sql之表連線和group by 組函式的分析

2022-05-24 04:30:13 字數 1714 閱讀 7765

1、首先我們來先看乙個簡單的例子:

有[sales.orders]訂單表和[sales.customers]顧客表,表的機構如下

業務要求:篩選  來自「按時打算」國家的使用者以及所下的訂單數

1

select

2 o.custid,count(*) as

'訂單數'3

from

[sales.orders

] o inner

join

[sales.customers]c

4on o.custid=

c.custid

5where c.country=

'按時打算'6

group

by o.custid;

這樣簡單的查詢,大家都能夠看明白,就不再解釋,就是使用了乙個 內連線,和group by 進行分組,然後對分組後的資料進行 使用組函式count進行求和

2、才是要講解的重點:三張表連線的 組函式的使用問題

這裡要增加一張表:[sales.orderdetails]訂單詳細表:表結構:

業務要求:查詢出每個使用者 買了 多少件商品  下過多少訂單

1

select

o.custid,2--

sum(qty):下面 用case是因為:組函式對 null 值不進行處理,所以含有求和之後返回null,而不是0

3case

4when

sum(qty) is

null

then'0

'5else

sum(qty)

6end7as

'商品數量

',--

count(*),(比原來的訂單數 多)--:相求訂單數量,這是錯的,因為三張表 關聯,這個時候,並不是級聯的 一對多的關係,況且,訂單表 處在 一對多的 關係的 中間 的位置

8count( distinct o.orderid) as

'訂單數'--

將 重複的 訂單 刪除掉,這樣求出的數量就是 對的了

9from

[sales.orderdetails

] od right

join

[sales.orders]o

10on od.orderid=o.orderid inner

join

[sales.customers]c

11on o.custid=

c.custid

12group

by o.custid

說明:關於外連線和內連線的區別就不再說明,我在以前的文章裡面已經進行說明了。現在說明為什麼原來的 cunnt(*)是不對了,因為客戶表 1對多 訂單表,訂單表 1對多 訂單詳細表。所以就要注意了,連線之後就會根據 最多的,最底層的  訂單詳細表的數量為基準,產生 一張連線表,所以這個時候就會有很多的訂單的編號是重複的,所以直接求和就會有很多重複的資料也進行求和了,所以是錯的。應該對 消除重複的訂單編號 進行求和。

SQL語法 之 表連線

連線查詢中用來連線連個表的條件稱為連線條件或連線謂詞。其形式為 表1 列名1 連線運算子 表2 列2 常見的連線運算子包括 1 比較運算子 between和and。2 邏輯運算子 not and or。3 使用between和and連線查詢形式為 表1 列名1 表2 列名2 and 表2 列名3 1...

SQL語句之GROUP BY用法詳解

大家都知道groupby在sql語句中代表按照某個字段分組,但原理和用法在網上不容易查得到。下面我用一句話簡介的來說明 如果select 中出現了非聚合函式的字段,那麼所有欄位都要在group by後面出現,然而group by後面的分組字段可以不用在select中出現。原因 因為每一次的selec...

SQL 子查詢和表連線

一條搜尋語句他的過濾條件 於另乙個搜尋語句的select結果 select cust name,cust contact from customers where cust id in select cust id from orders where order num in select orde...