26.多表查詢

1.笛卡爾集

創建倆表:

-- 創建部門表(dept)
use mysql_learn
CREATE TABLE dept (deptno INT PRIMARY KEY,       dname VARCHAR(50) NOT NULL,   loc VARCHAR(50)      
);-- 創建員工表(emp)
CREATE TABLE emp (empno INT PRIMARY KEY,        ename VARCHAR(50) NOT NULL,  job VARCHAR(50),             mgr INT,                       hiredate DATE,                sal DECIMAL(10,2) NOT NULL,   comm DECIMAL(10,2),           deptno INT
);

插入一些示例數據:

-- 向部門表插入數據
INSERT INTO dept (deptno, dname, loc) VALUES
(10, 'ACCOUNTING', 'NEW YORK'),
(20, 'RESEARCH', 'DALLAS'),
(30, 'SALES', 'CHICAGO'),
(40, 'OPERATIONS', 'BOSTON');-- 向員工表插入數據
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES
(7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800.00, NULL, 20),
(7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600.00, 300.00, 30),
(7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250.00, 500.00, 30),
(7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975.00, NULL, 20),
(7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250.00, 1400.00, 30),
(7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850.00, NULL, 30),
(7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450.00, NULL, 10),
(7788, 'SCOTT', 'ANALYST', 7566, '1982-12-09', 3000.00, NULL, 20),
(7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000.00, NULL, 10),
(7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500.00, 0.00, 30),
(7876, 'ADAMS', 'CLERK', 7788, '1983-01-12', 1100.00, NULL, 20),
(7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950.00, NULL, 30),
(7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000.00, NULL, 20),
(7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300.00, NULL, 10);  

看看結果:

部門表,里面有4條記錄

雇員表,里面有14條記錄

假設現在有個需求:打印某個員工的工資條。

我們有兩張表:1??雇員表,2??部門表。

當我們根據前面所學習的知識直接對兩個表同時查詢時會出現以下情況:

SELECT * from dept,emp

可以看到,我們直接將倆表連起來一起查出來的記錄有56條之多。

仔細探查我們會發現,這些結果實際上就是第一個表中的四條記錄和第二張表的一條記錄進行拼接而成的。也就是4*14=56條記錄。這就是笛卡爾集

所以這些直接進行查詢獲得的信息是有冗余的信息,為了得到真正有意義的信息,我們需要做的就是過濾

2.笛卡爾集的解決

為了過濾出有意義的信息,我們直接在where子句中做即可。

SELECT * from dept,empwhere dept.deptno = emp.deptno

這樣我們就解決了笛卡爾集,得到了真正有意義的14條記錄。

對sql語句稍作修改,也就可以得到每個員工的工資條了。

SELECT ename as '姓名',job as '工作',sal as '薪水',dname as '部門',deptno as '部門號'from dept,empwhere dept.deptno = emp.deptno

我們會發現這樣會報錯。

SQL 錯誤 [1052] [23000]: Column 'deptno' in field list is ambiguous

因為我們進行的是多表查詢,deptno這個字段在倆表中同時存在,直接寫會有歧義的。

我們對sql再次進行修改:

SELECT ename as '姓名',job as '工作',sal as '薪水',dname as '部門',emp.deptno as '部門號'from dept,empwhere dept.deptno = emp.deptno

得到了我們想要的結果了。

注意:多表查詢的條件不能少于表的個數減一,否則就會出現笛卡爾集

3.練習

再創建一個工資等級表。

CREATE TABLE grade_salary (grade INT,losal DECIMAL(10, 2),hisal DECIMAL(10, 2)
);INSERT INTO grade_salary (grade, losal, hisal)
VALUES 
(1, 1000.00, 1200.00),
(2, 1201.00, 2000.00),
(3, 2001.00, 3000.00),
(4, 3001.00, 9999.00),
(5, 3001.00, 9999.00);

(1)顯示各個員工的姓名,工資,工資等級

SELECT ename,sal,gradefrom emp,grade_salary

很顯然,直接查倆個表會出現笛卡爾集。

我們做一下過濾:可以直觀的分析出雇員表emp和工資級別表grade_salary之間的聯系就是員工工資在工資級別表中的那一個級別區間,也即員工工資和工資級別區間相對應的記錄就是我們要查詢的結果。

基于此,可以使用between and 語句來判斷。

SELECT ename,sal,gradefrom emp,grade_salary gswhere sal between losal and hisal;

(2)顯示員工名字,工資,所在部門名字,并按部門號降序排列

顯然我們這次需要查詢,emp和dept這兩張表,為了防止出現笛卡爾集,做一下過濾,最后用order by做一下排序。

SELECT ename,sal,dnamefrom emp e,dept dwhere e.deptno = d.deptnoorder by d.deptno DESC ;

再看一眼,按部門號降序排序也做好了。

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

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

相關文章

深度學習題目(僅供參考)

