關聯查詢mysql_《MySQL數據庫》關聯查詢

原標題:《MySQL數據庫》關聯查詢

一、關聯查詢

1、概念

在查詢數據時,所需要的數據不只在一張表中,可能在兩張或多張表中。這個時候,需要同時操作這些表來查詢數據,即關聯查詢。

關聯查詢所涉及到的表與表之間都會存在有關聯的字段,如員工表的部門編號和部門表的部門編號。

2、笛卡爾積

在做關聯查詢時,數據庫會使用某一張表中的每一條記錄都與另外一張表的所有記錄進行組合。比如表A有x條記錄,表B有y條記錄,最終組合數為x*y,這個值就是笛卡爾積,通常沒有意義。

07465f9317ebc6dcedba4cf0d68cf6e8.png

3、等值連接

在做關聯查詢時,這些表中存在著有關聯的兩個字段。我們使用某一張表中的一條記錄通過相關聯的字段與另外一張表的記錄進行匹配,組合成一條新的記錄。使用"="連接關聯字段

需求1:查詢員工的姓名,職位及其所在部門的名稱 、地址

79efe2576288db3c7788c09bfa4d33d4.png

4、內連接

內連接返回所有滿足條件的記錄,關鍵字join on。查詢效果與等值連接一樣。用法:表A [inner] join 表B on 關聯條件

6420819787c7256ed7375b2f2d02db1b.png

5、外連接

在做關聯查詢時,我們所需要的數據,除了那些滿足關聯條件的數據外,還有不滿足關聯條件的數據。此時需要使用外連接。

會涉及到兩個概念:

驅動表(主表):除了顯示滿足條件的數據,還需要顯示不滿足條件的數據的表

從表(副表):只顯示滿足關聯條件的數據的表

mysql外連接只支持左外連接,右外連接,不支持全外連接

左外連接:

表A left [outer] join 表B on 關聯條件。

表A是驅動表,表B是從表

右外連接

表A right [outer] join 表B on 關聯條件

表B是驅動表,表A是從表

全外連接:

兩張表的數據不管滿不滿足條件,都做顯示。

表A full [outer] join 表B on 關聯條件

PS:mysql 不支持全外連接

需求1:查詢所有員工的姓名,職位,及其部門編號,部門名稱----分析:員工表為驅動表,部門表為從表

select e.ename,e.job,e.deptno,d.dname from emp e left join dept d on e.deptno = d.deptno;

02c8d45b7a0e723f4b14b7fdc6e6092a.png

6、自連接

自連接是一種特殊的關聯查詢。數據的來源是同一個表,這樣的表內的多個字段要存有關系。我們要使用表別名來虛擬出兩個表。

需求1:查詢員工姓名,職位及其上司姓名,職位。

mysql > select a.ename 員工姓名,

a.job 員工職位,

b.ename 上司姓名,

b.job 上司職位

from emp a join emp b on a.mgr=b.empno;

分析:可以看出 a的mgr與b的empno關聯,所以,a是員工表,b是領導表

1cd83b5f915db343e9c91fb6d4c18439.png

二、高級關聯查詢

有的時候,我們要查詢的數據,一個簡單的查詢語句完成不了,并且我們使用的數據,表中不能直觀體現出來。而是預先經過一次查詢才會有所體現。那么先執行的查詢,我們稱之子查詢。被子查詢嵌入的查詢語句稱之為父查詢或主查詢。

主查詢可以是select語句,也可以是DML語句或者是DDL語句。

根據子查詢返回結果的不同,可以分為單行單列子查詢、多行單列子查詢、多行多列子查詢。

46cd7658820d6d4b24aee330be49d47c.png

子查詢所在的位置,有可能出現在以下地方:

1)子查詢可以在where子句中

2)子查詢可以在from子句中

3)子查詢可以在having子句中

4)子查詢可以在select字句中,相當于外連接的另外一種寫法。

1、在where子句中

需求1:查詢和員工姓名scott同職位的員工信息。

select ename,job,hiredate,sal,deptno from emp where job=(select job from emp where ename='scott');

a7515e9fc7d04a6b89981eaabe5401fb.png

需求2:查詢薪水比所有員工的平均薪水高的員工信息

mysql > select ename,job,hiredate,sal from emp where sal > (select avg(ifnull(sal,0)) from emp);

需求3:查詢出部門中有salesman但是職位不是salesman的員工信息

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

exists 關鍵字

有時候,子查詢需要引用主查詢的字段數據,我們使用exists關鍵字。exists后面的子查詢至少返回一條記錄,則整個條件為true;

需求:查詢有員工的部門信息

mysql > select deptno,dname,loc from dept d where exists (select * from emp e where d.deptno =e.deptno);

