MySQL 之 多表連接查詢及子查詢


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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM