11.1 关系数据操作
并(UNION):把具有相同字段数目和字段类型的表合并到一起。
笛卡尔积(CARTESIAN PRODUCT):没有连接条件表关系的返回结果。字段数=table1字段数+table2字段数,记录数=table1记录数*table2记录数。
内连接(INNER JOIN):在表关系的笛卡尔积数据记录中,保留表关系中所有匹配的数据记录,舍弃不匹配的数据记录.
外连接(OUTER JOIN):在表关系的笛卡尔积数据记录中,不仅保留表关系中所有匹配的数据记录,而且还会保留部分不匹配的数据记录。
11.2 内连接(INNER JOIN)
按照匹配的条件分为:自然连接,等值连接,不等连接
1.自然连接:表关系的笛卡尔积中,首先根据表关系中相同名称的字段自动进行记录匹配,然后去掉重复的字段。
2.等值连接:表关系的笛卡尔积中,选择所匹配字段值相等(=符号)的数据记录,在新关系中不会去掉重复的字段。
3.不等连接:表关系的笛卡尔积中,选择所匹配字段值不相等(!=符号)的数据记录,在新关系中不会去掉重复的字段。
SELECT field1,field2,...,fieldn
FROM join_tablename1 INNER JOIN join_tablename2
ON join_condition
11.3 外连接(OUTER JOIN)
按照保留不匹配条件数据来源可以分为:左外连接、右外连接、全外连接
1.左外连接:表关系的笛卡尔积中,除了选择相匹配的数据记录,还包含关联左边表中不匹配的数据记录。
2.右外连接:表关系的笛卡尔积中,除了选择相匹配的数据记录,还包含关联右边表中不匹配的数据记录。
3.全外连接:表关系的笛卡尔积中,除了选择相匹配的数据记录,还包含左右两表中不匹配的数据记录。
SELECT field1,field2,...,fieldn
FROM join_tablename1 LEFT|RIGHT|FULL [OUTER] JOIN join_tablename2
ON join_condition
11.4 合并查询
MySQL通过 UNION|UNION ALL 实现并操作,UNION去掉了重复数据记录,UNION ALL没有去掉重复数据记录。
SELECT field1,field2,...,fieldn
FROM tablename1
UNION|UNION ALL
SELECT field1,field2,...,fieldn
FROM tablename2
UNION|UNION ALL
SELECT field1,field2,...,fieldn
FROM tablename3
……
11.5 子查询
通过统计函数 COUNT() 查询所关联表笛卡尔积后的数据记录数(两表数据记录乘积条数据记录数),具体SQL语句如下:
SELECT COUNT(*)
FROM t_dept,t_employee
如果查询到的数据记录数MySQL可以接受,然后才进行多表连接查询。如果查询到的数据记录数远大于MySQL软件可接受的范围,则通过子查询来实现多表查询。
11.5.1 返回结果为单行单列和单行多列
子查询一般在WHERE子句里,通常会包含比较运算符(“>”、“<”、“=”、“!=”等)。
11.5.2 返回结果为多行单列
子查询一般在WHERE子句里,通常会包含IN、ANY、ALL、EXISTS等。
IN:主查询的查询条件在子查询的查询结果中时使用。
ANY:主查询的查询条件为满足子查询查询结果中任意一条数据记录。
=ANY:功能和IN一样;
>(>=)ANY:大于(大于等于)最小的数据记录;
<(<=)ANY:小于(小于等于)最大的数据记录。
ALL:主查询的查询条件为满足子查询查询结果中所有数据记录。
>(>=)ALL:大于(大于等于)最大的数据记录;
<(<=)ALL:小于(小于等于)最小的数据记录。
EXISTS:返回记录行时条件为真,返回当前遍历到的记录,反之丢弃。
11.5.3 返回结果为多行多列子查询
子查询一般在FROM子句里,被当做一张临时表来处理。
SELECT d.deptno,d.dname,d.loc,number,average
FROM t_dept d INNER JOIN (
SELECT depno dno,COUNT(empno) number,AVG(sal) average FROM t_employee GROUP BY depno DESC) employee
ON d.deptno=employee.dno;