SELECT语句关键字的定义顺序
SELECT DISTINCT <select_list>
FROM <left_table>
<join_type> JOIN <right_table>
ON <join_condition>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number>;
SELECT语句关键字的执行顺序
(7) SELECT
(8) DISTINCT <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) HAVING <having_condition>
(9) ORDER BY <order_by_condition>
(10) LIMIT <limit_number>
连表
join 连表:
SQL 表连接 用于把来自两个或多个表的行结合起来
表连接有啥作用呢?
当我们的数据横跨 2 个或 2 个以上的表时,我们就要考虑要怎么排列这两个表中的数据,好让它们组成一个大的表
数据库系统把这种多个表数据的排列方式叫做表连接 ( SQL JOIN )
SQL JOIN 子句通过两个或两个以上的表的共有字段,将这些表的行结合起来
连表太多会影响性能
交叉连接
select * from tb1, tb2;
多张表直接连生成笛卡尔积
内连接
2. 内联结:只连接匹配的行
找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了正确的结果
select * from tb1 [inner] join tb2 on tb1.id = tb2.id;
等同于
select * from tb1, tb2 where tb1.id = tb2.id;
这种形式为内联结(不显示值为Null的行)
外连接之左连接
3. 外联结之左联结:优先显示左表全部记录
select * from tb1 left [outer] join tb2 on tb1.id = tb2.id;
以左表为准,即找出所有员工信息,当然包括没有部门的员工
本质就是:在内连接的基础上增加左边有右边没有的结果
外连接之右连接
4. 外联结之右联结:优先显示右表全部记录
select * from tb1 right [outer] join tb2 on tb1.id = tb2.id;
以右表为准,即找出所有部门信息,包括没有员工的部门
本质就是:在内连接的基础上增加右边有左边没有的结果
全外连接
5. 全外联结:显示左右两个表全部记录
在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
注意:mysql不支持全外连接 full JOIN
强调:mysql可以使用UNION操作符间接实现全外连接
union操作符
SQL UNION 操作符合并两个或多个 SELECT 语句的结果
UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名
1. 不允许重复 union
SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2;
2. 允许重复值 union all
SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2;
但这些 SELECT 语句 的结果集必须符合一定的要求:
1. 每个 SELECT 语句必须拥有相同数量的列
2. 列也必须拥有相似的数据类型
3. 每个 SELECT 语句中的列的顺序必须相同
union 上下联表,自动去重,all选项可保留重复的行
select * from employee left join department on employee.dep_id = department.id
union
select * from employee right join department on employee.dep_id = department.id
;