sql set functions

8
هندسة ا والتحكم ماسباتلثالثة السنة البيانات ر قواعد ا مقرنامسةعملية اسة الل ال1 توابع التجميع : تسمحSQL موعاتكن تطبيقها على م بية الثمساة من التوابع اموع مستخدام باذا فهي تسمى عطيات, و من اset functions موعات أي توابع اوابع التجميع, أو ت وذه التوابع هلتام:دول ا ال مبينة من التوابع هي:ذا النوع ساسيةغة الصيا اFunction_name (input_argument) د عبارة بعلتابعء استدعا نضع اselect عادية... أما متحولعمدة الت وامسابال مع امان ا كما كاinput_agument ؤها...راد إجرات اود يتعلق بامسابا عم فهو اسملتابع اcount ات, أيعطيت على اسابا يقوم خرى بكونهن بقية التوابع ا عف هذا التوابعتل : نستطيع أنعطيات. ند على قيم ا يعتم ضع ا عام* نستطيع هذا ح لتابعذا ا رام كباخرى...مر مع التوابع ا ا ما كتبنا وإذاcount(*) ساب لتابع سيقوم اتد السج عد كامى القيما علن أعمد ثتوي بعض مك الثا فيها تل دول ال وجودة اnull ... سجل اوظفد اطلوب هو عدن ا كال: إذا مثادول ال لدينا emp نكتب:select count(*) from emp; لتام:ر اتفساسبة اه عند كتانتباه أن ويب اselect count(ename) from emp; ت الث قيمةيتم عد السج سename ست مساوية إل فيها ليnull . تفسارينس نتيجة ا ستكون واء يتم إدخال أ حال هتلفةلسابق ا...وظف لبعض ام عبارةتطيع استخدا نسwhere الشرط لتجميع طرفابع ا يكون تاع ولكن يب أوابع التجمي مع ت بعد الواردwhere : , أي مثwhere count(ename)>14 هي كتابة خاطئة.ذين تزيد رواتبهم على الوظفد اة عدطلوب هو إعادن ا كا إذا1500 : select count(ename)from emp where sal>1500; ت الث قيمة العموديتم عد السج وهنا سsal من فيها أك1500 فقط...لتابع اع اCount د ما أو عمو د القيمطي عد بعت جدولد سج عدsum عمود وجودةوع القيم امعيد م يAvg عمود وجودةتوسط القيم اعيد م يMin عمودعيد أصغر قيم يMax عمود فيمةعيد أك ي

Upload: asemsaleh

Post on 24-Jan-2016

216 views

Category:

Documents


0 download

DESCRIPTION

Set functions or Group functions in the Structured Query Language SQL. Count,Sum,AVG,MIN,MAxLesson 05 of an SQL in Practice course.Language: Arabic

TRANSCRIPT

Page 1: SQL Set Functions

اجللسة العملية اخلامسة –مقرر قواعد البيانات –السنة الثالثة –حلاسبات والتحكم هندسة ا

1

باستخدام جمموعة من التوابع احلسابية اليت ميكن تطبيقها على جمموعات SQL: تسمح التجميعتوابع هذه التوابع و أو توابع التجميع, أي توابع اجملموعات set functionsمن املعطيات, وهلذا فهي تسمى

مبينة يف اجلدول التايل:

الصياغة األساسية هلذا النوع من التوابع هي:

Function_name (input_argument)

كما كان احلال مع احلسابات واألعمدة العادية... أما متحول selectنضع استدعاء التابع بعد عبارة input_agument ...فهو اسم عمود يتعلق باحلسابات املراد إجراؤها

: خيتلف هذا التوابع عن بقية التوابع األخرى بكونه ال يقوم حبسابات على املعطيات, أي countالتابع كبارامرت هلذا التابع يف حني ال نستطيع هذا *عام ضع املال يعتمد على قيم املعطيات. نستطيع أن ن

كام عدد السجالت سيقوم التابع حبساب (*)countوإذا ما كتبنا األمر مع التوابع األخرى... ...nullاملوجودة يف اجلدول مبا فيها تلك اليت حتتوي بعض من أعمدهتا على القيم

نكتب: empني لدينا يف اجلدول مثال: إذا كان املطلوب هو عدد املوظفني املسجلselect count(*) from emp;

وجيب االنتباه أنه عند كتابة االستفسار التايل:select count(ename) from emp;

