الاستعلامات الفرعية
Download
Report
Transcript الاستعلامات الفرعية
ماهي االستعالمات الفرعية؟
االستعالم الفرعي عبارة عن استعالم طبيعي مضمن داخل استعالم آخر.
-
يمكن لالستعالم الفرعي أن يتواجد في
جزء .WHERE
جزء .HAVING
جزء .SELECT
-
دائما االستعالم الفرعي يكون بداخل أقواس ().
•
•
•
أنواع االستعالمات الفرعية: : “scalar subquery ” -1تعيد عمود واحد تقاطع صف واحد أي تعيد قيمة واحدة فقط.
: “row subquery ” -2تعيد مجموعة من األعمدة تقاطع صف واحد.
: “table subquery ” -3تعيد عمود واحد أو أكثر تقاطع مجموعة صفوف.
2
: مثال
STAFF (sno, fname, lname, position, sex, DOB, salary, bno)
BRANCH (bno, street, city, postcode)
المطلوب إيجاد أرقام وأسماء ومراتب كل الموظفين الذين يعملون في الفرع
.‘163 Main St’ الموجود في شارع
: الحل
SELECT sno, fname, lname, position
FROM staff
WHERE bno = (SELECT bno
FROM branch
WHERE street = ‘163 Main St’);
3
: مثال
STAFF (sno, fname, lname, position, sex, DOB, salary, bno)
المطلوب إيجاد أرقام و أسماء والمراتب الوظيفية والرواتب للموظفين الذين رواتبهم أعلى
.من المتوسط
: الحل
SELECT sno, fname, lname, position, salary – (SELECT
avg(salary) FROM staff ) AS sal_diff
FROM staff
WHERE salary > ( SELECT avg(salary)
FROM staff );
4
5
غالبا جملة ()GROUP BYال تستخدم في االستعالمات الفرعية.
عادة األعمدة في جملة الـ SELECTالتي تستخدم في االستعالمات الفرعية تكون
تابعة للجدول في جزء الـ FROMالخاص باالستعالم الفرعي ,ولكن توجد حاالت
تكون األعمدة في االستعالم الفرعي تابعة للجدول الموجود في االستعالم الرئيسي
الذي يتضمن االستعالم الفرعي وفي هذه الحالة يسمى االستعالم الفرعي بـ ”
.“correlated subquery
إذا كان لدينا استعالم وكان يجب علينا أن نقارن فيه استعالم فرعي بشيء آخر فإنه
يجب أن نضع االستعالم الفرعي في جهة اليمين للمقارنة.
إذا كان العائد من االستعالم الفرعي قيمة واحدة فقط فإننا نستخدم معه
أدوات المقارنة (> . )>< , >= , <= , = , < ,
إذا كان العائد أكثر من قيمة واحدة فإننا نستخدم معه ()ANY,ALL,IN
إضاففة إلى أدوات المقارنة ماعدا ( )INال نستخدم معها أدوات مقارنة.
6
:مثال
- PROPERTYFORRENT (pno, street, area, city, pcode, type, rooms, rent, sno)
- STAFF (sno, fname, lname, position, sex, DOB, salary, bno)
- BRANCH (bno, street, city, postcode)
.‘163 Main St’ المطلوب إيجاد كل العقارات التي يتابعها الموظفون الذين يعملون في الفرع الذي يقع في شارع
:الحل
SELECT pno, street, area, city, pcode, type, rooms, rent
FROM property_for_rent
WHERE sno IN
(SELECT sno
FROM staff
WHERE bno =
(SELECT bno
FROM branch
WHERE street = ‘163 MainSt’));
7
:مثال
STAFF (sno, fname, lname, position, sex, DOB, salary, bno)
المطلوب استرجاع بعض البيانات للموظف الذي راتبه أعلى من كل رواتب الموظفين في الفرع
.B3 رقم
: الحل
position, salary
SELECT sno, fname, lname,
FROM staff
WHERE salary > ALL
(SELECT salary
FROM staff
WHERE bno = ‘B3’);
8
Sno
FName
LName
SL21
John
White
position
Manager
salary
30000
9
. ألنه لهما نفس المعنىSOME بدلANY أوANY بدلSOME * يمكننا كتابة
:مثال
STAFF (sno, fname, lname, position, sex, DOB, salary, bno)
المطلوب استرجاع بعض البيانات للموظف الذي راتبه أعلى من على األقل راتب موظف واحد
.B3 في الفرع رقم
: الحل
position, salary
SELECT sno, fname, lname,
FROM staff
WHERE salary > SOME
(SELECT salary
FROM staff
WHERE bno = ‘B3’);
10
sno
FName
LName
position
salary
SL21
John
White
Manager
30000
SG14
David
Ford
Supervisor
18000
SG5
Susan
Brand
Manager
24000
11
, “ إذا ظهر ناتج من االستعالم حتى لو كان صف واحدTRUE” تعيدEXIST
.“ إذا لم يوجد هناك ناتجFALSE” وتعيد
: مثال
-
STAFF (sno, fname, lname, position, sex, DOB, salary, bno)
BRANCH (bno, street, city, postcode)
.المطلوب إيجاد كل الموظفين الذين يعملون في فروع لندن
SELECT sno, fname, lname,
FROM staff s
WHERE EXISTS
(SELECT *
FROM branch b
WHERE
s.bno
= b.bno
position
AND
city =‘London’);
12
) في االستعالمات فإننا نستخدمها ألجل الدمج وإجراءUNION( عندما نستخدم
.عملية اتحاد بين استعالمين مختلفين
: مثال
- PROPERTYFORRENT (pno, street, area, city, pcode, type, rooms, rent, sno)
- STAFF (sno, fname, lname, position, sex, DOB, salary, bno)
- BRANCH (bno, street, city, postcode)
.المطلوب إيجاد كل المدن التي توجد بها فروع أو توجد بها عقارات
: الحل
SELECT city
UNION
(SELECT city
FROM
FROM
branch)
propertyforrent);
13
.) في االستعالمات إليجاد حل مشترك بين ناتج استعالمين مختلفينINTERSECT( تستخدم
““من العالقات في الشريحة السابقة:مثال
.المطلوب إيجاد مدن تحتوي على فروع وعقارات معا
: الحل
(SELECT city
INTERSECT
(SELECT city
FROM
branch)
FROM propertyforrent);
-------------------------------------------------------
SELECT DISTINCT b.city
FROM branch b, propertyforrent
WHERE b.city=p.city;
p
-------------------------------------------------------
SELECT DISTINCT city
FROM
branch b
WHERE EXISTS
(SELECT *
FROM propertyforrent p
WHERE p.city = b.city);
14
. تستخدم الستثناء نتيجة معينةEXCEPT
:مثال
- PROPERTYFORRENT (pno, street, area, city, pcode, type, rooms, rent, sno)
- STAFF (sno, fname, lname, position, sex, DOB, salary, bno)
- BRANCH (bno, street, city, postcode)
.المطلوب إيجاد كل المدن التي توجد فيها فروع لكن ال توجد فيها عقارات لإليجار
: الحل
(SELECT city FROM branch)
EXCEPT
(SELECT city FROM propertyforrent);
----------------------------------------------------SELECT DISTINCT city
FROM branch
WHERE city NOT IN
(SELECT
city
FROM propertyforrent);
----------------------------------------------------SELECT DISTINCT city
FROM
branch b
WHERE NOT EXISTS
(SELECT * FROM propertyforrent p
WHERE p.city = b.city);
15