MySQL篇七:復合查詢

文章目錄

  • 前言
  • 1. 基本查詢回顧
  • 2. 多表查詢
  • 3. 自連接
  • 4. 子查詢
    • 4.1 單行子查詢
    • 4.2 多行子查詢
    • 4.3 多列子查詢
    • 4.4 在from子句中使用子查詢
    • 4.5 合并查詢
      • 4.5.1 union
      • 4.5.2 union all

前言

??前面我們講解的mysql表的查詢都是對一張表進行查詢,在實際開發中這遠遠不夠。

1. 基本查詢回顧

??查詢工資高于500或崗位為MANAGER的雇員,同時還要滿足他們的姓名首字母為大寫的J

select * from EMP where (sal>500 or job='MANAGER') and ename like 'J%';

??按照部門號升序而雇員的工資降序排序

select * from EMP order by deptno, sal desc;

??使用年薪進行降序排序

select ename, sal*12+ifnull(comm,0) as '年薪' from EMP order by 年薪 desc;

??顯示工資最高的員工的名字和工作崗位

select ename, job from EMP where sal = (select max(sal) from EMP);

??顯示工資高于平均工資的員工信息

select ename, sal from EMP where sal>(select avg(sal) from EMP);

??顯示每個部門的平均工資和最高工資

select deptno, format(avg(sal), 2) , max(sal) from EMP group by deptno;

??顯示平均工資低于2000的部門號和它的平均工資

select deptno, avg(sal) as avg_sal from EMP group by deptno having avg_sal<2000;

??顯示每種崗位的雇員總數,平均工資

select job,count(*), format(avg(sal),2) from EMP group by job;

2. 多表查詢

??實際開發中往往數據來自不同的表,所以需要多表查詢。本節我們用一個簡單的公司管理系統,有三張表EMP,DEPT,SALGRADE來演示如何進行多表查詢。
??顯示雇員名、雇員工資以及所在部門的名字。 因為上面的數據來自EMP和DEPT表,因此要聯合查詢,其實我們只要emp表中的deptno = dept表中的deptno字段的記錄

select EMP.ename, EMP.sal, DEPT.dname from EMP, DEPT where EMP.deptno = DEPT.deptno;

??顯示部門號為10的部門名,員工名和工資

select ename, sal,dname from EMP, DEPT where EMP.deptno=DEPT.deptno and DEPT.deptno = 10;

??顯示各個員工的姓名,工資,及工資級別

select ename, sal, grade from EMP, SALGRADE where EMP.sal between losal and hisal;

3. 自連接

??自連接是指在同一張表連接查詢
??顯示員工FORD的上級領導的編號和姓名(mgr是員工領導的編號–empno)
??使用的子查詢:

select empno,ename from emp where emp.empno=(select mgr from emp where ename='FORD');

??使用多表查詢(自查詢)

-- 使用到表的別名
--from emp leader, emp worker,給自己的表起別名,因為要先做笛卡爾積,所以別名可以先識別select leader.empno,leader.ename from emp leader, emp worker whereleader.empno = worker.mgr and worker.ename='FORD';

4. 子查詢

??子查詢是指嵌入在其他sql語句中的select語句,也叫嵌套查詢

4.1 單行子查詢

??返回一行記錄的子查詢
??顯示SMITH同一部門的員工

select * from EMP WHERE deptno = (select deptno from EMP where ename='smith');

4.2 多行子查詢

??返回多行記錄的子查詢
??in關鍵字;查詢和10號部門的工作崗位相同的雇員的名字,崗位,工資,部門號,但是不包含10自己的

select ename,job,sal,deptno from emp where job in (select distinct job from emp where deptno=10) and deptno<>10;

??all關鍵字; 顯示工資比部門30的所有員工的工資高的員工的姓名、工資和部門號

select ename, sal, deptno from EMP where sal > all(select sal from EMP where deptno=30);

??any關鍵字; 顯示工資比部門30的任意員工的工資高的員工的姓名、工資和部門號(包含自己部門的員工)

select ename, sal, deptno from EMP where sal > any(select sal from EMP where deptno=30);

4.3 多列子查詢

??單行子查詢是指子查詢只返回單列,單行數據;多行子查詢是指返回單列多行數據,都是針對單列而言的,而多列子查詢則是指查詢返回多個列數據的子查詢語句
??查詢和SMITH的部門和崗位完全相同的所有雇員,不含SMITH本人

mysql> select ename from EMP where (deptno, job)=(select deptno, job from EMPwhere ename='SMITH') and ename <> 'SMITH';

4.4 在from子句中使用子查詢

??子查詢語句出現在from子句中。這里要用到數據查詢的技巧,把一個子查詢當做一個臨時表使用。
??顯示每個高于自己部門平均工資的員工的姓名、部門、工資、平均工資。

