mysql的表连接(left|right)join

测试MYSQL表关于内外连接
表一:雇员表(雇员ID,雇员名称,雇员入职时间,薪水,部门号)
create table empo(
empoid int(6)  not null  primary key auto_increment,
empname varchar(32) not null,
empdate datetime not null,
salary int(6) not null ,
deptno int(6) not null
)engine=innodb  charset=utf8

insert into  empo  values(1,‘zhangsan‘,‘2012-2-20 10:00:00‘,6000,1);
insert into  empo  values(2,‘lisi‘,‘2013-2-20 10:00:00‘,6000,2);
insert into  empo  values(3,‘王五‘,‘2014-2-20 10:00:00‘,6000,1);
insert into  empo  values(4,‘zhaoliu‘,‘2015-2-20 10:00:00‘,6000,3);
insert into  empo  values(5,‘zhaoliu‘,‘2015-2-20 10:00:00‘,6000,6);
insert into  empo  values(6,‘zhaoliu‘,‘2015-2-20 10:00:00‘,6000,8);

表二(部门号,部门名称)
create table dept(
deptid int(6) primary key ,
deptname varchar(32) not null
)engine=innodb charset=utf8

insert into dept values(1,‘xinzhengbu‘);
insert into dept values(2,‘jixubu‘);
insert into dept values(3,‘yunying‘);
insert into dept values(3,‘shejibu‘);

题目:
例1:内连接(内连接实际上就是利用 where 子句对两张表形成的笛卡尔积进行筛选,)
mysql> select * from empo,dept;
+--------+----------+---------------------+--------+--------+--------+------------+
| empoid | empname  | empdate             | salary | deptno | deptid | deptname   |
+--------+----------+---------------------+--------+--------+--------+------------+
|      1 | zhangsan | 2012-02-20 10:00:00 |   6000 |      1 |      1 | xinzhengbu |
|      2 | lisi     | 2013-02-20 10:00:00 |   6000 |      2 |      1 | xinzhengbu |
|      3 | 王五     | 2014-02-20 10:00:00 |   6000 |      1 |      1 | xinzhengbu |
|      4 | zhaoliu  | 2015-02-20 10:00:00 |   6000 |      3 |      1 | xinzhengbu |
|      1 | zhangsan | 2012-02-20 10:00:00 |   6000 |      1 |      2 | jixubu     |
|      2 | lisi     | 2013-02-20 10:00:00 |   6000 |      2 |      2 | jixubu     |
|      3 | 王五     | 2014-02-20 10:00:00 |   6000 |      1 |      2 | jixubu     |
|      4 | zhaoliu  | 2015-02-20 10:00:00 |   6000 |      3 |      2 | jixubu     |
|      1 | zhangsan | 2012-02-20 10:00:00 |   6000 |      1 |      3 | yunying    |
|      2 | lisi     | 2013-02-20 10:00:00 |   6000 |      2 |      3 | yunying    |
|      3 | 王五     | 2014-02-20 10:00:00 |   6000 |      1 |      3 | yunying    |
|      4 | zhaoliu  | 2015-02-20 10:00:00 |   6000 |      3 |      3 | yunying    |
|      1 | zhangsan | 2012-02-20 10:00:00 |   6000 |      1 |      4 | shejibu    |
|      2 | lisi     | 2013-02-20 10:00:00 |   6000 |      2 |      4 | shejibu    |
|      3 | 王五     | 2014-02-20 10:00:00 |   6000 |      1 |      4 | shejibu    |
|      4 | zhaoliu  | 2015-02-20 10:00:00 |   6000 |      3 |      4 | shejibu    |
+--------+----------+---------------------+--------+--------+--------+------------+
16 rows in set (0.00 sec)

