دستورات زبان دستکاری و مدیریت داده (DML)
DML سرواژه ی Data Manipulation Language است که عمليات پردازشی و دستکاری اشيای پايگاه داده مانند: insert(درج)، select (گزینش)، update (بروز رسانی) را پشتيبانی می کند.
DML به عنوان زبان پرسمان (SQL) هم شناخته می شود و اغلب دارای قابلیت انجام محاسبات ریاضی
و آماری است كه عملیات گزارش گیری از پايگاه داده را آسان تر می کند.
دستورات DML از داده ها query گرفته و آن ها را در schema object جاری دستکاری می کند. این دستورات به طور صریح تراکنش (transaction) جاری را اجرا و ثبت نمی کنند.
دستورات DML موجود در oracle عبارتند از
- Insert: به وسیله ی این دستور می توان سطر جدید در جدول مورد نظر وارد (درج) کرد.
- Update: به منظور بروز رسانی و ویراست سطرهای موجود در جدول بکار می رود.
- Delete: جهت حذف سطرهای موجود در یک جدول بکار می رود.
- Merge: برای بروز رسانی یا درج سطر جدید در صورت برقرار بودن شرط مشخص بکار می رود.
دستور Insert
با استفاده از این دستور می توان رکورد جدید به جدول جاری اضافه کرد.
مثال:
با استفاده از ساختار دستوری مزبور، می خواهیم سطر جدید به جدول emp اضافه کنیم.
Insert into emp values (101,’Sami’,’G.Manager’,
’8-aug-1998’,2000);
اگر می خواهید یک سطر جدید با ارائه ی مقادیری برای برخی از ستون ها و نه همه ی آن ها ایجاد کنید، باید اسم ستون را در دستور SELECT ذکر کنید. دستور زیر با ارائه ی مقادیری تنها برای ستون های empno، ename و sal سطر جدید در جدول emp درج می کند. دو ستون Job و Hiredate خالی (null) خواهد ماند.
Insert into emp (empno,ename,sal) values (102,’Ashi’,5000);
فرض بگیرید می خواهیم از یک ستون به ستونی دیگر سطر اضافه کنیم که این دو ستون دارای نام و ساختار زیر هستند.
حال می خواهیم از جدول old_emp به جدول emp، سطر اضافه کنیم. برای این منظور، دستور insert زیر را می نویسم.
Insert into emp (empno, ename, sal)
select empno, ename, sal from old_emp;
افزودن چندین سطر از یک جدول به جدول دیگر»
فرض کنید دارای جدولی به نام sales با ساختار زیر هستم.
Sales
اکنون می خواهیم سطرهایی از جدول یاد شده به جدولی به نام Weekly_Sales که دارای ساختار زیر می باشد، اضافه کنیم.
جهت نیل به این هدف می توان از دستور multi table INSERT بهره جست.
Insert all
Into week_sales(prodid,prodname,weekday,amount)
Values (prodid,prodname,’Mon’,mon_amt)
Into week_sales(prodid,prodname,weekday,amount)
Values (prodid,prodname,’Tue’,tue_amt)
Into week_sales(prodid,prodname,weekday,amount)
Values (prodid,prodname,’Wed’,wed_amt)
Into week_sales(prodid,prodname,weekday,amount)
Values (prodid,prodname,’Thu’,thu_amt)
Into week_sales(prodid,prodname,weekday,amount)
Values (prodid,prodname,’Fri’,fri_amt)
Into week_sales(prodid,prodname,weekday,amount)
Values (prodid,prodname,’Sat’,sat_amt)
Select prodid,prodname,mon_amt,tue_amt,wed_amt,thu_amt
Fri_amt,sat_amt from sales;
دستور UPDATE
دستور UPDATE برای بروز رسانی سطرهای جدول موجود که یا در schema شما قرار دارد و یا مجوز و امتیاز بروز رسانی (update privilege) آن ها را دارید، بکار می رود.
به عنوان مثال، به منظور افزایش درآمد کارکنانی که شماره ی آن در جدول 104 می باشد، به مقدار Rs.500، می توان دستور زیر را نوشت.
update emp set sal=sal+500 where empno = 104;
در دستور بالا، چنانچه از عبارت WHERE استفاده نمی کردیم، درآمد تمامی کارکنان به اندازه ی Rs.500 افزایش می یافت. بنابراین، چنانچه نمی خواهید تمامی فیلدها بروز رسانی شوند، باید از شرط مناسب WHERE استفاده کنید.
برای مثال، اگر بخواهیم اسم کارمند شماره ی 102 را از ‘Sami’
به ‘Mohd Sami’ تغییر داده و نیز درآمد وی را تا %10 افزایش دهیم، باید دستور زیر را بنویسیم.
update emp set name=’Mohd Sami’,
sal=sal+(sal*10/100) where empno=102;
حال می خواهیم درآمد تمامی کارکنان را به میزان 5% افزایش دهیم.
update emp set sal=sal+(sal*5/100);
برای تبدیل اسم تمامی کارکنان از حروف کوچک به حروف بزرگ، دستور زیر را می نویسیم.
update emp set name=upper(name);
فرض کنید جدولی داریم به نام student که دارای ساختار زیر می باشد.
حال به منظور محاسبه و بدست آوردن مقدار کل که مربوط به ستون Total می باشد.
update student set total=maths+phy+chem,
average=(maths+phy+chem)/3;
استفاده از subquery در عبارت ثابت UPDATE
فرض بگیرید ستونی به نام city را به داخل جدول employee وارد کرده و اکنون می خواهیم این ستون را با ستون متناظر (city) در جدول department که با جدول employee متصل هست راست کنیم.
update emp set city=(select city from dept
where deptno= emp.deptno);
دستور DELETE
دستور DELETE برای حذف سطرهای جداول موجود که یا در schema ی شما هستند و یا مجوز و امتیاز حذف آن ها را دارید، استفاده می شود. به عبارتی دیگر از اين دستور برای حذف اطلاعات يک رکورد در جدول استفاده می شود.
به عنوان مثال، برای حذف کارکنی که شماره ی آن 102 می باشد.
delete from emp where empno=102;
چنانچه شرط WHERE را ذکر نکنید، تمامی سطرهای جاری حذف می گردند.
فرض بگیرید می خواهیم تمامی کارکنانی که درآمد آن ها بالغ بر 2000 می باشد، را پاک کنیم. برای این منظور دستور delete زیر را می نویسیم.
delete from emp where salary > 2000;
مثال زیر دقیقا کار دستور بالا را انجام می دهد، با این تفاوت که برای نیل به این هدف از یک sub query بهره می گیرد.
DELETE FROM (SELECT * FROM emp)
WHERE sal > 2000;
حال جهت حذف تمامی سطرها از جدول emp
delete from emp;
دستور MERGE
دستور Merge به ما این امکان را می دهد تا محتویات دو جدول را به صورت دلخواه و با شروطی که مد
نظرمان است به هم متصل کنیم. به عبارتی دیگر از دستور مزبور می توان به منظور انتخاب سطرهایی از یک جدول برای انجام عملیات بروز رسانی یا درج در جدول دیگر بهره گرفت. این تصمیم که آیا عملیات بروز رسانی یا درج سطر جدید در جدول مقصد صورت گیرد، همگی بستگی به شرطی دارد که در عبارت
ON مشخص می شود. این دستور یکی از قابلیت های نوین ORACLE است که در ویرایش 9i ارائه گردیده. دستور نام برده تحت عنوان UPSERT نیز شناخته می شود که در واقع ترکیبی از UPDATE و INSERT می باشد.
در نظر بگیرید دارای جداولی با نام های sales_history و sales هستیم که ساختار زیر را دارند.
SALES
SALES HISTORY
حال می خواهیم جدول sales_history را بر اساس جدول sales بروز رسانی کنیم؛ به عبارت دیگر می خواهیم سطرهایی که از پیش در جدول sales_history هستند بروز رسانی شده و آن سطرهایی که در جدول ذکر شده موجود نیستند،
به این جدول تزریق شوند.
merge into sales_history sh
using sales s
on (s.prod=sh.prod and s.month=sh.month)
when matched then update set sh.amount=s.amount
when not matched then insert values (prod,month,amount);
پس از اینکه دستور MERGE اجرا گردید، جدول مورد نظر بدین شکل درخواهد آمد.