最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL多表關(guān)聯(lián)查詢(xún)相關(guān)練習(xí)題

 更新時(shí)間:2023年10月31日 11:32:11   作者:程序員丶星霖  
這篇文章主要給大家介紹了關(guān)于MySQL多表關(guān)聯(lián)查詢(xún)的相關(guān)資料,在MySQL中JOIN語(yǔ)句是實(shí)現(xiàn)多表關(guān)聯(lián)查詢(xún)的關(guān)鍵,它可以將多個(gè)表格中符合條件的數(shù)據(jù)連接在一起,從而提供一個(gè)完整的查詢(xún)結(jié)果,需要的朋友可以參考下

一、多表關(guān)聯(lián)查詢(xún)

多表關(guān)聯(lián)查詢(xún)是使用一條SQL語(yǔ)句,將關(guān)聯(lián)的多張表的數(shù)據(jù)查詢(xún)出來(lái)。

1.1 交叉查詢(xún)

交叉查詢(xún)就是將多張表的數(shù)據(jù)沒(méi)有條件地連接在一起進(jìn)行展示。

1.1.1 語(yǔ)法

使用交叉查詢(xún)類(lèi)別和商品

-- 目標(biāo):查詢(xún)所有分類(lèi),以及每個(gè)分類(lèi)下的所有商品信息
SELECT tc.*,tp.* FROM t_category tc,t_product tp;

SELECT * FROM t_category,t_product;
-- 這個(gè)語(yǔ)句查詢(xún)出來(lái)是一個(gè)笛卡爾積,里面有很多錯(cuò)誤的數(shù)據(jù),所以不用,這種查詢(xún)叫做交叉查詢(xún)

通過(guò)查詢(xún)結(jié)果可以看到,交叉查詢(xún)其實(shí)是一種錯(cuò)誤的做法,在查詢(xún)到的結(jié)果集中有大量的錯(cuò)誤數(shù)據(jù),稱(chēng)交叉查詢(xún)到的結(jié)果集是笛卡爾積。

1.2 內(nèi)連接查詢(xún)

通常要查詢(xún)的多個(gè)表之間都存在關(guān)聯(lián)關(guān)系,通過(guò)關(guān)聯(lián)關(guān)系(主外鍵關(guān)系)去除笛卡爾積。這種通過(guò)條件過(guò)濾去除笛卡爾積的查詢(xún),稱(chēng)之為連接查詢(xún)。

連接查詢(xún)又分為內(nèi)連接查詢(xún)外連接查詢(xún)。

1.2.1 隱式內(nèi)連接

-- 1. 內(nèi)連接查詢(xún):滿(mǎn)足連接條件的數(shù)據(jù)才能查詢(xún)出來(lái),不滿(mǎn)足連接條件的數(shù)據(jù)無(wú)法查詢(xún)出來(lái)
-- 1.1 隱式內(nèi)連接查詢(xún):
-- select 要查詢(xún)的字段 from 主表,從表 where 從表的外鍵 = 主表的主鍵
SELECT tc.*,tp.* FROM t_category tc,t_product tp WHERE tp.cno = tc.cid;

1.2.2 顯式內(nèi)連接

-- 1.2 顯式內(nèi)連接查詢(xún):
-- select 要查詢(xún)的字段 from 主表 [inner] join 從表 on 從表的外鍵 = 主表的主鍵
SELECT * FROM t_product tp INNER JOIN t_category tc ON tp.cno = tc.cid;
-- 查詢(xún)手機(jī)數(shù)碼分類(lèi)下的所有商品的信息以及分類(lèi)信息
SELECT * FROM t_product tp INNER JOIN t_category tc ON tp.cno = tc.cid WHERE tc.cname='手機(jī)數(shù)碼';

1.2.3 內(nèi)連接查詢(xún)的特點(diǎn)

主表和從表的數(shù)據(jù)都是滿(mǎn)足連接條件則能夠查詢(xún)出來(lái),不滿(mǎn)足連接條件則不會(huì)查詢(xún)出來(lái)。

1.3 外連接查詢(xún)

如果要保證查詢(xún)出某張表的全部數(shù)據(jù)情況下進(jìn)行連接查詢(xún),急需要使用外連接查詢(xún)。

外連接查詢(xún)分為左外連接和右外連接。

1.3.1 左外連接查詢(xún)

以join左邊的表為主表,展示主表的所有數(shù)據(jù),根據(jù)條件查詢(xún)連接右邊表的數(shù)據(jù),若滿(mǎn)足條件則展示,若不滿(mǎn)足則以null顯示。

可以理解為:在內(nèi)連接的基礎(chǔ)上保證左邊表的數(shù)據(jù)全部顯示。

-- 2. 外連接查詢(xún):會(huì)查詢(xún)出主表的所有數(shù)據(jù),從表的數(shù)據(jù)滿(mǎn)足條件則能查詢(xún)出來(lái),不滿(mǎn)足則查詢(xún)不出來(lái)
-- 2.1 左外連接查詢(xún):以join左邊的表作為主表,能查詢(xún)出左邊的表的所有數(shù)據(jù)
SELECT * FROM t_product tp LEFT OUTER JOIN t_category tc ON tp.cno = tc.cid;

1.3.2 右外連接查詢(xún)

以join右邊的表為主表,展示右邊表的所有數(shù)據(jù),根據(jù)條件查詢(xún)join左邊表的數(shù)據(jù),若滿(mǎn)足則展示,若不滿(mǎn)足則以null顯示。

可以理解為:在內(nèi)連接的基礎(chǔ)上保證右邊表的數(shù)據(jù)全部顯示

-- 2.2 右外連接查詢(xún):以join右邊的表作為主表,能查詢(xún)出右邊的表的所有數(shù)據(jù)
SELECT * FROM t_product tp RIGHT OUTER JOIN t_category tc ON tp.cno = tc.cid;

1.4 union聯(lián)合查詢(xún)

聯(lián)合查詢(xún)并不是多表連接查詢(xún)的一種方式。

聯(lián)合查詢(xún)是將多條查詢(xún)語(yǔ)句的查詢(xún)結(jié)果合并成一個(gè)結(jié)果并去掉重復(fù)數(shù)據(jù)。

全外連接查詢(xún)的意思就是將左表和右表的數(shù)據(jù)都查詢(xún)出來(lái),然后按照連接條件連接。

-- 全外連接,使用union聯(lián)合查詢(xún)做全外連接
-- union是將多個(gè)select語(yǔ)句查詢(xún)到的結(jié)果進(jìn)行合并,合并成一個(gè)結(jié)果,要求多個(gè)select語(yǔ)句查詢(xún)到的結(jié)果的格式是一樣的
SELECT * FROM t_product tp LEFT OUTER JOIN t_category tc ON tp.cno = tc.cid
UNION
SELECT * FROM t_product tp RIGHT OUTER JOIN t_category tc ON tp.cno = tc.cid

1.5 自連接查詢(xún)

自連接查詢(xún)是一種特殊的多表連接查詢(xún),因?yàn)閮蓚€(gè)關(guān)聯(lián)查詢(xún)的表是同一張表,通過(guò)取別名的方式來(lái)虛擬成兩張表,然后進(jìn)行兩張表的連接查詢(xún)。

