SQL 嵌套查詢的具體使用
嵌套查詢又稱子查詢,有select子查詢,where子查詢,from子查詢,exists子查詢。
插入數(shù)據(jù)
#創(chuàng)建表及插入記錄 CREATE TABLE class ( cid int(11) NOT NULL AUTO_INCREMENT, caption varchar(32) NOT NULL, PRIMARY KEY (cid) ) ENGINE=InnoDB CHARSET=utf8; INSERT INTO class VALUES (1, '三年二班'), (2, '三年三班'), (3, '一年二班'), (4, '二年九班'); CREATE TABLE course( cid int(11) NOT NULL AUTO_INCREMENT, cname varchar(32) NOT NULL, teacher_id int(11) NOT NULL, PRIMARY KEY (cid), KEY fk_course_teacher (teacher_id), CONSTRAINT fk_course_teacher FOREIGN KEY (teacher_id) REFERENCES teacher (tid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO course VALUES (1, '生物', 1), (2, '物理', 2), (3, '體育', 3), (4, '美術(shù)', 2); CREATE TABLE score ( sid int(11) NOT NULL AUTO_INCREMENT, student_id int(11) NOT NULL, course_id int(11) NOT NULL, num int(11) NOT NULL, PRIMARY KEY (sid), KEY fk_score_student (student_id), KEY fk_score_course (course_id), CONSTRAINT fk_score_course FOREIGN KEY (course_id) REFERENCES course (cid), CONSTRAINT fk_score_student FOREIGN KEY (student_id) REFERENCES student(sid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO score VALUES (1, 1, 1, 10), (2, 1, 2, 9), (5, 1, 4, 66), (6, 2, 1, 8), (8, 2, 3, 68), (9, 2, 4, 99), (10, 3, 1, 77), (11, 3, 2, 66), (12, 3, 3, 87), (13, 3, 4, 99), (14, 4, 1, 79), (15, 4, 2, 11), (16, 4, 3, 67), (17, 4, 4, 100), (18, 5, 1, 79), (19, 5, 2, 11), (20, 5, 3, 67), (21, 5, 4, 100), (22, 6, 1, 9), (23, 6, 2, 100), (24, 6, 3, 67), (25, 6, 4, 100), (26, 7, 1, 9), (27, 7, 2, 100), (28, 7, 3, 67), (29, 7, 4, 88), (30, 8, 1, 9), (31, 8, 2, 100), (32, 8, 3, 67), (33, 8, 4, 88), (34, 9, 1, 91), (35, 9, 2, 88), (36, 9, 3, 67), (37, 9, 4, 22), (38, 10, 1, 90), (39, 10, 2, 77), (40, 10, 3, 43), (41, 10, 4, 87), (42, 11, 1, 90), (43, 11, 2, 77), (44, 11, 3, 43), (45, 11, 4, 87), (46, 12, 1, 90), (47, 12, 2, 77), (48, 12, 3, 43), (49, 12, 4, 87), (52, 13, 3, 87); CREATE TABLE student( sid int(11) NOT NULL AUTO_INCREMENT, gender char(1) NOT NULL, class_id int(11) NOT NULL, sname varchar(32) NOT NULL, PRIMARY KEY (sid), KEY fk_class (class_id), CONSTRAINT fk_class FOREIGN KEY (class_id) REFERENCES class (cid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO student VALUES (1, '男', 1, '理解'), (2, '女', 1, '鋼蛋'), (3, '男', 1, '張三'), (4, '男', 1, '張一'), (5, '女', 1, '張二'), (6, '男', 1, '張四'), (7, '女', 2, '鐵錘'), (8, '男', 2, '李三'), (9, '男', 2, '李一'), (10, '女', 2, '李二'), (11, '男', 2, '李四'), (12, '女', 3, '如花'), (13, '男', 3, '劉三'), (14, '男', 3, '劉一'), (15, '女', 3, '劉二'), (16, '男', 3, '劉四') CREATE TABLE teacher( tid int(11) NOT NULL AUTO_INCREMENT, tname varchar(32) NOT NULL, PRIMARY KEY (tid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO teacher VALUES (1, '張磊老師'), (2, '李平老師'), (3, '劉海燕老師'), (4, '朱云海老師'), (5, '李杰老師');
select子查詢(外語句先執(zhí)行,內(nèi)語句后執(zhí)行)
例1. 查詢課程名并顯示課程老師的名稱
? select * from course c where c.teacher_id='1'; select * from teacher t where t.tid='1'; ??-- 最后拼接 select * ,(select tname from teacher t where t.tid=c.teacher_id)name from course c;

