English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دليل PostgreSQL الأساسي

دليل PostgreSQL المتقدم

واجهة PostgreSQL

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

الاستعلام الفرعي أو ما يسمى بالاستعلام الداخلي أو الاستعلام المدمج، هو استدعاء جملة استعلام في جملة WHERE في استعلام PostgreSQL.

يمكن أن تكون نتائج استعلام SELECT واحدة يمكن استخدامها كقيمة إدخال لجملة أخرى.

يمكن استخدام الاستعلامات الفرعية مع جمل SELECT و INSERT و UPDATE و DELETE، كما يمكن استخدام عمود مثل =، <، >، >=، <=، IN، BETWEEN وما إلى ذلك.

هناك بعض القواعد التي يجب اتباعها عند استخدام الاستعلامات الفرعية:

  • يجب أن تكون الاستعلامات الفرعية مدمجة في أقواس.

  • يمكن أن يكون هناك فقط عمود واحد في الاستعلام الفرعي في جملة SELECT، ما لم يكن هناك عدة أعمدة في الاستعلام الرئيسي، ويتم مقارنة الأعمدة المختارة مع الأعمدة في الاستعلام الفرعي.

  • لا يمكن استخدام ORDER BY في الاستعلام الفرعي، على الرغم من أن ORDER BY يمكن استخدامها في الاستعلام الرئيسي. يمكن استخدام GROUP BY في الاستعلام الفرعي، والذي يعمل بنفس الطريقة.

  • إذا كان الاستعلام الفرعي يعود بأكثر من سطر، يمكن استخدامه فقط مع عمود متعدد القيم، مثل عمود IN.

  • لا يمكن استخدام عمود BETWEEN مع الاستعلام الفرعي، ولكن يمكن استخدام BETWEEN داخل الاستعلام الفرعي.

استخدام الاستعلام الفرعي في جملة SELECT

الاستعلامات الفرعية عادة ما تستخدم مع جملة SELECT. النحو الأساسي كالتالي:

SELECT column_name [, column_name ]
FROM   table1 [, table2 ]
WHERE  column_name OPERATOR
      (SELECT column_name [, column_name ]
      FROM table1[, table2]
      [WHERE])

مثال على-line

إنشاء جدول COMPANY (تحميل ملف SQL لـ COMPANY ),المحتوى التالي كالتالي:

w3codeboxdb# select * from COMPANY;
 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy | 23 | Norway | 20000
  4 | Mark | 25 | Rich-Mond | 65000
  5 | David | 27 | Texas | 85000
  6 | Kim | 22 | South-Hall | 45000
  7 | James | 24 | Houston | 10000
(7 سطور)

الآن، دعونا نستخدمُ الاستعلامات الفرعية في جملة SELECT:

w3codeboxdb=# إدراجُ * من COMPANY WHERE ID في (إدراجُ ID من COMPANY WHERE SALARY > 45000);

حصلنا على النتيجة التالية:

 id | name | age | address | salary
id | name | age | address | salary
  3 | Teddy | 23 | Norway | 20000
  5 | David | 27 | Texas | 85000
(2 أسطر)

استخدامُ الاستعلامات الفرعية في جملة INSERT

يمكنُ استخدامُ الاستعلامات الفرعية أيضًا مع جملة INSERT. يتمُ إدراجُ البياناتِ المعدة من الاستعلامات الفرعية في جدول آخر.

يمكنُ تعديلُ البياناتُ المختارةُ من الاستعلامات الفرعية بأي رمزٍ أو دالةٍ تاريخيةٍ أو رقميةٍ.

القواعد الأساسية هي:

إدراجُ INTO اسمُ الجدول[ (column1[, column2])]
   SELECT[ *|column1[, column2]]
   FROM table1[, table2]
   [WHERE VALUE OPERATOR]

مثال على-line

افترضُ أنُ بنية COMPANY_BKP مشابهةُ لجدول COMPANY وأنها يمكنُ إنشاؤها باستخدام نفسُ جملة CREATE TABLE، فقط أسمُ الجدول يجبُ تغييرُه إلى COMPANY_BKP. الآن، نسخُ جدول COMPANY كاملاً إلى COMPANY_BKP، والجملة هي:

w3codeboxdb=# إدراجُ INTO COMPANY_BKP من COMPANY WHERE ID في (إدراجُ ID من COMPANY);;

استخدامُ الاستعلامات الفرعية في جملة UPDATE

يمكن استخدامُ الاستعلاماتُ الفرعية مع جملة UPDATE. عند استخدامُ الاستعلامات الفرعية مع جملة UPDATE، يتمُ تحديثُ عمودٍ واحدٍ أو أكثر في الجدول.

القواعد الأساسية هي:

تحديثُ جدول
تعيينُ اسمُ عمودٍ = قيمةُ جديدةً
[WHERE OPERATOR [VALUE]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [WHERE)

مثال على-line

مثال على-line

إليك مثال على كيفية تحديث SALARY لجميع العملاء في جدول COMPANY الذين تحتوي على AGE أكبر من 27 إلى ضعف القيمة الأصلية:

w3codeboxdb=# UPDATE COMPANY SET SALARY = SALARY * 0.50 WHERE AGE IN (SELECT AGE FROM COMPANY_BKP WHERE AGE >= 27);

w3codeboxdb=# DELETE FROM COMPANY WHERE AGE IN (SELECT AGE FROM COMPANY_BKP WHERE AGE > 27);

 سيعمل هذا على سطرين، وسيكون النص التالي في جدول COMPANY كما يلي:
id | name | age | address | salary
  ----+-------+-----+-------------+--------
  2 | Allen | 25 | Texas | 15000
  3 | Teddy | 23 | Norway | 20000
  4 | Mark | 25 | Rich-Mond | 65000
  6 | Kim | 22 | South-Hall | 45000
  1 | Paul | 32 | California | 10000
  7 | James | 24 | Houston | 10000
(7 سطور)

يستخدم الاستعلام الفرعي في جملة DELETE

يمكن استخدام الاستعلام الفرعي مع جملة DELETE، كما هو موضح في الجمل المذكورة أعلاه.

القواعد الأساسية هي:

DELETE FROM TABLE_NAME
[WHERE OPERATOR [VALUE]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [WHERE)

مثال على-line

مثال على-line

افترض، لدينا جدول COMPANY_BKP وهو نسخة احتياطية لجدول COMPANY.

إليك مثال على كيفية حذف جميع سجلات العملاء في جدول COMPANY التي تحتوي على AGE أكبر من أو يساوي 27:

w3codeboxdb=# DELETE FROM COMPANY WHERE AGE IN (SELECT AGE FROM COMPANY_BKP WHERE AGE > 27);

 سيعمل هذا على سطرين، وسيكون النص التالي في جدول COMPANY كما يلي:
id | name | age | address | salary
  ----+-------+-----+-------------+--------
  2 | Allen | 25 | Texas | 15000
  3 | Teddy | 23 | Norway | 20000
  4 | Mark | 25 | Rich-Mond | 65000
  6 | Kim | 22 | South-Hall | 45000
  7 | James | 24 | Houston | 10000
(6 سطور)