表的內連與外連
1.內連接
利用where子句對兩種表形成的笛卡爾積進行篩選,內連接是使用最多的連接查詢。
語法:
SELECT 字段 FROM 表1 INNER JOIN 表2 ON 連接條件 and 其它條件;
- 顯示SMITH的名字和部門名稱
--第一種寫法(前面學習過程中一直採用的方法)
select ename,dname from emp,dept
where emp.deptno=dept.deptno and ename='SMITH';
--採用標準的內連接寫法
select ename,dname
from emp inner join dept
on emp.deptno=dept.deptno and ename='SMITH';
+-------+----------+
| ename | dname |
+-------+----------+
| SMITH | RESEARCH |
+-------+----------+
2.外鏈接
分爲左外連接和右外連接
2.1左外連接
如果兩張表聯合查詢,join左側的表完全顯示(返回左表的所有行)就是左外連接。
語法:
SELECT 字段名 FROM 表1 LEFT JOIN 表2 ON 連接條件
案例:首先建兩張表,並插入數據
mysql> create table stu(id int,name varchar(30));
Query OK, 0 rows affected (0.06 sec)
mysql> insert into stu values(1,'zs'),(2,'ls'),(3,'ww'),(4,'zl');
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> create table exam(id int,grade int);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into exam values(1,56),(2,87),(11,98);
Query OK, 3 rows affected (0.01 sec)
--查看兩張表
mysql> select * from stu;
+------+------+
| id | name |
+------+------+
| 1 | zs |
| 2 | ls |
| 3 | ww |
| 4 | zl |
+------+------+
4 rows in set (0.00 sec)
mysql> select * from exam;
+------+-------+
| id | grade |
+------+-------+
| 1 | 56 |
| 2 | 87 |
| 11 | 98 |
+------+-------+
- 查詢所有學生的成績,如果這個學生沒有成績,也要將學生的個人信息顯示出來
--學生個人信息一定要顯示出來,即左表是stu表
mysql> select * from stu left join exam on stu.id=exam.id;
+------+------+------+-------+
| id | name | id | grade |
+------+------+------+-------+
| 1 | zs | 1 | 56 |
| 2 | ls | 2 | 87 |
| 3 | ww | NULL | NULL |
| 4 | zl | NULL | NULL |
+------+------+------+-------+
2.2右外連接
如果兩張表聯合查詢,join右側的表完全顯示(返回右表的所有行)就是右外連接。
SELECT 字段名 FROM 表1 RIGHT JOIN 表2 ON 連接條件
- 對stu和exam表聯合查詢,把所有成績顯示出來,即使這個成績沒有學生與它對應,也要顯示出來
mysql> select * from stu right join exam on stu.id=exam.id;
+------+------+------+-------+
| id | name | id | grade |
+------+------+------+-------+
| 1 | zs | 1 | 56 |
| 2 | ls | 2 | 87 |
| NULL | NULL | 11 | 98 |
+------+------+------+-------+
3.全連接
返回左表和右表中的所有行。
mysql> select * from stu full join exam;
+------+------+------+-------+
| id | name | id | grade |
+------+------+------+-------+
| 1 | zs | 1 | 56 |
| 1 | zs | 2 | 87 |
| 1 | zs | 11 | 98 |
| 2 | ls | 1 | 56 |
| 2 | ls | 2 | 87 |
| 2 | ls | 11 | 98 |
| 3 | ww | 1 | 56 |
| 3 | ww | 2 | 87 |
| 3 | ww | 11 | 98 |
| 4 | zl | 1 | 56 |
| 4 | zl | 2 | 87 |
| 4 | zl | 11 | 98 |
+------+------+------+-------+
4.練習題
使用scott數據庫查詢:列出部門名稱和這些部門的員工信息,同時列出沒有員工的部門
--第一種方法:
select d.dname,e.*
from dept d left join emp e on d.deptno=e.deptno;
--第二種方法:
select d.dname,e.*
from emp e right join dept d on d.deptno=e.deptno;
5.內連接與外連接的區別
1)內連接,也沒成爲自然連接,只有兩個表相匹配的行才能在結果集中出現。返回的結果集選取了兩個表中所有相匹配的數據,捨棄了不匹配的數據,所以內連接會造成信息的丟失
2)外連接不僅包含符合連接條件的行,還包括左表(左外連接時)、右表(右外連接時)、全連接中的所有數據行。
- 對stu表和exam表進行內連接的結果:只顯示符合連接條件的記錄
mysql> select * from stu inner join exam on stu.id=exam.id;
+------+------+------+-------+
| id | name | id | grade |
+------+------+------+-------+
| 1 | zs | 1 | 56 |
| 2 | ls | 2 | 87 |
+------+------+------+-------+
- 對stu表和exam表進行左外連接的結果:既顯示符合連接條件的記錄,又顯示左表中的記錄
mysql> select * from stu left join exam on stu.id=exam.id;
+------+------+------+-------+
| id | name | id | grade |
+------+------+------+-------+
| 1 | zs | 1 | 56 |
| 2 | ls | 2 | 87 |
| 3 | ww | NULL | NULL |
| 4 | zl | NULL | NULL |
+------+------+------+-------+