mysql> select * from empo inner join dept;
+--------+----------+---------------------+--------+--------+--------+------------+
| empoid | empname  | empdate             | salary | deptno | deptid | deptname   |
+--------+----------+---------------------+--------+--------+--------+------------+
|      1 | zhangsan | 2012-02-20 10:00:00 |   6000 |      1 |      1 | xinzhengbu |
|      2 | lisi     | 2013-02-20 10:00:00 |   6000 |      2 |      1 | xinzhengbu |
|      3 | 王五     | 2014-02-20 10:00:00 |   6000 |      1 |      1 | xinzhengbu |
|      4 | zhaoliu  | 2015-02-20 10:00:00 |   6000 |      3 |      1 | xinzhengbu |
|      1 | zhangsan | 2012-02-20 10:00:00 |   6000 |      1 |      2 | jixubu     |
|      2 | lisi     | 2013-02-20 10:00:00 |   6000 |      2 |      2 | jixubu     |
|      3 | 王五     | 2014-02-20 10:00:00 |   6000 |      1 |      2 | jixubu     |
|      4 | zhaoliu  | 2015-02-20 10:00:00 |   6000 |      3 |      2 | jixubu     |
|      1 | zhangsan | 2012-02-20 10:00:00 |   6000 |      1 |      3 | yunying    |
|      2 | lisi     | 2013-02-20 10:00:00 |   6000 |      2 |      3 | yunying    |
|      3 | 王五     | 2014-02-20 10:00:00 |   6000 |      1 |      3 | yunying    |
|      4 | zhaoliu  | 2015-02-20 10:00:00 |   6000 |      3 |      3 | yunying    |
|      1 | zhangsan | 2012-02-20 10:00:00 |   6000 |      1 |      4 | shejibu    |
|      2 | lisi     | 2013-02-20 10:00:00 |   6000 |      2 |      4 | shejibu    |
|      3 | 王五     | 2014-02-20 10:00:00 |   6000 |      1 |      4 | shejibu    |
|      4 | zhaoliu  | 2015-02-20 10:00:00 |   6000 |      3 |      4 | shejibu    |
+--------+----------+---------------------+--------+--------+--------+------------+
16 rows in set (0.00 sec)

上面两个SQL等价的。

下面是加where条件的等价SQL(select * from empo,dept where deptno=deptid;)
mysql> select * from empo inner join dept on  deptno=deptid;
+--------+----------+---------------------+--------+--------+--------+------------+
| empoid | empname  | empdate             | salary | deptno | deptid | deptname   |
+--------+----------+---------------------+--------+--------+--------+------------+
|      1 | zhangsan | 2012-02-20 10:00:00 |   6000 |      1 |      1 | xinzhengbu |
|      3 | 王五     | 2014-02-20 10:00:00 |   6000 |      1 |      1 | xinzhengbu |
|      2 | lisi     | 2013-02-20 10:00:00 |   6000 |      2 |      2 | jixubu     |
|      4 | zhaoliu  | 2015-02-20 10:00:00 |   6000 |      3 |      3 | yunying    |
+--------+----------+---------------------+--------+--------+--------+------------+
4 rows in set (0.00 sec)

例2:左连接
mysql> select * from empo left join dept on  deptno=deptid;
+--------+----------+---------------------+--------+--------+--------+------------+
| empoid | empname  | empdate             | salary | deptno | deptid | deptname   |
+--------+----------+---------------------+--------+--------+--------+------------+
|      1 | zhangsan | 2012-02-20 10:00:00 |   6000 |      1 |      1 | xinzhengbu |
|      2 | lisi     | 2013-02-20 10:00:00 |   6000 |      2 |      2 | jixubu     |
|      3 | 王五     | 2014-02-20 10:00:00 |   6000 |      1 |      1 | xinzhengbu |
|      4 | zhaoliu  | 2015-02-20 10:00:00 |   6000 |      3 |      3 | yunying    |
+--------+----------+---------------------+--------+--------+--------+------------+
4 rows in set (0.00 sec)

例3:右连接
mysql> select * from empo right join dept on  deptno=deptid;
+--------+----------+---------------------+--------+--------+--------+------------+
| empoid | empname  | empdate             | salary | deptno | deptid | deptname   |
+--------+----------+---------------------+--------+--------+--------+------------+
|      1 | zhangsan | 2012-02-20 10:00:00 |   6000 |      1 |      1 | xinzhengbu |
|      3 | 王五     | 2014-02-20 10:00:00 |   6000 |      1 |      1 | xinzhengbu |
|      2 | lisi     | 2013-02-20 10:00:00 |   6000 |      2 |      2 | jixubu     |
|      4 | zhaoliu  | 2015-02-20 10:00:00 |   6000 |      3 |      3 | yunying    |
|   NULL | NULL     | NULL                |   NULL |   NULL |      4 | shejibu    |
+--------+----------+---------------------+--------+--------+--------+------------+
5 rows in set (0.00 sec)

例4:将子查询替换成连接

表1
mysql> select * from empo;
+--------+----------+---------------------+--------+--------+
| empoid | empname  | empdate             | salary | deptno |
+--------+----------+---------------------+--------+--------+
|      1 | zhangsan | 2012-02-20 10:00:00 |   6000 |      1 |
|      2 | lisi     | 2013-02-20 10:00:00 |   6000 |      2 |
|      3 | 王五     | 2014-02-20 10:00:00 |   6000 |      1 |
|      4 | zhaoliu  | 2015-02-20 10:00:00 |   6000 |      3 |
|      5 | zhaoliu  | 2015-02-20 10:00:00 |   6000 |      6 |
|      6 | zhaoliu  | 2015-02-20 10:00:00 |   6000 |      8 |
+--------+----------+---------------------+--------+--------+
6 rows in set (0.00 sec)

表2
mysql> select * from dept;
+--------+------------+
| deptid | deptname   |
+--------+------------+
|      1 | xinzhengbu |
|      2 | jixubu     |
|      3 | yunying    |
|      4 | shejibu    |
+--------+------------+
4 rows in set (0.00 sec)

题目1、找出雇员不在部门表中的用户(雇员ID号为5,6的不在部门列表中)
select * from empo where deptno not in (select deptid from dept)
子查询写法
mysql> select * from empo where deptno  not in (select deptid from dept);
+--------+---------+---------------------+--------+--------+
| empoid | empname | empdate             | salary | deptno |
+--------+---------+---------------------+--------+--------+
|      5 | zhaoliu | 2015-02-20 10:00:00 |   6000 |      6 |
|      6 | zhaoliu | 2015-02-20 10:00:00 |   6000 |      8 |
+--------+---------+---------------------+--------+--------+

内连接写法(和上面写法同等)
mysql> select * from empo left join dept on empo.deptno=dept.deptid  where deptid is NULL;
+--------+---------+---------------------+--------+--------+--------+----------+
| empoid | empname | empdate             | salary | deptno | deptid | deptname |
+--------+---------+---------------------+--------+--------+--------+----------+
|      5 | zhaoliu | 2015-02-20 10:00:00 |   6000 |      6 |   NULL | NULL     |
|      6 | zhaoliu | 2015-02-20 10:00:00 |   6000 |      8 |   NULL | NULL     |
+--------+---------+---------------------+--------+--------+--------+----------+

说明:mysql中join中使用where和on的区别

1.(left|right)join... on.. and 的写法:是先处理on后面的条件,在处理表之间的连接
2.(left|rgint)join... on.. where的写法: 是先表left连接,在处理where条件
时间: 2024-10-21 23:15:37

mysql的表连接(left|right)join的相关文章

Mysql 多表连接查询 inner join 和 outer join 的使用

JOIN的含义就如英文单词"join"一样,连接两张表,大致分为内连接,外连接,右连接,左连接,自然连接.这里描述先甩出一张用烂了的图,然后插入测试数据. 首先先列举本篇用到的分类(内连接,外连接,交叉连接)和连接方法(如下): A)内连接:join,inner join B)外连接:left join,left outer join,right join,right outer join,union C)交叉连接:cross join 案例表: t_users: t_departme

