当前位置: 首页 > news >正文

【MySQL】区分:等值连接/自连接/自然连接/外连接 以及ON和Where使用

区分:等值连接/自连接/自然连接/外连接 以及ON和Where使用

  • 一、等值连接
  • 二、自连接
  • 三、自然连接
  • 四、外连接
        • 1.左外连接
        • 2.右外连接
        • 3.全外连接
  • 五、using 和 on
  • 六、JOIN 关联表中 ON、WHERE 后面跟条件的区别

一、等值连接

等值连接:它是基于两个表之间的相等测试,展现出来的是共同的数据,因此又称内部连接。

select * from a , b where  a.id = b.id;
select * from a inner join b on a.id = b.id;
select * from a inner join b using (`id`); 

除了inner join,还有left join和right join。

二、自连接

自连接:给一张表取两个不同的别名就,使用两个别名将表与表本身进行连接查询,然后附上连接条件。

select * from a , b where  a.id = b.id;

三、自然连接

自然连接:自然连接是一种特殊的等值连接。它要求两个关系表中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。而等值连接并不去掉重复的属性列。

# 自然连接-- 使用NATURAL JOIN 
SELECT *
FROM `a` NATURAL JOIN `b`

四、外连接

外连接包括左外连接、右外连接、全外连接。

1.左外连接

左外连接:两表进行连接时,将返回左表的所有行。如果左表的某行在右表中没有匹配行,则将为右表返回空值。

# 左外连接
-- 使用LEFT JOIN (left out join)
SELECT *
FROM `a` LEFT JOIN `b`
-- USING(`id`);
ON`a`.`id` = `b`.`id`;
2.右外连接

右外连接:两表进行连接时,将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

# 左外连接
-- 使用LEFT JOIN (left out join)
SELECT *
FROM `a` RIGHT JOIN `b`
-- USING(`id`);
ON`a`.`id` = `b`.`id`;
3.全外连接

全外连接:完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

# 全外连接-- 使用FULL JOIN,mysql 不支持,orcal支持
SELECT *
FROM `a` FULL JOIN `b`
-- USING(`id`);
ON`a`.`id` = `b`.`id`;-- mysql中使用UNION来实现FULL JOIN的功能
SELECT *
FROM `a` LEFT JOIN `b`
-- USING(`id`);
ON`a`.`id` = `b`.`id`
UNION
SELECT *
FROM `a` RIGHT JOIN `b`
-- USING(`id`);
ON`a`.`id` = `b`.`id`;

五、using 和 on

using 和 on 值可用于 left join 、right join 、full join ,不可用于 natural join ,因为 natural join 不需要显示的连接条件。

  • using:当连接条件中的两张表的两个连接属性相同时可以使用using。

  • on:连接条件中的两张表的两个连接属性不论是否相同,都可用 on, using 是 on 两个连接属性相同时的简写

六、JOIN 关联表中 ON、WHERE 后面跟条件的区别

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

join联结可以简单理解为以下过程:

  1. 首先两个表做一个笛卡尔积。
  2. 然后根据on后面的条件对这个笛卡尔积做一个过滤形成一张临时表。
  3. 如果有where就对上一步的临时表再进行过滤,进而得到最终的结果集。
  4. 也就是说如果inner join left join联查过滤条件放在on中就是在第二步进行的过滤;如果过滤条件放在where中就是在第三步进行的过滤。

inner join和cross join的区别:

  • cross join是笛卡尔积,理论上不应该支持on语法,inner join是内连接,支持on
  • SQLServer中cross join 后面加on 是错误的。mysql中使用inner join和cross join加不加on都不会报错。
  • 在 MySQL 中(仅限于 MySQL) CROSS JOIN 与 INNER JOIN 的表现是一样的,在不指定 ON 条件得到的结果都是笛卡尔积,反之取得两个表完全匹配的结果。INNER JOIN 与 CROSS JOIN 可以省略 INNER 或 CROSS 关键字

在使用left jion时,on和where条件的区别如下:

1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

最后几点总结:

  • 当使用left join时,无论on的条件是否满足,都会返回左表的所有记录,对于满足的条件的记录,两个表对应的记录会连接起来,对于不满足条件的记录,那右表字段全部是null
  • on后加了and就是 关联满足条件表2的数据,但是结果数据不做过滤,显示全部表1数据
  • on是在生成连接表的起作用的where是生成连接表之后对连接表再进行过滤,相当于where之前做了子查询,返回满足where条件的数据。

比如:

select * 
form tab1 
left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’);
这个查询返回结果还是会显示name为AAA的记录,因为on只作关联tab2的条件,并不会对tab1进行过滤作用。
select * 
form tab1 
left join tab2 on (tab1.size = tab2.size) 
where tab2.name=’AAA’这个结果就不显示name为AAA的记录。因为生成临时表后,where对行记录再次过滤。
http://www.lryc.cn/news/207420.html

相关文章:

  • Windows环境下Apache安装部署说明及常见问题解决
  • Linux-安装docker-compose
  • 机器学习实验一:KNN算法,手写数字数据集(使用汉明距离)
  • Java零基础入门-赋值运算符
  • xshell+xming显示jmeter的gui页面
  • el-tree业务
  • 警惕Mallox勒索病毒的最新变种malloxx,您需要知道的预防和恢复方法。
  • linux中断下文之tasklet(中断二)
  • Mysql事务+redo日志+锁分类+隔离级别+mvcc
  • Kafka-Java四:Spring配置Kafka消费者提交Offset的策略
  • Python 训练集、测试集以及验证集切分方法:sklearn及手动切分
  • 数据结构,及分类(存储分类、逻辑分类)介绍
  • Powershell脚本自动备份dhcp数据库
  • 第十六章总结:反射和注解
  • mysql 切割字符串函数
  • 汽车发动机电机右盖设计
  • ETHERNET/IP从站转CANOPEN主站连接AB系统的配置方法
  • 人工智能和机器学习:走向智能未来的关键
  • openGauss本地Centos7.6单机安装和简单应用
  • LeetCode--1 两数之和
  • Hafnium安全分区管理器和示例参考软件栈
  • Python解读市场趋势:LSTM 和 GRU 在预测 Google 股价方面的探索
  • vue源码分析(二)——vue的入口发生了什么
  • 系统架构师论文总结【持续更新】
  • STM32-LCD中英文显示及应用
  • 13.4web自动化测试(Selenium3+Java)
  • P1966 [NOIP2013 提高组] 火柴排队
  • Linux文件I/O
  • 卡巴斯基2009杀毒软件
  • Docker 容器服务的注册、发现及Docker安全