Mosh--Mysql 学习笔记(三) 连接

课程是国外Mosh Hamedani 的付费Mysql课程。 该课程干货满满,没有废话。并且授课方式目的性强,适合各个基础的学生。 课程在B站有搬运,大家动动手就可以找到~~ 希望能帮助到各位同学

第三章 连接

本章覆盖了mysql中的所有连接方式,包括内连接,外连接,自连接,多表连接,跨数据库连接,联合,自然连接,交叉连接。

第一节 内连接

为了数据的稳定性和可维护性,我们通常把每一种数据(比如customers)抽离形成单独的表,比如在orders表中我们通过customer_id来标注是哪一个客户下的订单,而不是使用用户的名字。因为用户可能在将来修改自己的地址,名字等属性,这就会造成表的高度耦合。 通过抽离我们可以直接在customer表中修改客户属性来实现数据的更新,不需要我们在orders表中修改客户的属性。

首先我们观察orders表的数据。

select * from orders


我们可以观察到这里我们看不见用户的具体信息,所以我们要通过连接orders表和customers表来在同一个表(结果集)中展示订单和用户的具体信息

SELECT 
    o.order_id,c.first_name
FROM
    sql_store.orders o
        JOIN
    customers c ON o.customer_id = c.customer_id //这样我们就实现了在一张表中展示订单号和下订单的客户名

在这里插入图片描述

章节练习

在一张表中展示订单号,具体的产品名字,数量,单价

select oi.order_id,p.name,oi.quantity,oi.unit_price from 
order_items oi
join products p on oi.product_id = p.product_id

在这里插入图片描述

第二节 跨数据库连接

这个比较简单,只需要在表的前面加上具体数据库的前缀便可

select oi.order_id,p.name,oi.quantity,oi.unit_price from 
sql_store.order_items oi// 注意这两行代码,这里把products表移到了另一个数据库,我们利用前缀关联了跨数据库的两张表
join sql_inventory.products p //注意这两行代码,这里把products表移到了另一个数据库,我们利用前缀关联了跨数据库的两张表
on oi.product_id = p.product_id
第三节 自连接

首先我们观察目标数据,这是一张employee表格,里面记录了员工的基本信息。请重点观察reports_to列,这里记录了每一个员工的汇报对象。恰好这个对象就是37270,这个人没有汇报对象。所以我们可以自连接本表,把每个员工的汇报对象替换成一个具体的人名。

在这里插入图片描述

SELECT  e.employee_id,e.first_name,e.last_name,m.first_name as reports_to FROM employees e
join employees m on e.reports_to = m.employee_id

在这里插入图片描述

第三节 多表连接

在orders表中,有status 状态一列属性,用于标注订单的状态信息。
在这里插入图片描述
在之前的章节中,我们通过连接orders.customer_id = customers.customer_id实现了在一张表格显示 订单编号和具体的客户名字,现在我们可以通过order.status = order_statues.status_id 在同一张表上显示 订单编号和顶带状态


SELECT * FROM sql_store.orders o	
join customers c on o.customer_id = c.customer_id
join order_statuses os on o.status = os.order_status_id
第四节 复合连接

对于有多个主键的表单连接,需要匹配所有的主键列。

第五节 隐式连接

和明示连接相比,Mysql也提供的隐式连接的语法支持,即不明确的使用 JOIN 关键字来连接2张表 。 对于实现相同功能,隐式连接有如下不同

明示连接 使用JOIN

select * from orders o
join customers c on
o.customer_id = c.customer_id

隐式连接 不使用JOIN

select * from 
orders o, customers c
where o.customer_id = c.customer_id

并不推荐这种隐式连接语法。

第六节 外连接
  • 在连接时, 使用内连接会自动隐藏没有被匹配的行值,比如连接orders和 customers时, 内连接会自动隐藏没有订单的客户。
    但是只要使用外连接,就可以显示出没有下订单的客户。
  • 外连接 关键字OUTER JOIN ,其中 OUTER 可写可不写。
  • 外连接有 left join 和right join,可以选择某个被连接的表作为 ‘基准表’。
Select * from 
orders o 
right join customers c 
on o.customer_id = c.customer_id

等价于

Select * from 
 customers c 
 left join orders o 
on o.customer_id = c.customer_id

多表外连接的方式语法类似。

第九节 自外连接 self outer join
第十节 USING 关键字

如果背连接的两张表有想通的列名,我们可以省略 join …on … 语法直接使用 USING(列名)

select * from
orders 
join customers
USING(customer_id)
自然连接 nature join 交叉连接
  • 自然连接类似mysql的自动检测,不推荐使用。
  • 交叉连接就是笛卡尔乘积连接。 关键字 CROSS JOIN。 如果不期望使用交叉连接 就一定要使用连接条件。
联合 UNION
  • 用于合并相同属性(列数,列值相同)的两张表
SELECT 
    order_id,
    order_date,
    'active' as status
FROM
    sql_store.orders
WHERE
    order_date >= '2019-01-01'
    
UNION//我在这!!!!!!!!!!!!

SELECT 
    order_id,
    order_date,
    'archived' as status
FROM
    sql_store.orders
WHERE
    order_date <= '2019-01-01'

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值