2、在from子句中

from子句用于指定表,如果想在一個子查詢的結果里繼續查詢,則子查詢需要寫在from子句中,相當于一個表。

需求1:查詢工資大于本部門平均工資的員工的信息。

mysql > select e.ename,e.sal,t.avg_sal,t.deptno from emp e join (select deptno,avg(ifnull(sal,0)) 'avg_sal' from emp group by deptno) t on e.deptno = t.deptno and e.sal>t.avg_sal order by t.deptno;

需求2:查詢每個員工的工資,姓名和其部門的平均工資。

select e.ename, e.sal, t.avg_sal from emp e , (select deptno,avg(ifnull(sal,0)) 'avg_sal' from emp group by deptno) t where e.deptno = t.deptno order by t.deptno;

3、在having子句中

需求:查詢平均工資大于30號部門平均工資的部門號、平均工資

mysql > select deptno,avg(ifnull(sal,0)) from emp group by deptno having avg(ifnull(sal,0))>(select avg(ifnull(sal,0)) from emp where deptno=30);

4、在select子句中

需求1:查詢每個員工的姓名,工資,及其部門的平均工資,工資之和

select ename,sal,

(select avg(ifnull(sal,0)) from emp a where a.deptno=b.deptno) avg_sal ,

(select sum(sal) from emp c where c.deptno=b.deptno ) sum_sal

from emp b order by b.deptno;返回搜狐,查看更多

責任編輯:

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

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

相關文章

python語言語塊句的標記_《自然語言處理理論與實戰》

編輯推薦 1.講解自然語言處理的理論 2.案例豐富&#xff0c;實戰性強 3.適合自然語言處理學習的入門者 內容提要 自然語言處理是什么&#xff1f;誰需要學習自然語言處理&#xff1f;自然語言處理在哪些地方應用&#xff1f;相關問題一直困擾著不少初學者。針對這一情況&#x…

NOIP2017年11月9日賽前模擬

最后一次NOIP模擬了 題目1&#xff1a;回文數字 Tom 最近在研究回文數字。  假設 s[i] 是長度為 i 的回文數個數&#xff08;不含前導0&#xff09;&#xff0c;則對于給定的正整數 n 有&#xff1a; 以上等式中最后面的括號是布爾表達式&#xff0c;Tom 想知道S[n] mod 2333…

height百分比失效

heigh:100%失效 解決方案&#xff1a; 第一種 html, body { height: 100%; } 第二種 div { height: 100%; position: absolute; } 非定位元素的寬高百分比計算不會將 padding 計算在內&#xff0c;而定位元素會計算在內。 利用這個特性可以實現圖片左右半區點擊分別上一張圖…

Java堆空間,本機堆和內存問題

最近&#xff0c;我在和一個朋友討論為什么Java進程使用的內存比啟動Java進程時設置的最大堆多。 代碼創建的所有Java對象都是在Java堆空間內創建的&#xff0c;其大小由-Xmx選項定義。 但是一個Java進程由很多空間組成&#xff0c;而不僅僅是Java堆空間。 以下是組成Java進程…

mysql視圖表怎么設置約束_MySQL一一sql的視圖、索引、約束

一、視圖本質上相當于一張**“虛擬表”**&#xff0c;可當作獨立的一張表進行操作(增、刪、改、查)** 作用&#xff1a;**** a)**可通過權限控制&#xff0c;只將“表中的少數列”暴露給數據庫用戶&#xff0c;而不讓該用戶直接操縱數據庫中“實際表”** b)**…

Software Development Life Cycle

轉載于:https://www.cnblogs.com/genezhao/p/6879848.html

python中 的用法_詳解python中@的用法

python中的用法 是一個裝飾器&#xff0c;針對函數&#xff0c;起調用傳參的作用。 有修飾和被修飾的區別&#xff0c;function作為一個裝飾器&#xff0c;用來修飾緊跟著的函數&#xff08;可以是另一個裝飾器&#xff0c;也可以是函數定義&#xff09;。 代碼1 結果1 Its fun…

ArrayAndString(數組和字符串)

1.實現一個算法&#xff0c;確定一個字符串的所有字符是否全都不同。假使不允許使用額外的數據結構&#xff0c;又該怎么處理&#xff1f; public class UniqueChars {public static void main(String[] args) {// TODO Auto-generated method stubString string "abcdef…

MyBatis教程– CRUD操作和映射關系–第2部分

為了說明這一點&#xff0c;我們正在考慮以下示例域模型&#xff1a; 會有用戶&#xff0c;每個用戶可能都有一個博客&#xff0c;每個博客可以包含零個或多個帖子。 這三個表的數據庫結構如下&#xff1a; CREATE TABLE user (user_id int(10) unsigned NOT NULL auto_incr…

