多表联查
多表联查可以使用三种方式进行查询,分别是笛卡尔积、连接查询、子查询;其中连接查询分为内连接、左外连接、右外连接。
笛卡尔积
语法格式:
SELECT * FROM dept,emp WHERE 两张表的关联关系
示例代码:
SELECT * FROM dept,emp WHERE dept.deptno = emp.deptno AND dept.dname = 'research
连接查询
连接查询可分为内连接、左外连接、右外连接。
工作中常用的是 小表 LEFT JOIN 大表 用小表驱动大表
左边写小表右边写大表
内连接 INNER JOIN
内连接会取两个表的交集
语法为:
SELECT * FROM emp e INNER JOIN dept d
ON 两张表的连接条件 WHERE 筛选条件
示例代码:
-- 查询在部门research工作的员工信息
SELECT * FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno
SELECT * FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno WHERE d.dname = 'research'
左(外)连接 LEFT JOIN
左外连接查询将会查询左表所有数据和右边满足条件的数据
语法为:
SELECT * FROM emp e LEFT JOIN dept d
ON 两张表的连接条件 WHERE 筛选条件
示例代码:
-- 查询在部门research工作的员工信息
SELECT * FROM emp e LEFT JOIN dept d
ON e.deptno = d.deptno
SELECT * FROM emp e LEFT JOIN dept d
ON e.deptno = d.deptno WHERE d.dname = 'research'
右(外)连接 RIGHT JOIN
右外连接查询将会查询右表所有数据和左边满足条件的数据
语法为:
SELECT * FROM emp e RIGHT JOIN dept d
ON 两张表的连接条件 WHERE 筛选条件
示例代码:
-- 查询在部门research工作的员工信息
SELECT * FROM emp e RIGHT JOIN dept d
ON e.deptno = d.deptno
SELECT * FROM emp e RIGHT JOIN dept d
ON e.deptno = d.deptno WHERE d.dname = 'research'
子查询(嵌套查询)
子查询将会把两个查询语句进行嵌套,在外面的查询语句为父查询或外层查询,在里面的查询语句为子查询或内层查询,将子查询的查询结果作为条件进行再次查询即父查询。
语法格式:
SELECT 需要查询的记录 FROM 表名
WHERE 字段名 = (
SELECT 字段名 FROM 表名
WHERE 筛选条件
)
示例代码:
-- 查询部门名称为accounting的所有信息
-- 1.根据部门名称查询部门编号
SELECT deptno FROM WHERE dname = 'accounting'
-- 2.根据查询到的编号进行员工信息查询
SELECT * FROM emp WHERE depton = 1
SELECT * FROM emp
WHERE deptno = (
SELECT deptno FROM dept
WHERE dname = 'accounting'
)
SQL语句执行顺序
(1) FROM [left_table] 选择表
(2) ON <join_condition> 链接条件
(3) <join_type> JOIN <right_table> 链接
(4) WHERE <where_condition> 条件过滤
(5) GROUP BY <group_by_list> 分组
(6) AGG_FUNC(column or expression),... 聚合
(7) HAVING <having_condition> 分组过滤
(8) SELECT (9) DISTINCT column,... 选择字段、去重
(9) ORDER BY <order_by_list> 排序
(10) LIMIT count OFFSET count; 分页
select 字段名 from 表名 left join 表名 on 连接条件 orderby 字段名 desc(降序) asc(升序)