超詳細多表查詢詳解-多表關系-多表查詢-子查詢

多表關系

  • 一對多關系:這是最常見的關系類型,它表示在兩個表之間,一個表中的記錄可以與另一個表中的多個記錄相關聯。例如,一個班級(父表)可以有多個學生(子表),但每個學生只能屬于一個班級。
  • 多對多關系:表示一個表中的多個記錄可以與另一個表中的多個記錄相關聯。例如,一個學生可以選修多門課程,而一門課程也可以被多個學生選修。
  • 一對一關系:關系: 一對一關系,多用于單表拆分,將一張表的基礎字段放在一張表中,其他詳情字段放在另 一張表中,以提升操作效率.實現: 在任意一方加入外鍵,關聯另外一方的主鍵,并且設置外鍵為唯一的(UNIQUE)

多表查詢概述

多表查詢就是指從多張表中查詢數據。

當直接查詢兩個表時

select * from emp , dept ;

會出現笛卡爾積問題

多表查詢中的笛卡爾積問題通常指的是在沒有指定有效的連接條件時,兩個或多個表之間會產生所有可能的行組合

?為了避免笛卡爾積的問題,可以采取以下措施:

明確連接條件:在進行多表查詢時,應該明確指定表與表之間的連接條件,確保只有相關的數據才會被組合在一起。

SELECT * FROM emp,dept where emp.dept_id =  dept.id;

使用內連接:使用內連接(INNER JOIN)來確保只有滿足連接條件的記錄才會出現在結果集中。

檢查關聯條件:確保所有的關聯條件都是有效的,避免因為錯誤的關聯條件導致查詢結果出現笛卡爾積。

使用外連接:如果需要包含某個表中的所有記錄,即使它們在另一個表中沒有匹配的記錄,可以使用外連接(LEFT OUTER JOIN 或 RIGHT OUTER JOIN)來避免笛卡爾積的問題。\

多表查詢分類

連接查詢

  1. 內連接:相當于查詢A、B交集部分數據

  2. 外連接

  3. 左外連接:查詢左表所有數據,以及兩張表交集部分數據

  4. 右外連接:查詢右表所有數據,以及兩張表交集部分數據

  5. 自連接:當前表與自身的連接查詢,自連接必須使用表別名

內連接

內連接的語法分為兩種: 隱式內連接、顯式內連接

隱式內連接

SELECT 字段列表 FROM 表1 , 表2 WHERE 條件 ... ;

顯式內連接

SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 連接條件 ... ;

有一個員工表(emp)和一個部門表(dept),并且想要查詢每個員工的姓名及其對應的部門名稱,可以使用以下查詢語句:?(顯式內連接實現) --- INNER JOIN ... ON ...

SELECT e.name, d.name FROM emp e INNER JOIN dept d ON e.dept_id = d.id;

查詢每一個員工的姓名 , 及關聯的部門的名稱 (隱式內連接實現)

表結構: emp , dept

連接條件: emp.dept_id = dept.id

select e.name,d.name from emp e , dept d where e.dept_id = d.id;

一旦為表起了別名,就不能再使用表名來指定對應的字段了,此時只能夠使用別名來指定字段。

外連接

外連接分為兩種,分別是:左外連接 和 右外連接。具體的語法結構為

左外連接

SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 條件 ... ;

右外連接

SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 條件 ... ;

查詢emp表的所有數據, 和對應的部門信息

由于需求中提到,要查詢emp的所有數據,所以是不能內連接查詢的,需要考慮使用外連接查詢。

表結構: emp, dept

連接條件: emp.dept_id = dept.id

select e.*, d.name from emp e left outer join dept d on e.dept_id = d.id;select e.*, d.name from emp e left join dept d on e.dept_id = d.id;

查詢dept表的所有數據, 和對應的員工信息(右外連接)

select d.*, e.* from emp e right outer join dept d on e.dept_id = d.id;select d.*, e.* from dept d left outer join emp e on e.dept_id = d.id;

左外連接和右外連接可以相互替換,只需要調整先后順序就可以了。而我們在日常開發使用時,更偏向于左外連接。

自連接

