欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL數(shù)據(jù)庫(kù)多表聯(lián)合查詢代碼示例

 更新時(shí)間:2024年01月20日 15:19:52   作者:小小惡斯法克  
所謂聯(lián)合就是把多個(gè)表的記錄往一起合并,一起進(jìn)行查詢,也叫多表查詢,這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫(kù)多表聯(lián)合查詢的相關(guān)資料,需要的朋友可以參考下

聯(lián)合查詢

union查詢,就是把多次查詢的結(jié)果合并起來(lái),形成一個(gè)新的查詢結(jié)果集

主要代碼:

SELECT 字段列表	FROM	表 A ...
UNION [ ALL ]
SELECT 字段列表  FROM	表B	;

聯(lián)合查詢的多張表的列數(shù)必須保持一致,字段類型也需要保持一致。

union all 會(huì)將全部的數(shù)據(jù)直接合并在一起,并不會(huì)去重

union 會(huì)對(duì)合并之后的數(shù)據(jù)去重。

案例:將薪資低于 5000 的員工 , 和 年齡大于 50 歲的員工全部查詢出來(lái).

思路:

1.直接使用多條件查詢,使用邏輯運(yùn)算符 or 連接

2.通過(guò)union/union all來(lái)聯(lián)合查詢

select * from empcp where salary < 5000
union all
select * from empcp where age > 50; --聯(lián)合查詢的多張表的列數(shù)必須保持一致,字段類型也需要保持一致。

執(zhí)行:

第一部分

第二部分

聯(lián)合(即要薪資低于5000的員工,又要年齡大于50的員工,那么就意味著這兩條數(shù)據(jù)要合并,關(guān)鍵字union all)

我們發(fā)現(xiàn)union all查詢出來(lái)的結(jié)果,有一個(gè)員工k是重復(fù)的,k的薪資低于5000,年齡又大于50,所以查詢了兩次,數(shù)據(jù)直接合并,僅僅進(jìn)行簡(jiǎn)單的合并,并未去重。

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

執(zhí)行:

我們發(fā)現(xiàn)union聯(lián)合查詢,會(huì)對(duì)查詢出來(lái)的結(jié)果進(jìn)行去重處理。

注意:

如果多條查詢語(yǔ)句查詢出來(lái)的結(jié)果,字段數(shù)量不一致,在進(jìn)行union/union all聯(lián)合查詢時(shí),將會(huì)報(bào)錯(cuò)。如:

子查詢

SQL語(yǔ)句中嵌套的SELECT語(yǔ)句,稱為嵌套查詢,又稱子查詢。

SELECT * FROM	t1	WHERE column1 = ( SELECT column1 FROM t2 ); 

注意!子查詢外部的語(yǔ)句可以是INSERT / UPDATE / DELETE / SELECT 的任何一個(gè)。

此時(shí),子查詢因?yàn)榇嬖谇短钻P(guān)系,邏輯性較強(qiáng),代碼是比較變通的,切不可死記硬背,根據(jù)邏輯去思考問(wèn)題

根據(jù)子查詢結(jié)果不同,可分為:

1.標(biāo)量子查詢(子查詢結(jié)果為單個(gè)值)

2.列子查詢(子查詢結(jié)果為一列)

3.行子查詢(子查詢結(jié)果為一行)

4.表子查詢(子查詢結(jié)果為多行多列)

根據(jù)子查詢位置,可分為:

1.WHERE之后

2.FROM之后

3.SELECT之后

標(biāo)量子查詢

子查詢返回的結(jié)果是單個(gè)值(數(shù)字、字符串、日期等),最簡(jiǎn)單的形式,這種子查詢稱為標(biāo)量子查詢。  常用的操作符:= <>  >    >= <  <=

案例:

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

思路:

拆解為兩步 (因?yàn)樵趩T工表中是沒(méi)有存儲(chǔ)銷售部這個(gè)部門名稱的,僅僅只有部門id)

1.查詢"銷售部" 部門ID

select id from dept where name = '銷售部';

2.根據(jù) "銷售部" 部門ID, 查詢員工信息,用*返回員工所有信息的字段

select * from empcp where dept_id = (select id from dept where name = '銷售部');
或者
select * from empcp where dept_id = 4 ;

執(zhí)行:

執(zhí)行:

查詢?cè)?"e"這個(gè)員工 入職之后的員工信息

思路:

拆解為兩步

1.查詢 e 的入職日期

select entrydate from empcp where name = 'e';

2.查詢指定入職日期之后入職的員工信息

select * from empcp where entrydate > (select entrydate from empcp where name = 'e');
或者
select * from empcp where entrydate > 2004-9-7 ;

執(zhí)行:

執(zhí)行:

當(dāng)然,我們需要了解entrydate是如何比較呢?

