《MySQL数据库》关联查询
一、關(guān)聯(lián)查詢
1、概念
在查詢數(shù)據(jù)時(shí),所需要的數(shù)據(jù)不只在一張表中,可能在兩張或多張表中。這個(gè)時(shí)候,需要同時(shí)操作這些表來查詢數(shù)據(jù),即關(guān)聯(lián)查詢。
關(guān)聯(lián)查詢所涉及到的表與表之間都會(huì)存在有關(guān)聯(lián)的字段,如員工表的部門編號和部門表的部門編號。
2、笛卡爾積
在做關(guān)聯(lián)查詢時(shí),數(shù)據(jù)庫會(huì)使用某一張表中的每一條記錄都與另外一張表的所有記錄進(jìn)行組合。比如表A有x條記錄,表B有y條記錄,最終組合數(shù)為x*y,這個(gè)值就是笛卡爾積,通常沒有意義。
3、等值連接
在做關(guān)聯(lián)查詢時(shí),這些表中存在著有關(guān)聯(lián)的兩個(gè)字段。我們使用某一張表中的一條記錄通過相關(guān)聯(lián)的字段與另外一張表的記錄進(jìn)行匹配,組合成一條新的記錄。使用"="連接關(guān)聯(lián)字段
需求1:查詢員工的姓名,職位及其所在部門的名稱 、地址
4、內(nèi)連接
內(nèi)連接返回所有滿足條件的記錄,關(guān)鍵字join on。查詢效果與等值連接一樣。
用法:表A [inner] join 表B on 關(guān)聯(lián)條件
5、外連接
在做關(guān)聯(lián)查詢時(shí),我們所需要的數(shù)據(jù),除了那些滿足關(guān)聯(lián)條件的數(shù)據(jù)外,還有不滿足關(guān)聯(lián)條件的數(shù)據(jù)。此時(shí)需要使用外連接。
會(huì)涉及到兩個(gè)概念:
驅(qū)動(dòng)表(主表):除了顯示滿足條件的數(shù)據(jù),還需要顯示不滿足條件的數(shù)據(jù)的表 從表(副表):只顯示滿足關(guān)聯(lián)條件的數(shù)據(jù)的表mysql外連接只支持左外連接,右外連接,不支持全外連接
左外連接:表A left [outer] join 表B on 關(guān)聯(lián)條件。 表A是驅(qū)動(dòng)表,表B是從表 右外連接表A right [outer] join 表B on 關(guān)聯(lián)條件表B是驅(qū)動(dòng)表,表A是從表 全外連接:兩張表的數(shù)據(jù)不管滿不滿足條件,都做顯示。表A full [outer] join 表B on 關(guān)聯(lián)條件 PS:mysql 不支持全外連接需求1:查詢所有員工的姓名,職位,及其部門編號,部門名稱----分析:員工表為驅(qū)動(dòng)表,部門表為從表
select e.ename,e.job,e.deptno,d.dname from emp e left join dept d on e.deptno = d.deptno;
6、自連接
自連接是一種特殊的關(guān)聯(lián)查詢。數(shù)據(jù)的來源是同一個(gè)表,這樣的表內(nèi)的多個(gè)字段要存有關(guān)系。我們要使用表別名來虛擬出兩個(gè)表。
需求1:查詢員工姓名,職位及其上司姓名,職位。
mysql > select a.ename 員工姓名, a.job 員工職位, b.ename 上司姓名, b.job 上司職位 from emp a join emp b on a.mgr=b.empno;分析:可以看出 a的mgr與b的empno關(guān)聯(lián),所以,a是員工表,b是領(lǐng)導(dǎo)表二、高級關(guān)聯(lián)查詢
有的時(shí)候,我們要查詢的數(shù)據(jù),一個(gè)簡單的查詢語句完成不了,并且我們使用的數(shù)據(jù),表中不能直觀體現(xiàn)出來。而是預(yù)先經(jīng)過一次查詢才會(huì)有所體現(xiàn)。那么先執(zhí)行的查詢,我們稱之子查詢。被子查詢嵌入的查詢語句稱之為父查詢或主查詢。
主查詢可以是select語句,也可以是DML語句或者是DDL語句。
根據(jù)子查詢返回結(jié)果的不同,可以分為單行單列子查詢、多行單列子查詢、多行多列子查詢。
子查詢所在的位置,有可能出現(xiàn)在以下地方:
1)子查詢可以在where子句中 2)子查詢可以在from子句中 3)子查詢可以在having子句中 4)子查詢可以在select字句中,相當(dāng)于外連接的另外一種寫法。1、在where子句中
需求1:查詢和員工姓名scott同職位的員工信息。
select ename,job,hiredate,sal,deptno from emp where job=(select job from emp where ename='scott');需求2:查詢薪水比所有員工的平均薪水高的員工信息
mysql > select ename,job,hiredate,sal from emp where sal > (select avg(ifnull(sal,0)) from emp);需求3:查詢出部門中有salesman但是職位不是salesman的員工信息
select ename,job,hiredate,sal,deptno from emp where deptno in (select distinct deptno from emp where job='salesman') and job <> 'salesman';exists 關(guān)鍵字
有時(shí)候,子查詢需要引用主查詢的字段數(shù)據(jù),我們使用exists關(guān)鍵字。exists后面的子查詢至少返回一條記錄,則整個(gè)條件為true;
需求:查詢有員工的部門信息
mysql > select deptno,dname,loc from dept d where exists (select * from emp e where d.deptno =e.deptno);2、在from子句中
from子句用于指定表,如果想在一個(gè)子查詢的結(jié)果里繼續(xù)查詢,則子查詢需要寫在from子句中,相當(dāng)于一個(gè)表。
需求1:查詢工資大于本部門平均工資的員工的信息。
mysql > select e.ename,e.sal,t.avg_sal,t.deptno from emp e join (select deptno,avg(ifnull(sal,0)) 'avg_sal' from emp group by deptno) t on e.deptno = t.deptno and e.sal>t.avg_sal order by t.deptno;需求2:查詢每個(gè)員工的工資,姓名和其部門的平均工資。
select e.ename, e.sal, t.avg_sal from emp e , (select deptno,avg(ifnull(sal,0)) 'avg_sal' from emp group by deptno) t where e.deptno = t.deptno order by t.deptno;3、在having子句中
需求:查詢平均工資大于30號部門平均工資的部門號、平均工資
mysql > select deptno,avg(ifnull(sal,0)) from emp group by deptno having avg(ifnull(sal,0))>(select avg(ifnull(sal,0)) from emp where deptno=30);4、在select子句中
需求1:查詢每個(gè)員工的姓名,工資,及其部門的平均工資,工資之和
select ename,sal, (select avg(ifnull(sal,0)) from emp a where a.deptno=b.deptno) avg_sal , (select sum(sal) from emp c where c.deptno=b.deptno ) sum_sal from emp b order by b.deptno;總結(jié)
以上是生活随笔為你收集整理的《MySQL数据库》关联查询的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL如何执行关联查询
- 下一篇: windows下载mysql太慢