自連接查詢

自連接是SQL中一種表與自身進行連接的操作,它常用于解決連續性問題或比較表中的數據.

自己連接自己,把一張表連接查詢多次

自連接可以看作是內連接的一種特殊情況,它允許我們使用同一張表的不同別名來執行連接操作。這樣做的目的是為了更好地比較表中的記錄或者查找具有特定關系的行。自連接在處理例如員工層級、朋友關系等具有層次或網絡結構的數據時尤為有用。以下是一些自連接的關鍵點:

  • 別名的使用:在進行自連接時,需要為同一張表設置兩個不同的別名,以便在查詢中區分它們。這兩個別名通常被視為兩個獨立的表來處理。
  • 連接條件:自連接的連接條件通常基于某些字段的相等性或其他邏輯關系。例如,如果我們想要找出年齡相同且籍貫也相同的學生信息,我們可以使用自連接來實現這一查詢。
  • 結果優化:在使用自連接時,可能會出現重復的記錄或者不需要的字段。因此,需要在查詢中添加適當的條件來去除這些冗余信息,以得到更精確的結果。
  • 性能考慮:由于自連接涉及到同一張表的多次引用,這可能會導致查詢性能的下降。因此,在設計查詢時,應考慮到性能的影響,并盡可能優化。
SELECT 字段列表 FROM 表A 別名A JOIN 表A 別名B ON 條件 ... ;

對于自連接查詢,可以是內連接查詢,也可以是外連接查詢

查詢員工 及其 所屬領導的名字

表結構: emp

select a.name , b.name from emp a , emp b where a.managerid = b.id;

?查詢所有員工 emp 及其領導的名字 emp , 如果員工沒有領導, 也需要查詢出來 表結構: emp a , emp b

select a.name '員工', b.name '領導' from emp a left join emp b on a.managerid =b.id;

在自連接查詢中,必須要為表起別名,要不然我們不清楚所指定的條件、返回的字段,到底 是哪一張表的字段。

聯合查詢
SELECT 字段列表 FROM 表A ...
UNION [ ALL ]
SELECT 字段列表 FROM 表B ....;

對于聯合查詢的多張表的列數必須保持一致,字段類型也需要保持一致。

union all 會將全部的數據直接合并在一起,union 會對合并之后的數據去重。

將薪資低于 5000 的員工 , 和 年齡大于 50 歲的員工全部查詢出來.

當前對于這個需求,我們可以直接使用多條件查詢,使用邏輯運算符 or 連接即可。 那這里呢,我們 也可以通過union/union all來聯合查詢.

select * from emp where salary < 5000
union all
select * from emp where age > 50;

union all查詢出來的結果,僅僅進行簡單的合并,并未去重。

union 聯合查詢,會對查詢出來的結果進行去重處理。

子查詢

SQL語句中嵌套SELECT語句,稱為嵌套查詢,又稱子查詢。
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );

?子查詢外部的語句可以是INSERT / UPDATE / DELETE / SELECT 的任何一個。

根據子查詢結果不同

A. 標量子查詢(子查詢結果為單個值)

標量子查詢是一種特殊的子查詢,它返回單一值,通常用在WHERE子句中與比較運算符結合使用

  • 定義和用法:標量子查詢的結果是一個單一的值,即一行一列的數據。這種查詢可以用作另一個查詢的一部分,通常是在WHERE子句中,以篩選滿足特定條件的記錄。例如,想要找出分數高于平均分的學生學號和成績,可以使用標量子查詢來計算平均分數并將其作為比較的條件。
  • 語法結構:基本的語法結構是將子查詢放置在括號內,并在外部查詢的WHERE子句中使用比較運算符。例如:SELECT 學號, 分數 FROM score WHERE 分數 > (SELECT AVG(分數) FROM score);。這里的子查詢?(SELECT AVG(分數) FROM score)?返回一個值,即score表中的平均分數。
  • 性能考慮:雖然標量子查詢在功能上非常強大,但它們可能會影響查詢的性能。因為子查詢需要先執行并取得結果,然后外部查詢才能使用這個結果。如果主查詢返回大量唯一的連接列值,那么子查詢可能需要執行多次,這可能會導致性能問題。優化標量子查詢的一種方法是重寫為JOIN操作,或者在某些情況下使用索引來改善性能。