-- 員工表
CREATE TABLE emp (
  id INT PRIMARY KEY, -- 員工id
  ename VARCHAR(50), -- 員工姓名
  mgr INT , -- 上級(jí)領(lǐng)導(dǎo)
  joindate DATE, -- 入職日期
  salary DECIMAL(7,2) -- 工資
);
-- 添加員工
INSERT INTO emp(id,ename,mgr,joindate,salary) VALUES 
(1001,'孫悟空',1004,'2000-12-17','8000.00'),
(1002,'盧俊義',1006,'2001-02-20','16000.00'),
(1003,'林沖',1006,'2001-02-22','12500.00'),
(1004,'唐僧',1009,'2001-04-02','29750.00'),
(1005,'李逵',1006,'2001-09-28','12500.00'),
(1006,'宋江',1009,'2001-05-01','28500.00'),
(1007,'劉備',1009,'2001-09-01','24500.00'),
(1008,'豬八戒',1004,'2007-04-19','30000.00'),
(1009,'羅貫中',NULL,'2001-11-17','50000.00'),
(1010,'吳用',1006,'2001-09-08','15000.00'),
(1011,'沙僧',1004,'2007-05-23','11000.00'),
(1012,'李逵',1006,'2001-12-03','9500.00'),
(1013,'小白龍',1004,'2001-12-03','30000.00'),
(1014,'關(guān)羽',1007,'2002-01-23','13000.00');


-- 自連接查詢(xún):表中的一個(gè)字段作為外鍵指向本表的主鍵
SELECT employee.*,manager.ename FROM emp employee,emp manager WHERE employee.mgr=manager.id AND employee.ename='孫悟空'

二、子查詢(xún)

如果一個(gè)查詢(xún)語(yǔ)句嵌套在另一個(gè)查詢(xún)語(yǔ)句里面,那么這個(gè)查詢(xún)語(yǔ)句就稱(chēng)之為子查詢(xún)。

根據(jù)位置不同,可以分為where型、from型、exists型。

2.1 where型

  • 子查詢(xún)是單值結(jié)果,那么可以對(duì)其使用(=,>等比較運(yùn)算符)
  • 子查詢(xún)是多值結(jié)果,那么可對(duì)其使用([not] in (子查詢(xún)結(jié)果),或>all(子查詢(xún)結(jié)果),或>=all(子查詢(xún)結(jié)果),<all(子查詢(xún)結(jié)果),<=all(子查詢(xún)結(jié)果),或>any(子查詢(xún)結(jié)果),或>=any(子查詢(xún)結(jié)果),<any(子查詢(xún)結(jié)果),<=any(子查詢(xún)結(jié)果))
-- where型子查詢(xún),是將子查詢(xún)語(yǔ)句放在where后面
-- 需求:查詢(xún)emp表中的薪資最高的那個(gè)員工的信息
-- where后面的條件中不能使用聚合函數(shù)
-- 第一步:查詢(xún)出最高的薪資
SELECT MAX(salary) FROM emp   -- 50000

-- 第二步:根據(jù)上一步查詢(xún)出來(lái)的最高薪資,查詢(xún)具體的員工信息
SELECT * FROM emp WHERE salary = 50000

-- 兩步合成一步
SELECT * FROM emp WHERE salary = (SELECT MIN(salary) FROM emp)

-- 需求:查詢(xún)出手機(jī)數(shù)碼和食物分類(lèi)下的所有商品信息
SELECT * FROM t_product WHERE cno IN(SELECT cid FROM t_category WHERE cname IN('手機(jī)數(shù)碼','食物'))

-- 需求:查詢(xún)出價(jià)格最高的商品信息
-- 思路一:匹配最高的價(jià)格
SELECT * FROM t_product WHERE price = (SELECT MAX(price) FROM t_product)

-- 思路二:按照價(jià)格的降序排列,取第一個(gè)
SELECT * FROM t_product ORDER BY price DESC LIMIT 0,1

-- 思路三:查詢(xún)價(jià)格大于所有商品的商品
SELECT * FROM t_product WHERE price>=ALL(SELECT price FROM t_product)

2.2 from型

子查詢(xún)的結(jié)果是多行多列的結(jié)果,類(lèi)似于一張表格。

必須給子查詢(xún)?nèi)e名,即臨時(shí)表名,表的別名不要加""和空格。

-- from型的子查詢(xún),這個(gè)針對(duì)的是子查詢(xún)的結(jié)果是多行、多列數(shù)據(jù)
-- 需求:查詢(xún)每個(gè)分類(lèi)下的分類(lèi)名、商品總數(shù)
-- 思路一:使用連接查詢(xún)
-- 使用外連接,查詢(xún)出分類(lèi)表的所有數(shù)據(jù)
SELECT tc.cname,COUNT(tp.pid) FROM t_category tc LEFT OUTER JOIN t_product tp ON tp.cno=tc.cid GROUP BY tc.cname

-- 思路二:使用子查詢(xún)
-- 第一步:對(duì)t_product根據(jù)cno進(jìn)行分組查詢(xún),統(tǒng)計(jì)每個(gè)分類(lèi)的商品數(shù)量
SELECT cno,COUNT(pid) FROM t_product GROUP BY cno
-- 第二步:用t_category表去連接第一步查詢(xún)出來(lái)的結(jié)果,進(jìn)行連接查詢(xún),此時(shí)要求查詢(xún)出所有分類(lèi)
SELECT tc.cname '商品名稱(chēng)',IFNULL(tn.total,0) '總數(shù)量' FROM t_category tc LEFT OUTER JOIN (SELECT cno,COUNT(pid) total FROM t_product GROUP BY cno) tn ON tn.cno=tc.cid

2.3 exists型

-- exists型子查詢(xún)
-- 需求:查詢(xún)那些有商品的分類(lèi)
-- 連接分類(lèi)表和商品表進(jìn)行查詢(xún)
-- exists是如果子查詢(xún)語(yǔ)句能夠至少查詢(xún)到一條數(shù)據(jù),就返回TRUE,否則就返回FALSE
SELECT cid,cname FROM t_category tc WHERE EXISTS (SELECT * FROM t_product tp WHERE tp.cno = tc.cid)

總結(jié) 

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