实操-mysql表连接笛卡尔积(join、left join)

1.为什么两张表连接会出现重复数据 2.表的连接过程是怎样的? 举例: 表A: 1 0 表B: 1 0 0 2 执行语句:select * from A join B on A.id = B.id; 顺序如下: join形成的表: 1 1 1 0 1 0 1 2 0 1 0 0 0 0 0 2 on之后: 1 1 0 0 0 0 所以表连接后出现了重复数据 两张表的关系存在一对多的关系,所以就会出现重复情况 什么是笛卡尔积呢? 就是两张表连接的时候,是通过笛卡尔积的方式连接. 笛卡尔(Desca

MySQL多表连接

1.内联接 典型的联接运算,使用像 =  或 <> 之类的比较运算).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行. 2.外联接. 外联接可以是左向外联接.右向外联接或完整外部联接.     在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:     1)LEFT  JOIN或LEFT OUTER JOIN     左向外联接的结果集包括  LEFT OUTER子句中

MySQL多表连接查询

多表连接查询: create table class( cid int primary key auto_increment, cname varchar(20) )default charset='utf8'; create tablr stu( sid int primary key auto_increment, sname varchar(20). cid int );default charset='utf8'; insert into class(name) values('一班')

oracle多表连接方式Hash Join Nested Loop Join Merge Join

在查看sql执行计划时,我们会发现表的连接方式有多种,本文对表的连接方式进行介绍以便更好看懂执行计划和理解sql执行原理. 一.连接方式:        嵌套循环(Nested  Loops (NL))      (散列)哈希连接(Hash Join (HJ))    (归并)排序合并连接(Sort Merge Join (SMJ) ) 二.连接说明:    1.Oracle一次只能连接两个表.不管查询中有多少个表,Oracle 在连接中一次仅能操作两张表.    2.当执行多个表的连接时,优化

mysql的表连接( left | right )join

测试MYSQL表关于内外连接 表一:雇员表(雇员ID,雇员名称,雇员入职时间,薪水,部门号) create table empo( empoid int(6)  not null  primary key auto_increment, empname varchar(32) not null, empdate datetime not null, salary int(6) not null , deptno int(6) not null )engine=innodb  charset=ut

SQL表连接查询(inner join、full join、left join、right join)

前提条件:假设有两个表,一个是学生表,一个是学生成绩表. 表的数据有: 一.内连接-inner jion : 最常见的连接查询可能是这样,查出学生的名字和成绩: select s.name,m.mark from student s,mark m where s.id=m.studentid 上面就是我们最常见的inner join,即内连接,把符合student.id=mark.studentid 条件的元组才选出来,也可以写成: select s.name,m.mark from stude

SQL表连接查询(inner join(join)、full join、left join、right join)

下面列出了您可以使用的 JOIN 类型,以及它们之间的差异. JOIN: 如果表中有至少一个匹配,则返回行(join=inner join) LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行 RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行 FULL JOIN: 只要其中一个表中存在匹配,就返回行 前提条件:假设有两个表,一个是学生表,一个是学生成绩表. 表的数据有: 一.内连接-inner jion : 最常见的连接查询可能是这样,查出学生的名字和成绩: sele

MySQL 多表连接内连接

自考题目讲解,专业请绕道 1.等值连接,在FROM子句中使用关键字INNER   JOIN或JOIN 连接两张表时,如若ON子句的连接条件中使用运算符 = 符号,即进行相等性测试,则此连接方式称为等值连接,也称为相等连接. 2.非等值连接,在FROM子句中使用关键字INNER JOIN 或JOIN 连接两张表时,如若在ON子句的连接条件中使用除运算符  =  之外的其他比较运算符,即进行不相等等性测试,则此连接方式称为非等值连接,也称为不等连接 3.自连接,在FROM子句中使用关键字INNER