وستكون نتيجة االستفسارين .nullفيها ليست مساوية إىل enameسيتم عد السجالت اليت قيمة لبعض املوظفني... السابقني خمتلفة يف حال مل يتم إدخال أمساء

مع توابع التجميع ولكن جيب أال يكون تابع التجميع طرفًا يف الشرط whereنستطيع استخدام عبارة هي كتابة خاطئة. where count(ename)>14, أي مثاًل: whereالوارد بعد

:1500إذا كان املطلوب هو إعادة عدد املوظفني الذين تزيد رواتبهم على select count(ename)from emp where sal>1500;

فقط... 1500فيها أكرب من salوهنا سيتم عد السجالت اليت قيمة العمود

املعىن التابعCount عدد سجالت جدولبعطي عدد القيم يف عمود ما أو sum يعيد جمموع القيم املوجودة يف عمود Avg يعيد متوسط القيم املوجودة يف عمود Min يعيد أصغر قيم عمود Max يعيد أكرب فيمة يف عمود

Page 2: SQL Set Functions

اجللسة العملية اخلامسة –مقرر قواعد البيانات –السنة الثالثة –حلاسبات والتحكم هندسة ا

2

, فالستعراض عدد املهن املختلفة يف distinctمع بعض املعامالت مث countميكننا كذلك تركيب نكتب: empاجلدول

select count(distinct job)from emp;

نكتب: 10أردنا معرفة جمموع الرواتب يف القسم إذا ما : Sumالتابع

select sum(sal) from emp where deptno=10;

نستطيع تسمية األعمدة الناجتة عن تطبيق التوابع اإلمجالية متاماً كما فعلنا مع العمليات احلسابية ومعام الضم, فنستطيع كتابة االستفسار السابق كما يلي:

select sum(sal) "summation of salary" from emp where deptno=10;

عمودًا أو تعبريًا حسابيًا يعتمد على عمود أو عدة أعمدة. فلو كان sumميكن أن يكون متحول نكتب: 10حساب جمموع الرواتب السنوية يف القسم املطلوب

select sum(sal*12)"annual salary" from emp where deptno=10;

أن يكون طرفًا يف تعبري حسايب أكرب, فلو علمنا أن الضريبة املفروضة على sum ميكن كذلك لتعبري من جمموع الرواتب السنوي: %2.5تبلغ 10القسم

select sum(sal*12)*0.025 tax from emp where deptno=10; ( sumالتابع وال بد من اإلشارة إىل أنه يتم استبعاد مجيع األسطر اليت حيوي فيها العمود املستهدف )ب

.Nullالقيمة

نكتب: 10إذا كان املطلوب هو إعادة متوسط الرواتب يف القسم : avgالتابع select avg(sal) from emp where deptno = 10;

نكتب: 10: إذا كان املطلوب إعادة الراتب األدىن والراتب األعلى يف القسم min, maxالتابعان select min(sal) "minimum salary" , max(sal) "maximum salary" from emp

where deptno = 10;

ال ينحصر على القيم العددية, ب ميكن min, maxالتابعني وال بد من اإلشارة إىل أن استخدام إعادة التاريخ الذي مت فيه استئجار املوظف ملطلوب استخدامهما كذلك مع معطيات التاريخ, فإذا كان ا

لتاريخ الذي مت فيه استئجار آخر موظف حىت اللحظة للعم , نكتب:األول للعم , واselect min(hiredate) "first date", max(hiredate) "last date" from emp;

ميكن هلذه التوابع أن تعم كذلك مع القيم احملرفية بنفس الطريقة السابقة...

اعتمادًا على تطابق القيم املخزنة يف بتجميع أسطر جدول ما SQLاستفسارات التجميع: تسمح لغة عمود حمدد.

Page 3: SQL Set Functions

اجللسة العملية اخلامسة –مقرر قواعد البيانات –السنة الثالثة –حلاسبات والتحكم هندسة ا

3

, selectإىل عبارة group byتشكي اجملموعات: للقيام بتجميع أسطر جدول ما, نقوم بإضافة أمر ونتبع هذا األمر بأمساء األعمدة اليت نستخدم القيم املخزنة فيها لتجميع األسطر, حيث يتم جتميع

زنة يف هذه األعمدة...األسطر املشرتكة يف القيم املخ هو إعادة عدد املوظفني يف ك قسم, نكتب:إذا كان املطلوب

select deptno,count(ename) from emp group by deptno;

إذا ما قمنا اآلن باختيار األرقام املختلفة لألقسام املوجودة يف كيف يتم تنفيذ االستفسار السابق. :empاجلدول

select distinct deptno from emp;

وكان الناتج مثالً هو التايل:DEPTNO

-------

10

20

30

مثاًل, يقوم 10فيه هي deptno, وجيد أن قيمة الـ empمن السطر األول يف اجلدول SQLيبدأ معاجل وعند .10مساوية هلا أي deptnoالسجالت اليت تكون فيها قيمة الـ عدد بإعادة هذه القيمة وحساب

يتم االنتقال إىل السطر التايل وإال إن 10هي deptnoاالنتقال إىل السطر الثاين إذا كانت قيمة الـ فيها مساوية deptnoيقوم بإعادهتا مع حساب عدد األسطر اليت قيمة الـ 10كانت خمتلفة عن الـ

قد أعيدت القيمة ما كانت تلكيف احلسابات التالية إذا deptnoلتلك القيمة, أي أنه يتجاه قيمة الـ يف عملية االستفسار...

إذا كان املطلوب هو إعادة جمموع الرواتب, متوسط الرواتب, أكرب راتب, أصغر راتب يف ك قسم, نكتب:

select deptno,sum(sal),avg(sal),min(sal),max(sal) from emp

group by deptno;

املختلفة, مع عدد املوظفني الذين يتقاضون ك راتب: إذا كان املطلوب هو إعادة قيم الرواتبselect sal,count(ename)from emp group by sal;

إذا كان املطلوب هو إعادة أمساء املهن املختلفة, مع عدد املوظفني يف ك مهنة:select job,count(ename) from emp group by job;

ى أكثر من عمود واحد, أي نستطيع كتابةنستطيع إجراء عملية التجميع اعتماداً عل group by col1,col,…;

إذا كان املطلوب هو إعادة عدد املوظفني الذين يشرتكون يف املهنة والراتب معاً:select sal,job,count(ename)from emp group by sal,job;

Page 4: SQL Set Functions

اجللسة العملية اخلامسة –مقرر قواعد البيانات –السنة الثالثة –حلاسبات والتحكم هندسة ا

4

, ومن تجميع حسب الراتبأي ال group byيتم التجميع هنا حسب العمود الذي يأيت أواًل بعد عبارة مث التجميع حسب املهنة من أج ك راتب...

التجميع حسب يتم يف البداية , job1, job2, job3 مهن 3و sal1, sal2فإذا كان لدينا رابتان الراتب:

Sal count(ename)

Sal1 number1

Sal2 number2 sal1فيها هي salساب عدد السجالت اليت قيمة الـ ح أي Job1يتم البدء مثاًل مع املهنة بعد ذلك , وحنص على:Job1فيها هي الـ Jobوقيمة الـ

Sal job count(ename)

Sal1 job1 some_number

مع مجيع املهن يتم sal1. وبعد االنتهاء من الـ sal1مع الـ Job3مث الـ Job2بعد ذلك يأيت دور الـ والعم كما سبق... sal2االنتقال إىل الـ

إن عمليات التجميع اليت قمنا هبا حىت اآلن تستخدم مجيع أسطر حتديد األسطر الداخلة يف التجميع:

متامًا كما whereاجلدول, لكن ميكننا حتديد عدد األسطر الداخلة يف التجميع باستخدام عبارة استخدمناها يف حالة االستعالمات البسيطة...

وال جيوز استخدامها لتحديد ,تجميعالحديد عدد األسطر قب تنفيذ عملية لت whereتستخدم .تلك العمليةاألسطر بعد تنفيذ

1200أرقام األقسام وعدد العمال يف ك قسم والذين تزيد رواتبهم على إذا كان املطلوب هو إعادة نكتب:

select deptno, count(ename) from emp where sal>1200 group by deptno;

أي مل مت استبعادهم من عملية التجميع... 1200يف هذا االستفسار, إن العمال الذين رواتبهم أق من .1200فيها أق من salيتم عد السجالت اليت قيمة الـ

, ألن األوىل تنفذ قب الثانية حكماً...group byأواًل مث عبارة الـ whereجيب أن يرد شرط

أي مبعىن بعد إعادة رقم القسم أسطر حمددة من األسطر الناجتة عن عملية التجميع, إذا ما أردنا إعادة األقسام اليت متوسط الرواتب فيها أق من حد معنيومتوسط الرواتب يف هذا القسم, نريد أن نستبعد

. يف مث هذه احلاالت حنتاج إىل شرط يتم تعريفه على األسطر املعادة من عملية مثاًل( 2000)ونستطيع أن نكتب لتنفيذ االستفسار .havingتجميع, يتم تعريف هذا النوع من الشروط باستخدام ال

السابق:

Page 5: SQL Set Functions

اجللسة العملية اخلامسة –مقرر قواعد البيانات –السنة الثالثة –حلاسبات والتحكم هندسة ا

5

select deptno,avg(sal)from emp group by deptno having avg(sal)>2000;

having والعمود الذي ستنفذ عليه تعليمة تابع التجميع عملية اختيار وال بد من اإلشارة هنا إىل أنفلتعدي االستعالم السابق .selectباألعمدة وتوابع اجملموعات املستخدمة يف عبارة ليس له عالقة

حبيث يعيد أرقام األقسام ومتوسط الرواتب يف ك قسم, بشرط أن يكون عدد املوظفني يف هذا القسم , نكتب:3أكرب من

select deptno,avg(sal)from emp group by deptno having count(ename)>3;

على سبي املثال, إذا كان معاً. havingوعلى شرط whereميكن أن حيتوي استفسار ما على شرط , مث 1000املطلوب عند حساب متوسط الرواتب يف ك قسم استبعاد الرواتب الضعيفة اليت تق عن

نكتب ما يلي: 2000استبعاد األقسام اليت متوسط الرواتب فيها أق من select deptno,avg(sal),count(ename) from emp where sal>1000 group by

deptno having avg(sal)>2000;

لرتتيب األسطر املعادة يف نتيجة االستعالم, فلرتتيب األقسام order byنستطيع استخدام تعليمة املعادة تصاعدياً حسب عدد العمال نكتب:

select deptno,avg(sal),count(ename) from emp where sal>1000 group by

deptno having avg(sal)>2000 order by count(ename);

إىل أن العمود املستخدم يف الرتتيب جيب أن يكون خاضعًا لتابع جتميع أو وارداً وال بد من اإلشارة هنا .group byيف عبارة

data manipulation تعدي املعطيات

, هذه التعليمات ثالث تعليمات لتعدي املعطيات املخزنة يف اجلداول SQLكما ذكرنا سابقاً, توفر لغة أي احلذف. deleteأي التحديث, updateأي اإلضافة, insertهي:

الذي تعاملنا به مع التعليمة ميكن أن تضيف سجاًل واحدًا إىل اجلدول, وهو الشك insertتعليمة حىت اآلن.

لنسخ عدة أسطر من جدول إىل جدول آخر أو حىت اجلدول insertإن باإلمكان استخدام تعليمة والصيغة العامة كالتايل: نفسه...

Insert into table_name select columns from another_table_name…;

حقول اجلدول اهلدف لعملية selectقول الناجتة عن عبارة ومن الطبيعي أنه من الالزم أن توافق احل من ناحية العدد والرتتيب ومنط املعطيات... table_nameاإلضافة

, ولن نقوم empوخمططه هو ذاته خمطط اجلدول managerلنقم اآلن بإنشاء جدول حيم االسم .deptبربطه مع اجلدول

create table manager(empno number(4) primary key, ename varchar2(10),

job varchar2(9), mgr number(4), hiredate date, sal number(7,2),

Page 6: SQL Set Functions

اجللسة العملية اخلامسة –مقرر قواعد البيانات –السنة الثالثة –حلاسبات والتحكم هندسة ا

6

comm number(7,2), deptno number(2));

.managerيف اجلدول managerاملطلوب اآلن إدخال سجالت املوظفني الذين مهنتهم insert into manager select * from emp where lower(job)='manager';

وذلك يف حال مل نرد إضافة القيم table_nameمالحظة: نستطيع حتديد األعمدة اهلدف يف اجلدول

إىل مجيع األعمدة...وهو يف الواقع جدول جزئئ )من حيث bonusحيم االسم scottإن أحد جداول املستخدم