常用的操作符:= <> > >= < <=

查詢 "銷售部" 的所有員工信息

 select * from emp where dept_id = (select id from dept where name = '銷售部');

B. 列子查詢(子查詢結果為一列)

列子查詢是子查詢的一種類型,它返回單列多行的結果集,通常與主查詢結合使用來篩選數據

列子查詢的特點是它返回一個字段的多個值,這些值通常用于WHERE子句中與IN、ANY、ALL或EXISTS等操作符結合使用,以便根據子查詢的結果來過濾主查詢的數據。

以下是列子查詢的一些典型用法:

  • 與IN操作符結合使用:當需要根據一組值來篩選數據時,可以使用IN操作符。例如,如果想要選取所有年齡為18歲的學生的成績信息,可以使用列子查詢來獲取這些學生的學號,然后根據這些學號來查詢成績。
  • 與ANY和ALL操作符結合使用:ANY和ALL操作符可以用于比較主查詢中的值與子查詢返回的一組值。ANY用于比較是否滿足子查詢結果中的任意一個條件,而ALL用于比較是否滿足子查詢結果中的所有條件。
  • 與EXISTS操作符結合使用:EXISTS操作符用于檢查子查詢是否返回了結果。如果子查詢返回至少一行數據,EXISTS操作符返回真,否則返回假。這在檢查是否存在相關記錄時非常有用。

常用的操作符:IN 、NOT IN 、 ANY 、SOME 、 ALL

操作符描述
IN在指定的集合范圍之內,多選一
NOT IN不在指定的集合范圍之內
ANY子查詢返回列表中,有任意一個滿足即可
SOME與ANY等同,使用SOME的地方都可以使用ANY
ALL子查詢返回列表的所有值都必須滿足

查詢所有 財務部 人員工資

select * from emp where salary > all ( select salary from emp where dept_id =
(select id from dept where name = '財務部') );

C. 行子查詢(子查詢結果為一行)

行子查詢返回的結果集包含一行多列

  • 返回值:行子查詢可以返回一個或多個字段的值,這些值可以是單一的記錄,也可以是由多條記錄組成的集合。
  • 使用場景:當需要根據一組相關的數據來篩選主查詢結果時,可以使用行子查詢。例如,如果想要找出工資最高的員工信息,可能需要根據員工的工資和員工編號來進行查詢。
  • 比較運算符:在單行子查詢中,通常使用單行比較運算符(如=, >, <, >=, <=, <>),而在多行子查詢中,則使用多行運算符(如IN, ANY, ALL)。

常用的操作符:= 、<> 、IN 、NOT IN

查詢與 "小白" 的薪資及直屬領導相同的員工信息 ;

select * from emp where (salary,managerid) = (select salary, managerid from emp
where name = '小白');

D. 表子查詢(子查詢結果為多行多列)

表子查詢是子查詢的一種類型,它返回的結果集包含多行多列,并且需要在查詢中為其指定別名

  • 別名的使用:由于表子查詢返回的是多行多列的結果集,因此在使用時必須為其指定別名,以便在外部查詢中引用這些字段。
  • 語法結構:表子查詢通常放在圓括號中,并且在外部查詢的FROM子句后面,通過別名來引用。例如,如果要找出參加了“01”課程的學生信息及課程分數,可以使用表子查詢來實現更復雜的查詢條件。
  • 性能考慮:表子查詢可能會影響查詢的性能,特別是當子查詢返回大量數據時。因此,在設計查詢時,應當考慮效率,并在必要時對查詢進行優化。
  • 與外部查詢的關系:表子查詢的結果不被直接顯示,而是傳遞給外部查詢,作為外部查詢的條件使用。外部查詢根據子查詢的結果來過濾數據,并最終顯示結果。

常用的操作符:IN

查詢入職日期是 "2000-6-6" 之后的員工信息 , 及其部門信息

select e.*, d.* from (select * from emp where entrydate > '2000-6-6') e left join dept d on e.dept_id = d.id ;

