转载请注明出处!!
之前数据表连接操作多使用逗号或者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的几种连接 join/inner join/cross join/逗号/left join/right join/natural join的更多相关文章

  1. mysql的三种连接方式

    SQL的三种连接方式分为:左外连接.右外连接.内连接,专业术语分别为:LEFT JOIN.RIGHT JOING.INNER JOIN 内连接INNER JOIN:使用比较运算符来根据指定的连接的每个 ...

  2. 比较详细的mysql的几种连接功能分析,只要你看完就能学会的好东西

    下面是例子分析表A记录如下: aID        aNum 1           a20050111 2           a20050112 3           a20050113 4   ...

  3. 170221、浅谈mysql的SQL的四种连接

    例子:   -------------------------------------------------  a表     id   name     b表     id   job   pare ...

  4. 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接(转)

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...

  5. 【转】深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接

    [原文]:http://www.jb51.net/article/39432.htm 1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.    ...

  6. 深入了解SQL的四种连接&不然要命的!

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...

  7. 深入理解SQL的四种连接,左外连接,右外连接,内连接,全连接

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...

  8. SQL的四种连接(左外连接、右外连接、内连接、全连接)

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...

  9. 转【深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接】

    转自:https://www.jb51.net/article/39432.htm 1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     ...

随机推荐

  1. eclipse编码格式设置教程、如何为eclipse设置编码格式?

    如果要使插件开发应用能有更好的国际化支持,能够最大程度的支持中文输出,则最好使 Java文件使用UTF-8编码.然而,EcliPSe工 作空间(workspace)的缺省字符编码是操作系统缺省的编码, ...

  2. 用nodej和glub-watcher写的监听go 项目自动编译,很鸡肋

    glub 一般都是很轻量的编译. go太重了,改一小个部分,就编译的话,多数是编译失败. 而且很消耗性能,还没想到完美的优化办法. 暂时用个定时器 监听2秒,停止1秒,如此循环,会减少些 “无效”的编 ...

  3. Uber从Postgres切换到MySQL

    Uber工程师在官方博客上描述了他们为什么要从 Postgres 切换到 MySQL 数据库.Uber的早期架构是由 Python编写的后端应用构成,使用了 Postgres 数据库.但此后,Uber ...

  4. 精妙SQL语句收集

    SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作.(转) 一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数 ...

  5. css之字体设置

    字体大小font-size 字体风格font-style 字体加粗font-weight 字体类型font-family 字体阴影text-shadow 字体行高line-height 字间距lett ...

  6. I hate it

    Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老 ...

  7. 使用my exclipse对数据库进行操作(1)

    一.查找 public class class1 { public static void main(String[] args) { // TODO Auto-generated method st ...

  8. 1055: [HAOI2008]玩具取名

    Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后 他会根据自己的喜好,将名字中任意一个字母用"WING" ...

  9. c++ 操作注册表

    1.       注册表简介 注册表是为Windows NT和Windows95中所有32位硬件/驱动和32位应用程序设计的数据文件,用于存储系统和应用程序的设置信息.16位驱动在Winnt (Win ...

  10. delphi 获取两个颜色差值

    前面说了已经获取到颜色值了,现在需要比较两个颜色的差值. 两个颜色的根据RGB的差来取,有两种情况: 1.(R的平方+G的平方+B的平方)开根号,再两个颜色值相减获取差值. 2.(((R1-R2)的平 ...