一、注意力和transformer 一、選擇題 注意力機制的核心步驟不包括? A. 計算注意力分布 B. 加權平均輸入信息 C. 隨機丟棄部分輸入 D. 打分函數計算相關性 答案:C(硬性注意力雖隨機選擇輸入,但核心步驟仍為分布計算與加權&#xf…

WebWorker:提升前端性能的多線程利器

簡介 在現代Web開發中,隨著應用越來越復雜,JavaScript的單線程模型開始顯現其局限性。Web Workers的出現為解決這一問題提供了優雅的方案,它允許開發者在后臺線程中運行腳本,而不會影響主線程的性能。 Web Workers是HTML5標準的…

milvus教程:collection和scheme

環境配置:可以看上一節 一.數據庫使用 連接 Milvus Standalone創建數據庫 my_database_1(無額外屬性)創建數據庫 my_database_2(設置副本數為 3)列出所有數據庫查看默認數據庫(default)詳情修…

14:00開始面試,14:06就出來了,問的問題有點變態。。。

從小廠出來,沒想到在另一家公司又寄了。 到這家公司開始上班,加班是每天必不可少的,看在錢給的比較多的份上,就不太計較了。沒想到6月一紙通知,所有人不準加班,加班費不僅沒有了,薪資還要降40%…

Electron(01)

Electron Electron是什么 electron可以使用前端技術開發桌面應用,跨平臺性,開發一套應用,可以打包到三個平臺。 electron結合Chromium(谷歌內核)和 Node.js 和Native Api 當使用 Electron 時,很重要的一…

Kafka 攔截器深度剖析:原理、配置與實踐

引言 在構建高可用、可擴展的消息系統時,Kafka以其卓越的性能和穩定性成為眾多企業的首選。而Kafka攔截器作為Kafka生態中強大且靈活的功能組件,能夠在消息的生產和消費過程中實現自定義邏輯的注入,為消息處理流程帶來極大的擴展性和可控性。…

Flutter 與原生技術(Objective-C/Swift,java)的關系

在 iOS 開發中,Flutter 與原生技術(Objective-C/Swift)的關系 一、技術定位與核心差異 Flutter 語言:使用Dart 語言開發,通過 AOT(提前編譯)將代碼轉換為原生 ARM 指令,無需依賴 iOS…

最新期刊影響因子,基本包含全部期刊

原文鏈接:2024年期刊最新影響因子(IF) 2024年期刊最新影響因子(IF) BioinfoR生信筆記 ,注于分享生物信息學相關知識和R語言繪圖教程。

java 設計模式_行為型_14策略模式

14.策略模式 策略模式作為一種軟件設計模式,指對象有某個行為,但是在不同的場景中,該行為有不同的實現算法。 策略模式把這些算法,都抽取出來,組成一個一個的類,可以任意的替換,大大降低了代碼…

【AI Study】第四天,Pandas(9)- 進階主題

文章概要 本文詳細介紹 Pandas 的進階主題,包括: 自定義函數高級索引數據導出實際應用示例 自定義函數 函數應用 # 基本函數應用 def calculate_bonus(salary, performance):"""計算獎金Args:salary (float): 基本工資performance (…

Boost dlib opencv vs2022 C++ 源碼安裝集成配置

?在進行人臉檢測開發時候出現 E1696: 無法打開源文件 "dlib/image_processing/frontal_face_detector.h 解決方案 1, 下載boost 需要:https://www.boost.org/ 或github git clone --recursive https://gitee.com/luozhonghua/boost.git 記住一定要完整版源碼…

rest_framework permission_classes 無效的解決方法

寫了一個特別簡單的view: csrf_exempt login_required() authentication_classes([TokenAuthentication]) permission_classes([IsAdminUser, IsAuthenticated]) def department_management_view(request):if request.method POST:department_name request.POST.…

Windows 體系對比 + 嵌入式開發全流程拆解

一、操作系統層級對比:Windows 家族 vs Linux 家族 角色Windows 體系Linux 體系本質核心內核Windows NT KernelLinux Kernel操作系統引擎(管理CPU/內存/硬件)完整操作系統Windows 11 Home/ProUbuntu / Debian / CentOS內核 界面 軟件 驅動…

C# 實現 gRPC高級通信框架簡單實現

1. 前言 gRPC(Google Remote Procedure Call)是一個高性能、開源和通用的RPC框架,由Google主導開發。它支持多種編程語言,并廣泛用于構建分布式應用程序和服務。gRPC基于HTTP/2協議,支持雙向流、請求-響應和多請求-多…

將項目推到Github

前提條件 需要安裝GIT需要注冊GitHub賬號 步驟 首先我們需要登錄我們的GITHUB賬號,然后點擊新建存儲庫 然后起一個名字,設置一些私有公開即可 創建完成之后,這里有可以遠程推送的命令 后面就直接輸出命令即可 之后推送即可 git push orig…

K8S 專欄 —— namespace和Label篇

文章目錄 namespace創建namespacenamespace使用默認namespaceLabel添加Label查詢Labelnamespace 命名空間是一種用于在 kubernetes 集群中劃分資源的虛擬化手段,每個資源都屬于一個命名空間,使得多個團隊或應用可以在同一個集群中獨立運行,避免資源沖突。 創建namespace y…

44.第二階段x64游戲實戰-封包-分析掉落物列表id存放位置

免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動! 本次游戲沒法給 內容參考于:微塵網絡安全 上一個內容:43.第二階段x64游戲實戰-封包-代碼實現獲取包裹物品 之前的內容找到了掉落物的…

匯編語言期末快速過手筆記

一、計算機系統組成 計算機系統組成:由硬件系統和軟件系統組成 硬件系統:CPU、存儲器、輸入/輸出設備等物理部件軟件系統:操作系統、各種語言、系統軟件和應用軟件 匯編語言分類 屬于低級語言(直接面向硬件)與高級語言…

C++相比于C語言增加了哪些概念?

C相比于C語言增加了哪些概念? 作者將狼才鯨創建日期2025-06-17 CSDN閱讀地址:C相比于C語言增加了哪些概念?Gitee源碼目錄:qemu/demo_代碼示例/02_C_Class 目標受眾:熟悉C語言,對C完全不了解,但…

HarmonyOS5 分布式測試:斷網情況支付場景異常恢復驗證

以下是針對HarmonyOS 5分布式事務在斷網支付場景下的異常恢復驗證全流程方案,綜合關鍵技術與測試策略: 一、核心事務機制驗證 ?兩階段提交(2PC)協議? 模擬支付流程中網絡中斷,驗證事務協調者能否正確處理預提交與回滾…