建表前準備 1.笛卡爾積:將兩表所有的數據一一對應,生成一張大表 2.連表查詢 1.inner join 內連接 2.left join 左連接(left join左邊的表為主表,主表記錄必須全部顯示,輔表沒辦法對應上的,就通過null來補全) 3.right join 右連接 4.union 全連 ...
目錄
建表前準備
#建表
#部門表
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.笛卡爾積:將兩表所有的數據一一對應,生成一張大表
select * from dep,emp; #兩個表拼一起
select * from dep,emp where dep.id = emp.dep_id; #找到兩表之間對應的關係記錄
select * from dep,emp where dep.id = emp.dep_id and dep.name='技術'; #篩選部門名稱為技術的大表中的記錄
select emp.name from dep,emp where dep.id = emp.dep_id and dep.name='技術'; #拿到篩選後的記錄的員工姓名欄位數據
2.連表查詢
1.inner join 內連接
第一步:連表
select * from dep inner join emp on dep.id=emp.dep_id;
第二步: 過濾
select * from dep inner join emp on dep.id=emp.dep_id where dep.name='技術';
第三步:找對應欄位數據
select emp.name from dep inner join emp on dep.id=emp.dep_id where dep.name='技術';
2.left join 左連接(left join左邊的表為主表,主表記錄必須全部顯示,輔表沒辦法對應上的,就通過null來補全)
select * from dep left join emp on dep.id=emp.dep_id;
3.right join 右連接
select * from dep right join emp on dep.id=emp.dep_id;
4.union 全連接
mysql> select * from dep left join emp on dep.id=emp.dep_id
-> union
-> select * from dep right join emp on dep.id=emp.dep_id;
5.子查詢:(一個查詢結果集作為另一個查詢的條件)
select name from emp where dep_id = (select id from dep where name = '技術');