問題:假設有個表的結構是(學號,姓名,電子郵件地址)
請統計是否有重名的學生;再統計是否有電子郵件地址有重複;最後統計下使用不同的電子郵件的伺服器各有多少個學生,比如 cbmichael@163.com richman@163.com 在統計時都算是163.com的郵件
答: 是否有重名可以用group by 來解決,最常見的
SELECT count(sname)
FROMfrom table1
Group by sname
如果每項都是1,那麼表示沒有重複
還有一種方法,比較法
分別執行下面的語句
SELECT count(distinct sname)
from table1
和
SELECT count(sname)
from table1
看兩次的查詢結果是否一致,若一致表明沒有重複,反之則有重名的情況.
同理的, 統計是否有電子郵件地址有重複也採用上述兩種方法,只需把sanme替換為email即可.
接下來說最難的部分: 統計下使用不同的電子郵件的伺服器各有多少個學生
思路:首先,統計有多少個學生是很簡單的,痛點在於如何統計不同的電子郵件伺服器
如同例子裡的說明: 比如 cbmichael@163.com richman@163.com 在統計時都算是163.com的郵件
也就是說我們真正要統計的就是@後面的部分! 這裡我先想到了在字串取部分,記得原來用excel有個MID函數可以有這樣地作用,現在換SQL,找函數。。。這裡卡了有一天的樣子。。不斷地百度。。終於找到了Substring!
先來看語句:
select substring(email,charindex('@',email)+1,100) 郵件伺服器, count(email) 使用學生數
from table1
Group by substring(email,charindex('@',email)+1,100)
分條解析。。。
Substring是取得字串的函數,基本用法是
文法
SUBSTRING( e-xpression , start , length )
參數
e-xpression
是字串、二進位字串、text、image、列或包含列的運算式。不要使用包含彙總函式的運算式。
start
是一個整數,指定子串的開始位置。
length
是一個整數,指定子串的長度(要返回的字元數或位元組數)。
所以剛開始是用subrsting(email,
接下來是
舉個例子:
CHARINDEX('SQL', 'Microsoft SQL Server')
這個函數命令將返回在“Microsoft SQL Server”中“SQL”的起始位置,在這個例子中,CHARINDEX函數將返回“S”在“Microsoft SQL Server”中的位置11
我們這裡用
charindex('@',email),取得@在email欄位中的位置,由於是取伺服器位址,所以後面跟上+1表明是從@這個位置的向右第一個字元開始取,後面的100表示取的長度,因為各個郵件伺服器地址長度不一樣,比如163.com,hotmail,com所以取100來保險些。這樣就完成了取得不同的電子郵件伺服器的任務:)
另法:
select right(email,len(email)-charindex('@',email)) 郵件伺服器,count(email) 使用人數
from table1
group by right(email,len(email)-charindex('@',email))
這個方法好理解些,先申明這裡的right,len,charindex都是取得字串的函數
用法:right(char_expr,int_expr) 返回字串右邊int_expr個字元
這裡用right(email,len(email)-charindex('@',email)表示的意思是返回字串email裡面的len(email)-charindex('@',email)長度,len(email)-charindex('@',email)的意思是總的字元個數減去@之前(包括@)的字元個數,留下來的字元長度就是郵件伺服器地址啦:)
建議大家用baidu查查關於sql取字串的方法,一定會獲益匪淺的.