在SQL中,entrydate是一個(gè)字段名,通常表示一個(gè)日期或日期時(shí)間類型的數(shù)據(jù)。

要比較entrydate字段,你可以使用各種比較運(yùn)算符,如=<、>、<=>=、<>!=。

以下是一些示例,說(shuō)明如何比較entrydate字段:

1.等于,大于,小于,小于等于,大于等于,不等于就不過(guò)多演示了,因?yàn)橹苯痈谋容^運(yùn)算符即可

SELECT * FROM your_table WHERE entrydate = '2023-10-23';
-- =可以改為<,>,<>,<=,>=......

2.BETWEEN: 如果你想選擇一個(gè)日期范圍內(nèi)的記錄,你可以使用BETWEEN:

SELECT * FROM your_table WHERE entrydate BETWEEN '2023-10-01' AND '2023-10-31';

這個(gè)查詢會(huì)返回所有entrydate在'2023-10-01'和'2023-10-31'之間的記錄。注意,BETWEEN運(yùn)算符是包含邊界值的。


3. LIKE 和日期: 如果你想基于日期的部分部分進(jìn)行比較,例如查找以特定年份開(kāi)始的日期,你可以使用LIKE:

SELECT * FROM your_table WHERE entrydate LIKE '2023%';

這個(gè)查詢會(huì)返回所有以'2023'開(kāi)頭的entrydate的記錄。LIKE運(yùn)算符通常與通配符一起使用,如%表示任何數(shù)量的任何字符。


4. DATE() 函數(shù): 如果你只想比較日期部分而忽略時(shí)間部分,你可以使用DATE()函數(shù):

SELECT * FROM your_table WHERE DATE(entrydate) = '2023-10-23';

這個(gè)查詢只會(huì)比較日期部分,忽略時(shí)間部分。這對(duì)于只關(guān)心日期而不關(guān)心具體時(shí)間的情況很有用。

5. 時(shí)間間隔: 如果你想基于兩個(gè)日期之間的時(shí)間間隔進(jìn)行比較,你可以使用減法:

SELECT * FROM your_table WHERE DATEDIFF(day, entrydate, '2023-10-23') > 5;

這個(gè)查詢會(huì)返回所有與'2023-10-23'相差超過(guò)5天的entrydate的記錄。DATEDIFF()函數(shù)根據(jù)指定的時(shí)間間隔返回兩個(gè)日期之間的差異。在這個(gè)例子中,我們使用天作為時(shí)間間隔單位。不同的數(shù)據(jù)庫(kù)系統(tǒng)可能有不同的函數(shù)來(lái)計(jì)算日期差異,所以請(qǐng)根據(jù)你使用的系統(tǒng)查閱相應(yīng)的文檔。

列子查詢

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

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

操作符

描述

IN

在指定的集合范圍之內(nèi),多選一

NOT IN

不在指定的集合范圍之內(nèi)

ANY

子查詢返回列表中,有任意一個(gè)滿足即可

SOME

與ANY等同,使用SOME的地方都可以使用ANY

ALL

子查詢返回列表的所有值都必須滿足

案例:

查詢 "銷售部" 和 "市場(chǎng)部" 的所有員工信息

思路:

分解為兩步

1.查詢 "銷售部" 和 "市場(chǎng)部" 的部門ID

select id from dept where name = '銷售部' or name = '市場(chǎng)部';

2.根據(jù)部門ID, 查詢員工信息  (由于是兩個(gè)元素,所以用到了in)

select * from empcp where dept_id in (select id from dept where name = '銷售部' or name = '市場(chǎng)部');
或者
select * from empcp where dept_id in(2,4) --2.4是上述語(yǔ)句查詢的結(jié)果,所以我們可以把2,4替換掉,讓上面的語(yǔ)句作為子查詢存在

而由于內(nèi)部的sql查詢出來(lái)不再是一個(gè)單個(gè)值了,而是一列,多行。所以這種子查詢稱為列子查詢

執(zhí)行:

執(zhí)行:

查詢比 財(cái)務(wù)部 所有人工資都高的員工信息

思路:

分解為以下兩步

1.查詢所有 財(cái)務(wù)部 人員工資

select id from dept where name = '財(cái)務(wù)部'; 
 
select salary from empcp where dept_id = (select id from dept where name = '財(cái)務(wù)部');
或者
select salary from empcp where dept_id = 3;

2.比 財(cái)務(wù)部 所有人工資都高的員工信息 (這個(gè)salary要大于這三個(gè)工資的所有值,比其中任何一個(gè)大,此時(shí)就要大于這個(gè)列表中所有值,要加上all)

select * from empcp where salary > all ( select salary from empcp where dept_id =
(select id from dept where name = '財(cái)務(wù)部') );

執(zhí)行:

執(zhí)行:

查詢比 研發(fā)部 其中任意一人工資高的員工信息