.emp( من اجلدول schemeالتخطيط Bonus(ename, job, sal, comm.)

.nullأمساء ورواتب العمال الذين عمولتهم bonusلنضف اآلن إىل اجلدول insert into bonus(ename,sal) select ename,sal from emp where comm is null;

, هلذه العبارة الصيغة التالية:updateحتديث املعطيات: يتم حتديث املعطيات باستخدام عبارة

update table_name

set column1=new_value

column2=new_value,…

where some_condition; متبوعة باسم اجلدول املطلوب حتديث معطياته, بعد ذلك تأيت updateتبدأ التعليمة بالكلمة املفتاحية

. يهامع القيم اليت سيتم التعدي إل متبوعة بأمساء األعمدة املطلوب تعدي قيمها setالكلمة املفتاحية اليت حتدد جمموعة من األسطر اليت سيتم تعدي قيم أعمدهتا بالقيم whereتنتهي التعليمة بالعبارة

اجلديدة.حبيث يصبح راتبه scott, يطلب تعدي سج املوظف bonusعلى سبي املثال, بالعودة إىل اجلدول

.1و عمولته 5000update bonus

set sal=5000,

comm=1

where lower(ename)=’scott’;

ال بد من اإلشارة هنا إىل أن التحديث يشم مجيع سجالت اجلدول إذا ما مت االستغناء عن عبارة where.

نستطيع استعمال التعابري احلسابية عند حتديد القيمة اجلديدة اليت سيتم التحديث إليها, فإذا كان نكتب: %3املطلوب زيادة رواتب العاملني مبقدار

update bonus

set sal=sal*0.03;

Page 7: SQL Set Functions

اجللسة العملية اخلامسة –مقرر قواعد البيانات –السنة الثالثة –حلاسبات والتحكم هندسة ا

7

للوهلة نكتبإىل عمولة ك موظف. 1: إذا كان املطلوب هو إضافة nullالعم مع القيمة اخلالية :األوىل

update emp

set comm=comm+1; قيم العمولة سنجد أن اإلضافة قد متت فقط يف احلالة اليت مل تكن فيها فإذا ما طلبنا اآلن استعراض

, Nullستكون قيمته النهائية null, والسبب أن أي تعبري حسايب أحد أطرافه Nullمساوية إىل العمولة التابع sql. حل هذه املشكلة تقدم nullبقيت قيمة العمود nullمع قيم الـ 1ومن مث فإنه عند مجع الـ

nvl :ملعاجلة حالة القيم اخلالية, هلذا التابع الصيغة التالية Nvl(value,new_value)

لن يطرأ عليها أي تغيري, أما إذا كانت مساوية هلا Nullغري مساوية إىل valueإذا كانت القيمة سيتم حتوي قيم العمولة nvl(comm,0)+1. واآلن عندما نكتب new_valueستصبح مساوية لـ

ا يلي:إىل الصفر, ومن مث إضافة الواحد... وعليه تصبح عملية التحديث كم nullاملساوية لـ update emp

set comm=nvl(comm,0)+1;

لن حتص عندما حندد للعمود قيمة جديدة ثابتة, كأن nullال بد من اإلشارة إىل أن حالة القيم نكتب:

Update emp

Set comm=1;

حذف األسطر: ذات الصيغة العامة التالية: deleteتتم عملية احلذف باستخدام تعليمة

Delete from table_name

Where condition;

متبوعة باسم اجلدول املطلوب احلذف منه, يلي ذلك fromمث deleteتبدأ التعليمة بالكلمة املفتاحية متبوعة بالشرط الذي حيدد جمموعة معينة من السجالت whereقسم اختياري يبدأ بالكلمة احملجوزة

ليتم حذفها...د شرطًا سيتم إفراغ اجلدول من املعطيات, أي حذف مجيع وال بد من اإلشارة إىل أنه يف حال مل حند

السجالت. نكتب: sعلى سبي املثال, حلذف سجالت املوظفني الذين تبدأ أمساؤهم باحلرف

delete from bonus

where lower(ename) like's%';

Page 8: SQL Set Functions

اجللسة العملية اخلامسة –مقرر قواعد البيانات –السنة الثالثة –حلاسبات والتحكم هندسة ا

8

شابه لذلك املستخدم لتنفيذ الربط اعتماداً على أعمدة ذات أمساء خمتلفة يف اجلداول, يتم حتديد شرط م , كما يلي:onيف عملية الربط التقليدية ولكن باستخدام املعام

Select columns from table1 join table2 in join_condition;

هذا وبالطبع فإن باإلمكان استخدام هذه الطريقة يف حالة األعمدة ذات األمساء الواحدة...

الربط: إذا كانت عملية الربط تتم اعتمادًا على مفتاح أساسي يف إجناز عملية ||استخدام املعام ,table1.pk(col1,col2)ومفتاح خارجي مركبني )مؤلفني من أكثر من عمود(...

table2.fk(col1,col2) , فعند تنفيذ الربط اعتماداً على الصيغة التقليدية حنتاج إىل املساواةpk=fk يف شرط الربط...