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ì)就是對各種表進(jìn)行裁剪和拼接,最后得到我們想要的數(shù)據(jù)。
所有的能通過子查詢完成的查詢都能用連接查詢完成,如例1:查詢課程名并顯示課程老師的名稱
select *from course co left join teacher te on te.tid=co.teacher_id;
所以要靈活運(yùn)用查詢方式,才能更高效的查詢。
到此這篇關(guān)于SQL 嵌套查詢的具體使用的文章就介紹到這了,更多相關(guān)SQL 嵌套查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL Server數(shù)據(jù)復(fù)制到的Access兩步走
以下的文章主要描述的是把SQL Server數(shù)據(jù)復(fù)制到的Access數(shù)據(jù)庫中的實(shí)際操作步驟,以及對其在實(shí)際操作中要用到的代碼描述。2015-09-09SQLSERVER對索引的利用及非SARG運(yùn)算符認(rèn)識
SQL對篩選條件簡稱:SARG(search argument/SARG)當(dāng)然這里不是說SQLSERVER的where子句,是說SQLSERVER對索引的利用,感興趣的朋友可以了解下,或許本文的知識點(diǎn)對你有所幫助哈2013-02-02使用sqlserver存儲過程sp_send_dbmail發(fā)送郵件配置方法(圖文)
這篇文章用圖文的方式介紹了使用sqlserver存儲過程sp_send_dbmail發(fā)送郵件的方法,大家參考使用吧2014-01-01SQL SERVER偏移函數(shù)(LAG、LEAD、FIRST_VALUE、LAST _VALUE、NT
本文主要介紹了SQL SERVER偏移函數(shù)(LAG、LEAD、FIRST_VALUE、LAST _VALUE、NTH_VALUE),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05在SQL Server啟動時(shí)自動執(zhí)行存儲過程。
當(dāng)sql server啟動時(shí),我很想運(yùn)行一個(gè)存儲過程。有沒有一種方法可以在每次SQL Server服務(wù)啟動時(shí)都會自動執(zhí)行這個(gè)存儲過程呢?2008-10-10關(guān)于SQL中CTE(公用表表達(dá)式)(Common Table Expression)的總結(jié)
WITH AS短語,也叫做子查詢部分(subquery factoring),可以讓你做很多事情,定義一個(gè)SQL片斷,該SQL片斷會被整個(gè)SQL語句所用到2012-08-08SQL Server日期時(shí)間加減函數(shù)(DATEDIFF、DateAdd)的使用
日期時(shí)間是常用的函數(shù),本文主要介紹了SQL Server日期時(shí)間加減函數(shù)(DATEDIFF、DateAdd)的使用,感興趣的可以了解一下2023-10-10