MySQL之內外連接(如何使用及常見面試題:內外連接區別詳解)

表的內連與外連

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