MySQL數(shù)據(jù)庫操作(五)——多表查詢

個(gè)人博客:haichenyi.com。感謝關(guān)注

合并結(jié)果集 union all(包含相同行)、union(去除相同行)

??把查詢的結(jié)果合并到一起。要求: 查詢的結(jié)果列數(shù)相同,列類型相同

create table emp(
    eid int,
    ename varchar(50),
    eage int
);

create table stu(
    sid int,
    sname varchar(50)
);

//合并結(jié)果集(加上all,包含相同的行)
select eid,ename from emp
union all
select * from stu;

//合并結(jié)果集(去掉all,去除相同行)
select eid,ename from emp
union
select * from stu;

連接查詢

內(nèi)連接

方言: select * from 表1,表2 where 條件

表a有三條數(shù)據(jù):q,w,e
表b有兩條數(shù)據(jù):h,j
select * from a,b;
得出的結(jié)果是表a與表b的笛卡爾集,也就是會(huì)得到6條數(shù)據(jù),
分別:qh,qj,wh,wj,eh,ej
去除無用的笛卡爾集,加上where后面的條件
連表查詢會(huì)有附表的外鍵=主表的主鍵這個(gè)條件

select * from student,teacher where student.tid=teacher.tid;

查詢學(xué)生的全部信息,需要查詢學(xué)生表和老師表,
條件是學(xué)生表里面的老師id等于老師表里面的老師id,
這樣查出來的結(jié)果就是我們想要的結(jié)果
例子:要求打印員工姓名,工資以及部分名稱
     員工姓名,工資在emp表,部門名稱在dept表
select emp.ename,emp.sal,dept.dname
from emp,dept
where emp.did=dept.did;

如果嫌棄表名字太長了可以這樣:
select e.ename,e.sal,d.dname
from emp e,dept d
where e.did=d.did;

標(biāo)準(zhǔn): select * from 表1 別名1 inner join 表2 別名2 on 條件

別名都是可選的,條件跟上面寫的一樣。兩者的區(qū)別就只有二個(gè):
1、方言連接兩個(gè)表是用逗號(hào),標(biāo)準(zhǔn)連接兩個(gè)表是用 inner join
2、條件:方言用where,標(biāo)準(zhǔn)用on

select e.ename,e.sal,d.dname
from emp e inner join dept d
where e.did=d.did;

外連接 一主一次

左外連接 left outer join ,左表為主表,右表為次表,左表中不論滿足不滿足條件都查詢出來,右表中對應(yīng)的位置用null補(bǔ)位

查詢所有員工名稱,工資以及部門名稱,部門名稱為null的填無部分
select e.ename as 姓名,e.sal as 工資,d.ifnull(dname,'無部門') as 部門名稱
from emp e left outer join dept d
where e.did=d.did;

右外連接 right outer join 與左外對應(yīng)

子查詢 一條sql語句中有多個(gè)select關(guān)鍵字,ALL,ANY,IN

//查詢員工中最高工資員工的詳細(xì)信息
select * from emp where sal=MAX(sal);
//上面這個(gè)寫法是錯(cuò)誤的,條件中是不能出現(xiàn)集合函數(shù)
//上面這個(gè)寫法是錯(cuò)誤的,條件中是不能出現(xiàn)集合函數(shù)
//上面這個(gè)寫法是錯(cuò)誤的,條件中是不能出現(xiàn)集合函數(shù)


//1、先查最高工資
select MAX(sal) from emp;
//2、最高工資的員工信息
select * from emp where sal=(select MAX(sal) from emp);
//上面這個(gè)寫法才是正確的
//上面這個(gè)寫法才是正確的
//上面這個(gè)寫法才是正確的

出現(xiàn)的位置: 1、from后作為表 2、where后作為條件

上面那條sql語句就是作為條件
//查詢部門等于30的員工的姓名和年齡
select e.name,e.age from (select * from emp where did=30) e;
//上面這條就是from后面作為表

1、打印高于平均工資的所有人的信息(單行單列作為條件)

select * from emp where (sal>select AVG(sal) from emp);

2、打印大于30部門的所有員工工資的員工信息(多行單列作為條件)

select * from emp where sal > ALL (select sal from emp where did=30);

3、打印大于30部門任意一人員工工資的員工信息

select * from emp where sal> ANY (select sal from emp where did = 30);

4、打印工作和部門與張三相同的員工信息

select * from emp where (job,did) IN (select job,did from emp where ename='張三');

練習(xí)題

前提條件已知四張表

員工表emp(eid,ename,job,emid,etime,sal,edid)
部門表dept(did,dname,dloc)
薪資等級(jí)表salgrade(grade,losal,hisal)
領(lǐng)導(dǎo)表mgr(mid,mname,mtime)

1、查詢至少有一個(gè)員工的部門,顯示部門編號(hào),部門名稱,部門位置,部門人數(shù)

分析:
1、列:d.did,d.dname,d.dloc,部門人數(shù)
2、表:dept d,emp e
條件:e.did=d.did

//查詢部門編號(hào),部門名稱,部門位置
select * from dept;

//查詢部門人數(shù)
select e.did,count(*) from emp group by e.did;

//把上面查詢的兩張表內(nèi)連接
select * from dept inner join select e.did,count(*) from emp group by e.did;

//加上條件,給出別名
select d.*,z1.cnt from dept d inner join (select did,count(*) cnt from emp group by e.did) z1 where d.did=z1.did;

2、查詢所有員工名稱及其直接上級(jí)領(lǐng)導(dǎo)名稱

分析:
1、列:e.ename,m.mname
2、表:emp e,mgr m
條件:e.emid=m.mid
//查詢員工名稱
select ename from emp;
//查詢領(lǐng)導(dǎo)名稱
select mname from mgr;

select ename from emp e left outer join (select mname from mgr ) m on e.emid = m.mid; 

3、列出受雇傭日期早于直接上級(jí)的所有員工編號(hào),姓名,以及部門名稱

分析:
1、列:e.eid,e.ename,d.dname
2、表:emp,mgr,dept
//查詢受雇傭日期早于直接上級(jí)領(lǐng)導(dǎo)的員工信息
select etime from emp;
select mtime from mgr;

select * from emp e
inner join 
select mtime from mgr m
on e.emid=m.mid and e.etime<m.mtime

//再把部門名稱加上
(select eid,ename,edid from emp e
inner join 
select mtime from mgr m
on e.emid=m.mid and e.etime<m.mtime) z1 
left outer join 
select dname from dept d 
on z1.edid = d.did;

或者
select e.eid,e.ename,d.dname
from emp e,mgr m,dept d
where e.emid=m.mid and e.etime<m.mtime and e.edid=d.did;

4、列出部門名稱和這些部門的員工信息,同事列出沒有員工的部門

分析:
1、列:員工信息,和部門名稱,沒有員工的部門也要列出來
2、表:emp,dept

select e.*,d.dname from emp e 
right outer join 
dept d
on e.edid=d.did;

5、列出最低薪資大于15000的各種工作以及從事此工作的人數(shù)

分析:
1、列:工作類型,人數(shù)
2、表:emp
條件:min(sal)>15000

select job,count(*)
from emp
group by job
having min(sal)>15000

6、列出在銷售部工作的員工姓名,假定不知道銷售部的部門編號(hào)

分析:
1、列:員工姓名
2、表:emp,dept
條件:e.edid=d.did

select ename
from emp e
where e.edid=(select did from dept where dname='銷售部');

7、列出薪資高于公司平均工資的所有員工信息,所在部門名稱,上級(jí)領(lǐng)導(dǎo),工資等級(jí)

分析:
1、列:員工信息,部門名稱,上級(jí)領(lǐng)導(dǎo)名稱,工資等級(jí)
2、表:emp,dept,mgr
條件:sal>avg(sal),e.edid=d.did,e.emid=m.mid
//先查詢高出平均工資的員工信息
select * from emp where sal>(select avg(sal) from emp);

//把后面的表一個(gè)一個(gè)的加上去
//加部門名稱
select e.*,d.dname
from 
    emp e left outer join dept d on e.edid=d.did
where e.sal>(select avg(sal) from emp)

//加上級(jí)領(lǐng)導(dǎo)名稱
select e.*,d.dname,m.mname
from 
    emp e left outer join dept d on e.edid=d.did
    left outer join mgr m on e.emid = m.mid
where e.sal>(select avg(sal) from emp)

//最后加工資等級(jí)
select e.*,d.dname,m.mname,s.grade
from 
    emp e left outer join dept d on e.edid=d.did
    left outer join mgr m on e.emid = m.mid
    left outer join salgrade s on e.sal between s.losal and hisal
where e.sal>(select avg(sal) from emp)

8、列出與張三從事相同工作的所有員工以及部門名稱

分析:
1、列:所有員工,部門名稱
2、表:emp,dept
條件:張三的工作相同,e.edid=d.did

select e.*,d.dname from emp e 
left outer join dept d
on e.edid=d.did
where e.job=(select job from emp where ename='張三');

或者

select e.*,d.dname from emp e,dept d where e.edid=did and e.job=(select job from emp where ename='張三');

9、列出薪資高于30部門的所有員工薪資的員工的姓名和薪資,部門名稱


select e.ename,e.sal,d.dname from emp e left outer join dept d
where e.sal > all (select sal from emp where edid=30) and e.edid = d.did;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容