الاستعلامات الفرعية

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