position 的屬性值

理論上來說&#xff0c;全部 position 的取值有8個 包括&#xff1a;position&#xff1a;static | relative | absolute | fixed | sticky | initial | inherit | unset 其中最常用的是 static 、relative、absolute、fixed 和 sticky initial、inherit、unset 是css的關鍵…

[ JavaScript ] JavaScript 實現繼承.

對于javascript中的繼承&#xff0c;因為js中沒有后端語言中的類式繼承。所以js中的繼承&#xff0c;一般都是原型繼承(prototype)。 function P (name){this.name name;this.say function(){console.log(p);} }function S (name,id){this.id id;this.eat function(){conso…

mysql數據庫應用的權限層級_MySQL數據庫的用戶權限管理

嗨&#xff01;各位小伙伴今天翻了一下歷史記錄MySQL 數據庫還有點內容今天開始我們就來補上吧~用戶權限管理伙伴們要知道&#xff0c;在數據庫方面有兩個方向。一個是數據庫管理員(Database Administrator)簡稱DBA&#xff0c;一個是數據庫開發工程師(Database Developer)&…

linux i2c adapter 增加設備_Linux驅動之I2C驅動架構

一、Linux的I2C體系結構主要由三部分組成&#xff1a;(1) I2C核心提供I2C控制器和設備驅動的注冊和注銷方法&#xff0c;I2C通信方法&#xff0c;與適配器無關的代碼以及探測設備等。(2) I2C控制器驅動(適配器)(3) I2C設備驅動二、重要的結構體i2c_adapter//i2c控制器(適配器)i…

Alpha-end

前言 失心瘋病源10團隊代碼管理github個人感悟 肝不動了&#xff0c;肝不動了。明天如果見不到我&#xff0c;不要太想我。站立會議 隊名&#xff1a;PMS530雨勤&#xff08;組長&#xff09; 今天完成了那些任務 熬夜肝代碼代碼簽入github明天的計劃 肝到凌晨還剩下哪些任務 團…

html 01前沿-web介紹

1. 認識網頁 網頁主要由文字、圖像和超鏈接等元素構成。當然&#xff0c;除了這些元素&#xff0c;網頁中還可以包含音頻、視頻以及Flash等。 2. 瀏覽器&#xff08;顯示代碼&#xff09; 瀏覽器是網頁顯示、運行的平臺&#xff0c;常用的瀏覽器有IE、火狐&#xff08;Firefox…

避免寫慢SQL

最近在整理數據庫中的慢SQL&#xff0c;同時也查詢了相關資料。記錄一下&#xff0c;要學會使用執行計劃來分析SQL。 1. 為查詢緩存優化你的查詢 大多數的MySQL服務器都開啟了查詢緩存。這是提高性最有效的方法之一&#xff0c;而且這是被MySQL的數據庫引擎處理的。當有很多相同…

為什么子孫后代會討厭使用java.util.Stack

在我用無意義的重言式殺死你之前&#xff0c;這是要點 如果您的應用程序接近實時&#xff0c;或者將代碼發送到Mars&#xff0c;則需要保留Java中默認的Stack實現。 根據LinkedList編寫您自己的版本。 同樣&#xff0c;如果您的應用程序是關鍵任務&#xff0c;并且希望堆棧由…

play 連接mysql_Play framework 2.x 連接mysql | 學步園

筆者所使用的系統為64位 windows7。本文假設java1.5版本以上環境已經搭好&#xff0c;play 框架已經下載至本地。首先我們創建一個項目。命令行進入play的目錄命令&#xff1a;play new demo再次輸入項目名字輸入2 選擇java項目創建完成界面OK&#xff0c;一個play框架下的java…

rpm -e --nodeps_微課 | rpm的思維導圖

前導課程&#xff1a;微課 | rpm的查詢、升級與卸載命令本次微課將演示使用xmind繪制rpm思維導圖的過程&#xff0c;包括視頻文字&#xff0c;大約需要你10分鐘。另外&#xff0c;文末還有一則IT冷笑話&#xff0c;學習之余、會心一笑:)這個思維導圖將包含以下內容&#xff1a;…

CentOS7搭建lamp環境

Mysql安裝 CentOS 7 版本將MySQL數據庫軟件從默認的程序列表中移除&#xff0c;用mariadb代替了。MariaDB數據庫管理系統是MySQL的一個分支&#xff0c;主要由開源社區在維護&#xff0c;采用GPL授權許可。開發這個分支的原因之一是&#xff1a;甲骨文公司收購了MySQL后&#x…