相關(guān)文章

  • MySQL查詢(xún)表中某列字段相同的重復(fù)數(shù)據(jù)的方法

    MySQL查詢(xún)表中某列字段相同的重復(fù)數(shù)據(jù)的方法

    在數(shù)據(jù)庫(kù)查詢(xún)中,我們經(jīng)常需要查找表中某列中重復(fù)的數(shù)據(jù),本文將介紹如何使用 SQL 查詢(xún)語(yǔ)句來(lái)查找表中某列字段相同的重復(fù)數(shù)據(jù),幫助你快速定位重復(fù)數(shù)據(jù)問(wèn)題并進(jìn)行處理
    2023-08-08
  • 詳解MySQL主從復(fù)制實(shí)戰(zhàn) - 基于GTID的復(fù)制

    詳解MySQL主從復(fù)制實(shí)戰(zhàn) - 基于GTID的復(fù)制

    本篇文章主要介紹了MySQL主從復(fù)制實(shí)戰(zhàn) - 基于GTID的復(fù)制,基于GTID的復(fù)制是MySQL 5.6后新增的復(fù)制方式.有興趣的可以了解一下。
    2017-03-03
  • MySQL重連連接丟失:The last packet successfully received from the server的原因及解決方案

    MySQL重連連接丟失:The last packet successfully 

    在開(kāi)發(fā)和運(yùn)維MySQL數(shù)據(jù)庫(kù)應(yīng)用時(shí),經(jīng)常會(huì)遇到“連接丟失”或“重連失敗”的問(wèn)題,這類(lèi)問(wèn)題不僅會(huì)影響應(yīng)用程序的穩(wěn)定性,還可能導(dǎo)致數(shù)據(jù)不一致等嚴(yán)重后果,本文將探討MySQL連接丟失的原因、如何診斷此類(lèi)問(wèn)題以及采取哪些措施來(lái)解決或預(yù)防,需要的朋友可以參考下
    2025-02-02
  • Dbeaver連接MySQL數(shù)據(jù)庫(kù)及錯(cuò)誤Connection?refusedconnect處理方法

    Dbeaver連接MySQL數(shù)據(jù)庫(kù)及錯(cuò)誤Connection?refusedconnect處理方法

    這篇文章主要介紹了dbeaver連接MySQL數(shù)據(jù)庫(kù)及錯(cuò)誤Connection?refusedconnect處理方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • 導(dǎo)致mysqld無(wú)法啟動(dòng)的一個(gè)錯(cuò)誤問(wèn)題及解決

    導(dǎo)致mysqld無(wú)法啟動(dòng)的一個(gè)錯(cuò)誤問(wèn)題及解決

    這篇文章主要介紹了導(dǎo)致mysqld無(wú)法啟動(dòng)的一個(gè)錯(cuò)誤問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 淺談MySQL user權(quán)限表

    淺談MySQL user權(quán)限表

    MySQL 在安裝時(shí)會(huì)自動(dòng)創(chuàng)建一個(gè)名為 mysql 的數(shù)據(jù)庫(kù),mysql 數(shù)據(jù)庫(kù)中存儲(chǔ)的都是用戶(hù)權(quán)限表。本文就詳細(xì)的介紹一下MySQL user權(quán)限表 ,感興趣的可以了解一下
    2021-06-06
  • 虛擬機(jī)Centos7安裝MySQL數(shù)據(jù)庫(kù)實(shí)踐

    虛擬機(jī)Centos7安裝MySQL數(shù)據(jù)庫(kù)實(shí)踐

    用戶(hù)分享在虛擬機(jī)安裝MySQL的全過(guò)程及常見(jiàn)問(wèn)題解決方案,包括處理GPG密鑰、修改密碼策略、配置遠(yuǎn)程訪(fǎng)問(wèn)權(quán)限及防火墻設(shè)置,最終通過(guò)關(guān)閉防火墻和停止NetworkManager解決網(wǎng)絡(luò)連接異常問(wèn)題
    2025-07-07
  • MySQL中SHOW DATABASES語(yǔ)句查看或顯示數(shù)據(jù)庫(kù)

    MySQL中SHOW DATABASES語(yǔ)句查看或顯示數(shù)據(jù)庫(kù)

    在MySQL中,可使用SHOW DATABASES語(yǔ)句來(lái)查看或顯示當(dāng)前用戶(hù)權(quán)限范圍以?xún)?nèi)的數(shù)據(jù)庫(kù),下面就來(lái)介紹一下如何使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Mysql8主從復(fù)制解讀(兼容低高版本)

    Mysql8主從復(fù)制解讀(兼容低高版本)

    文章詳細(xì)介紹了MySQL主從復(fù)制的理論知識(shí)、必要前提、實(shí)現(xiàn)原理、binlog的三種類(lèi)型以及主從同步的具體步驟,通過(guò)配置主庫(kù)和從庫(kù)的MySQL配置文件,并創(chuàng)建用于主從同步的用戶(hù),可以實(shí)現(xiàn)主從復(fù)制,最后,文章還討論了主從同步的驗(yàn)證和故障切換的方法
    2025-02-02
  • mysql8創(chuàng)建、刪除用戶(hù)以及授權(quán)、消權(quán)操作詳解

    mysql8創(chuàng)建、刪除用戶(hù)以及授權(quán)、消權(quán)操作詳解

    上網(wǎng)找過(guò)資料說(shuō)要進(jìn)入mysql數(shù)據(jù)庫(kù)在進(jìn)行這些操作,所以下面這篇文章主要給大家介紹了關(guān)于mysql8創(chuàng)建、刪除用戶(hù)以及授權(quán)、消權(quán)操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03

最新評(píng)論

维西| 乌兰县| 高尔夫| 巴中市| SHOW| 凌源市| 富平县| 鄂州市| 敦化市| 隆昌县| 会东县| 澄江县| 新巴尔虎左旗| 林芝县| 昌宁县| 左贡县| 冀州市| 陆丰市| 定安县| 镇沅| 肥东县| 长宁县| 江川县| 叙永县| 长泰县| 秭归县| 鲜城| 依安县| 泰州市| 正定县| 方山县| 磐石市| 镶黄旗| 西和县| 延川县| 清流县| 天水市| 惠州市| 绵阳市| 根河市| 汝阳县|