1合并结果集,使用关键字union和union all,其区别是union会去掉合并中重复的部分而union all不会去掉重复的列。使用这个关键字的要求结果姐的列和类型必须相同。
定义两个表如下所示:a和b,两个表分别有一个整型的id和一个字符串的name。
1.1使用union all
SELECT * FROM a UNION ALL SELECT * FROM b;
1.2使用union
SELECT * FROM a UNION SELECT * FROM b;
2内连接
2.1这个是带有方言的方式,在oracle可能不适合
SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;
2.2这个是最标准的内连接的书写方式,建议用这个
SELECT * FROM emp e INNER JOIN dept d ON e.deptno=d.deptno;
2.3 natural join不需要on他自动根据两个表相同的字段自动匹配
SELECT * FROM emp NATURAL JOIN dept d ;
3外链接
外链接分为左外连接,和右外连接。MySQL不支持全外连接。
3.1左外连接,是指以左表为主,当两个表进行连接的时候,右边的表的值没有时,会以左边的表为主,即会把左边所有的值都列出来,右表没有的补null。
SELECT * FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;
3.2右外连接和左外连接相反,他是以右表为主,当两个表进行连接的时候,左边的表没有值的时候,会以右表为准,即会把右表所有的值都列出来,左表没有的补null。
SELECT * FROM emp e RIGHT JOIN dept d ON e.deptno=d.deptno;
3.3全外连接,mysql不支持全外连接,但是可以通过将左外连接和右外连接结合起来,即union,即可得到全外连接。
SELECT * FROM emp e RIGHT JOIN dept d ON e.deptno=d.deptno
UNION
SELECT * FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;
4子查询
可以通过查看select关键字的个数来作为判断
4.1. 出现的位置:
where后作为条件存在(一般是多行单列)
from后作为表存在(多行多列)
4.2. 条件
单行单列:SELECT * FROM 表1 别名1 WHERE 列1 [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 别名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 条件)
多行多列:SELECT * FROM 表1 别名1 , (SELECT ....) 别名2 WHERE 条件
5MySQL的关键字查询的顺序