MySQL 表查詢之子查詢


子查詢的概念

  1. 一個查詢的結果做為另一個查詢的條件
  2. 有查詢的嵌套,內部的查詢稱為子查詢
  3. 子查詢要使用括號

子查詢結果的三種情況

  1. 子查詢的結果是單行單列
  2. 子查詢的結果是多行單列
  3. 子查詢的結果是多行多列

子查詢的結果是一個值

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 后面作為表進行二次查詢


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM