子查詢最常用於SELECT-SQL命令的WHERE子句中。
子查詢是一個 SELECT 語句,它嵌套在一個 SELECT、SELECT...INTO 語句、INSERT...INTO 語句、DELETE 語句、或 UPDATE 語句或嵌套在另一子查詢中
子查詢可以寫在WHERE子句、HAVING子句、FROM子句中。
子查詢分為多行子查詢和單行子查詢。
select t1.id 序號, t1.no 班級, t1.s_name 學生名字, t1.score 分數 from test_t t1 where (t1.id,t1.score) in (select t2.id, t2.score from test_t t2);
select no 班級, s_name 學生名字 from test_t where score in(select max(score) from test_t);
班級 學生名字 2 李四 3 小C
關聯子查詢:
INSERT INTO TEST_T (ID, NO, T_NAME, S_NAME, SCORE) VALUES ('10', '2', 'Mary', 'AAA', '70');
select t1.id 序號, t1.no 班級, t1.s_name 學生名字, t1.score 分數 from test_t t1 where t1.score = (select max(t2.score) from test_t t2 where t1.no = t2.no);
序號 班級 學生名字 分數 2 2 李四 99 7 1 Zhang 70 6 3 小C 99
該句使用了關聯子查詢,內層查詢用t1.no = t2.no和外層查詢的字段做匹配。 關聯子查詢的執行過程(猜測):ID NO T_NAME S_NAME SCORE 1 1 Peter 張三 60
2)到內層查詢中t2表篩選t1.no = t2.no(把同一個班級的記錄都篩選出來,返回了這個班級的最高分)ID NO T_NAME S_NAME SCORE 1 1 Peter 張三 60 4 1 Peter 小A 59 7 1 Peter Zhang 70
返回了70這個值 3)外層比較score是否和t2.score相等,這裡是不等,於是返回空 4)外層查詢繼續取下一條記錄,繼續循環 如果t1.no = t2.no判斷條件放到外層查詢中:
select t1.id 序號, t1.no 班級, t1.s_name 學生名字, t1.score 分數 from test_t t1 where t1.score = (select max(t2.score) from test_t t2) and t1.no = t2.no;
思路二(使用group by):
select id 序號, no 班級, s_name 學生名字, score 分數 from test_t where (no,score) in(select no 班級, max(score) 分數 from test_t group by no);
使用多列子查詢,先在內層查詢用班級號分組,算出最高分,返回給外層查詢
exists和not exists關鍵字 exists操作符檢查在子查詢中是否存在滿足條件的行。exists只返回true或false。 exists和關聯子查詢:
select * from test_t t1 where exists (select 1 from test_t t2 where t2.score < 60 and t1.id = t2.id);
ID NO T_NAME S_NAME SCORE 4 1 Peter 小A 59
1)從主查詢裡取出一行,到子查詢查找滿足score < 60 and t1.id = t2.id的行
select * from test_t t1 where not exists (select 1 from test_t t2 where t2.score < 90 and t1.id = t2.id);
ID NO T_NAME S_NAME SCORE 6 3 Tom 小C 99 2 2 Mary 李四 99 9 3 Tom Li 90