160 likes | 304 Views
الاستعلامات الفرعية ( Subqueries ). الاستعلامات الفرعية ( Subqueries ). ماهي الاستعلامات الفرعية؟ الاستعلام الفرعي عبارة عن استعلام طبيعي مضمن داخل استعلام آخر. يمكن للاستعلام الفرعي أن يتواجد في جزء . WHERE جزء . HAVING جزء .SELECT دائما الاستعلام الفرعي يكون بداخل أقواس ().
E N D
الاستعلامات الفرعية (Subqueries) • ماهي الاستعلامات الفرعية؟ الاستعلام الفرعي عبارة عن استعلام طبيعي مضمن داخل استعلام آخر. • يمكن للاستعلام الفرعي أن يتواجد في • جزء .WHERE • جزء .HAVING • جزء .SELECT • دائما الاستعلام الفرعي يكون بداخل أقواس (). • أنواع الاستعلامات الفرعية: 1- “scalar subquery” : تعيد عمود واحد تقاطع صف واحد أي تعيد قيمة واحدة فقط. 2- ”row subquery“ : تعيد مجموعة من الأعمدة تقاطع صف واحد. 3- ”table subquery“ : تعيد عمود واحد أو أكثر تقاطع مجموعة صفوف.
الاستعلامات الفرعية (Subqueries) • مثال: • 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’);
الاستعلامات الفرعية (Subqueries) • مثال: • 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 );
الاستعلامات الفرعية (Subqueries) • غالبا جملة (GROUP BY)لا تستخدم في الاستعلامات الفرعية. • عادة الأعمدة في جملة الـ SELECT التي تستخدم في الاستعلامات الفرعية تكون تابعة للجدول في جزء الـ FROM الخاص بالاستعلام الفرعي, ولكن توجد حالات تكون الأعمدة في الاستعلام الفرعي تابعة للجدول الموجود في الاستعلام الرئيسي الذي يتضمن الاستعلام الفرعي وفي هذه الحالة يسمى الاستعلام الفرعي بـ ” correlated subquery“. • إذا كان لدينا استعلام وكان يجب علينا أن نقارن فيه استعلام فرعي بشيء آخر فإنه يجب أن نضع الاستعلام الفرعي في جهة اليمين للمقارنة.
الاستعلامات الفرعية (Subqueries) • إذا كان العائد من الاستعلام الفرعي قيمة واحدة فقط فإننا نستخدم معه أدوات المقارنة (> , < , = , =< , => , <>) . • إذا كان العائد أكثر من قيمة واحدة فإننا نستخدم معه (ANY,ALL,IN) إضاففة إلى أدوات المقارنة ماعدا (IN) لا نستخدم معها أدوات مقارنة.
استخدام (IN) في الاستعلامات الفرعية • مثال: - 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’));
استخدام (ANY/ ALL) في الاستعلامات الفرعية • مثال: • STAFF (sno, fname, lname, position, sex, DOB, salary, bno) المطلوب استرجاع بعض البيانات للموظف الذي راتبه أعلى من كل رواتب الموظفين في الفرع رقم .B3 • الحل: SELECT sno, fname, lname, position, salary FROM staff WHERE salary > ALL (SELECT salary FROM staff WHERE bno = ‘B3’);
استخدام (ANY/ ALL) في الاستعلامات الفرعية Sno LName position salary FName SL21 John White Manager 30000
استخدام (ANY/ ALL) في الاستعلامات الفرعية * يمكننا كتابة SOME بدل ANY أو ANY بدل SOME لأنه لهما نفس المعنى. • مثال: • STAFF (sno, fname, lname, position, sex, DOB, salary, bno) المطلوب استرجاع بعض البيانات للموظف الذي راتبه أعلى من على الأقل راتب موظف واحد في الفرع رقم .B3 • الحل: SELECT sno, fname, lname, position, salary FROM staff WHERE salary > SOME (SELECT salary FROM staff WHERE bno = ‘B3’);
استخدام (ANY/ ALL) في الاستعلامات الفرعية sno LName position salary FName SL21 John White Manager 30000 SG14 David Ford 18000 Supervisor SG5 Susan Brand 24000 Manager
استخدام (EXIST/ NOT EXIST) • EXISTتعيد ”TRUE“ إذا ظهر ناتج من الاستعلام حتى لو كان صف واحد , وتعيد ”FALSE“ إذا لم يوجد هناك ناتج. • مثال: • STAFF (sno, fname, lname, position, sex, DOB, salary, bno) • BRANCH (bno, street, city, postcode) المطلوب إيجاد كل الموظفين الذين يعملون في فروع لندن. SELECT sno, fname, lname, position FROM staff s WHERE EXISTS (SELECT * FROM branch b WHERE s.bno = b.bno AND city =‘London’);
استخدام (UNION) • عندما نستخدم (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 FROM branch) UNION (SELECT city FROM propertyforrent);
استخدام (INTERSECT) • تستخدم (INTERSECT) في الاستعلامات لإيجاد حل مشترك بين ناتج استعلامين مختلفين. • مثال:“من العلاقات في الشريحة السابقة“ المطلوب إيجاد مدن تحتوي على فروع وعقارات معا. • الحل: (SELECT city FROM branch) INTERSECT (SELECT city FROM propertyforrent); ------------------------------------------------------- SELECT DISTINCT b.city FROM branch b, propertyforrent p WHERE b.city=p.city; ------------------------------------------------------- SELECT DISTINCT city FROM branch b WHERE EXISTS (SELECT * FROM propertyforrent p WHERE p.city = b.city);
استخدام (EXCEPT) • 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);