转载请注明出处!!
之前数据表连接操作多使用逗号或者join,对几种连接的概念一直浑浑噩噩,最近研究了一波,把这些连接的区别搞明白了。
连接:A xjoin B(主表 操作 关联表)
select过程:from->where->group by->having->order by->limit
在不使用on语法时,join、inner join、逗号、cross join结果相同,都是取2个表的笛卡尔积。逗号与其他操作符优先级不同,所以有可能产生语法错误,尽量减少用逗号
join、inner join、cross join支持on和using语法,逗号不支持on和using语法
on语法:筛选连接后的结果,两表的对应列值相同才在结果集中,可以通过and连接多个列值的匹配要求,列名可以不同
select * from tb_test1 inner join tb_student on tb_test1.id=tb_student.id;
using语法:筛选连接后的结果,两表的对应列值相同才在结果集中,括号内用多个列名要求用逗号连接,列名必须相同
select * from tb_test1 cross join tb_student using(id);
仅MySQL中!:(MySQL中没有全外连接,用UNION操作实现吧)
join=inner join=cross join(笛卡尔积)
left join=left outer join
right join=right outer join
sample数据:
select * from tb_test1;
+----+-----------+--------+-------+
| id | name | gender | score |
+----+-----------+--------+-------+
| 1 | 李毅 | 男 | 95.30 |
| 2 | 二丫 | 女 | 95.30 |
| 3 | 张三 | 女 | 95.30 |
| 4 | 李四 | 女 | 95.30 |
| 7 | 胡鲁瓦 | 男 | 95.30 |
| 9 | 后羿 | 男 | 95.30 |
+----+-----------+--------+-------+
select * from tb_student;
+----+--------+--------+------------+
| id | name | gender | birthday |
+----+--------+--------+------------+
| 1 | 李毅 | 男 | 1988-03-20 |
| 2 | kevin | 男 | 1987-08-23 |
| 3 | marry | 女 | 1989-11-25 |
| 4 | lucy | 女 | 1989-11-25 |
| 5 | lily | 女 | 1992-01-25 |
+----+--------+--------+------------+
natural join:自然连接(不允许带on/using)
natrual join:全自然连接,对左右2个表相同名字的列进行等值匹配,不可用on,using操作指定,自动删除多余重名列
natrual left join:左自然连接,保留2个表的列(删除多余重名列),以左表为准,不存在匹配的右表列,值置为NULL
natrual right join:和左自然连接相反
select * from tb_test1 natural join tb_student;
+----+--------+--------+-------+------------+
| id | name | gender | score | birthday |
+----+--------+--------+-------+------------+
| 1 | 李毅 | 男 | 95.30 | 1988-03-20 |
+----+--------+--------+-------+------------+
select * from tb_test1 natural left join tb_student;
+----+-----------+--------+-------+------------+
| id | name | gender | score | birthday |
+----+-----------+--------+-------+------------+
| 1 | 李毅 | 男 | 95.30 | 1988-03-20 |
| 2 | 二丫 | 女 | 95.30 | NULL |
| 3 | 张三 | 女 | 95.30 | NULL |
| 4 | 李四 | 女 | 95.30 | NULL |
| 7 | 胡鲁瓦 | 男 | 95.30 | NULL |
| 9 | 后羿 | 男 | 95.30 | NULL |
+----+-----------+--------+-------+------------+
select * from tb_test1 natural right join tb_student;
+----+--------+--------+------------+-------+
| id | name | gender | birthday | score |
+----+--------+--------+------------+-------+
| 1 | 李毅 | 男 | 1988-03-20 | 95.30 |
| 2 | kevin | 男 | 1987-08-23 | NULL |
| 3 | marry | 女 | 1989-11-25 | NULL |
| 4 | lucy | 女 | 1989-11-25 | NULL |
| 5 | lily | 女 | 1992-01-25 | NULL |
+----+--------+--------+------------+-------+
inner join:内连接(不带on/using时做笛卡尔积)
主表和关联表的笛卡尔积结果,通过on或者using操作筛选结果集(先求笛卡尔积,后筛选,所以性能上和where一样),2个表的所有列都被保存
select * from tb_student a join tb_test1 b on a.id=b.id;
+----+--------+--------+------------+----+--------+--------+-------+
| id | name | gender | birthday | id | name | gender | score |
+----+--------+--------+------------+----+--------+--------+-------+
| 1 | 李毅 | 男 | 1988-03-20 | 1 | 李毅 | 男 | 95.30 |
| 2 | kevin | 男 | 1987-08-23 | 2 | 二丫 | 女 | 95.30 |
| 3 | marry | 女 | 1989-11-25 | 3 | 张三 | 女 | 95.30 |
| 4 | lucy | 女 | 1989-11-25 | 4 | 李四 | 女 | 95.30 |
+----+--------+--------+------------+----+--------+--------+-------+
select * from tb_student a join tb_test1 b on a.gender=b.gender and a.name=b.name;
+----+--------+--------+------------+----+--------+--------+-------+
| id | name | gender | birthday | id | name | gender | score |
+----+--------+--------+------------+----+--------+--------+-------+
| 1 | 李毅 | 男 | 1988-03-20 | 1 | 李毅 | 男 | 95.30 |
| 6 | 李毅 | 男 | 1985-10-11 | 1 | 李毅 | 男 | 95.30 |
+----+--------+--------+------------+----+--------+--------+-------+
left join:左外连接(必须带on/using,等价与left outer join)
左表为主表,保留全部记录全部列,右表为关联表,加上on操作之外的其他列,符合on条件的记录连接上
on和where的区别(在外连接时有差别):on和where在性能上不存在差异,都是在笛卡尔积后筛选,但on在from阶段,属于join操作,先于where。所以当left join连接时,虽然左表的列不符合on条件,也必须保留,只是该记录右表全是null。而where对连接后的结果做筛选,不符合条件的直接剔除
select * from tb_student a left join tb_test1 b on a.id=b.id;
+----+--------+--------+------------+------+--------+--------+-------+
| id | name | gender | birthday | id | name | gender | score |
+----+--------+--------+------------+------+--------+--------+-------+
| 1 | 李毅 | 男 | 1988-03-20 | 1 | 李毅 | 男 | 95.30 |
| 2 | kevin | 男 | 1987-08-23 | 2 | 二丫 | 女 | 95.30 |
| 3 | marry | 女 | 1989-11-25 | 3 | 张三 | 女 | 95.30 |
| 4 | lucy | 女 | 1989-11-25 | 4 | 李四 | 女 | 95.30 |
| 5 | lily | 女 | 1992-01-25 | NULL | NULL | NULL | NULL |
| 6 | 李毅 | 男 | 1985-10-11 | NULL | NULL | NULL | NULL |
+----+--------+--------+------------+------+--------+--------+-------+
select * from tb_student a left join tb_test1 b on a.id=b.id and a.id<4;
+----+--------+--------+------------+------+--------+--------+-------+
| id | name | gender | birthday | id | name | gender | score |
+----+--------+--------+------------+------+--------+--------+-------+
| 1 | 李毅 | 男 | 1988-03-20 | 1 | 李毅 | 男 | 95.30 |
| 2 | kevin | 男 | 1987-08-23 | 2 | 二丫 | 女 | 95.30 |
| 3 | marry | 女 | 1989-11-25 | 3 | 张三 | 女 | 95.30 |
| 4 | lucy | 女 | 1989-11-25 | NULL | NULL | NULL | NULL |
| 5 | lily | 女 | 1992-01-25 | NULL | NULL | NULL | NULL |
| 6 | 李毅 | 男 | 1985-10-11 | NULL | NULL | NULL | NULL |
+----+--------+--------+------------+------+--------+--------+-------+
select * from tb_student a left join tb_test1 b on a.id=b.id where a.id<4;
+----+--------+--------+------------+------+--------+--------+-------+
| id | name | gender | birthday | id | name | gender | score |
+----+--------+--------+------------+------+--------+--------+-------+
| 1 | 李毅 | 男 | 1988-03-20 | 1 | 李毅 | 男 | 95.30 |
| 2 | kevin | 男 | 1987-08-23 | 2 | 二丫 | 女 | 95.30 |
| 3 | marry | 女 | 1989-11-25 | 3 | 张三 | 女 | 95.30 |
+----+--------+--------+------------+------+--------+--------+-------+
right join:右外连接,和左外连接相反
以后再使用MySQL的连接就清晰了。
如有不准确的地方请留言指教
- mysql的三种连接方式
SQL的三种连接方式分为:左外连接.右外连接.内连接,专业术语分别为:LEFT JOIN.RIGHT JOING.INNER JOIN 内连接INNER JOIN:使用比较运算符来根据指定的连接的每个 ...
- 比较详细的mysql的几种连接功能分析,只要你看完就能学会的好东西
下面是例子分析表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a20050113 4 ...
- 170221、浅谈mysql的SQL的四种连接
例子: ------------------------------------------------- a表 id name b表 id job pare ...
- 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接(转)
1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...
- 【转】深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
[原文]:http://www.jb51.net/article/39432.htm 1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. ...
- 深入了解SQL的四种连接&不然要命的!
1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...
- 深入理解SQL的四种连接,左外连接,右外连接,内连接,全连接
1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...
- SQL的四种连接(左外连接、右外连接、内连接、全连接)
1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...
- 转【深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接】
转自:https://www.jb51.net/article/39432.htm 1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. ...
随机推荐
- HTML5和CSS3基础教程(第8版)-读书笔记(3)
第11章 用CSS 进行布局 网站设计主要有两大类型:固定宽度和响应式. 对于固定(fixed)布局,整个页面和每一栏都有基于像素的宽度.顾名思义,无论是使用移动电话和平板电脑等较小的设备查看页面,还 ...
- 判断闰年的方法以及如何获得单链表的倒数第K个元素
今天很悲催,心中向往的公司,打电话过来面试,问到我两个问题,结果竟然都没有回答上,伤心了,记录下今天失败,希望以后不要被同样的问题给PASS. 问题1.如何判断是否为闰年 所谓闰年那就是:四年一闰,百 ...
- MySQL表分区
MySQL的表分区 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以 ...
- redis在windows中的安装
之前介绍过了redis的相关知识,以及在linux平台上安装redis,为了方便学习,这里记录一下redis在windows平台上的安装步骤 1.下载redis下载地址https://github.c ...
- ytxgnopyvw
Rt.不是我的博客被盗了 而是我要测试一下某网站是自动抓取我的博客还是手动抓取. 如果是手动抓取,那么该网站的管理员一定会看见这篇博文, 希望管理员能够自己反省. ytxgn只是为了百度搜索方便罢了.
- python 字符串函数
split函数:将字符串分割成序列 str.split("分隔符") 一般可以这样用 list = [n for n in str.split],这样可以得到一个新的序列 str ...
- mybatis 关联查询 association
<resultMap id="DutyPersonAndFileAndScoreMap" type="com.cares.asis.duty.entity.Duty ...
- nginx 版本介绍
Nginx官网提供了三个类型的版本Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版Stable version:最新稳定版,生产环境上建议使用的版 ...
- Java 第十章 类和对象
类和对象 类与对象的关系是什么? 答 :类是具有相同属性和方法的一组对象的集合. 类是抽象的,对象是具体的:类是对象的模版,对象是类的实例. 定义一个类的语法是什么? public class 类名{ ...
- java中的内部类小结
内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类.如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液.跳动).显然, ...