根據子查詢位置

A. WHERE之后

B. FROM之后

C. SELECT之后

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

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

相關文章

市場復盤總結 20240301

僅用于記錄當天的市場情況&#xff0c;用于統計交易策略的適用情況&#xff0c;以便程序回測 短線核心&#xff1a;不參與任何級別的調整&#xff0c;采用龍空龍模式 一支股票 10%的時候可以操作&#xff0c; 90%的時間適合空倉等待 二進三&#xff1a; 進級率中 40% 最常用的…

Linux高級編程:進程(一)

1、進程 1.1什么是進程&#xff1a;進行中的程序&#xff08;正在運行中的程序&#xff09;-process過程 程序的一次執行過程 - 進程 hello.c -- 程序源代碼 a.out -- 可執行程序 1.2程序和進程的關系&#xff1a; 程序<------>進程 1.3進程怎么來的&#xff1a; 程…

http 協議深入介紹

一&#xff0c;http 相關概念 &#xff08;一&#xff09;關鍵名詞 1&#xff0c;互聯網 是網絡的網絡&#xff0c;是所有類型網絡的母集 2&#xff0c;因特網 世界上最大的互聯網網絡。即因特網概念從屬于互聯網概念。習慣上&#xff0c;大家把連接在因特網上的計算機都成…

碼界深潛:全面解讀軟件工程的藝術與科學

&#x1f3e1; 基石構筑篇——軟件工程基礎理論及技能 &#x1f522; 編程語言選型與精修 于軟件工程之浩瀚宇宙中&#xff0c;編程語言猶如各色畫筆&#xff0c;每種語言的特性對應不同的創作領域。譬如Java倚仗跨平臺兼容性和強大的面向對象機制&#xff0c;在企業級應用程序…

【大廠AI課學習筆記NO.59】(12)過擬合與欠擬合

擬合就是調整參數和模型&#xff0c;讓結果無限接近真實值的過程。 我們先來了解個概念&#xff1a; 偏差-方差窘境&#xff08;bias-variance dilemma&#xff09;是機器學習中的一個重要概念&#xff0c;它涉及到模型選擇時面臨的權衡問題。 偏差&#xff08;Bias&#xf…

【leetcode熱題】克隆圖

難度&#xff1a; 中等通過率&#xff1a; 25.1%題目鏈接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 題目描述 克隆一張無向圖&#xff0c;圖中的每個節點包含一個 val 和一個 neighbors &#xff08;鄰接點&#xff09;列表 。 解法&#xff1a; 使用一個 map …

centos7單節點部署ceph(mon/mgr/osd/mgr/rgw)

使用ceph建議采用多節點多磁盤方式部署&#xff0c;本文章僅作為單節點部署參考&#xff0c;請勿用于生產環境 使用ceph建議采用多節點多磁盤方式部署&#xff0c;本文章僅作為單節點部署參考&#xff0c;請勿用于生產環境 使用ceph建議采用多節點多磁盤方式部署&#xff0c;…

使用 Grafana 使用JSON API 請求本地接口 報錯 bad gateway(502)解決

一 . 問題&#xff1a; 在用docker部署Grafana 來實現儀表盤的展示&#xff0c;使用到比較多的就是使用JAON API插件調用本地部署的API&#xff0c;比如訪問localhost下的 /test_data 接口&#xff0c;一般我們使用的是http://localhost:8080/test_data&#xff0c; 但是在訪…

C++面試寶典第34題:整數反序

題目 給出一個不多于5位的整數, 進行反序處理。要求: 1、求出它是幾位數。 2、分別輸出每一位數字。僅數字間以空格間隔, 負號與數字之間不需要間隔。如果是負數,負號加在第一個數字之前, 與數字沒有空格間隔。注意:最后一個數字后沒有空格。 3、按逆序輸出各位數字。逆序后…

Flutter混合棧管理方案對比

1.Google官方&#xff08;多引擎方案&#xff09; Google官方建議的方式是多引擎方案&#xff0c;即每次使用一個新的FlutterEngine來渲染Widget樹&#xff0c;存在的主要問題是每個引擎都要有比較大的內存等資源消耗&#xff0c;雖然Flutter 2.0之后的FlutterEngineGroup通過在…

