1. 程式人生 > 實用技巧 >查詢重複姓名的sql語句

查詢重複姓名的sql語句

方式一:select * from 學生表 where 姓名 in(select 姓名 from 學生表 group by 姓名 having count(姓名)>=2)

分析:from 學生表 :找到要查詢的表名, where 姓名 in:過濾條件讓姓名符合小括號裡面內容group by 姓名 :按照姓名來分組,也就是說姓名相同的會放在同一組裡面,其他欄位可能包括多條資訊,having count(姓名)>=2:過濾分組內容中姓名達到兩個以及以上的資訊)

方式二:select 姓名,count(姓名) from 學生表 group by 姓名 having count(姓名)>=2

注意方式二:select 姓名 from 學生表 group by 姓名 having count(姓名)>=2即可,count(姓名)是自己又在返回的檢視看到了另一個欄位,這個欄位用來顯示出現的重複姓名的次數。

SQL中GROUP BY語句與HAVING語句的使用

GROUP BY語句,經過研究和練習,終於明白如何使用了,在此記錄一下同時添加了一個自己舉的小例子,通過寫這篇文章來加深下自己學習的效果,還能和大家分享下,同時也方便以後查閱,一舉多得


一、GROUP BY

GROUP BY語句用來與聚合函式(aggregate functions such as COUNT, SUM, AVG, MIN

, or MAX.)聯合使用來得到一個或多個列的結果集。

語法如下:

SELECT column1, column2, ... column_n, aggregate_function (expression)

FROM tables

WHERE predicates

GROUP BY column1, column2, ... column_n;


舉例

比如說我們有一個學生表格(student),包含學號(id),課程(course),分數(score)等等多個列,我們想通過查詢得到每個學生選了幾門課程,此時我們就可以聯合使用COUNT函式與GROUP BY語句來得到這一結果

SELECT id, COUNT(course) as numcourse

FROM student

GROUP BY id

因為我們是使用學號來進行分組的,這樣COUNT函式就是在以學號分組的前提下來實現的,通過COUNT(course)就可以計算每一個學號對應的課程數。

注意

因為聚合函式通過作用於一組資料而只返回一個單個值,因此,在SELECT語句中出現的元素要麼為一個聚合函式的輸入值,要麼為GROUP BY語句的引數,否則會出錯。

例如,對於上面提到的表格,我們做一個這樣的查詢:

SELECT id, COUNT(course) as numcourse, score

FROM student

GROUP BY id

此時查詢便會出錯,錯誤提示如下:

Column ‘student.score' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

出現以上錯誤的原因是因為一個學生id對應多個分數,如果我們簡單的在SELECT語句中寫上score,則無法判斷應該輸出哪一個分數。如果想用score作為select語句的引數可以將它用作一個聚合函式的輸入值,如下例,我們可以得到每個學生所選的課程門數以及每個學生的平均分數:

SELECT id, COUNT(course) as numcourse, AVG(score) as avgscore

FROM student

GROUP BY id


二、HAVING

HAVING語句通常與GROUP BY語句聯合使用,用來過濾由GROUP BY語句返回的記錄集。

HAVING語句的存在彌補了WHERE關鍵字不能與聚合函式聯合使用的不足。

語法:

SELECT column1, column2, ... column_n, aggregate_function (expression)
FROM tables
WHERE predicates
GROUP BY column1, column2, ... column_n
HAVING condition1 ... condition_n;


同樣使用本文中的學生表格,如果想查詢平均分高於80分的學生記錄可以這樣寫:

SELECT id, COUNT(course) as numcourse, AVG(score) as avgscore

FROM student

GROUP BY id

HAVING AVG(score)>=80;

在這裡,如果用WHERE代替HAVING就會出錯

SQL中group by詳解

看一下測試表test

對這個表寫group by時,可能就會發生下面這樣的怪事:

select name from test group by name  -- ok
select * from test group by name --error
select name,sum(number) from test group by name -- ok 
  • 1
  • 2
  • 3

行吧,接下來一步步的來看。

1. 單列group by

對 test表(表1)執行下面語句

select name from test group by name
  • 1

結果很明顯,這是表2

為了能夠更好的理解“group by”多個列“和”聚合函式“的應用,由表1到表2的過程中,增加一個虛構的中間表:虛擬表3。下面說說如何來思考上面SQL語句執行情況:

  1. from test:sql執行的第一步,找表,這個沒啥變化;

  2. from test group by name:沒有join 和 where 操作,就是group by了,這時候的過程就如下圖所示了,找到name那一列,將具有相同name值的行,合併成同一行。比如nama = aa時,就將<1,aa,2>和<2,aa,3>這兩行合併,其它欄位(id,number)合併在一個單元格;

  3. 接下來就對產生的虛擬表3進行select操作了,這時候就可以看出上面的幾句select的問題出在哪了。

(1)直接 select name 是沒問題的,因為group by 的欄位就是name,每個單元格只有一個name,某悶忒;

(2)執行 select * 的話,就是從表3中選擇,可是id 和 number 欄位中的單元格里的內容有多個值,關係型資料庫是不允許這樣的,這樣就無法形成嚴格的關係約束條件了,所以會報錯;

那麼,對於 id 和 number列咋辦呢?聚合函式。

不知道大家有沒有遇到過 aggregator blah blah 之類的報錯,我用 group by 的時候就放過這個錯,現在想來應該就是 後面用了 group by,卻沒對欄位進行聚合,導致單元格里有多個值。

聚合函式,就是用來輸入多個數據,輸出一個數據的,如count(id), sum(number),每個聚合函式的輸入就是每一個多資料的單元格。

因此,這裡可以執行

select name,sum(number) from test group by name
  • 1

那麼sum 函式就是對虛擬表3中,每個name對應的number單元格進行sum操作,就可以得到:

2. 對多列進行 group by

那要是group by 多個欄位怎麼理解呢, 比如還是在test 表中,group by name,number,此時我們可以將name 和 number 看成一個整體欄位,將其作為一個整體來進行判斷劃分的。如圖:

這裡只有 <bb, 5>和<cc, 6>是 name 和 number 都相等的,所以將其進行合併,其餘並不完全一樣,所以沒有進行分組合並。

此時執行以下語句

select name,sum(id) from test group by name,number
  • 1

就可以得到

SQL Count(*)函式,GROUP_By,Having的聯合使用

COUNT(*) 函式返回在給定的選擇中被選的行數。

語法:SELECT COUNT(*) FROM table

使用:現在有一個表,名叫app_category,從Navicat中可以看到表中所有資料,如圖所示,可見表中有297條資料

使用count函式的時候可以看到:

當然僅僅是這個樣子,是木有意義的,我用個視覺化工具一眼看穿,要這個函式就顯得雞肋了,那麼我們繼續往下看。

場景是這樣的:表app_category與表category關聯。且表間關係是一對多,即同一個app_category_id 對應多個category-id,現在我需要統計出每一個category_id在app_category表中出現的次數那麼該如何實現呢,請看接下來的操作:

這樣依然有點不夠酷炫,那麼我們還可以在後面繼續追加sql語句呀

例如這條語句:

SELECT category_id ,COUNT(*) AS count FROM app_category
GROUP BY category_id HAVING count(category_id) >2

其查詢的結果是隻有count的值大於2 的時候,才是需要的結果