MySQL的联结使用
MySQL的联结使用
- 1 前言
- 2 联结的类型
- 2.1 内部联结/等值联结(equijoin)
- 2.2 自联结
- 2.3 自然联结
- 2.4 外部联结
- 3 一些联结的注意事项
1 前言
本人在自学MySQL后刷题的过程中发现,自己对联结内容掌握的还不够熟练。通过翻看《MySQL必知必会》以及查阅相关资料后,形成以下总结,和大家共同学习。
本人水平有限,有错误还请指正,非常感谢。
2 联结的类型
2.1 内部联结/等值联结(equijoin)
内部联结(也称作等值联结)基于两个表之间的相等测试。
内联结查询有两种实现方式:
1.在WHERE子句中指定联结条件;
示例:
SELECT cust_name,cust_contact
FROM customer,orders,orderitems
WHERE customer.cust_id = orders.cust_id
AND orderitems.order_num = orders.order_num;
2.在FROM子句中使用INNER JOIN(可省略为JOIN) … ON;
示例:
SELECT cust_name,cust_contact
FROM customer INNER JOIN orders,orderitems
ON customer.cust_id = orders.cust_id
AND orderitems.order_num = orders.order_num;
内联结可以联结多个表,参与内联结的表的地位是平等的。
2.2 自联结
自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句。使用自联结需要使用表别名,防止对表的引用出现二义性。
#使用自联结代替嵌套语句
#-------------------------------------------
#嵌套语句
SELECT prod_id,prod_name
FROM products
WHERE vend_id = (SELECT vend_idFROM productsWHERE prod_id = 'DTNTR');
#--------------------------------------------
#自联结
SELECT prod_id,prod_name
FROM products as p1 #使用表别名
WHERE p1.vend_id = p2.vend_id
AND p2.prod_id = 'DTNTR'
2.3 自然联结
自然连接是一种特殊的等值连接,他要求两个关系表中进行连接的必须是相同的属性列(名字相同),无须添加连接条件,并且在结果中消除重复的属性列。
使用自然联结应注意:自然联结必须要有相同的属性列才能进行,即等值联结之后要去除相同的属性列。
示例(转载自等值联结与自然联结的区别):
表:S
| A | B |
|---|---|
| 1 | 2 |
| 3 | 3 |
| 5 | 9 |
表:R
| B | C |
|---|---|
| 2 | 1 |
| 7 | 2 |
| 3 | 5 |
使用自然联结:
SELECT *
FROM S NATURAL JOIN R;
得到结果:
| A | B | C |
|---|---|---|
| 1 | 2 | 1 |
| 3 | 3 | 5 |
2.4 外部联结
使用外部联结可以显示没有关联行的行。
外部联结存在两种基本形式左外部联结和右外部联结。左外部联结(LEFT OUT JOIN)可写作LEFT JOIN(LEFT JOIN默认为是OUT属性),右外部联结(RIGHT OUT JOIN)也可简写作RIGHT JOIN(RIGHT JOIN默认为是OUT属性),它们之间的唯一区别是所关联的表的顺序不同,使用LEFT(或RIGHT)是选择左边(或右边)的所有行。
如要联结会员信息表和订单表,使用外部联结可以查询到没有下单记录的会员,而使用内部联结只能显示已有下单记录的会员信息和订单信息。
示例如下:
表:members_info
| memberId | name | sex | age |
|---|---|---|---|
| 1200001 | 小刚 | 男 | 20 |
| 1200002 | 小明 | 男 | 18 |
| 1200003 | 小华 | 男 | 25 |
| 1200004 | 小红 | 女 | 22 |
表:orders_info
| orderId | memberld | creatTime |
|---|---|---|
| 1587908872 | 1200001 | 2019-07-14 11:32:23 |
| 1587908873 | 1200004 | 2019-07-14 15:04:34 |
| 1587908877 | 1200003 | 2019-07-15 20:11:04 |
| 1587908879 | 1200003 | 2019-07-17 17:47:17 |
| 1587908880 | 1200001 | 2019-07-18 11:00:04 |
代码如下:
SELECT m.name,o.*
FROM members_info AS m LEFT JOIN orders_info as o
ON m.memberId = o.memberId ;
显示查询结果
| name | orderId | memberld | creatTime |
|---|---|---|---|
| 小刚 | 1587908872 | 1200001 | 2019-07-14 11:32:23 |
| 小刚 | 1587908880 | 1200001 | 2019-07-18 11:00:04 |
| 小明 | NULL | NULL | NULL |
| 小华 | 1587908877 | 1200003 | 2019-07-15 20:11:04 |
| 小华 | 1587908879 | 1200003 | 2019-07-17 17:47:17 |
| 小红 | 1587908873 | 1200004 | 2019-07-14 15:04:34 |
3 一些联结的注意事项
-
INNER JOIN和,(逗号)在没有连接条件下语义等效:两者都在指定的表之间产生笛卡尔积(即,第一个表中的每一行都与第二个表中的每一行都联结在一起);然而,逗号运算符的优先级低于
INNER JOIN,CROSS JOIN,LEFT JOIN等等。如果在存在联结条件时将逗号联结与其他联结类型混合使用,则可能出现形式错误。 -
与
ON一起使用的搜索条件也可以用在WHERE子句中,通常,ON子句用于指定如何联结表的条件,WHERE子句用于限制结果集中包含哪些行; -
如果在一个左联结
LEFT JOIN中的ON或USING子句右侧表没有可以匹配的行,则右表将使用一个将列全部设置为NULL的行,可以使用该条件在表中查找在另一个表中没有对应项的行,借用上文表示例:#使用ON SELECT m.* FROM members_info as m LEFT JOIN orders_info AS o ON m.memberId = o.memberId WHERE orderId IS NULL;#使用USING SELECT m.* FROM members_info as m LEFT JOIN orders_info AS o USING(memberId) WHERE orderId IS NULL;显示结果为:
memberId name sex age 1200002 小明 男 18 -
RIGHT JOIN类似于LEFT JOIN。为了使代码可跨数据库移植,建议使用LEFT JOIN代替RIGHT JOIN;
内容持续补充。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
