多表联查

多表联查可以使用三种方式进行查询,分别是笛卡尔积、连接查询、子查询;其中连接查询分为内连接、左外连接、右外连接。

笛卡尔积

语法格式:

  1. SELECT * FROM dept,emp WHERE 两张表的关联关系

示例代码:

  1. SELECT * FROM dept,emp WHERE dept.deptno = emp.deptno AND dept.dname = 'research

连接查询

连接查询可分为内连接、左外连接、右外连接。

工作中常用的是 小表 LEFT JOIN 大表 用小表驱动大表

左边写小表右边写大表

内连接 INNER JOIN

内连接会取两个表的交集

语法为:

  1. SELECT * FROM emp e INNER JOIN dept d
  2. ON 两张表的连接条件 WHERE 筛选条件

示例代码:

  1. -- 查询在部门research工作的员工信息
  2. SELECT * FROM emp e INNER JOIN dept d
  3. ON e.deptno = d.deptno
  4. SELECT * FROM emp e INNER JOIN dept d
  5. ON e.deptno = d.deptno WHERE d.dname = 'research'

左(外)连接 LEFT JOIN

左外连接查询将会查询左表所有数据和右边满足条件的数据

语法为:

  1. SELECT * FROM emp e LEFT JOIN dept d
  2. ON 两张表的连接条件 WHERE 筛选条件

示例代码:

  1. -- 查询在部门research工作的员工信息
  2. SELECT * FROM emp e LEFT JOIN dept d
  3. ON e.deptno = d.deptno
  4. SELECT * FROM emp e LEFT JOIN dept d
  5. ON e.deptno = d.deptno WHERE d.dname = 'research'

右(外)连接 RIGHT JOIN

右外连接查询将会查询右表所有数据和左边满足条件的数据

语法为:

  1. SELECT * FROM emp e RIGHT JOIN dept d
  2. ON 两张表的连接条件 WHERE 筛选条件

示例代码:

  1. -- 查询在部门research工作的员工信息
  2. SELECT * FROM emp e RIGHT JOIN dept d
  3. ON e.deptno = d.deptno
  4. SELECT * FROM emp e RIGHT JOIN dept d
  5. ON e.deptno = d.deptno WHERE d.dname = 'research'

子查询(嵌套查询)

子查询将会把两个查询语句进行嵌套,在外面的查询语句为父查询或外层查询,在里面的查询语句为子查询或内层查询,将子查询的查询结果作为条件进行再次查询即父查询。

语法格式:

  1. SELECT 需要查询的记录 FROM 表名
  2. WHERE 字段名 = (
  3. SELECT 字段名 FROM 表名
  4. WHERE 筛选条件
  5. )

示例代码:

  1. -- 查询部门名称为accounting的所有信息
  2. -- 1.根据部门名称查询部门编号
  3. SELECT deptno FROM WHERE dname = 'accounting'
  4. -- 2.根据查询到的编号进行员工信息查询
  5. SELECT * FROM emp WHERE depton = 1
  6. SELECT * FROM emp
  7. WHERE deptno = (
  8. SELECT deptno FROM dept
  9. WHERE dname = 'accounting'
  10. )

SQL语句执行顺序

  1. (1) FROM [left_table] 选择表
  2. (2) ON <join_condition> 链接条件
  3. (3) <join_type> JOIN <right_table> 链接
  4. (4) WHERE <where_condition> 条件过滤
  5. (5) GROUP BY <group_by_list> 分组
  6. (6) AGG_FUNC(column or expression),... 聚合
  7. (7) HAVING <having_condition> 分组过滤
  8. (8) SELECT (9) DISTINCT column,... 选择字段、去重
  9. (9) ORDER BY <order_by_list> 排序
  10. (10) LIMIT count OFFSET count; 分页
  1. select 字段名 from 表名 left join 表名 on 连接条件 orderby 字段名 desc(降序) asc(升序)