SQL中的分組查詢與聯(lián)合查詢舉例詳解
前言
在數(shù)據(jù)庫操作中,GROUP BY
分組查詢和聯(lián)合查詢是非常強(qiáng)大且常用的功能,它們能夠幫助我們從大量數(shù)據(jù)中提取有價值的信息。本文將深入探討這兩種查詢方式,并結(jié)合具體示例進(jìn)行詳細(xì)講解。
1. GROUP BY分組查詢
1.1 語句格式
GROUP BY
語句的基本格式如下:
SELECT 分組列的列名, 除分組列的列名之外只能使用聚合函數(shù) FROM 查詢表的表名 GROUP BY 分組列的列名 HAVING HAVING子句:對GROUP BY的結(jié)果進(jìn)行過濾(只能和GROUP BY一起使用)
在這個語句中,SELECT
關(guān)鍵字用于指定要查詢的列,其中除了分組列之外,其他列必須使用聚合函數(shù)(如SUM
、AVG
、COUNT
等)。FROM
關(guān)鍵字指定要查詢的表。GROUP BY
關(guān)鍵字用于指定按照哪一列進(jìn)行分組。HAVING
子句則用于對分組后的結(jié)果進(jìn)行進(jìn)一步的篩選。
1.2 示例說明
假設(shè)有如下所示的exam
表:
1.2.1 分別查詢哥哥組和弟弟組的英語成績總和
SELECT exam.`group`, SUM(exam.english) FROM exam AS exam GROUP BY exam.`group`
在這個查詢中,我們使用GROUP BY
將數(shù)據(jù)按照group
列進(jìn)行分組,然后使用SUM
聚合函數(shù)計算每個組的英語成績總和。執(zhí)行結(jié)果如下:
1.2.2 查詢哥哥組的所有成績總和
SELECT exam.`group`, SUM( exam.english +exam.chinese+exam.math) FROM exam AS exam GROUP BY exam.`group` HAVING exam.`group` ='哥哥組'
這里同樣使用GROUP BY
進(jìn)行分組,不過在SUM
函數(shù)中計算了每個學(xué)生的所有科目成績總和。HAVING
子句用于篩選出group
為哥哥組
的記錄。執(zhí)行結(jié)果如下:
通過這兩個示例,我們可以看到GROUP BY
分組查詢在對數(shù)據(jù)進(jìn)行分類統(tǒng)計時的強(qiáng)大功能。它能夠根據(jù)指定的列將數(shù)據(jù)分組,并對每個組的數(shù)據(jù)進(jìn)行聚合計算,從而得到我們需要的統(tǒng)計信息。
2. 聯(lián)合查詢
聯(lián)合查詢用于將多個查詢結(jié)果合并在一起,常見的聯(lián)合查詢包括內(nèi)連接、外連接、自連接、子查詢和合并查詢等。下面我們將逐一介紹這些聯(lián)合查詢的用法。
2.1 內(nèi)連接
內(nèi)連接是一種最常用的連接方式,它返回兩個表中滿足連接條件的所有行。
2.1.1 語法格式
select * from table1,table2 where table1.xx=table2.xx;
這是一種基于逗號分隔的表名和WHERE
子句指定連接條件的寫法。更標(biāo)準(zhǔn)的寫法是使用JOIN
關(guān)鍵字:
SELECT * FROM table1 JOIN table2 ON table1.xx = table2.xx;
2.1.2 執(zhí)行過程
內(nèi)連接的執(zhí)行過程可以分為以下幾個步驟:
- 計算笛卡爾積:首先計算參加表連接的兩個表的笛卡爾積。例如,假設(shè)有
qintianpeople
表和qintiancommodity
表,執(zhí)行以下查詢:
SELECT * FROM qintianpeople, qintiancommodity
結(jié)果會得到兩個表的笛卡爾積,即qintianpeople
表中的每一行與qintiancommodity
表中的每一行進(jìn)行組合,結(jié)果集的行數(shù)為兩個表行數(shù)的乘積。執(zhí)行結(jié)果如下:
- 通過連接條件過濾無效數(shù)據(jù):在笛卡爾積的基礎(chǔ)上,通過連接條件過濾掉不滿足條件的數(shù)據(jù)。例如:
SELECT * FROM qintianpeople, qintiancommodity WHERE qintianpeople.people_id = qintiancommodity.people_id
這里使用WHERE
子句指定了連接條件,只有people_id
相等的行才會被保留。執(zhí)行結(jié)果如下:
- 加入查詢條件得到想要的結(jié)果行:可以進(jìn)一步添加查詢條件來篩選出符合特定要求的行。例如:
SELECT * FROM qintianpeople, qintiancommodity WHERE qintianpeople.people_id = qintiancommodity.people_id AND qintianpeople.people_id>5
這里在連接條件的基礎(chǔ)上,添加了qintianpeople.people_id>5
的條件,進(jìn)一步篩選出符合條件的行。執(zhí)行結(jié)果如下:
- 精簡列名得到最終想要查詢的列:最后,可以根據(jù)需求選擇需要顯示的列,精簡結(jié)果集。例如:
SELECT qintianpeople.people_id, people_name, commodity_name FROM qintianpeople, qintiancommodity WHERE qintianpeople.people_id = qintiancommodity.people_id AND qintianpeople.people_id>5
這個查詢只選擇了people_id
、people_name
和commodity_name
這幾列,得到了更精簡的結(jié)果。執(zhí)行結(jié)果如下:
2.2 外連接
外連接分為左外連接和右外連接,它們的區(qū)別在于以哪個表為基準(zhǔn)進(jìn)行連接。
2.2.1 左外連接
語法格式:
Select * from table1 left join table2 on table1.xx=table2.xx;
左外連接以左表為基準(zhǔn),左邊的數(shù)據(jù)全部顯示,右邊的數(shù)據(jù)沒有對應(yīng)記錄的顯示為NULL
。例如:
SELECT qintianpeople.people_id, people_name, commodity_name FROM qintiancommodity LEFT JOIN qintianpeople ON qintiancommodity.people_id = qintianpeople.people_id
執(zhí)行結(jié)果如下:
2.2.2 右外連接
語法格式:
Select * from table1 right join table2 on table1.xx=table2.xx;
右外連接以右表為基準(zhǔn),右邊的數(shù)據(jù)全部顯示,左邊的數(shù)據(jù)沒有對應(yīng)記錄的顯示為NULL
。例如:
SELECT qintianpeople.people_id, people_name, commodity_name FROM qintiancommodity RIGHT JOIN qintianpeople ON qintiancommodity.people_id = qintianpeople.people_id
執(zhí)行結(jié)果如下:
2.3 自連接
自連接是指在同一個表上進(jìn)行連接操作,它可以把行比較轉(zhuǎn)化為列比較,在查詢時可以使用WHERE
進(jìn)行過濾。
語法格式:
select * from table1 t1,table1 t2 where t1.xx=t2.xx;
2.4 子查詢
子查詢是指在一個查詢中嵌套另一個查詢,將內(nèi)層查詢的結(jié)果作為外層查詢的條件。子查詢可以分為單行子查詢和多行子查詢。
2.4.1 單行子查詢
語法格式:
Select * from table1 where id=(select id from table2 where...);
例如,假設(shè)有customers
表和orders
表,我們想要查詢下了訂單的客戶信息,可以使用如下子查詢:
SELECT * FROM customers WHERE customer_id IN (SELECT DISTINCT customer_id FROM orders);
這個子查詢先從orders
表中獲取所有下過訂單的customer_id
,然后外層查詢從customers
表中查詢這些customer_id
對應(yīng)的客戶信息。
2.4.2 多行子查詢
語法格式:
Select * from table1 where id in (select id from table2 where...);
多行子查詢與單行子查詢類似,不過它返回的是多個值,使用IN
關(guān)鍵字來匹配這些值。例如:
SELECT * FROM products WHERE product_id IN (SELECT product_id FROM order_items WHERE quantity > 10);
這個查詢會返回在order_items
表中被訂購數(shù)量大于10的所有產(chǎn)品信息。
子查詢可以多次嵌套,以實現(xiàn)更復(fù)雜的查詢邏輯。例如:
SELECT * FROM customers WHERE customer_id IN ( SELECT customer_id FROM orders WHERE order_date > '2023-01-01' AND customer_id IN ( SELECT customer_id FROM customers WHERE region = 'Asia' ) );
這個嵌套子查詢首先篩選出亞洲地區(qū)的客戶customer_id
,然后在這些客戶中篩選出在2023年1月1日之后下過訂單的客戶customer_id
,最后查詢出這些客戶的詳細(xì)信息。
2.5 合并查詢
合并查詢用于將兩個或多個查詢的結(jié)果合并到一個結(jié)果集中,分為去重合并和不去重合并。
2.5.1 顯示去重
語法格式:
select * from table1 union select * from table2;
UNION
關(guān)鍵字會將兩個查詢結(jié)果合并,并去除重復(fù)的行。
2.5.2 不顯示去重
語法格式:
select * from table1 union all select * from table2;
UNION ALL
關(guān)鍵字會將兩個查詢結(jié)果直接合并,保留所有的行,包括重復(fù)的行。
2.6 一條SQL語句的執(zhí)行順序
了解一條SQL語句的執(zhí)行順序?qū)τ诰帉懜咝?zhǔn)確的查詢非常重要。SQL語句的執(zhí)行順序如下:
FROM
:指定需要查詢的表。JOIN ON
:取笛卡爾積并根據(jù)連接條件進(jìn)行連接。WHERE
:使用限制條件過濾數(shù)據(jù)。GROUP BY
:對數(shù)據(jù)進(jìn)行分組查詢。HAVING
:對分組后的結(jié)果進(jìn)行過濾。SELECT
:篩選需要顯示的列。DISTINCT
:對結(jié)果進(jìn)行去重(如果有該關(guān)鍵字)。ORDER BY
:對結(jié)果進(jìn)行排序。LIMIT
:限制返回的行數(shù)。
總結(jié)
到此這篇關(guān)于SQL中的分組查詢與聯(lián)合查詢舉例詳解的文章就介紹到這了,更多相關(guān)SQL分組查詢與聯(lián)合查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
此數(shù)據(jù)庫沒有有效所有者,因此無法安裝數(shù)據(jù)庫關(guān)系圖支持對象
此數(shù)據(jù)庫沒有有效所有者,因此無法安裝數(shù)據(jù)庫關(guān)系圖支持對象。若要繼續(xù),請首先使用“數(shù)據(jù)庫屬性”對話框的“文件”頁或ALTER AUTHORIZATION語句將數(shù)據(jù)庫所有者設(shè)置為有效登錄名,然后再添加數(shù)據(jù)庫關(guān)系圖支持對象2012-01-01sql添加數(shù)據(jù)后返回受影響行數(shù)據(jù)
Inserted 表用于存儲 INSERT 和 UPDATE 語句所影響的行的副本。在一個插入或更新事務(wù)處理中,新建行被同時添加到 inserted 表和觸發(fā)器表中2011-11-11在SQL Server中恢復(fù)多個數(shù)據(jù)庫的方法小結(jié)
這篇文章主要介紹了如何在SQL Server中恢復(fù)多個數(shù)據(jù)庫,通常情況下,只要備份文件的名稱與相應(yīng)的數(shù)據(jù)庫匹配,且沒有附加的日期或時間信息,就可以通過有效的 T-SQL 腳本來完成恢復(fù),文中給介紹了在SQL Server中恢復(fù)多個數(shù)據(jù)庫的方法小結(jié),需要的朋友可以參考下2024-09-09sqlserver 支持定位當(dāng)前頁,自定義排序的分頁SQL(拒絕動態(tài)SQL)
sqlserver 支持定位當(dāng)前頁,自定義排序的分頁SQL(拒絕動態(tài)SQL)2010-05-05