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

SQL中的分組查詢與聯(lián)合查詢舉例詳解

 更新時(shí)間:2025年02月05日 10:54:03   作者:半聾半瞎  
這篇文章主要介紹了GROUPBY分組查詢和聯(lián)合查詢?cè)跀?shù)據(jù)庫(kù)操作中的應(yīng)用,GROUPBY用于將數(shù)據(jù)分組并進(jìn)行聚合計(jì)算,而聯(lián)合查詢則通過(guò)連接多個(gè)表或子查詢的結(jié)果來(lái)獲取更復(fù)雜的數(shù)據(jù)集,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在數(shù)據(jù)庫(kù)操作中,GROUP BY分組查詢和聯(lián)合查詢是非常強(qiáng)大且常用的功能,它們能夠幫助我們從大量數(shù)據(jù)中提取有價(jià)值的信息。本文將深入探討這兩種查詢方式,并結(jié)合具體示例進(jìn)行詳細(xì)講解。

1. GROUP BY分組查詢

1.1 語(yǔ)句格式

GROUP BY語(yǔ)句的基本格式如下:

SELECT
    分組列的列名,
    除分組列的列名之外只能使用聚合函數(shù)
FROM
    查詢表的表名
GROUP BY
    分組列的列名
HAVING
    HAVING子句:對(duì)GROUP BY的結(jié)果進(jìn)行過(guò)濾(只能和GROUP BY一起使用)

在這個(gè)語(yǔ)句中,SELECT關(guān)鍵字用于指定要查詢的列,其中除了分組列之外,其他列必須使用聚合函數(shù)(如SUM、AVG、COUNT等)。FROM關(guān)鍵字指定要查詢的表。GROUP BY關(guān)鍵字用于指定按照哪一列進(jìn)行分組。HAVING子句則用于對(duì)分組后的結(jié)果進(jìn)行進(jìn)一步的篩選。

1.2 示例說(shuō)明

假設(shè)有如下所示的exam表:

1.2.1 分別查詢哥哥組和弟弟組的英語(yǔ)成績(jī)總和

SELECT
    exam.`group`, 
    SUM(exam.english)
FROM
    exam AS exam
GROUP BY
    exam.`group`

在這個(gè)查詢中,我們使用GROUP BY將數(shù)據(jù)按照group列進(jìn)行分組,然后使用SUM聚合函數(shù)計(jì)算每個(gè)組的英語(yǔ)成績(jī)總和。執(zhí)行結(jié)果如下:

1.2.2 查詢哥哥組的所有成績(jī)總和

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)行分組,不過(guò)在SUM函數(shù)中計(jì)算了每個(gè)學(xué)生的所有科目成績(jī)總和。HAVING子句用于篩選出group哥哥組的記錄。執(zhí)行結(jié)果如下:

通過(guò)這兩個(gè)示例,我們可以看到GROUP BY分組查詢?cè)趯?duì)數(shù)據(jù)進(jìn)行分類統(tǒng)計(jì)時(shí)的強(qiáng)大功能。它能夠根據(jù)指定的列將數(shù)據(jù)分組,并對(duì)每個(gè)組的數(shù)據(jù)進(jìn)行聚合計(jì)算,從而得到我們需要的統(tǒng)計(jì)信息。

2. 聯(lián)合查詢

聯(lián)合查詢用于將多個(gè)查詢結(jié)果合并在一起,常見(jiàn)的聯(lián)合查詢包括內(nèi)連接、外連接、自連接、子查詢和合并查詢等。下面我們將逐一介紹這些聯(lián)合查詢的用法。

2.1 內(nèi)連接

內(nèi)連接是一種最常用的連接方式,它返回兩個(gè)表中滿足連接條件的所有行。

2.1.1 語(yǔ)法格式

select * from table1,table2 where table1.xx=table2.xx;

這是一種基于逗號(hào)分隔的表名和WHERE子句指定連接條件的寫法。更標(biāo)準(zhǔn)的寫法是使用JOIN關(guān)鍵字:

SELECT *
FROM table1
JOIN table2 ON table1.xx = table2.xx;

2.1.2 執(zhí)行過(guò)程

內(nèi)連接的執(zhí)行過(guò)程可以分為以下幾個(gè)步驟:

  • 計(jì)算笛卡爾積:首先計(jì)算參加表連接的兩個(gè)表的笛卡爾積。例如,假設(shè)有qintianpeople表和qintiancommodity表,執(zhí)行以下查詢:
SELECT
    *
FROM
    qintianpeople,
    qintiancommodity

結(jié)果會(huì)得到兩個(gè)表的笛卡爾積,即qintianpeople表中的每一行與qintiancommodity表中的每一行進(jìn)行組合,結(jié)果集的行數(shù)為兩個(gè)表行數(shù)的乘積。執(zhí)行結(jié)果如下:

  • 通過(guò)連接條件過(guò)濾無(wú)效數(shù)據(jù):在笛卡爾積的基礎(chǔ)上,通過(guò)連接條件過(guò)濾掉不滿足條件的數(shù)據(jù)。例如:
SELECT
    *
FROM
    qintianpeople,
    qintiancommodity
