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

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

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

聯(lián)合查詢

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

主要代碼:

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

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

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

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

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

思路:

1.直接使用多條件查詢,使用邏輯運算符 or 連接

2.通過union/union all來聯(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查詢出來的結(jié)果,有一個員工k是重復(fù)的,k的薪資低于5000,年齡又大于50,所以查詢了兩次,數(shù)據(jù)直接合并,僅僅進行簡單的合并,并未去重。

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

執(zhí)行:

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

注意:

如果多條查詢語句查詢出來的結(jié)果,字段數(shù)量不一致,在進行union/union all聯(lián)合查詢時,將會報錯。如:

子查詢

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

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

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

此時,子查詢因為存在嵌套關(guān)系,邏輯性較強,代碼是比較變通的,切不可死記硬背,根據(jù)邏輯去思考問題

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

1.標量子查詢(子查詢結(jié)果為單個值)

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

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

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

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

1.WHERE之后

2.FROM之后

3.SELECT之后

標量子查詢

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

案例:

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

思路:

拆解為兩步 (因為在員工表中是沒有存儲銷售部這個部門名稱的,僅僅只有部門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í)行:

查詢在 "e"這個員工 入職之后的員工信息

思路:

拆解為兩步

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í)行:

當然,我們需要了解entrydate是如何比較呢?

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

要比較entrydate字段,你可以使用各種比較運算符,如=、<、>、<=>=、<>!=

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

1.等于,大于,小于,小于等于,大于等于,不等于就不過多演示了,因為直接更改比較運算符即可

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

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

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

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


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

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

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


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

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

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

5. 時間間隔: 如果你想基于兩個日期之間的時間間隔進行比較,你可以使用減法:

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

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

列子查詢

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

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

操作符

描述

IN

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

NOT IN

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

ANY

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

SOME

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

ALL

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

案例:

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

思路:

分解為兩步

1.查詢 "銷售部" 和 "市場部" 的部門ID

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

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

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

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

執(zhí)行:

執(zhí)行:

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

思路:

分解為以下兩步

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

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

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

select * from empcp where salary > all ( select salary from empcp where dept_id =
(select id from dept where name = '財務(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)相同的員工信息 ;

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

拆解為兩步:

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

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

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

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

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é)果作為一張臨時表,再和其他表聯(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)在查詢的不是一個單行數(shù)據(jù),而是一個多行數(shù)據(jù)嗎,此時就不能等于了,這時候我們要使用的是in)

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

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.查詢這部分員工, 對應(yīng)的部門信息;

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

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

?先暫時寫為*

select * from [剛剛查詢的一個結(jié)果作為一張表放進來,子查詢的結(jié)果作為一張臨時表存在,取一個別名e] ;

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

?接著查詢部門信息,有一個員工q,id為17的沒有部門信息,我們要不要查出來,也需要,所以要查全部數(shù)據(jù)我們要使用到左外連接,此時我們順便把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é):此時我們就在from之后用到了子查詢,它會把這個子查詢的結(jié)果作為一張表來與另一張表做

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ù)庫多表聯(lián)合查詢的文章就介紹到這了,更多相關(guān)MySQL多表聯(lián)合查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql5.7.17.msi安裝圖文教程

    mysql5.7.17.msi安裝圖文教程

    這篇文章主要為大家詳細介紹了mysql 5.7.17.msi安裝圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Windows 10系統(tǒng)下徹底刪除卸載MySQL的方法教程

    Windows 10系統(tǒng)下徹底刪除卸載MySQL的方法教程

    mysql數(shù)據(jù)庫的重新安裝是一個麻煩的問題,很難卸除干凈,下面這篇文章主要給大家介紹了關(guān)于在Windows 10系統(tǒng)下徹底刪除卸載MySQL的方法教程,對大家具有一定的參考學(xué)習價值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • 使用MySQL唯一索引的注意事項及說明

    使用MySQL唯一索引的注意事項及說明

    這篇文章主要介紹了使用MySQL唯一索引的注意事項及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • MySql .frm數(shù)據(jù)庫文件導(dǎo)入的問題

    MySql .frm數(shù)據(jù)庫文件導(dǎo)入的問題

    手頭有.frm 文件,怎樣導(dǎo)入數(shù)據(jù)庫???
    2009-07-07
  • mysql found_row()使用詳解

    mysql found_row()使用詳解

    在參考手冊中對found_rows函數(shù)的描述是: it is desirable to know how many rows the statement would have returned without the LIMIT. 也就是說,它返回值是如果SQL語句沒有加LIMIT的情況下返回的數(shù)值。
    2016-05-05
  • MySQL實現(xiàn)字段分割一行轉(zhuǎn)多行的示例代碼

    MySQL實現(xiàn)字段分割一行轉(zhuǎn)多行的示例代碼

    這篇文章主要介紹了MySQL實現(xiàn)字段分割一行轉(zhuǎn)多行的示例代碼,本文給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • MySQL教程徹底學(xué)懂存儲過程

    MySQL教程徹底學(xué)懂存儲過程

    這篇文章主要為大家介紹了MySQL系列的存儲過程,文中詳細的為大家解釋存儲過程的相關(guān)概念及用法語法,以及對存儲過程的理解解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • CentOS6.4上使用yum安裝mysql

    CentOS6.4上使用yum安裝mysql

    這篇文章主要為大家詳細介紹了CentOS6.4上使用yum安裝mysql圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • mysql中提高Order by語句查詢效率的兩個思路分析

    mysql中提高Order by語句查詢效率的兩個思路分析

    在MySQL數(shù)據(jù)庫中,Order by語句的使用頻率是比較高的。但是眾所周知,在使用這個語句時,往往會降低數(shù)據(jù)查詢的性能。
    2011-03-03
  • 修改MySQL字符集的實現(xiàn)

    修改MySQL字符集的實現(xiàn)

    為確保MySQL客戶端默認使用utf8或utf8mb4字符集,需要修改客戶端啟動命令或客戶端配置文件,本文就來介紹一下修改MySQL字符集的實現(xiàn),感興趣的可以了解一下
    2024-10-10

最新評論