English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا الدرس، ستتعلم كيفية إدراج استعلام داخل استعلام آخر في SQL.
الاستعلام الفرعي، المعروف أيضًا باسم الاستعلام العميق أو الاستعلام الفرعي، هوSELECTمدمج في استعلام SQL آخر WHERE 或 HAVINGالاستعلام الفرعي في الجملة. البيانات التي يستعيد الاستعلام الفرعي تستخدمها الجملة الخارجية بنفس الطريقة التي تستخدم فيها القيم النصية.
الاستعلام الفرعي يقدم طريقة بسيطة وفعالة لتعامل الاستعلامات التي تعتمد على نتائج استعلام آخر. إنه يشبه إلى حد كبير جملة SELECT العادية، ولكنه يفتقر إلى قيود. النقاط الرئيسية الأكثر أهمية هي كما يلي:
子查询必须始终出现在括号内。
子查询必须只返回一列。这意味着不能在子查询中使用SELECT *,除非所引用的表只有一列。如果目的是行比较,可以使用返回多列的子查询。
子查询不能是UNION。只允许一个SELECT语句。
子查询最常与SELECT语句一起使用,但是也可以在INSERT,UPDATE或DELETE语句中或在另一个子查询中使用它们。
以下语句仅返回订单表中订单价值超过5000美元的那些客户的详细信息。还要注意,我们在子查询中使用了关键字DISTINCT从结果集中消除了重复的cust_id值。
SELECT * FROM customers; WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders WHERE order_value > 5000);
提示:子查询可以返回单个值,单个行,单个列或包含一个或多个行或一个或多个列的表。
子查询也可以与INSERT语句一起使用。这是一个实例:
INSERT INTO premium_customers; SELECT * FROM customers; WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders WHERE order_value > 5000);
上面的语句将通过使用子查询返回的数据,将高级客户的记录插入名为premium_customers的表中。这里的高级客户是已下订单价值超过5000美元的客户。
提示:查阅有关SQL克隆表的教程,以了解如何使用INSERT ... SELECT语句快速将多行从另一个表插入到表中。
您还可以将子查询与UPDATE语句结合使用,以更新表中的单列或多列,如下所示:
UPDATE orders; SET order_value = order_value + 10; WHERE cust_id IN (SELECT cust_id FROM customers WHERE postal_code = 75016);
سيتم تحديث قيمة الطلب لـ (orders) بزيادة 10 دولارات عن القيمة الحالية للعملاء الذين لديهم رمز البريد 75016.
بالمثل، يمكن دمج الاستعلام الفرعي مع جملة DELETE ل�除 سطر واحد أو أكثر من الجدول، مثلما هو موضح أدناه:
DELETE FROM orders WHERE order_id IN (SELECT order_id FROM order_details WHERE product_id = 5);
الجملة SQL في المثال أعلاه ستعبر عنproduct_idحذف هذه الطلبات من جدول أوامر المنتج 5.