WHERE
    qintianpeople.people_id = qintiancommodity.people_id

這里使用WHERE子句指定了連接條件,只有people_id相等的行才會(huì)被保留。執(zhí)行結(jié)果如下:

  • 加入查詢條件得到想要的結(jié)果行:可以進(jìn)一步添加查詢條件來(lái)篩選出符合特定要求的行。例如:
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é)果如下:

  • 精簡(jiǎn)列名得到最終想要查詢的列:最后,可以根據(jù)需求選擇需要顯示的列,精簡(jiǎn)結(jié)果集。例如:
SELECT
    qintianpeople.people_id,
    people_name,
    commodity_name
FROM
    qintianpeople,
    qintiancommodity
WHERE
    qintianpeople.people_id = qintiancommodity.people_id AND
    qintianpeople.people_id>5

這個(gè)查詢只選擇了people_id、people_namecommodity_name這幾列,得到了更精簡(jiǎn)的結(jié)果。執(zhí)行結(jié)果如下:

2.2 外連接

外連接分為左外連接和右外連接,它們的區(qū)別在于以哪個(gè)表為基準(zhǔn)進(jìn)行連接。

2.2.1 左外連接

語(yǔ)法格式

Select * from table1 left join table2 on table1.xx=table2.xx;

左外連接以左表為基準(zhǔn),左邊的數(shù)據(jù)全部顯示,右邊的數(shù)據(jù)沒(méi)有對(duì)應(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 右外連接

語(yǔ)法格式

Select * from table1 right join table2 on table1.xx=table2.xx;

右外連接以右表為基準(zhǔn),右邊的數(shù)據(jù)全部顯示,左邊的數(shù)據(jù)沒(méi)有對(duì)應(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 自連接

自連接是指在同一個(gè)表上進(jìn)行連接操作,它可以把行比較轉(zhuǎn)化為列比較,在查詢時(shí)可以使用WHERE進(jìn)行過(guò)濾。

語(yǔ)法格式

select * from table1 t1,table1 t2 where t1.xx=t2.xx;

2.4 子查詢

子查詢是指在一個(gè)查詢中嵌套另一個(gè)查詢,將內(nèi)層查詢的結(jié)果作為外層查詢的條件。子查詢可以分為單行子查詢和多行子查詢。

2.4.1 單行子查詢

語(yǔ)法格式

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);

這個(gè)子查詢先從orders表中獲取所有下過(guò)訂單的customer_id,然后外層查詢從customers表中查詢這些customer_id對(duì)應(yīng)的客戶信息。

2.4.2 多行子查詢

語(yǔ)法格式

Select * from table1 where id in (select id from table2 where...);

多行子查詢與單行子查詢類似,不過(guò)它返回的是多個(gè)值,使用IN關(guān)鍵字來(lái)匹配這些值。例如:

SELECT *
FROM products
WHERE product_id IN (SELECT product_id FROM order_items WHERE quantity > 10);

這個(gè)查詢會(huì)返回在order_items表中被訂購(gòu)數(shù)量大于10的所有產(chǎn)品信息。

子查詢可以多次嵌套,以實(shí)現(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'
    )
);

這個(gè)嵌套子查詢首先篩選出亞洲地區(qū)的客戶customer_id,然后在這些客戶中篩選出在2023年1月1日之后下過(guò)訂單的客戶customer_id,最后查詢出這些客戶的詳細(xì)信息。

2.5 合并查詢

合并查詢用于將兩個(gè)或多個(gè)查詢的結(jié)果合并到一個(gè)結(jié)果集中,分為去重合并和不去重合并。

2.5.1 顯示去重

語(yǔ)法格式

select * from table1 union select * from table2;

UNION關(guān)鍵字會(huì)將兩個(gè)查詢結(jié)果合并,并去除重復(fù)的行。

2.5.2 不顯示去重

語(yǔ)法格式

select * from table1 union all select * from table2;

UNION ALL關(guān)鍵字會(huì)將兩個(gè)查詢結(jié)果直接合并,保留所有的行,包括重復(fù)的行。

2.6 一條SQL語(yǔ)句的執(zhí)行順序

了解一條SQL語(yǔ)句的執(zhí)行順序?qū)τ诰帉懜咝?zhǔn)確的查詢非常重要。SQL語(yǔ)句的執(zhí)行順序如下:

  • FROM:指定需要查詢的表。
  • JOIN ON:取笛卡爾積并根據(jù)連接條件進(jìn)行連接。
  • WHERE:使用限制條件過(guò)濾數(shù)據(jù)。
  • GROUP BY:對(duì)數(shù)據(jù)進(jìn)行分組查詢。
  • HAVING:對(duì)分組后的結(jié)果進(jìn)行過(guò)濾。
  • SELECT:篩選需要顯示的列。
  • DISTINCT:對(duì)結(jié)果進(jìn)行去重(如果有該關(guān)鍵字)。
  • ORDER BY:對(duì)結(jié)果進(jìn)行排序。
  • LIMIT:限制返回的行數(shù)。

總結(jié) 

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

相關(guān)文章

最新評(píng)論