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條件


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章