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

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

الاستعلام الفرعي أو الاستعلام الداخلي أو الاستعلام المدمج هو استعلام SQLite آخر يتم دمجه في جملة WHERE.

يستخدم الاستعلام الفرعي لتحديد البيانات التي سيتم استخدامها في الاستعلام الرئيسي كشرط إضافي للتحكم في البيانات التي سيتم استرجاعها.

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

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

  • يجب وضع الاستعلام الفرعي داخل الأقواس.

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

  • على الرغم من أن يمكن استخدام ORDER BY في الاستعلام الرئيسي، لا يمكن استخدام ORDER BY في الاستعلام الفرعي. يمكن استخدام GROUP BY لتشغيل نفس وظيفة ORDER 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])

示例

جدول COMPANY يحتوي على السجلات التالية.

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1 Paul 32 California 20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5 David 27 Texas 85000.0
6                                     Kim                              22                                  South-Hall                      45000.0
7                                     James                          24                                  Houston                          10000.0

الآن، دعونا نستخدم جملة SELECT لفحص الاستعلام الفرعي التالي.

sqlite> SELECT * 
   FROM COMPANY 
   WHERE ID IN (SELECT ID 
      FROM COMPANY 
      WHERE SALARY > 45000);

سيكون لدينا النتيجة التالية.

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
4           Mark        25          Rich-Mond   65000.0
5 David 27 Texas 85000.0

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

يمكن استخدام الاستعلام الفرعي أيضًا مع جملة INSERT. يمكن استخدام أي وظيفة نصية، أو تاريخية، أو عددية لتعديل البيانات المختارة في الاستعلام الفرعي.

以下是基本语法如下-

INSERT INTO table_name [ (column1 [, column2 ])
   SELECT [ *|column1 [, column2 ]
   FROM table1 [, table2 ]
   [ WHERE VALUE OPERATOR ]

示例

النظر في جدول COMPANY_BKP، الذي له بنية مشابهة لجدول COMPANY، ويُمكن استخدامه كاسم جدول باستخدام نفس الأمر CREATE TABLE. لنسخ جدول COMPANY كاملاً إلى COMPANY_BKP، استخدم الجملة التالية-

sqlite> INSERT INTO COMPANY_BKP
   SELECT * FROM COMPANY 
   WHERE ID IN (SELECT ID 
      FROM COMPANY) ;

带有UPDATE语句的子查询

子查询可以与UPDATE语句结合使用。使用带有UPDATE语句的子查询时,可以更新表中的单列或多列。

以下是基本语法如下-

UPDATE tableSET column_name = new_value[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
      FROM TABLE_NAME)
   [ WHERE) ]

示例

假设我们有COMPANY_BKP表可用,它是COMPANY表的备份。

以下示例将COMPANY表中年龄大于或等于27岁的所有客户的薪资更新0.50倍。

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

这将影响两行,最后COMPANY表将具有以下记录-

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  10000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5                                     David                              27                                  Texas                              42500.0
6                                     Kim                              22                                  South-Hall                      45000.0
7                                     James                          24                                  Houston                          10000.0

带有DELETE语句的子查询

子查询可以与DELETE语句一起使用,就像上面提到的任何其他语句一样。

以下是基本语法如下-

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

示例

假设我们有COMPANY_BKP表可用,它是COMPANY表的备份。

下面的示例从COMPANY表中删除年龄大于或等于27的所有客户的记录。

sqlite> 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.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5                                     David                              27                                  Texas                              42500.0
6                                     Kim                              22                                  South-Hall                      45000.0
7                                     James                          24                                  Houston                          10000.0