where 子查詢(先執(zhí)行子查詢,再執(zhí)行外查詢)
例2.查詢學(xué)習(xí)了體育的學(xué)生
-- 選擇了體育學(xué)生的id select sc.student_id from course co left join score sc on co.cid=sc.course_id where cname='體育' -- 通過學(xué)生表用學(xué)生id匹配學(xué)生姓名 select st.sname from student st where st.sid in( select sc.student_id from course co left join score sc on co.cid=sc.course_id where cname='體育')
部分結(jié)果:

from 子查詢(先執(zhí)行子查詢,再執(zhí)行外查詢)
例3.列出三年二班學(xué)了體育的學(xué)生
select a.* from (select st.sname,cl.caption from score sc left join course co on sc.course_id=co.cid left join student st on st.sid=sc.student_id left join class cl on cl.cid=st.class_id where co.cname='體育')a where a.caption='三年二班';

exists 子查詢
(先執(zhí)行外語句,再執(zhí)行子查詢,根據(jù)子查詢返回結(jié)果判斷是否保留外查詢結(jié)果)
例4.查詢學(xué)了課程di為1的學(xué)生的姓名
select * from student st where exists( select *from score sc where course_id='1' and sc.student_id=st.sid );

總結(jié)
sql查詢本質(zhì)就是對各種表進行裁剪和拼接,最后得到我們想要的數(shù)據(jù)。
所有的能通過子查詢完成的查詢都能用連接查詢完成,如例1:查詢課程名并顯示課程老師的名稱
select *from course co left join teacher te on te.tid=co.teacher_id;

所以要靈活運用查詢方式,才能更高效的查詢。
到此這篇關(guān)于SQL 嵌套查詢的具體使用的文章就介紹到這了,更多相關(guān)SQL 嵌套查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQLSERVER分頁查詢關(guān)于使用Top方式和row_number()解析函數(shù)的不同
這篇文章主要介紹了SQLSERVER分頁查詢關(guān)于使用Top方式和row_number()解析函數(shù)的不同的相關(guān)資料,需要的朋友可以參考下2016-02-02
Superset實現(xiàn)動態(tài)SQL查詢功能
這篇文章給大家介紹使用自定義參數(shù)方式實現(xiàn) superset 實現(xiàn)SQL動態(tài)查詢功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-08-08
sql使用cast進行數(shù)據(jù)類型轉(zhuǎn)換示例
這篇文章主要介紹了sql使用cast進行數(shù)據(jù)類型轉(zhuǎn)換,需要的朋友可以參考下2014-03-03
SQL Server臨時表的正確刪除方式(sql server 刪除臨時表)
臨時表與一般的表不同,它是保存到tempDb表中。臨時表的表名與你所建的表名也不一樣,因為他要為不同人的相同操作創(chuàng)建不同的臨時表。下文將為您分別示例正確和錯誤的刪除操作,感興趣的朋友一起看看吧2023-02-02
MSSQL優(yōu)化之探索MSSQL執(zhí)行計劃(轉(zhuǎn))
最近總想整理下對MSSQL的一些理解與感悟,卻一直沒有心思和時間寫,晚上無事便寫了一篇探索MSSQL執(zhí)行計劃,本文講執(zhí)行計劃但不僅限于講執(zhí)行計劃2011-10-10
SQLSERVER編譯與重編譯發(fā)生場景及重用的利弊介紹
本文將介紹編譯的含義;執(zhí)行計劃重用的利弊以及重編譯的發(fā)生場景等等,為您學(xué)習(xí)SQLSERVER編譯與重編譯打下很好的基礎(chǔ),感興趣的朋友可以了解下2013-01-01
Sql中將datetime轉(zhuǎn)換成字符串的方法(CONVERT)
這篇文章主要介紹了Sql中將datetime轉(zhuǎn)換成字符串的方法,需要的朋友可以參考下2014-04-04

