连接查询

  1. 内连接
    * 方言:SELECT * FROM 表1 别名1, 表2 别名2 WHERE 别名1.xx=别名2.xx
    * 标准:SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
      > 只有两张表中都符合条件的数据, 才会被显示, 也就是两张表数据的交集

  2. 外连接
    * 左外:SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
      > 左表记录无论是否满足条件都会查询出来,而右表只有满足条件才能出来。左表中不满足条件的记录,右表部分都为NULL
    
    * 右外:SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
      > 右表记录无论是否满足条件都会查询出来,而左表只有满足条件才能出来。右表不满足条件的记录,其左表部分都为NULL
    
子查询
  1. 出现的位置:
    * where后作为条件存在
    * from后作为表存在(一般结果是多行多列)
    * 出现在select后, 这种情况非常少

  2. 条件 (括号中的 * 的个数 代表重要程度, 以及是否常用)
    * (***)单行单列:SELECT * FROM 表1 别名1 WHERE 列1 [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 别名2 WHERE 条件)
    * (***)多行多列:SELECT * FROM 表1 别名1 , (SELECT ....) 别名2 WHERE 条件
    * (**) 多行单列:SELECT * FROM 表1 别名1 WHERE 列1 [IN, ALL, ANY] (SELECT 列 FROM 表2 别名2 WHERE 条件)
    * (*)  单行多列:SELECT * FROM 表1 别名1 WHERE (列1,列2) IN (SELECT 列1, 列2 FROM 表2 别名2 WHERE 条件)
  3.子查询语句的嵌套(例子)
    CREATE DATABASE test;
    USE test;

    CREATE TABLE student(
        sid INT PRIMARY KEY AUTO_INCREMENT,
        sname VARCHAR(20)
    );

    CREATE TABLE course(
        cid INT PRIMARY KEY AUTO_INCREMENT,
        cname VARCHAR(20)
    );

    CREATE TABLE stu_course(
        sid INT,
        cid INT,
        CONSTRAINT fk_stu FOREIGN KEY (sid) REFERENCES student(sid),
        CONSTRAINT fk_course FOREIGN KEY (cid) REFERENCES course(cid)
    );

    INSERT INTO student VALUES (NULL,'刘饼'),(NULL,'梁俊'),(NULL,'小白'),(NULL,'秦超');
    INSERT INTO course VALUES (NULL,'JAVAEE'),(NULL,'PHP'),(NULL,'UI'),(NULL,'ANDROID');

    INSERT INTO stu_course VALUES (1,1),(1,3),(2,2),(2,3),(2,4),(3,1),(4,2),(4,4),(4,1),(4,3);

    -- 查询所有学生的选课情况:内连接
    SELECT s.sname,c.cname FROM student s,course c,stu_course sc WHERE s.sid=sc.sid AND c.cid = sc.cid AND c.cname='JAVAEE' ORDER BY s.sname;

    -- 查询所有学生的选课情况:左外连接
    SELECT s.sname,c.cname FROM stu_course sc LEFT JOIN student s ON s.sid=sc.sid LEFT JOIN course c ON c.cid=sc.cid WHERE c.cname='JAVAEE';

    -- 查询每个学生选课的数量:内连接
    SELECT s.sname,COUNT(c.cname) FROM student s,course c,stu_course sc WHERE s.sid=sc.sid AND c.cid = sc.cid GROUP BY s.sname;

    -- 查询每个学生选课的数量:右外连接
    SELECT s.sname,c.cname FROM student s RIGHT JOIN (course c RIGHT JOIN stu_course sc ON sc.cid = c.cid) ON s.sid=sc.sid;
 4.SQL查询语句的一个书写顺序
    select --from -- where --group by--having--order by