【MySQL數據庫】多表查詢(笛卡爾積現象,聯合查詢、內連接、左外連接、右外連接、子查詢)-通過練習快速掌握法

在DQL的基礎查詢中,我們已經學過了多表查詢的一種:聯合查詢(union)。本文我們將系統的講解多表查詢。

笛卡爾積現象

首先,我們想要查詢emp表和stu表兩個表,按照我們之前的知識棧,我們直接使用:

select * from emp,stu;

當查詢emp時:15條記錄被查詢

當查詢stu時:5條記錄被查詢

但是讓我們來觀察結果:

哇,查詢到了70條記錄?。而且根據結果我們可以看出:左表emp的每條記錄都會與右表stu的每條記錄組成一條新的記錄,也就是14*5=70條記錄。這種現象非常符合離散數學中學到的笛卡爾積的結果,所以我們將這種現象稱為笛卡爾積現象。

笛卡爾積(Cartesian Product):表示兩個集合之間的所有可能的有序對的集合

笛卡爾積的性質包括:

  1. 笛卡爾積的結果是一個新集合。
  2. 如果?AA?和?BB?其中一個為空集,則結果也為空集。
  3. 笛卡爾積的順序是重要的,即?A×B≠B×A。

我們如何實現15+4的結果呢?直接使用上面的select肯定是不行了。

那么,此時有一個叫聯合查詢的方式出現在腦海里:

聯合查詢

關鍵字:【union all】

select empno,ename,job from emp
union all
select id,nick,pwd from stu;

觀察結果:19=15+4條記錄 (使用union代替union all可以實現去重的功能)

但是為了將記錄查詢出來,我們 必須合適選擇每個表的字段,將兩個表查詢的字段的數據類型一一對應。empno int?= id int,ename varchar?= nick varchar ......

如果數據類型對應不上,那么將無法查詢,結果是:

直接查詢的條件限制法

那么聯合查詢也不能符合我們對查詢結果的預期,這時候需要我們轉換思路。從笛卡爾積現象開始:【需求:查詢員工表以及每個員工對應的部門信息】

首先直接查詢:

對于查詢的結果,雖然有重復, 但至少有我們需要的結果,那么只需要將這個表中的有效記錄提取出來,就可以了。也就是使用where條件進行限定:

此時我們查詢的結果就符合我們的預期了。但注意,這時候我們操作時必須給每個字段指定上是哪個表的字段,不然的話,該字段屬于二義性字段,無法通過語法分析,也就不能執行了。

內連接

select field from tb1 
[inner] join tb2 on condition;

等值連接

eg.根據一個編號查另一個表中改編號對應的內容。常見于:根據子表外鍵連接父表主鍵

【練習:查詢員工表以及每個員工對應的部門信息】

select * from emp [inner]join dept on emp.DEPTNO = dept.DEPTNO;

非等值連接

eg.根據一個表的某個字段,查另一個表中該字段屬于哪段區間的信息。實際用途:等級劃分

【練習:根據員工的薪水查出薪水的等級】

自連接

eg.自連接是某個表的某個字段信息存儲的數據是本表的另一條記錄的信息。常用于:事物關聯

【練習:根據員工表的領導編號查詢領導的名字】

自連接的流程:為顯示的字段起別名(避免兩個結果字段名沖突,非必須)=》from選擇查詢表=》join 連接表(本表),并起別名(避免二義性,必須)=》連接條件。[過程中的每個字段都需要明確指出是哪個表]?

外連接

由于內連接會將連接條件的字段中空值的記錄給過濾掉,所以為了顯示較為全面的記錄,我們采用外連接的方式進行多表查詢。

左外連接

左外連接就是(left [outer] join ... on...)。顯示主表的所有字段,并將被連接的從表符合連接條件的記錄連接到主表,如果沒有,主表顯示原本記錄,從表的字段中為空。

【練習:查詢員工表以及每個員工對應的部門信息---顯示所有員工】

右外連接

右外連接就是(right?[outer] join ... on...)。與左外連接類似。

【練習:查詢員工表以及每個員工對應的部門信息---顯示所有部門】

我們對比發現,右外連接顯示的記錄比左外連接的記錄多一條,多出的一條是部門表中的數據,但該部門在員工表中沒有員工,所以全部顯示為空。

:外連接查詢的結果記錄數 >= 內連接查詢到的結果記錄數

左外連接【左圖】、右外連接【右圖】

子查詢

子查詢:嵌套在其它SQL語句內的查詢語句,且必須出現在圓括號內(查詢一般是指select語句):子查詢的結果可以作為外層查詢的過濾條件或計算字段。

標量子查詢

子查詢返回結果是單個值,如數字、字符串、日期等最簡單的形式。這種子查詢稱為標量子查詢。【常用的操作符:| = | <> |?> | >= | < | <= |】

【練習:查詢銷售部的部門員工信息】

第一步:查詢銷售部的部門編號

select deptno from dept where dname="SALES";

第二步:查詢部門編號為上述結果的員工

select * from emp where deptno = 上條語句的結果;

第三步:合并一條語句:

select * from emp where deptno = (select deptno from dept where dname="SALES");

標量子查詢可以在子句中使用聚合函數、而且子句的位置還可以出現在select后作為字段出現:

【練習:查詢部門名,以及每個部門的人數】

select dname, (select count(*) from emp where dept.deptno=emp.deptno) emps 
from dept;

列子查詢

子查詢的結果是一列(或者多列),這種子查詢稱為列子查詢

【常用操作符:in、not in、any、some、all】

IN:在指定的集合范圍之內,多選一

NOT IN:不再指定的集合范圍之內

ANY:子查詢返回列表中,有任意一個滿足即可【相當于集合所有元素作 or 運算】

SOME:與ANY相同,SOME與ANY等價

ALL:子查詢返回列表的所有值都要滿足【相當于集合所有元素之間作 and 運算】

【練習:查詢銷售部(SALES)和調研部(RESEARCH)所有員工信息】

select * 
from emp 
where deptno in (select deptno from dept where dname in ("SALES","RESEARCH"));-- or:
select * 
from emp 
where deptno in (select deptno from dept where dname="SALES" or dname="RESEARCH");

【練習:查詢比銷售部的所有人的工資都高的員工信息】

比所有人都高,也就是sal > all( {...} )

通過這個練習,我們不僅練習了all運算,我們還知道了,子句可以嵌套子句。

行子查詢

子查詢的返回結果是一行(可以是多行),這種子查詢稱為行子查詢

【常用操作符:| = | <> | in | not in】

【練習:查詢與“SMITH”的 薪資以及直屬領導 都相同的員工信息】

-- (單行結果)
select * from emp where (sal,mgr) = (select sal,mgr from emp where ename = "SMITH");-- (多行結果)
select * from emp where (sal,mgr) in (select sal,mgr from emp where ename = "SMITH");

通過該練習,我們掌握了新的知識:

(field1,field2,...,fieldn) 可以通過加圓括號的方式直接與行結果進行運算【= | <> | in | not in】?

表子查詢

子查詢的結果可以是多行多列,產生這種結果的子查詢稱為表子查詢。【常用操作符:IN】

這種就是行子查詢的 in 操作。

-- (多行結果)
select * from emp where (sal,mgr) in (select sal,mgr from emp where ename = "SMITH");

感謝大家!歡迎指導、詢問、探討知識!

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

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

相關文章

Java:Apache HttpClient中HttpRoute用法的介紹

當使用Apache HttpClient組件時&#xff0c;經常會用到它的連接池組件。典型的代碼如下&#xff1a; PoolingHttpClientConnectionManager connectionManager new PoolingHttpClientConnectionManager();connectionManager.setMaxTotal(httpConfig.getMaxPoolTotal());connect…

RHCE(RHCSA復習:npm、dnf、源碼安裝實驗)

七、軟件管理 7.1 rpm 安裝 7.1.1 掛載 [rootlocalhost ~]# ll /mnt total 0 drwxr-xr-x. 2 root root 6 Oct 27 21:32 hgfs[rootlocalhost ~]# mount /dev/sr0 /mnt #掛載 mount: /mnt: WARNING: source write-protected, mounted read-only. [rootlocalhost ~]# [rootlo…

分布式的消息流平臺之Pulsar

Pulsar 流處理詳解 Apache Pulsar 是一個分布式的消息流平臺&#xff0c;集成了**消息隊列&#xff08;MQ&#xff09;和流處理&#xff08;Stream Processing&#xff09;**能力。Pulsar 不僅提供低延遲、高吞吐的消息傳輸能力&#xff0c;還支持基于 Pulsar Functions、Flin…

【C++多線程】thread

C中的std::thread是C11引入的線程庫的一部分&#xff0c;提供了創建和管理線程的能力。它封裝了操作系統的線程接口&#xff0c;使得在C中更方便地進行多線程編程。 1. std::thread 的定義 std::thread 類位于<thread>頭文件中&#xff0c;定義在std命名空間下&#xff…

【css酷炫效果】純CSS實現故障文字特效

【css酷炫效果】純CSS實現故障文字特效 緣創作背景html結構css樣式完整代碼基礎版進階版(3D效果) 效果圖 想直接拿走的老板&#xff0c;鏈接放在這里&#xff1a;https://download.csdn.net/download/u011561335/90492053 緣 創作隨緣&#xff0c;不定時更新。 創作背景 剛…

uniapp配置代理解決跨域問題

兩種方式&#xff1a; 1、manifest.json中配置 "h5" : {"template" : "static/index.html","devServer" : {"port" : 9090,"https" : false,"proxy":{"/prod-api":{"target":&quo…

物聯網為什么用MQTT不用 HTTP 或 UDP?

先來兩個代碼對比&#xff0c;上傳溫度數據給服務器。 MQTT代碼示例 // MQTT 客戶端連接到 MQTT 服務器 mqttClient.connect("mqtt://broker.server.com:8883", clientId) // 訂閱特定主題 mqttClient.subscribe("sensor/data", qos1) // …

Flutter:頁面滾動,導航欄背景顏色過渡動畫

記錄&#xff1a;導航默認透明&#xff0c;頁面發生滾動后&#xff0c;導航背景色由0-1&#xff0c;過渡到白色背景。 view import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:get/get.dart; import package:redo…

STM32 —— MCU、MPU、ARM、FPGA、DSP

在嵌入式系統中&#xff0c;MCU、MPU、ARM、FPGA和DSP是核心組件&#xff0c;各自在架構、功能和應用場景上有顯著差異。以下從專業角度詳細解析這些概念&#xff1a; 一、 MCU&#xff08;Microcontroller Unit&#xff0c;微控制器單元&#xff09; 核心定義 集成系統芯片&a…

批量刪除 PPT 空白幻燈片頁面

如果我們需要刪除 PPT 文檔中的空白幻燈片頁面&#xff0c;我們可以借助 Office 工具來完成&#xff0c;但是如果是大量的 PPT 文檔需要批量刪除空白幻燈片頁面&#xff0c;那就需要使用專業的批量處理工具來完成&#xff0c;今天就給大家介紹一種批量刪除 PPT 空白幻燈片頁面的…

【canvas】一鍵自動布局:如何讓流程圖節點自動找到最佳位置

一鍵自動布局&#xff1a;如何讓流程圖節點自動找到最佳位置 引言 在流程圖、拓撲圖和系統架構圖設計中&#xff0c;節點布局往往是最令人頭疼的問題。如果手動調整每個節點位置&#xff0c;不僅耗時費力&#xff0c;還難以保證美觀性和一致性。本文將深入解析如何實現自動布…

【平臺優化】大數據集群一個客戶端參數引起的任務性能差的問題

大數據集群一個客戶端參數引起的任務性能差的問題 背景介紹排查過程任務慢的具體原因Executor中數據內存往磁盤溢寫結果數據寫入分區路徑 分析解決方案 結語&思考 背景介紹 隨著業務量不斷擴大&#xff0c;平臺逐步發展成HDFS多聯邦的架構&#xff0c;這個過程中&#xff…

【微信小程序變通實現DeepSeek支持語音】

微信小程序實現錄音轉文字&#xff0c;并調用后端服務&#xff08;Node.js&#xff09;進行語音識別和&#xff0c;然后調用DeepSeek 處理的完整實現。 整體架構 前端&#xff08;微信小程序&#xff09;&#xff1a; 實現錄音功能。將錄音文件上傳到后端。接收后端返回的語音…

uniapp常用組件

寫在前面 今天將uniapp中的組件都過了一遍&#xff0c;上手難度不大&#xff0c;但是還是遇到了一些問題&#xff1a; HBuilder實在是太難用&#xff0c;不管是插件生態還是設計之類的&#xff0c;總之就是用的哪哪不順手雖然打開內置瀏覽器是挺方便的&#xff0c;但是不知道…

【Linux】應用層自定義協議 + 序列化和反序列化

應用層自定義協議 序列化和反序列化 一.應用層1.再談 "協議"2.序列化 和 反序列化 二. Jsoncpp1.序列化2.反序列化 三. Tcp全雙工 面向字節流四.自定義協議 保證報文的完整性1.Makefile2.Mutex.hpp3.Cond.hpp4.Log.hpp5.Thread.hpp6.ThreadPool.hpp7.Common.hpp8.…

二.使用ffmpeg對原始音頻數據重采樣并進行AAC編碼

重采樣&#xff1a;將音頻三元組【采樣率 采樣格式 通道數】之中的任何一個或者多個值改變。 一.為什么要進行重采樣&#xff1f; 1.原始音頻數據和編碼器的數據格式不一致 2.播放器要求的和獲取的數據不一致 3.方便運算 二.本次編碼流程 1.了解自己本機麥克風參數&#x…

器材借用管理系統詳細設計基于Spring Boot-SSM

? 目錄 ?摘要 一、系統概述? ?二、系統架構設計? 2?.1技術選型? ?2.2系統架構? ?三、需求分析 3.1用戶需求分析 3.2功能模塊設計? 3.3、性能需求分析 3.4、安全需求分析 ?四、數據庫設計? ?五、安全性設計? ?六、系統測試與維護? ?七、總結?…

麒麟V10 arm cpu aarch64 下編譯 RocketMQ-Client-CPP 2.2.0

國產自主可控服務器需要訪問RocketMQ消息隊列&#xff0c;最新的CSDK是2020年發布的 rocketmq-client-cpp-2.2.0 這個版本支持TLS模式。 用默認的版本安裝遇到一些問題&#xff0c;記錄一下。 下載Releases apache/rocketmq-client-cpp GitHubhttps://github.com/apache/roc…

C語言每日一練——day_12(最后一天)

引言 針對初學者&#xff0c;每日練習幾個題&#xff0c;快速上手C語言。第十二天。&#xff08;最后一天&#xff0c;完結散花啦&#xff09; 采用在線OJ的形式 什么是在線OJ&#xff1f; 在線判題系統&#xff08;英語&#xff1a;Online Judge&#xff0c;縮寫OJ&#xff0…

網絡安全應急入門到實戰

奇安信&#xff1a;95015網絡安全應急響應分析報告&#xff08;2022-2024年&#xff09;官網可以下載 https://github.com/Bypass007/Emergency-Response-Notes 應急響應實戰筆記 網絡安全應急響應技術實戰指南 .pdf 常見場景 第4章 勒索病毒網絡安全應急響應 第5章 挖礦木…