子查詢的概念
- 一個查詢的結果做為另一個查詢的條件
- 有查詢的嵌套,內部的查詢稱為子查詢
- 子查詢要使用括號
子查詢結果的三種情況
- 子查詢的結果是單行單列
- 子查詢的結果是多行單列
- 子查詢的結果是多行多列
子查詢的結果是一個值
SELECT 查詢字段 FROM 表 WHERE 字段=(子查詢);
如:
創建一個學生個人信息表
CREATE TABLE students(
Id INT(30),
Name VARCHAR(10),
Age INT(4),
Gender VARCHAR(25),
PRIMARY KEY(Id)
);
創建一個學習成績表
CREATE TABLE course(
Id INT(30),
Java INT(5),
Python INT(5),
MySQL INT(5),
Hadoop INT(5),
C INT(5),
PHP INT(5),
Linux INT(5),
English INT(5),
Math INT(5),
CONSTRAINT id_course FOREIGN KEY(Id) REFERENCES students(Id)
);
案例:要查詢Java成績最高的學生的信息
SELECT * FROM students
WHERE id = (
SELECT id FROM course
WHERE Java = (
SELECT MAX(Java)FROM course
)
);
子查詢結果是多行單列
子查詢結果是單例多行,結果集類似於一個數組,父查詢使用 IN 運算符,或者BETWEEN ... AND ...
SELECT 查詢字段 FROM 表 WHERE 字段 IN (子查詢);
案例:要查詢低於Java平均分的學生的信息
SELECT * FROM students
WHERE id BETWEEN
(SELECT MIN(id) FROM course WHERE Java < (SELECT AVG(Java) FROM course))
AND
(SELECT MAX(id) FROM course WHERE Java < (SELECT AVG(Java) FROM course));
子查詢的結果是多行多列
子查詢結果只要是多列,肯定在 FROM 后面作為表
SELECT 查詢字段 FROM (子查詢) 表別名 WHERE 條件;
子查詢作為表需要取別名,否則這張表沒有名稱則無法訪問表中的字段
如:查詢學生的信息和Java、Python、English、Math成績,且要求Math成績大於平均分
第一步:查詢Java、Python、English、Math所有成績
SELECT Java, Python, English, Math, id FROM course AS course1
第二步:查詢Math成績的平均分
SELECT AVG(Math) FROM course
第三步:利用表連接,查詢學生信息,和要求查詢的學生科目,及分數要求
SELECT * FROM students
INNER JOIN (SELECT Java, Python, English, Math, id FROM course) AS course1 ON students.Id = course1.Id
WHERE Math > (SELECT AVG(Math) FROM course);
自查詢總結:
-
子查詢結果只要是單列,則在 WHERE 后面作為條件
-
子查詢結果只要是多列,則在 FROM 后面作為表進行二次查詢