這兩天看了《SQL必知必會》第四版這本書,並照着書上做了不少實驗,也對以前的概念有得新的認識,也發現以前自己有得地方理解錯了。我采用的數據庫是SQL Server2012.數據庫中有一張比賽成績表,表里有四個字段。下面變列出我新學到的知識。
這個是數據庫的全部記錄
1.order by
語句: select * from Scores order by name , Score desc
執行結果:
①order by在執行排序功能時,會先對排序字段按abcd這樣的順序進行,漢字的話是按拼音的首字母,默認是正序。
②例子中先按name字段進行正序排序,當name相同時,又按score倒敘排,例如拜仁兩條數據,勝的開頭字母是s,負的是f,因為是倒敘,所以勝的那條數據排在前面。
2.通配符 _ 和 %
通配符 _表示的是匹配單個字符,而%則是匹配多個字符。具體寫法兩者無差別。
select * from Scores where name like '拜_' select * from Scores where name like '拜%'
注意:①通配符%看起來像是可以匹配任何東西, 但有個例外, 這就是NULL。 子句where name like '%' 不會匹配產品名稱為NULL的行。
②不要過度使用通配符。 如果其他操作符能達到相同的目的,應該使用其他操作符。
在確實需要使用通配符時, 也盡量不要把它們用在搜索模式的開始處。 把通配符置於開始處, 搜索起來是最慢的。
3.拼接字段 +
語句: select name+ '('+ Score +')' as ac from Scores
執行結果:
拼接字段就算把兩個字段合成一個字段的查詢出來。
4.文本處理函數
①SQL中有很多內置函數,這個表是常用的文本處理函數。
語句: select upper(name) from Scores select len(name) from Scores select left(name,1) from Scores
執行結果:
②其中對於SOUNDEX()解釋一下,SOUNDEX是一個將任何文本串 轉換為描述其語音表示的字母數字模式的算法。
select soundex(date) from Scores
select * from Scores where soundex(name) =soundex('張三')
5.日期和時間處理函數
日期和時間采用相應的數據類型存儲在表中,每種DBMS都有自己的特殊形式。 日期和時間值以特殊的格式存儲,以便能快速和有效地排序或過濾,並且節省物理存儲空間。
語句: select date,name from Scores where DATEPART(DD,Date)=10 --查詢10號的數據
執行結果:
6.聚合函數
聚合函數是對某些行進行函數運算,並返回一個值,下圖是常用的聚合函數。
說明:①五個函數都忽略列值為NULL的行。
②使用COUNT(*)對表中行的數目進行計數,不管表列中包含的是空值(NULL)還是非空值,都會計算到總數中。
③使用COUNT(column) 對特定列中具有值的行進行計數, 忽略NULL值。
7.分組函數Group By和having
① 當需要統計球隊的勝場次數時,這個時候就需要用到分組函數Group By,用到Group By之后,過濾條件就不能用where了,而要用到having。
語句: select name,COUNT(*) as 場次 from Scores group by name --查詢球隊名和比賽場次信息
結果:
語句:select name,COUNT(*) as 場次 from Scores group by name having COUNT(*)>1 --查詢球隊名和比賽場次大於1場的信息
結果:
注意:分組查詢中,slect的內容必須是group by的字段或聚合函數,不能是其他。例如將date字段放在select中,便出現錯誤。
②where和having 差別是:where過濾行, 而having過濾分組。
這里有另一種理解方法, WHERE在數據分組前進行過濾, HAVING在數據分組后進行過濾。 這是一個重要的區別, WHERE排除的行不包括在分組
中。 這可能會改變計算值, 從而影響HAVING子句中基於這些值過濾掉的分組。
語句: select name,COUNT(*) as 場次 from Scores where id<4 group by name having COUNT(*)>1 --在id小於4的數據中查詢出球隊名和比賽場次大於1場的信息
結果:
8.SELECT子句順序
SQL 語句的執行順序跟其語句的語法順序並不一致,上圖是SQL語句的語法順序。而執行順序確是:From----->Where----->Group By---->Having----->Select----->Order By
①From 才是 SQL 語句執行的第一步,並非 Select 。數據庫在執行 SQL 語句的第一步是將數據從硬盤加載到數據緩沖區中,以便對這些數據進行操作。
② Select 是在大部分語句執行了之后才執行的,嚴格的說是在 From 和 Group By 之后執行的。理解這一點是非常重要的,這就是你不能在 Where中使用在 Select 中設定別名的字段作為判斷條件的原因。
就先寫到這里吧,后邊的慢慢在寫