思路:

分解為兩步

1.查詢研發(fā)部所有人工資

select salary from empcp where dept_id = (select id from dept where name = '研發(fā)部');

2.比研發(fā)部其中任意一人工資高的員工信息 (關(guān)鍵字any)

select * from empcp where salary > any ( select salary from empcp where dept_id =
(select id from dept where name = '研發(fā)部') );

執(zhí)行:

執(zhí)行:

行子查詢

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

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

案例:

查詢與 "b" 的薪資及直屬領(lǐng)導(dǎo)相同的員工信息 ;

思路:行子查詢一般來(lái)說(shuō),左邊要給組合條件,右邊再給子查詢的結(jié)果,不能把條件分開(kāi),再給子查詢結(jié)果

拆解為兩步:

1.查詢 "b" 的薪資及直屬領(lǐng)導(dǎo)

select salary, managerid from empcp where name = 'b';

2.查詢與 "b" 的薪資及直屬領(lǐng)導(dǎo)相同的員工信息 ;

第三個(gè)代碼就是使用salary和managerid作為了一個(gè)組合條件,然后這個(gè)組合條件等于一個(gè)組合值

select * from empcp where (salary,managerid) = (select salary, managerid from empcp
where name = 'b');
或者
select * from empcp where salary = 12500 and managerid = 1 ;
或者
select * from empcp where (salary , managerid) =  (12500 ,1) ;

執(zhí)行:

執(zhí)行:

???表子查詢

子查詢返回的結(jié)果是多行多列,這種子查詢稱為表子查詢。(子查詢查詢返回的結(jié)果就類似于一張表)

常用的操作符:IN

表子查詢經(jīng)常在from之后,把表子查詢返回的結(jié)果作為一張臨時(shí)表,再和其他表聯(lián)查操作

案例:1.查詢與 "k" , "p" 的職位和薪資相同的員工信息

拆解為兩步:

1.查詢與 "k" , "p" 的職位和薪資

select job, salary from empcp where name = 'k' or name = 'p';

2.查詢與 "k" , "p" 的職位和薪資相同的員工信息 (注意,這里where之后給的是組合條件。如果where之后條件如果是單行,那么我們之前在這一塊的寫法是(job,salary)= 子查詢的結(jié)果就ok了,但是現(xiàn)在查詢的不是一個(gè)單行數(shù)據(jù),而是一個(gè)多行數(shù)據(jù)嗎,此時(shí)就不能等于了,這時(shí)候我們要使用的是in)

3.解讀,這一塊的含義指的是job和salary這個(gè)組合要么滿足上面的,要么滿足下面的,在這個(gè)列表里面多選一,只要能夠滿足一個(gè)這個(gè)員工的數(shù)據(jù)就可以查詢出來(lái)

select * from empcp where (job,salary) in ( select job, salary from empcp where name =
'k' or name = 'p' );

執(zhí)行:

執(zhí)行:

查詢?nèi)肼毴掌谑?"2006-01-01" 之后的員工信息 , 及其部門信息

思路:

分解為兩步

1.入職日期是 "2006-01-01" 之后的員工信息

select * from empcp where entrydate > '2006-01-01';

2.查詢這部分員工, 對(duì)應(yīng)的部門信息;

3.要查詢部門的相關(guān)信息就要再去聯(lián)查另一個(gè)表,dept表

4.所以我們需要把第一次查詢的結(jié)果作為一張表,再去聯(lián)查dept表

?先暫時(shí)寫為*

select * from [剛剛查詢的一個(gè)結(jié)果作為一張表放進(jìn)來(lái),子查詢的結(jié)果作為一張臨時(shí)表存在,取一個(gè)別名e] ;

select * from (select * from empcp where entrydate > '2006-01-01') e ;

?接著查詢部門信息,有一個(gè)員工q,id為17的沒(méi)有部門信息,我們要不要查出來(lái),也需要,所以要查全部數(shù)據(jù)我們要使用到左外連接,此時(shí)我們順便把dept表取名為d

select * from (select * from empcp where entrydate > '2006-01-01') e left join dept d on e.dept_id = d.id ;

執(zhí)行:

?總結(jié):此時(shí)我們就在from之后用到了子查詢,它會(huì)把這個(gè)子查詢的結(jié)果作為一張表來(lái)與另一張表做

select e.*, d.* from (select * from empcp where entrydate > '2006-01-01') e left
join dept d on e.dept_id = d.id ;
或者
select * from (select * from empcp where entrydate > '2006-01-01') e left join dept d
on e.dept_id = d.id ;

執(zhí)行:

執(zhí)行:

總結(jié) 

到此這篇關(guān)于MySQL數(shù)據(jù)庫(kù)多表聯(lián)合查詢的文章就介紹到這了,更多相關(guān)MySQL多表聯(lián)合查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql中的limit用法有哪些(推薦)

    mysql中的limit用法有哪些(推薦)

    在我們使用查詢語(yǔ)句的時(shí)候,經(jīng)常要返回前幾條或者中間某幾行數(shù)據(jù),這個(gè)時(shí)候怎么辦呢,mysql已經(jīng)為我們提供了這樣一個(gè)功能,盡管語(yǔ)法邏輯很是怪異,這個(gè)功能就好比oracle里的rownum,但比mysql提供的這個(gè)LIMIT好用、好記和好理解多了,具體內(nèi)容一起通過(guò)本文看看吧
    2017-10-10
  • MySQL頁(yè)面訪問(wèn)統(tǒng)計(jì)及排名情況

    MySQL頁(yè)面訪問(wèn)統(tǒng)計(jì)及排名情況

    這篇文章主要介紹了MySQL頁(yè)面訪問(wèn)統(tǒng)計(jì)及排名情況,涉及到mysql頁(yè)面訪問(wèn)統(tǒng)計(jì),mysql統(tǒng)計(jì)排名相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • SQL中current_date()函數(shù)的實(shí)現(xiàn)

    SQL中current_date()函數(shù)的實(shí)現(xiàn)

    日期時(shí)間類型的數(shù)據(jù)也是經(jīng)常要用到的,SQL中也提供了一些函數(shù)對(duì)這些數(shù)據(jù)進(jìn)行處理,本文主要介紹了SQL中current_date()函數(shù)的實(shí)現(xiàn),具有一定的參考價(jià)值
    2024-02-02
  • MySQL命令行登入的兩種方式

    MySQL命令行登入的兩種方式

    MySQL是一個(gè)需要賬戶名密碼登錄的數(shù)據(jù)庫(kù),登陸后使用,它提供了一個(gè)默認(rèn)的root賬號(hào),下面這篇文章主要給大家介紹了關(guān)于MySQL命令行登入的兩種方式,需要的朋友可以參考下
    2023-04-04
  • 一文詳解MySQL—Join的使用優(yōu)化

    一文詳解MySQL—Join的使用優(yōu)化

    JOIN是一種非常常見(jiàn)的操作,用于將兩個(gè)或多個(gè)表中的數(shù)據(jù)合并到一個(gè)結(jié)果集中。MySQL支持多種JOIN類型,本文通過(guò)代碼示例詳細(xì)介紹了Join的使用優(yōu)化,有需要的小伙伴可以參考閱讀
    2023-04-04
  • 清理MySQL Binlog二進(jìn)制日志的三種方式

    清理MySQL Binlog二進(jìn)制日志的三種方式

    Binlog日志非常重要,但是占用的磁盤空間也很大,我們也需要定期的去清理二進(jìn)制日志,在MySQL數(shù)據(jù)庫(kù)中,提供了自動(dòng)清理Binlog日志的參數(shù),本文給大家介紹了清理MySQL Binlog二進(jìn)制日志的三種方式,文中通過(guò)代碼講解非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • MySQL使用EXISTS檢查記錄是否存在的詳細(xì)過(guò)程

    MySQL使用EXISTS檢查記錄是否存在的詳細(xì)過(guò)程

    EXISTS是SQL中用于檢查子查詢是否返回至少一條記錄的運(yùn)算符,它通常用于測(cè)試是否存在滿足特定條件的記錄,從而在主查詢中進(jìn)行相應(yīng)操作,本文給大家介紹MySQL使用EXISTS檢查記錄是否存在,感興趣的朋友一起看看吧
    2025-08-08
  • Prometheus 監(jiān)控MySQL使用grafana展示

    Prometheus 監(jiān)控MySQL使用grafana展示

    這篇文章主要介紹prometheus通過(guò)mysql exporter+node exporter監(jiān)控mysql,并使用grafana進(jìn)行圖表展示的相關(guān)內(nèi)容,感興趣的效果版可以參考下文
    2021-08-08
  • 關(guān)于mysql數(shù)據(jù)庫(kù)格式化簡(jiǎn)單介紹

    關(guān)于mysql數(shù)據(jù)庫(kù)格式化簡(jiǎn)單介紹

    本文將介紹關(guān)于mysql數(shù)據(jù)庫(kù)格式化時(shí)需要注意的一些問(wèn)題,需要的朋友可以參考下
    2012-11-11
  • MySQL8重置root賬戶密碼圖文教程超詳細(xì)講解

    MySQL8重置root賬戶密碼圖文教程超詳細(xì)講解

    root賬戶為MySQL的超級(jí)管理員用戶,擁有MySQL提供的所有權(quán)限,這篇文章主要介紹了MySQL8重置root賬戶密碼圖文教程,需要的朋友可以參考下
    2023-05-05

最新評(píng)論