一.介紹 首先說一下,我們寫項目一般都會建一個資料庫,那資料庫裡面是不是存了好多張表啊,不可能把所有的數據都放到一張表裡面,肯定要分表來存數據,這樣節省空間,數據的組織結構更清晰,解耦和程度更高,但是這些表本質上是不是還是一個整體啊,是一個項目所有的數據,那既然分表存了,就要涉及到多個表連接查詢了, ...
一.介紹
首先說一下,我們寫項目一般都會建一個資料庫,那資料庫裡面是不是存了好多張表啊,不可能把所有的數據都放到一張表裡面,肯定要分表來存數據,這樣節省空間,數據的組織結構更清晰,解耦和程度更高,但是這些表本質上是不是還是一個整體啊,是一個項目所有的數據,那既然分表存了,就要涉及到多個表連接查詢了,比如說員工信息一張表,部門信息一張表,那如果我想讓你幫我查一下技術部門有哪些員工的姓名,你怎麼辦,單獨找員工表能實現嗎,不能,單獨找部門表也無法實現,因為部門表裡面沒有員工的信息,對不對,所以就涉及到部門表和員工表來關聯到一起進行查詢了,好,那我們來建立這麼兩張表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
#建表
#部門表
create table department(
id int ,
name varchar( 20 )
);
#員工表,之前我們學過foreign key,強行加上約束關聯,但是我下麵這個表並沒有直接加foreign key,這兩個表我只是讓它們在邏輯意義上有關係,並沒有加foreign key來強制兩表建立關係,為什麼要這樣搞,是有些效果要給大家演示一下
#所以,這兩個表是不是先建立哪個表都行啊,如果有foreign key的話,是不是就需要註意表建立的順序了。那我們來建表。
create table employee(
id int primary key auto_increment,
name varchar( 20 ),
sex enum( 'male' , 'female' ) not null default 'male' ,
age int ,
dep_id int
);
#給兩個表插入一些數據
insert into department values
( 200 , '技術' ),
( 201 , '人力資源' ),
( 202 , '銷售' ),
( 203 , '運營' ); #註意這一條數據,在下麵的員工表裡面沒有對應這個部門的數據
insert into employee(name,sex,age,dep_id) values
( 'egon' , 'male' , 18 , 200 ),
( 'alex' , 'female' , 48 , 201 ),
( 'wupeiqi' , 'male' , 38 , 201 ),
( 'yuanhao' , 'female' , 28 , 202 ),
( 'liwenzhou' , 'male' , 18 , 200 ),
( 'jingliyang' , 'female' , 18 , 204 ) #註意這條數據的dep_id欄位的值,這個204,在上面的部門表裡面也沒有對應的部門id。所以兩者都含有一條雙方沒有涉及到的數據,這都是為了演示一下效果設計的昂
;
#查看表結構和數據
mysql> desc department;
+ - - - - - - - + - - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - +
| Field | Type | Null | Key | Default | Extra |
+ - - - - - - - + - - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - +
| id | int ( 11 ) | YES | | NULL | |
| name | varchar( 20 ) | YES | | NULL | |
+ - - - - - - - + - - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - +
mysql> desc employee;
+ - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - - - - - - - - - - +
| Field | Type | Null | Key | Default | Extra |
+ - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - - - - - - - - - - +
| id | int ( 11 ) | NO | PRI | NULL | auto_increment |
| name | varchar( 20 ) | YES | | NULL | |
| sex | enum( 'male' , 'female' ) | NO | | male | |
| age | int ( 11 ) | YES | | NULL | |
| dep_id | int ( 11 ) | YES | | NULL | |
+ - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - - - - - - - - - - +
mysql> select * from department;
+ - - - - - - + - - - - - - - - - - - - - - +
| id | name |
+ - - - - - - + - - - - - - - - - - - - - - +
| 200 | 技術 |
| 201 | 人力資源 |
| 202 | 銷售 |
| 203 | 運營 |
+ - - - - - - + - - - - - - - - - - - - - - +
mysql> select * from employee;
+ - - - - + - - - - - - - - - - - - + - - - - - - - - + - - - - - - + - - - - - - - - +
| id | name | sex | age | dep_id |
+ - - - - + - - - - - - - - - - - - + - - - - - - - - + - - - - - - + - - - - - - - - +
| 1 | egon | male | 18 | 200 |
| 2 | alex | female | 48 | 201 |
| 3 | wupeiqi | male | 38 | 201 |
| 4 | yuanhao | female | 28 | 202 |
| 5 | liwenzhou | male | 18 | 200 |
| 6 | jingliyang | female | 18 | 204 |
+ - - - - + - - - - - - - - - - - - + - - - - - - - - + - - - - - - + - - - - - - - - +
|
二.多表連接查詢
1 2 3 4 5 |
#重點:外鏈接語法
SELECT 欄位列表
FROM 表 1 INNER|LEFT|RIGHT JOIN 表 2
ON 表 1. 欄位 = 表 2. 欄位;
|
1、交叉連接:不適用任何匹配條件。生成笛卡爾積
補充一點:select 查詢表的時候,後面可以跟多張表一起查詢: