电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

一文了解MySQL的四大子查詢

瀏覽:33日期:2023-08-14 20:18:43
目錄前言一、子查詢概念二、標量/單行子查詢、列子/表子查詢??標量子查詢??單行子查詢??列子查詢(多行子查詢)??表子查詢三、總結前言

本節將為大家帶來MySQL標量/單行子查詢、列子/表子查詢的講解?

一、子查詢概念

子查詢指一個查詢語句嵌套在另一個查詢語句內部的查詢,這個特性從MySQL 4.1開始引入;在特定情況下,一個查詢語句的條件需要另一個查詢語句來獲取,內層查詢(inner query)語句的查詢結果,可以為外層查詢(outer query)語句提供查詢條件。

內層查詢即子查詢,外層查詢即主查詢,只是叫法不同而已

?查詢需求:

查詢公司中工資最低的員工信息

工資最低是多少?

SELECT * FROM emp WHERE sal=(SELECT MIN(sal) FROM emp);

?子查詢規范:

子查詢必須放在小括號中子查詢一般放在比較操作符的右邊,以增強代碼可讀性子查詢可以出現在幾乎所有的SELECT字句中(如:SELECT、FROM、WHERE、ORDER BY、HAVING子句)

?子查詢分類:

1、根據子查詢返回的數據分類:

標量子查詢(scalar subquery):返回1行1列一個值行子查詢(row subquery):返回的結果集是 1 行 N 列列子查詢(column subquery):返回的結果集是 N 行 1列表子查詢(table subquery):返回的結果集是 N 行 N 列

子查詢可以返回一個標量(就一個值)、一個行、一個列或一個表,這些子查詢分別稱之為標量、行、列和表子查詢。

2、根據子查詢和主查詢之間是否有條件關聯分類:

相關子查詢:兩個查詢之間有一定的條件關聯(相互聯系)不相關子查詢:兩個查詢之間沒有條件關聯(相互獨立)

3、為了方便,對于在何處使用子查詢給大家給出幾點個人建議:

子查詢出現在WHERE子句中:此時子查詢返回的結果一般都是單列單行、單行多列、多行單列子查詢出現在HAVING子句中:此時子查詢返回的都是單行單列數據,同時為了使用統計函數操作子查詢出現在FROM子句中:此時子查詢返回的結果圖一般都是多行多列,可以按照一張數據表(臨時表)的形式操作二、標量/單行子查詢、列子/表子查詢??標量子查詢

子查詢返回的是單行單列的數據,就是一個值

查詢出基本工資比ALLEN低的全部員工信息

