mysql的表連接( left | right )join
阿新 • • 發佈:2017-12-18
num str value creat sele mar arch function clas
測試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,
‘趙六 ‘
,
‘2015-2-20 10:00:00‘
,6000,3);
insert into empo values(5,
‘趙六 ‘
,
‘2015-2-20 10:00:00‘
,6000,6);
insert into empo values(6,
‘趙六 ‘
,
‘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 | 趙六 | 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 | 趙六 | 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 | 趙六 | 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 | 趙六 | 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 | 張三 | 2012-02-20 10:00:00 | 6000 | 1 | 1 | xinzhengbu |
| 2 | 李四 | 2013-02-20 10:00:00 | 6000 | 2 | 1 | xinzhengbu |
| 3 | 王五 | 2014-02-20 10:00:00 | 6000 | 1 | 1 | xinzhengbu |
| 4 | 趙六 | 2015-02-20 10:00:00 | 6000 | 3 | 1 | xinzhengbu |
| 1 | 張三 | 2012-02-20 10:00:00 | 6000 | 1 | 2 | jixubu |
| 2 | 李四 | 2013-02-20 10:00:00 | 6000 | 2 | 2 | jixubu |
| 3 | 王五 | 2014-02-20 10:00:00 | 6000 | 1 | 2 | jixubu |
| 4 | 趙六 | 2015-02-20 10:00:00 | 6000 | 3 | 2 | jixubu |
| 1 | 張三 | 2012-02-20 10:00:00 | 6000 | 1 | 3 | yunying |
| 2 | 李四 | 2013-02-20 10:00:00 | 6000 | 2 | 3 | yunying |
| 3 | 王五 | 2014-02-20 10:00:00 | 6000 | 1 | 3 | yunying |
| 4 | 趙六 | 2015-02-20 10:00:00 | 6000 | 3 | 3 | yunying |
| 1 | 張三 | 2012-02-20 10:00:00 | 6000 | 1 | 4 | shejibu |
| 2 | 李四 | 2013-02-20 10:00:00 | 6000 | 2 | 4 | shejibu |
| 3 | 王五 | 2014-02-20 10:00:00 | 6000 | 1 | 4 | shejibu |
| 4 | 趙六 | 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 | 張三 | 2012-02-20 10:00:00 | 6000 | 1 | 1 | xinzhengbu |
| 3 | 王五 | 2014-02-20 10:00:00 | 6000 | 1 | 1 | xinzhengbu |
| 2 | 李四 | 2013-02-20 10:00:00 | 6000 | 2 | 2 | jixubu |
| 4 | 趙六 | 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 | 張三 | 2012-02-20 10:00:00 | 6000 | 1 | 1 | xinzhengbu |
| 2 | 李四 | 2013-02-20 10:00:00 | 6000 | 2 | 2 | jixubu |
| 3 | 王五 | 2014-02-20 10:00:00 | 6000 | 1 | 1 | xinzhengbu |
| 4 | 趙六 | 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 | 張三 | 2012-02-20 10:00:00 | 6000 | 1 | 1 | xinzhengbu |
| 3 | 王五 | 2014-02-20 10:00:00 | 6000 | 1 | 1 | xinzhengbu |
| 2 | 李四 | 2013-02-20 10:00:00 | 6000 | 2 | 2 | jixubu |
| 4 | 趙六 | 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 | 張三 | 2012-02-20 10:00:00 | 6000 | 1 |
| 2 | 李四 | 2013-02-20 10:00:00 | 6000 | 2 |
| 3 | 王五 | 2014-02-20 10:00:00 | 6000 | 1 |
| 4 | 趙六 | 2015-02-20 10:00:00 | 6000 | 3 |
| 5 | 趙六 | 2015-02-20 10:00:00 | 6000 | 6 |
| 6 | 趙六 | 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 | 趙六 | 2015-02-20 10:00:00 | 6000 | 6 |
| 6 | 趙六 | 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 | 趙六 | 2015-02-20 10:00:00 | 6000 | 6 | NULL | NULL |
| 6 | 趙六 | 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條件
mysql的表連接( left | right )join