//獲取各個部門的平均工資,將其看作臨時表select ename, deptno, sal, format(asal,2) from EMP,(select avg(sal) asal, deptno dt from EMP group by deptno) tmpwhere EMP.sal > tmp.asal and EMP.deptno=tmp.dt;

??查找每個部門工資最高的人的姓名、工資、部門、最高工資

select EMP.ename, EMP.sal, EMP.deptno, ms from EMP,(select max(sal) ms, deptno from EMP group by deptno) tmpwhere EMP.deptno=tmp.deptno and EMP.sal=tmp.ms;

??顯示每個部門的信息(部門名,編號,地址)和人員數量
??方法1:使用多表

select DEPT.dname, DEPT.deptno, DEPT.loc,count(*) '部門人數' from EMP,DEPTwhere EMP.deptno=DEPT.deptno group by DEPT.deptno,DEPT.dname,DEPT.loc;

??方法2:使用子查詢

-- 1. 對EMP表進行人員統計
select count(*), deptno from EMP group by deptno;-- 2. 將上面的表看作臨時表
select DEPT.deptno, dname, mycnt, loc from DEPT,(select count(*) mycnt, deptno from EMP group by deptno) tmpwhere DEPT.deptno=tmp.deptno;

4.5 合并查詢

??在實際應用中,為了合并多個select的執行結果,可以使用集合操作符 union,union all

4.5.1 union

??該操作符用于取得兩個結果集的并集。當使用該操作符時,會自動去掉結果集中的重復行。
??將工資大于2500或職位是MANAGER的人找出來

select ename, sal, job from EMP where sal>2500 unionselect ename, sal, job from EMP where job='MANAGER';--去掉了重復記錄

4.5.2 union all

??該操作符用于取得兩個結果集的并集。當使用該操作符時,不會去掉結果集中的重復行。
??將工資大于25000或職位是MANAGER的人找出來

 select ename, sal, job from EMP where sal>2500 union allselect ename, sal, job from EMP where job='MANAGER';

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/44371.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44371.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44371.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【高中數學/指數函數】比較a=0.6^0.9 b=0.6^1.5 c=1.5^0.6的大小

【問題】 比較a0.6^0.9 b0.6^1.5 c1.5^0.6的大小 【解答】 指數函數y0.6^x是減函數&#xff0c;因為0.9<1.5,所以0.6^0.9>0.6^1.5,即a>b; 指數函數y1.5^x是增函數&#xff0c;1.5^0.6>1.5^01>0.6^0.9,即c>a; 綜上&#xff0c;得出c>a>b的結論。 …

【運維】docker批量刪除臨時鏡像(兩種方式)

docker批量刪除Tag<none>的臨時鏡像 在開發的時候&#xff0c;需要經常發布開發包&#xff0c;在使用docker build構建鏡像的時候&#xff0c;同一個版本經常會使用相同tag&#xff0c;頻繁打包一段時間后&#xff0c;本地會出現很多Tag<none>的臨時鏡像&#xff…

【MySQL】MySQL中的字段類型和區別

文章目錄 前言一、說明舉例1. 數值類型2. 字符串類型3. 日期和時間類型 二、總結 前言 在設計數據庫和創建表時&#xff0c;理解MySQL中的各種字段類型及其區別是非常重要的。每種類型都有其特定的用途和存儲需求。在本文中&#xff0c;我們將詳細討論MySQL中的各種字段類型&a…

uniapp如何發送websocket請求

方法1&#xff1a; onLoad() {uni.connectSocket({url: ws://127.0.0.1:8000/ws/stat/realTimeStat/,success: (res) > {console.log(connect success, res);}});uni.onSocketOpen(function (res) {console.log(WebSocket連接已打開&#xff01;);uni.sendSocketMessage({d…

Xinstall揭秘:APP推廣數據背后的真相,讓你的營銷更精準!

在這個移動互聯網時代&#xff0c;APP如同雨后春筍般涌現&#xff0c;但如何在這片紅海中脫穎而出&#xff0c;成為每一個開發者與運營者面臨的共同難題。其中&#xff0c;APP推廣統計作為衡量營銷效果、優化推廣策略的關鍵環節&#xff0c;更是不可忽視的一環。今天&#xff0…

[GDOUCTF 2023]Tea writeup

