MySQL学习之连表

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操作符

# 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
          ;
    # ===========================================================================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值