網絡安全: Kali Linux 使用 nmap 掃描目標主機

目錄 一、實驗 1.環境 2. Kali Linux (2024.1) 使用 namp 掃描目標主機 3.Kali Linux (2024.1)遠程登錄 Windows Server 4.Kali Linux (2024.1) 使用crunch字典工具 5.Kali Linux (2024.1)使用hydra密碼工具 6.Kali Linux (2022.3) 通過SSH端口獲取 Ubuntu 密碼 二、問題…

【信息系統項目管理師】--【信息技術發展】--【新一代信息技術及應用】--【區塊鏈】

文章目錄 第二章 信息技術發展2.2 新一代信息技術及應用2.2.4 區塊鏈1.技術基礎2.關鍵技術3.應用和發展 第二章 信息技術發展 信息技術是在信息科學的基本原理和方法下&#xff0c;獲取信息、處理信息、傳輸信息和使用信息的應用技術總稱。從信息技術的發展過程來看&#xff0c…

3月03日,每日信息差

&#x1f396; 素材來源官方媒體/網絡新聞 &#x1f384; 國產商用飛機C919及ARJ21首次飛抵老撾 &#x1f30d; 北京將打造新一批智能工廠 &#x1f30b; 阿里云將于3月29日停止商標代理服務 &#x1f381; 起亞在美因遠光燈故障召回3.5萬輛Telluride汽車 ? 天涯社區擬5月1日前…

C++——模板詳解

目錄 模板 函數模板 顯示實例化 類模板 模板特點 模板 模板&#xff0c;就是把一個本來只能對特定類型實現的代碼&#xff0c;變成一個模板類型&#xff0c;這個模板類型能轉換為任何內置類型&#xff0c;從而讓程序員只需要實現一個模板&#xff0c;就能對不同的數據進行操…

FPGA-串口接收圖像寫入RAM并讀出在TFT顯示屏上顯示

系統框圖&#xff1a; 需要用到的模塊有&#xff1a; 1&#xff0c;UART_RX(串口接收模塊)&#xff1b; 2&#xff0c;串口接受的數據存放到RAM模塊&#xff1b; 3&#xff0c;RAM IP核&#xff1b; 4&#xff0c;時鐘IP核 &#xff08;TFT顯示屏驅動時鐘的產生&#xff09…

kafka同步副本集及關鍵參數

上篇文章講了副本機制是什么&#xff0c;一文讀懂kafka內部怎么運行的-CSDN博客 這里深挖下同步副本集及里面的關鍵參數。副本會去leader副本拉去數據追加到自己日志中。 我們知道kafka副本的作用是提高系統的高可用。當leader副本掛了時&#xff0c;會從候選副本集中選者一個當…

java-冪等性

冪等性 1.1冪等性定義&#xff1a; 在計算機領域中&#xff0c;冪等&#xff08;Idempotence&#xff09;是指任意一個操作的多次執行總是能獲得相同的結果&#xff0c;不會對系統狀態產生額外影響。在Java后端開發中&#xff0c;冪等性的實現通常通過確保方法或服務調用的結…

設計模式(十四)中介者模式

請直接看原文: 原文鏈接:設計模式&#xff08;十四&#xff09;中介者模式_設計模式之中介模式-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 前言 寫了很多篇設計模式的…

Ribbon實現Cloud負載均衡

安裝Zookeeper要先安裝JDK環境 解壓 tar -zxvf /usr/local/develop/jdk-8u191-linux-x64.tar.gz -C /usr/local/develop 配置JAVA_HOME vim /etc/profile export JAVA_HOME/usr/local/develop/jdk1.8.0_191 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOM…

npm install 一直在等待sill idealTree buildDeps

最近在整vue的前端項目&#xff0c;npm install的時候一直在等待&#xff0c;記錄下處理過程。 1.檢查當前npm鏡像的地址 輸入命令&#xff1a;"npm config get registry"&#xff0c;如果結果是"https://registry.npmjs.org/"。 更換下地址&#xff0c…