课程是国外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'