通過strings找到關鍵函數 int __fastcall main_0(int argc, const char **argv, const char **envp) {char *v3; // rdi__int64 i; // rcxchar v6; // [rsp20h] [rbp0h] BYREFint v7; // [rsp24h] [rbp4h]int v8; // [rsp44h] [rbp24h]int four_key[12]; // [rsp68h] [rbp48h]…

你知道滾筒式高速視覺檢測機外觀怎么“看”出產品質量嗎?

點火線圈膠套是一種用于保護點火線圈絕緣部分的膠質套管。這種膠套通常由高溫耐磨的橡膠或硅膠材料制成&#xff0c;具有良好的絕緣性能和耐高溫性能。點火線圈膠套的作用是防止點火線圈與外部環境接觸&#xff0c;防止受潮、灰塵或化學物質的侵蝕&#xff0c;同時起到絕緣和保…

python怎么調用cmd命令

關于python調用cmd命令&#xff1a; 1、python的OS模塊 OS模塊調用CMD命令有兩種方式&#xff1a;os.popen()、os.system()都是用當前進程來調用。 OS.system是無法獲取返回值的。當運行結束后接著往下面執行程序。用法如&#xff1a;OS.system("ipconfig"). OS.…

隨身WiFi市場亂象橫生,隨身WiFi測評最好的格行隨身WiFi如何引領變革?

在當今隨身WiFi市場亂象頻發、內卷嚴重的背景下&#xff0c;消費者對于產品的性能與商家是否會后臺割韭菜依舊存疑&#xff0c;尤其是“隨身WiFi到底卡不卡&#xff1f;”的問題&#xff0c;成為了廣大消費者關注的重點。然而&#xff0c;在眾多品牌中&#xff0c;格行隨身WiFi…

【音頻特征提取】傅里葉變換算法源碼學習記錄

目錄 背景快速理解FFT&#xff08;快速傅里葉變換&#xff09;IFFT&#xff08;逆傅里葉變換&#xff09;STFT&#xff08;短時傅里葉變換&#xff09; 代碼實現FFT源代碼IFFT源代碼FFT、IFFT自己實驗STFT源代碼STFT自己實驗 總結 背景 最近用到了相關操作提取音頻信號特征&am…

Vue3 根據相對路徑加載vue組件

一、設置動態組件加載器 1、"DynamicFormLoader.vue" <template><div><component :is"formComponent" v-if"formComponent" /></div> </template><script setup> import { ref, watch } from vue; import …

如何測試掃地機器人的穩定性

測試掃地機器人的穩定性是一個綜合性的過程&#xff0c;旨在確保機器人在各種環境和條件下都能穩定運行。以下是一些關鍵的測試步驟和方面&#xff1a; 清潔效果測試 目的&#xff1a;評估掃地機器人在不同地面和污漬類型上的清潔能力。 方法&#xff1a; 使用不同類型的地面&…

標簽印刷檢測,如何做到百分百準確?

印刷標簽是一種用于標識、識別或包裝產品的平面印刷制品。這些標簽通常在紙張、塑料膜、金屬箔等材料上印刷產品信息、條形碼、圖像或公司標識&#xff0c;以便于產品識別和管理。印刷標簽有各種形狀、尺寸和材質&#xff0c;可以根據具體需求進行定制設計。常見的印刷標簽包括…

FlutterFlame游戲實踐#15 | 生命游戲 - 演繹啟動

theme: cyanosis 本文為稀土掘金技術社區首發簽約文章&#xff0c;30天內禁止轉載&#xff0c;30天后未獲授權禁止轉載&#xff0c;侵權必究&#xff01; Flutter\&Flame 游戲開發系列前言: 該系列是 [張風捷特烈] 的 Flame 游戲開發教程。Flutter 作為 全平臺 的 原生級 渲…

android 居中對齊

在 Android 中&#xff0c;要使 LinearLayout 中的內容居中對齊&#xff0c;你可以通過設置 android:gravity 屬性或使用 android:layout_gravity 屬性來實現。這兩個屬性的使用取決于你希望對齊的內容是 LinearLayout 內部的子視圖還是 LinearLayout 本身相對于其父布局的對齊…

4.3 設備管理

大綱 設備分類 輸入輸出 虛設備和SPOOLING技術

管理客戶的10個CRM系統技巧

客戶是企業生存和發展的基石。為此&#xff0c;客戶關系管理系統&#xff08;CRM&#xff09;應運而生&#xff0c;旨在幫助企業實現大規模的個性化客戶接觸&#xff0c;并通過定制化的互動增強客戶忠誠度&#xff0c;從而推動企業的持續增長。 然而&#xff0c;引入CRM系統并…

vue3對比 Setup、Render、SFC 從 vue 底層實現和性能開銷上全面分析三者區別及優略

vue3 中對比 Setup、Render、SFC 從 vue 底層實現和性能開銷上全面分析三者區別及優略 /* setup 方式 */ export const Setup defineComponent({setup() {const handleChange (v: any) > {};return () > {return (<div><button onClick{handleChange}>Tes…

AD確定板子形狀

方法1 修改柵格步進值&#xff0c;手動繪制 https://cnblogs.com/fqhy/p/13768031.html 方法2 器件擺放確定板子形狀 https://blog.csdn.net/Mark_md/article/details/116445961

Java實戰:尋找完美數

文章目錄 一、何謂完美數二、尋找完美數&#xff08;一&#xff09;編程思路&#xff08;二&#xff09;編寫程序&#xff08;三&#xff09;運行程序 三、實戰小結 一、何謂完美數 完美數是一種特殊的自然數&#xff0c;它等于其所有正除數&#xff08;不包括其本身&#xff…