實驗表建立
建表
#建表
create table dep(
id int,
name varchar(20)
);
create table emp(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);
插入數據
#插入數據
insert into dep values
(200,'技術'),
(201,'人力資源'),
(202,'銷售'),
(203,'運營');
insert into emp(name,sex,age,dep_id) values
('jason','male',18,200),
('egon','female',48,201),
('kevin','male',38,201),
('nick','female',28,202),
('owen','male',18,200),
('jerry','female',18,204)
;
# 當初爲何咱們要分表,就是爲了方便管理,在硬盤上確實是多張表,可是到了內存中咱們應該把他們再拼成一張表進行查詢才合理
笛卡爾積
select * from emp,dep; # 左表一條記錄與右表全部記錄都對應一遍>>>笛卡爾積
# 將全部的數據都對應了一遍,雖然不合理可是其中有合理的數據,如今咱們須要作的就是找出合理的數據
# 查詢員工及所在部門的信息
select * from emp,dep where emp.dep_id = dep.id;
# 查詢部門爲技術部的員工及部門信息
select * from emp,dep where emp.dep_id = dep.id and dep.name = '技術';
內鏈接
# 一、內鏈接:只取兩張表有對應關係的記錄
select * from emp inner join dep on emp.dep_id = dep.id;
select * from emp inner join dep on emp.dep_id = dep.id
where dep.name = "技術";
左鏈接
# 二、左鏈接: 在內鏈接的基礎上保留左表沒有對應關係的記錄
select * from emp left join dep on emp.dep_id = dep.id;
右鏈接
# 三、右鏈接: 在內鏈接的基礎上保留右表沒有對應關係的記錄
select * from emp right join dep on emp.dep_id = dep.id;
全鏈接
# 四、全鏈接:在內鏈接的基礎上保留左、右面表沒有對應關係的的記錄
select * from emp left join dep on emp.dep_id = dep.id
union
select * from emp right join dep on emp.dep_id = dep.id;
子查詢
# 就是將一個查詢語句的結果用括號括起來看成另一個查詢語句的條件去用
# 1.查詢部門是技術或者人力資源的員工信息
"""
先獲取技術部和人力資源部的id號,再去員工表裏面根據前面的id篩選出符合要求的員工信息
"""
select * from emp where dep_id in (select id from dep where name = "技術" or name = "人力資源");
# 2.每一個部門最新入職的員工 思路:先查每一個部門最新入職的員工,再按部門對應上聯表查詢
select t1.id,t1.name,t1.hire_date,t1.post,t2.* from emp as t1
inner join
(select post,max(hire_date) as max_date from emp group by post) as t2
on t1.post = t2.post
where t1.hire_date = t2.max_date
;
"""
記住一個規律,表的查詢結果能夠做爲其餘表的查詢條件,也能夠經過其別名的方式把它做爲一張虛擬表去跟其餘表作關聯查詢
"""
select * from emp inner join dep on emp.dep_id = dep.id;