连接查询
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