SELECT * FROM emp WHERE sal<(SELECT sal FROM emp WHERE eanme&#61;&#39;ALLEN&#39;);

查詢基本工資高于公司平均工資的全部員工信息

SELECT * FROM emp WHERE sal>(SELECT AVG(sal) FROM emp);

查詢出與ALLEN從事同一工作,并且基本工資高于員工編號為7521的全部員工信息

SELECT * FROM emp WHERE job=(SELECT job FROM emp WHERE ename='ALLEN') AND sal>(SELECT sal FROM emp WHERE empno=7521)#把ALLEN自己去掉AND ename<>'ALLEN';

?效果如下:

??單行子查詢

子查詢返回的是單行多列的數據,就是一條記錄

查詢與SCOTT從事統一工作且工資相同的員工信息

SELECT * FROM emp WHERE (job,sal)=(SELECT job,sal FROM emp WHERE ename='SCOTT')AND ename<>'SCOTT';

查詢與員工編號為7566從事統一工作且領導相同的全部員工信息

SELECT * FROM emp WHERE (job,mgr)=(SELECT job,mgr FROM emp WHERE empno=7566)AND emp<>7566;

?效果如下:

??列子查詢(多行子查詢)

子查詢返回的是多行單列的數據,就是一列數據。多行子查詢也稱為集合比較子查詢,

在使用多行子查詢需要使用多行比較操作符:

操作符含義IN等于列表中的任意一個ANY需要和單行比較操作符一起使用(>、<、=、<>…),與子查詢結果中任何一個值比較,一個成立ALL需要和單行比較操作符一起使用(>、<、=、<>…),和子查詢返回的所有值比較,同時成立SOME實際上是ANY的別名,作用相同,一般用ANY

IN操作符

IN 運算符用來判斷表達式的值是否位于給出的列表中;如果是,返回值為 1,否則返回值為 0。

NOT IN 的作用和 IN 恰好相反,NOT IN 用來判斷表達式的值是否不存在于給出的列表中;如果不是,返回值為 1,否則返回值為 0。

查詢出與每個部門中最低工資相同的員工信息

按照部門分組,統計每個部門的最低工資根據最低工資查詢出員工信息SELECT * FROM emp WHERE sal IN(SELECT MIN(sal) FROM emp GROUP BY deptno)AND deptno IS NOT NULL;

ANY操作符

ANY關鍵字是一個MySQL運算符,如果子查詢條件中ANY的比較結果為TRUE,則它會返回布爾值TRUE 。

查詢工資比任何管理工資都要高的員工信息

查找出每個管理的薪資每個員工的薪資與每個管理的薪資比較SELECT * FROM emp WHERE sal >ANY(SELECT MIN(sal) FROM emp WHERE job='MANAGER' GROUP BY deptno);

ALL操作符

ALL關鍵字是一個MySQL運算符,如果子查詢條件中ALL的比較結果為TRUE,則它會返回布爾值TRUE 。

案例同ANY操作符

?效果如下:

??表子查詢

子查詢返回的是多行多列的數據,就是一個表格,必須使用 IN、ANY 和 ALL 操作符對子查詢返回的結果進行比較

?綜合練習:

在emp表中,得到與10號部門任何一個員工入職年份和領導相同的員工信息(用在where子句中)

需要用到DATE_FORMAT(hiredate,'%Y')將入職日期轉換為年份

SELECT * FROM empWHERE (DATE_FORMAT(hiredate,'%Y'),mgr) IN (SELECT DATE_FORMAT(hiredate,'%Y') hiryear,mgr FROM emp WHERE deptno=10);

查詢出每個部門的編號、名稱、位置、部門人數、平均工資(用在from子句中)

以前學的多表聯合查詢——-emp、dept

用子查詢聯合查詢

SELECT d.deptno,d.dname,d.loc,COUNT(e.deptno),ROUND(AVG(sal),2) FROMdept d LEFT JOIN emp eON e.deptno=d.deptnoGROUP BY d.deptno,d.dname,d.loc;SELECT dept.deptno,dept.dname,dept.loc,d.count,d.avgsal FROM dept LEFT JOIN (SELECT deptno,COUNT(*) count,AVG(sal) avgsal FROM emp GROUP BY deptno) dON dept.deptno=d.deptno;

查詢出所有在’SALES’部門工作的員工編號、姓名、基本工資、獎金、職位、雇傭日期、部門的最高和最低工資。(where和from子句同時使用)

#1SELECT e.empno,e.ename,e.sal,e.comm,e.job,e.hiredate,minsal,maxsal,e.deptno FROM emp e JOIN (SELECT deptno,MIN(sal) minsal,MAX(sal) maxsal FROM emp GROUP BY deptno) tdON e.deptno=td.deptno AND e.deptno=(SELECT deptno FROM dept WHERE dname='SALES');#2SELECT e.empno,e.ename,e.sal,e.comm,e.job,e.hiredate,minsal,maxsal,e.deptno FROM emp e JOIN (SELECT deptno,MIN(sal) minsal,MAX(sal) maxsal FROM emp GROUP BY deptnoHAVING deptno=(SELECT deptno FROM dept WHERE dname='SALES')) tdON e.deptno=td.deptno;

查詢出比‘ALLEN’或‘CLACRK’薪資多的所有員工的編號、姓名、基本工資、部門名稱、領導姓名、部門人數。

#隱式方式SELECT e.empno,e.ename,e.sal,d.dname,me.ename 領導,temp.count FROM emp e,dept d,emp me,(SELECT deptno,COUNT(deptno) count FROM emp e GROUP BY deptno) tempWHERE e.deptno=d.deptno AND e.mgr=me.empno AND temp.deptno=e.deptnoAND e.sal >ANY(SELECT sal FROM emp WHERE ename IN('ALLEN','CLARK'))AND e.ename NOT IN('ALLEN','CLARK');#顯示方式SELECT e.empno,e.ename,e.sal,d.dname,me.ename 領導,temp.count FROM emp e JOIN dept d ON e.deptno=d.deptnoLEFT JOIN emp me ON e.mgr=me.empnoJOIN (SELECT deptno,COUNT(deptno) count FROM emp e GROUP BY deptno) temp ON temp.deptno=e.deptnoAND e.sal >ANY(SELECT sal FROM emp WHERE ename IN('ALLEN','CLARK'))AND e.ename NOT IN('ALLEN','CLARK');

列出公司各個部門的經理(假設每個部門只有一個經理,job為‘MANAGER’)的姓名、薪資、部門名稱、部門人數、部門平均工資。

#隱式方式SELECT e.ename,e.sal,d.dname,temp.count,temp.avgsalFROM emp e,dept d,(SELECT deptno, COUNT(deptno) count,AVG(sal) avgsal FROM emp GROUP BY deptno) temp WHERE job='MANAGER' AND e.deptno=d.deptno AND temp.deptno=e.deptno; #顯示方式SELECT e.ename,e.sal,d.dname,temp.count,temp.avgsalFROM emp e JOIN dept d ON e.deptno=d.deptno JOIN (SELECT deptno, COUNT(deptno) count,AVG(sal) avgsal FROM emp GROUP BY deptno) temp ON temp.deptno=e.deptno AND job='MANAGER';

查詢出所有薪資高于公司平均薪資的員工編號、姓名、基本工資、職位、雇傭日期、所在部門名稱、部門位置、上級領導姓名、工資等級、部門人數、平均工資、平均服務年限。

#隱式方式SELECT e.empno,e.ename,e.sal,e.job,e.hiredate,d.dname,d.loc,me.ename 領導,s.grade,temp.count,temp.avgsal,temp.avgyearFROM emp e,dept d,emp me,salgrade s,(SELECT deptno,COUNT(deptno) count,AVG(sal) avgsal,AVG(TIMESTAMPDIFF(MONTH,hiredate,CURDATE())/12) avgyear FROM emp GROUP BY deptno) temp WHERE e.deptno=d.deptno AND e.sal>(SELECT AVG(sal) FROM emp)AND e.mgr=me.empnoAND e.sal BETWEEN s.losal AND s.hisalAND temp.deptno=e.deptno;#顯示方式SELECT e.empno,e.ename,e.sal,e.job,e.hiredate,d.dname,d.loc,me.ename 領導,s.grade,temp.count,temp.avgsal,temp.avgyearFROM emp e JOIN dept d ON e.deptno=d.deptno AND e.sal>(SELECT AVG(sal) FROM emp)LEFT JOIN emp me ON e.mgr=me.empnoJOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisalJOIN (SELECT deptno,COUNT(deptno) count,AVG(sal) avgsal,AVG(TIMESTAMPDIFF(MONTH,hiredate,CURDATE())/12) avgyear FROM emp GROUP BY deptno) temp ON temp.deptno=e.deptno;

三、總結

?? 子查詢允許結構化的查詢,這樣就可以把一個查詢語句的每個部分隔開。??子查詢提供了另一種方法來執行有些需要復雜的join和union來實現的操作。??在許多人看來,子查詢可讀性較高。 而實際上,這也是子查詢的由來。

到此這篇關于一文了解MySQL的四大子查詢的文章就介紹到這了,更多相關MySQL 子查詢內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
主站蜘蛛池模板: 澳洁干洗店加盟-洗衣店干洗连锁「澳洁干洗免费一对一贴心服务」 干洗加盟网-洗衣店品牌排行-干洗设备价格-干洗连锁加盟指南 | 河北中仪伟创试验仪器有限公司是专业生产沥青,土工,水泥,混凝土等试验仪器的厂家,咨询电话:13373070969 | 喷涂流水线,涂装流水线,喷漆流水线-山东天意设备科技有限公司 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 衬氟止回阀_衬氟闸阀_衬氟三通球阀_衬四氟阀门_衬氟阀门厂-浙江利尔多阀门有限公司 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 东莞市天进机械有限公司-钉箱机-粘箱机-糊箱机-打钉机认准东莞天进机械-厂家直供更放心! | H型钢切割机,相贯线切割机,数控钻床,数控平面钻,钢结构设备,槽钢切割机,角钢切割机,翻转机,拼焊矫一体机 | 拉伸膜,PE缠绕膜,打包带,封箱胶带,包装膜厂家-东莞宏展包装 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | 品牌策划-品牌设计-济南之式传媒广告有限公司官网-提供品牌整合丨影视创意丨公关活动丨数字营销丨自媒体运营丨数字营销 | 合肥展厅设计-安徽展台设计-合肥展览公司-安徽奥美展览工程有限公司 | 搪玻璃冷凝器_厂家-越宏化工设备| 不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰]-不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰] | 成都网站建设制作_高端网站设计公司「做网站送优化推广」 | 高铝轻质保温砖_刚玉莫来石砖厂家_轻质耐火砖价格 | 丽陂特官网_手机信号屏蔽器_Wifi信号干扰器厂家_学校考场工厂会议室屏蔽仪 | 专业生产动态配料系统_饲料配料系统_化肥配料系统等配料系统-郑州鑫晟重工机械有限公司 | 制冷采购电子商务平台——制冷大市场 | 酶联免疫分析仪-多管旋涡混合仪|混合器-莱普特科学仪器(北京)有限公司 | 高铝矾土熟料_细粉_骨料_消失模_铸造用铝矾土_铝酸钙粉—嵩峰厂家 | 派克防爆伺服电机品牌|国产防爆伺服电机|高低温伺服电机|杭州摩森机电科技有限公司 | 网架支座@球铰支座@钢结构支座@成品支座厂家@万向滑动支座_桥兴工程橡胶有限公司 | 七维官网-水性工业漆_轨道交通涂料_钢结构漆 | 食品机械专用传感器-落料放大器-低价接近开关-菲德自控技术(天津)有限公司 | 带式压滤机_污泥压滤机_污泥脱水机_带式过滤机_带式压滤机厂家-河南恒磊环保设备有限公司 | 等离子表面处理机-等离子表面活化机-真空等离子清洗机-深圳市东信高科自动化设备有限公司 | 合肥网带炉_安徽箱式炉_钟罩炉-合肥品炙装备科技有限公司 | 篷房[仓储-婚庆-展览-活动]生产厂家-江苏正德装配式帐篷有限公司 | 熔体泵|换网器|熔体齿轮泵|熔体计量泵厂家-郑州巴特熔体泵有限公司 | 合肥废气治理设备_安徽除尘设备_工业废气处理设备厂家-盈凯环保 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 振动传感器,检波器-威海广达勘探仪器有限公司 | 低气压试验箱_高低温低气压试验箱_低气压实验箱 |林频试验设备品牌 | 有机废气处理-rto焚烧炉-催化燃烧设备-VOC冷凝回收装置-三梯环境 | 电动葫芦-河北悍象起重机械有限公司 | 直读光谱仪,光谱分析仪,手持式光谱仪,碳硫分析仪,创想仪器官网 | 天津试验仪器-电液伺服万能材料试验机,恒温恒湿标准养护箱,水泥恒应力压力试验机-天津鑫高伟业科技有限公司 | 鑫达滑石-辽宁鑫达滑石集团 | 面粉仓_储酒罐_不锈钢储酒罐厂家-泰安鑫佳机械制造有限公司 |