1、前期准備
#建表
create table department(
id int,
name varchar(20)
);
create table employee(
id int,
name varchar(20),
sex enum('male','female'),
age int,
dep_id int
);
#插入數據
insert into department values
(200,'技術'),
(201,'人力資源'),
(202,'銷售'),
(203,'運營');
insert into employee(id,name,sex,age,dep_id) values
(1,'cai','male',18,200),
(2,'liu','female',48,201),
(3,'ling','male',38,201),
(4,'liangliang','female',28,202),
(5,'acai','male',18,200),
(6,'bao','female',18,204)
;
2、連表
(1)、 交叉連接:不使用任何匹配條件。生成笛卡爾積
select * from employee,department;
(2)、 內連接:只連接匹配的行(所有不在條件匹配內的數據,都會被剔出連表)
# 方式一 :
select * from employee,department where dep_id = department.id;
# 方式二 :
select * from employee inner join department on dep_id = department.id;
(3)、 外連接
左外連接:優先顯示左表全部記錄(本質就是在內連接的基礎上增加左邊有右邊沒有的結果)
右外連接:優先顯示右表全部記錄(本質就是在內連接的基礎上增加右邊有左邊沒有的結果)
全外連接:顯示左右兩個表全部記錄(mysql 不支持全外連接,但可以間接實現全外連接)
# 左外連接 left join
select * from employee left join department on dep_id = department.id;
# 右外連接 right join
select * from employee right join department on dep_id = department.id;
# 全外連接 full join (mysql中不支持)
# 在mysql中實現全外連接的方法
select * from employee left join department on dep_id = department.id
union
select * from employee right join department on dep_id = department.id;
3、符合條件查詢連接
# 示例1:以內連接的方式查詢employee和department表,並且employee表中的age字段值必須大於25,即找出年齡大於25歲的員工以及員工所在的部門
select employee.name,department.name from employee inner join department on dep_id = department.id where age>25;
select e.name ename,d.name dname from employee e inner join department d on dep_id = d.id where age>25;
select e.name,d.name from employee e inner join department d on dep_id = d.id where age>25;
# 示例2:以內連接的方式查詢employee和department表,並且以age字段的升序方式顯示。
select * from employee inner join department on dep_id = department.id order by age;
4、子查詢
(1)、 帶 in 關鍵字的子查詢
# 查詢平均年齡在25歲以上的部門名
select name from department where id in (select dep_id from employee group by dep_id having avg(age)>25);
# 查看不足1人的部門名(子查詢得到的是有人的部門id)
# 分步完成
先從employee中查有多少個部門有人
select distinct dep_id from employee;
從department表中把不在上述部門中的那些項找出來
select * from department where id not in (200,201,202,204);
# 組合結果
select * from department where id not in (select distinct dep_id from employee);
(2)、 帶比較運算符的子查詢
比較運算符: = != > < >= <= <>
# 查看技術部員工姓名
# 分步完成
先查詢技術部的id
select id from department where name = '技術';
根據技術部id查詢employee表 找到技術部id對應的人名
select * from employee where dep_id = 200;
# 組合結果
select name from employee where dep_id = (select id from department where name = '技術');
# 查詢大於所有人平均年齡的員工名與年齡
# 分步完成
所有人的平均年齡
select avg(age) from employee; # 28
查大於上述平均年齡的人
select name,age from employee where age>28;
# 組合結果
select name,age from employee where age>(select avg(age) from employee);
# 查詢大於部門內平均年齡的員工名、年齡
# 分步完成
查詢各部門平均年齡
select dep_id,avg(age) from employee group by dep_id;
查大於部門平均年齡的人
select * from employee where dep_id = 200 and age>18
select * from employee where dep_id = 201 and age>43
select * from employee where dep_id = 202 and age>28
select * from employee where dep_id = 204 and age>18
# 組合結果
select * from employee inner join (select dep_id,avg(age) as avg_age from employee group by dep_id) as t on employee.dep_id = t.dep_id;
select * from employee inner join (select dep_id,avg(age) as avg_age from employee group by dep_id) as t on employee.dep_id = t.dep_id where age>avg_age;
(3)、 帶 exists 關鍵字的查詢
exists關鍵字表示存在,在使用exists關鍵字時,內層查詢語句不返回查詢的記錄。而是返回一個真假值。True或False ,當返回True時,外層查詢語句將進行查詢;當返回False時,外層查詢語句不進行查詢。
# 內層查詢返回True,外層查詢會進行
select name from employee1 where exists(select * from department where id=200);
# 內層查詢返回False,外層查詢不會進行
select name from employee1 where exists(select * from department where id=205);