MYSQL学习笔记-连接

一、JOIN 语句

从多张表格选择列

USE sql_store;
SELECT order_id, o.product_id, name, quantity, o.unit_price
FROM order_items o
JOIN products p ON o.product_id = p.product_id
  • 为了方便区分,改写表格的名称。如 order_items简写为o
  • 这里的重命名写在FROM的位置,但SELECT里可以使用
  • 改写后所有位置须使用新名称

二、JOIN 用法

1. 合并不同数据库的表格

将在不同数据库的表中的列提取出来

USE sql_store;
SELECT *
FROM order_items o
JOIN sql_inventory.products p 
	ON o.product_id = p.product_id
  • 对不是当前数据库的表格需要加上前缀,例如此处的sql_inventory

2. 合并同一数据库的表格(自连接)

下表为employees表格:

employee_idfirst_namelast_namejob_titlesalaryreports_tooffice_id
33391D’arcyNortunenAccount Executive62871372701
37270YovonndaMagrannellExecutive Secretary63996NULL10
37851SayerMattersonStatistician III98926372701
40448MindyCrissilStaff Scientist94860372701
56274KeriannAlloisiVP Marketing110150372701
  • 通过employee_id和repors_to列找出该公司的员工级别关系。因此合并同一数据库内的表格employees。
USE sql_hr;
SELECT 
	e.employee_id,
	e.first_name,
    m.first_name AS manager
FROM employees e
JOIN employees m
	ON e.reports_to = m.employee_id
  • 合并前的表格命名为e,在此基础上与m进行合并,使reports_to对应于employee_id,即可找出每个员工的上级,并将其命名为manager。
  • 运行结果为:
employee_idfirst_namemanager
33391D’arcyYovonnda
37851SayerYovonnda
40448MindyYovonnda
56274KeriannYovonnda

3. 多表连接

  • payment表格如下;
payment_idclient_idinvoice_iddateamountpayment_method
1522019-02-128.181
2162019-01-0374.551
33112019-01-110.031
45132019-01-2687.441
53152019-01-1580.311
63172019-01-1568.101
75182019-01-0832.771
85182019-01-0810.002
  • payment_method表格如下
payment_method_idname
1Credit Card
2Cash
3PayPal
4Wire Transfer
  • clients 表格如下
client_idnameaddresscitystatenumber
1Vinte3 Nevada ParkwaySyracuseNY315-252-7305
2Myworks34267 Glendale ParkwayHuntingtonWV304-659-1170
3Yadel096 Pawling ParkwaySan FranciscoCA415-144-6037
4Kwideo81674 Westerfield CircleWacoTX254-750-0784
5Topiclounge0863 Farmco RoadPortlandOR971-888-9129
USE sql_invoicing;
SELECT c.client_id, c.name, p.date, p.invoice_id, amount, pm.name AS payment_method
FROM clients c
JOIN payments p
	ON c.client_id = p.client_id
JOIN payment_methods pm
	ON p.payment_method = pm.payment_method_id
  • 运行结果如下:
client_idnamedateinvoice_idamountpayment_method
5Topiclounge2019-02-1228.18Credit Card
1Vinte2019-01-03674.55Credit Card
3Yadel2019-01-11110.03Credit Card
5Topiclounge2019-01-261387.44Credit Card
3Yadel2019-01-151580.31Credit Card
3Yadel2019-01-151768.10Credit Card
5Topiclounge2019-01-081832.77Credit Card
5Topiclounge2019-01-081810.00Cash

4. 复合连接条件

在单列无法唯一确定所属行时,考虑多列复合连接条件。

SELECT *
FROM order_items oi
JOIN order_item_notes oin
	ON oi.order_id = oin.order_Id
    AND oi.product_id = oin.product_id    
  • 使用AND连接两个条件

5. 单表外连接

-之前的连接JOIN是内连接,省略了INNER,使用外连接时同样可以省略OUTER,只写LEFT或者RIGHT

SELECT 
p.product_id, p.name, oi.quantity
FROM products p
LEFT JOIN order_items oi
	ON oi.product_id = p.product_id
ORDER BY product_id
    
  • 以FROM后面的这个表格作为基础,如果LEFT JOIN则表示选中所有products,不论是否产生订单
  • 同理,若RIGHT JOIN则表示选中所有订单

6. 多表外连接

SELECT 
	o.order_date, 
	o.order_id, 
	c.first_name, 
	sh.name AS shipper, 
	os.name AS status
FROM orders o
JOIN customers c
	ON c.customer_id = o.customer_id
LEFT JOIN shippers sh
	ON sh.shipper_id = o.shipper_id
LEFT JOIN order_statuses os
	ON os.order_status_id = o.status
ORDER BY status    

运行结果如下:
在这里插入图片描述

7. 自外连接

在2的例子中,缺少了一条CEO本人的记录,可以用自外连接的方式使其显示出来

USE sql_hr;
SELECT 
	e.employee_id,
	e.first_name,
    m.first_name AS manager
FROM employees e
LEFT JOIN employees m
	ON e.reports_to = m.employee_id

得到的结果为:

employee_idfirst_namemanager
33391D’arcyYovonnda
37270YovonndaNull
37851SayerYovonnda
40448MindyYovonnda
56274KeriannYovonnda

普通的JOIN无法显示boss本人的记录,需要使用LEFT JOIN

8. USING子句

当不同的表格中的列名称相同时,可以用USING子句简化表达

SELECT 
	p.date,
    c.name AS client,
    p.amount,
    pm.name AS name
FROM payments p
JOIN clients c
	-- ON p.client_id = c.client_id
	USING (client_id)
LEFT JOIN payment_methods pm
	ON pm.payment_method_id = p.payment_method

内连接、外连接都可以用USING,但列名称必须一致

-- 简化 4.复合连接条件的代码
SELECT *
FROM order_items oi
JOIN order_item_notes oin
	--ON oi.order_id = oin.order_Id
    --AND oi.product_id = oin.product_id  
    USING (order_id, product_id)  
--简化 3.多表连接代码
SELECT 
	p.date,
    c.name AS client,
	p.amount,
    pm.name
FROM payments p
JOIN clients c
	USING (client_id)
JOIN payment_methods pm
	ON p.payment_method = pm.payment_method_id

9. 自然连接

自动连接,无法控制

SELECT *
FROM orders o
NATURAL JOIN customers c

10. 交叉连接

显式语法

SELECT 
	c.first_name AS customer,
	p.name AS product
FROM customers c
CROSS JOIN products p
ORDER BY c.first_name

隐式语法

SELECT 
	c.first_name AS customer,
	p.name AS product
FROM customers c, products p
ORDER BY c.first_name

11. 联合

结合不同表单的,用UNION连接
举例:要求得出不同用户分级,points<2000为青铜,2000<points<3000为白银,points>3000为黄金,按照用户first_name字母顺序排列。
customer表内容

SELECT 
	customer_id,
    first_name,
    points,
	'Bronze' AS type
FROM customers
WHERE points < 2000
UNION
SELECT 
	customer_id,
    first_name,
    points,
	'Silver' AS type
FROM customers
WHERE points BETWEEN 2000 AND 3000
UNION
SELECT 
	customer_id,
    first_name,
    points,
	'Gold' AS type
FROM customers
WHERE points > 3000
ORDER BY first_name

运行结果:
在这里插入图片描述

注意点:

  • UNION连接的不同select段后面不能加分号
  • 区间的两个端点用关键词BETWEENAND
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值