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

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

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

前言

在數(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ù)(如SUMAVG、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_idpeople_namecommodity_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)文章

最新評論