MYSQL数据库学习十一 多表数据记录查询

时间:2023-01-18 19:40:38

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;