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

استخدام الاستعلامات الفرعية في قاعدة بيانات MySQL

لا أريد أن أتحدث عن هذا لفترة طويلة، سأقوم فقط بوضع استخدام الاستعلام الفرعي في قاعدة بيانات MySQL.

كود كما هو موضح أدناه:

</pre><pre name="code" class="sql">1. الاستعلام الفرعي هو SELECT فقرة في استعلام آخر. 
مثال: 
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2); 
من بين ذلك، SELECT * FROM t1 ... يُسمى الاستعلام الخارجي [Outer Query](أو استعلام خارجي), 
SELECT column1 FROM t2 يُسمى الاستعلام الفرعي [Sub Query]. 
لذلك، نقول إن الاستعلام الفرعي هو المدمج داخل الاستعلام الخارجي. وفي الواقع، من الممكن أن يكون هناك استعلام فرعي آخر داخل استعلام فرعي. 
子查询必须出现在圆括号之间。 
行级子查询 
SELECT * FROM t1 WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10); 
SELECT * FROM t1 WHERE ROW(col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10); 
行级子查询的返回结果最多为一行。 
优化子查询 
-- 创建数据表 
CREATE TABLE IF NOT EXISTS tdb_goods, 
goods_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
goods_name VARCHAR(150) NOT NULL, 
goods_cate VARCHAR(40) NOT NULL, 
brand_name VARCHAR(40) NOT NULL, 
goods_price DECIMAL(15,3) UNSIGNED NOT NULL DEFAULT 0, 
is_show BOOLEAN NOT NULL DEFAULT 1, 
is_saleoff BOOLEAN NOT NULL DEFAULT 0 
); 
-- 写入记录 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('R510VC 15.6英寸笔记本','笔记本','华硕','3399',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Y400N 14.0英寸笔记本电脑','笔记本','联想','4899',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('G150TH 15.6英寸游戏本','游戏本','雷神','8499',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X550CC 15.6英寸笔记本','笔记本','华硕','2799',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X240(20ALA0EYCD) 12.5英寸超极本','超级本','联想','4999',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('U330P 13.3英寸超极本','超级本','联想','4299',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('SVP13226SCB 13.3英寸触控超极本','超级本','索尼','7999',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iPad mini MD531CH/A 7.9英寸平板电脑','平板电脑','苹果','1998',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iPad Air MD788CH/A 9.7英寸平板电脑 (16G WiFi版)','平板电脑','苹果','3388',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iPad mini ME279CH/A equipped with Retina display 7.9-inch tablet computer (16G WiFi version)','tablet computer','Apple','2788',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('IdeaCentre C340 20-inch all-in-one computer ','desktop computer','Lenovo','3499',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Vostro 3800-R1206 desktop computer','desktop computer','Dell','2899',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iMac ME086CH/A 21.5-inch all-in-one computer','desktop computer','Apple','9188',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('AT7-7414LP desktop computer (i5-3450 quad-core 4G 500G 2G discrete display DVD mouse Linux)','desktop computer','Acer','3699',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Z220SFF F4F06PA workstation','server/workstation','HP','4288',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('PowerEdge T110 II服务器','服务器/工作站','戴尔','5388',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Mac Pro MD878CH/A 专业级台式电脑','服务器/工作站','苹果','28888',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W 头戴显示设备','笔记本配件','索尼','6999',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('商务双肩背包','笔记本配件','索尼','99',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X3250 M4机架式服务器 2583i14','服务器/工作站','IBM','6888',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('玄龙精英版 笔记本散热器','笔记本配件','九州风神','',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W 头戴显示设备','笔记本配件','索尼','6999',DEFAULT,DEFAULT); 
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('商务双肩背包','笔记本配件','索尼','99',DEFAULT,DEFAULT); 
-- احسب متوسط أسعار جميع منتجات الكمبيوتر و احتفظ بـ 2 أرقام عشرية،AVG,MAX,MIN،COUNT،SUM هي دوال التجميع 
SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods; 
-- جلب جميع المنتجات ذات الأسعار أعلى من السعر المتوسط وتحديد الترتيب بترتيب تنازلي للسعر 
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price > 5845.10 ORDER BY goods_price DESC; 
-- استخدم الاستعلام الفرعي لتحقيق ذلك 
SELECT goods_id,goods_name,goods_price FROM tdb_goods 
WHERE goods_price > (SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods) 
ORDER BY goods_price DESC; 
-- جلب أسعار المنتجات التي نوعها "اللابتوب" 
SELECT goods_price FROM tdb_goods WHERE goods_cate = 'اللابتوب'; 
-- جلب المنتجات ذات الأسعار أعلى أو تساوي سعر "اللابتوب" وتحديد الترتيب بترتيب تنازلي للسعر 
SELECT goods_id,goods_name,goods_price FROM tdb_goods 
WHERE goods_price = ANY(SELECT goods_price FROM tdb_goods WHERE goods_cate = 'اللابتوب') 
ORDER BY goods_price DESC; 
-- = ANY أو = SOME تساوي IN 
SELECT goods_id,goods_name,goods_price FROM tdb_goods 
WHERE goods_price IN (SELECT goods_price FROM tdb_goods WHERE goods_cate = 'اللابتوب') 
ORDER BY goods_price DESC; 
-- إنشاء جدول "فئات المنتجات" 
CREATE TABLE IF NOT EXISTS tdb_goods_cates( 
cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
cate_name VARCHAR(40) 
); 
-- جلب جميع السجلات من جدول tdb_goods وتحديد الفئات 
SELECT goods_cate FROM tdb_goods GROUP BY goods_cate; 
-- كتابة نتائج التجميع في جدول البيانات tdb_goods_cates 
INSERT tdb_goods_cates (cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate; 
-- تحديث جدول البيانات tdb_goods باستخدام جدول البيانات tdb_goods_cates 
UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate = cate_name 
SET goods_cate = cate_id ; 
-- إنشاء جدول البيانات وتسجيل السجلات باستخدام CREATE...SELECT 
-- SELECT brand_name FROM tdb_goods GROUP BY brand_name; 
CREATE TABLE tdb_goods_brands ( 
brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
brand_name VARCHAR(40) NOT NULL 
) SELECT brand_name FROM tdb_goods GROUP BY brand_name; 
-- تحديث جدول البيانات tdb_goods باستخدام جدول البيانات tdb_goods_brands (خطأ) 
UPDATE tdb_goods INNER JOIN tdb_goods_brands ON brand_name = brand_name 
SET brand_name = brand_id; 
-- عمود 'brand_name' في قائمة الحقول غير واضح 
-- صحيح 
UPDATE tdb_goods AS g INNER JOIN tdb_goods_brands AS b ON g.brand_name = b.brand_name 
SET g.brand_name = b.brand_id; 
-- عرض بنية جدول البيانات الخاصة بـ tdb_goods 
DESC tdb_goods; 
-- بيان تعديل بنية جدول البيانات باستخدام جملة ALTER TABLE 
ALTER TABLE tdb_goods 
CHANGE goods_cate cate_id SMALLINT UNSIGNED NOT NULL, 
CHANGE brand_name brand_id SMALLINT UNSIGNED NOT NULL; 
-- إدخال سجلات في جداول tdb_goods_cates و tdb_goods_brands 
INSERT tdb_goods_cates(cate_name) VALUES('موجه رأي(','مكتبة تبادل(','شبكة'); 
INSERT tdb_goods_brands(brand_name) VALUES('هائل'),('تونغهوا تونغفانغ'),('شينهو'); 
-- إدخال سجلة جديدة في جدول tdb_goods 
INSERT tdb_goods(goods_name,cate_id,brand_id,goods_price) VALUES(' LaserJet Pro P1606dn أسود وأبيض طابعة ليزر','12','4','1849'); 
-- استعلام عن تفاصيل جميع المنتجات (من خلال الاتصال الداخلي) 
SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g 
INNER JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id 
INNER JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id\G; 
-- استعلام عن تفاصيل جميع المنتجات (من خلال الاتصال الخارجي الأيسر) 
SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g 
LEFT JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id 
LEFT JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id\G; 
-- استعلام عن تفاصيل جميع المنتجات (من خلال الاتصال الخارجي الأيمن) 
SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g 
RIGHT JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id 
RIGHT JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id\G; 
-- تصميم جدول بيانات فئات لا نهائية 
CREATE TABLE tdb_goods_types( 
type_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
type_name VARCHAR(20) NOT NULL, 
parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0 
); 
INSERT tdb_goods_types(type_name,parent_id) VALUES('家用电器',DEFAULT); 
INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑、办公',DEFAULT); 
INSERT tdb_goods_types(type_name,parent_id) VALUES('大家电',1); 
INSERT tdb_goods_types(type_name,parent_id) VALUES('生活电器',1); 
INSERT tdb_goods_types(type_name,parent_id) VALUES('平板电视',3); 
INSERT tdb_goods_types(type_name,parent_id) VALUES('空调',3); 
INSERT tdb_goods_types(type_name,parent_id) VALUES('电风扇',4); 
INSERT tdb_goods_types(type_name,parent_id) VALUES('饮水机',4); 
INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑整机',2); 
INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑配件',2); 
INSERT tdb_goods_types(type_name,parent_id) VALUES('笔记本电脑',9); 
INSERT tdb_goods_types(type_name,parent_id) VALUES('超级本',9); 
INSERT tdb_goods_types(type_name,parent_id) VALUES('游戏本',9); 
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('معالج',10); 
INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('الخادم',10); 
-- العثور على جميع الفئات وما تحتويه من فروع الأب 
SELECT s.type_id,s.type_name,p.type_name FROM tdb_goods_types كـ s LEFT JOIN tdb_goods_types كـ p ON s.parent_id = p.type_id; 
-- العثور على جميع الفئات وما تحتويه من فروع 
SELECT p.type_id,p.type_name,s.type_name FROM tdb_goods_types كـ p LEFT JOIN tdb_goods_types كـ s ON s.parent_id = p.type_id; 
-- العثور على عدد جميع الفئات وما تحتويه من فروع 
SELECT p.type_id,p.type_name,عدد(s.type_name) كـ children_count FROM tdb_goods_types كـ p LEFT JOIN tdb_goods_types كـ s ON s.parent_id = p.type_id GROUP BY p.type_name ORDER BY p.type_id; 
-- إضافة حقل child_count لـ tdb_goods_types 
ALTER TABLE tdb_goods_types ADD child_count MediumInt غير قابل للتغيير DEFAULT 0; 
-- تحديث عدد الفروع المكتشفة مؤخرًا في جدول tdb_goods_types 
UPDATE tdb_goods_types كـ t1 INNER JOIN ( SELECT p.type_id,p.type_name,عدد(s.type_name) كـ children_count FROM tdb_goods_types كـ p 
JOIN tdb_goods_types كـ s ON s.parent_id = p.type_id 
GROUP BY p.type_name 
ORDER BY p.type_id ) AS t2 
ON t1.type_id = t2.type_id 
SET t1.child_count = t2.children_count; 
-- نسخ السجلات ذات الرقم 12 و 20 
SELECT * FROM tdb_goods WHERE goods_id IN (19,20); 
-- تحقيق النسخ باستخدام INSERT ... SELECT 
INSERT tdb_goods(goods_name,cate_id,brand_id) SELECT goods_name,cate_id,brand_id FROM tdb_goods WHERE goods_id IN (19,20); 
-- إيجاد السجلات المكررة 
SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2; 
-- حذف السجلات المكررة 
DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2 ) AS t2 ON t1.goods_name = t2.goods_name WHERE t1.goods_id > t2.goods_id; 

حسنًا، سأقدم لكم هذا النوع من استخدام الاستعلام الفرعي في MySQL، آمل أن يكون هذا مفيدًا لكم!

من المحتمل أن تعجبك