设为首页 收藏本站
查看: 322|回复: 0

[经验分享] mysql的表连接(left|right)join

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-4-3 10:53:31 | 显示全部楼层 |阅读模式
测试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条件



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-53483-1-1.html 上篇帖子: Windows下MySQL的主从热备(自动同步)配置 下篇帖子: Linux 下安装MySql的一点整理 mysql
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表