1. order by 默認是升序
2. count(*) count(字段)兩者的區別就在於count函數不統計null
3. 通配符過濾使用LIKE關鍵字是一個二元操作符,左表達式為待匹配字段,右表達式為待匹配的通配符表達式表達式由通配符和普通字符組成
(1)單字符匹配:_ 單字符匹配在通配符表達式中可以出現多次 如: __b_d
(2)多字符匹配:% 匹配任意次數(零或任意)
(_與%可以配合使用)
(3)集合匹配:[] 方括號中包含一個字符集,匹配與字符集中任意一個字符相匹配的字符
'^':否定符來讀集合取反 例: [^bt]%
集合匹配只適用於SqlServer,其他數據庫可通過變通實現
總結: 通配符過濾很強大,不過在檢索數據是會進行全表掃描,所以速度非常慢,因此不要過分使用通配符過濾,在使用其他方式可以實現效果的時候就應該避免通配符過濾
4.空值檢測使用 IS NULL 關鍵字 語法: "待檢測字段 IS NULL" 不為空則使用IS NOT NULL 語法: "待檢測字段 IS NOT NULL"
5.反義運算符 != 不等於 !< 不小於 !> 不大於 不過只支持SQLserver和DB2
對應
同義運算符 比如 "不大於"的同義詞是"小於等於" 而"不小於"的同義詞是"大於等於"同時SQL提供了通用的表示“不等於”的運算符“<>”,這樣“不等於”、“不大於”和“不 小於”就分別可以表示成“<>”、“<=”和“>=”
6.not 運算符用來將一個表達式的值取反 真=>假 假=>真 使用方式: not(表達式)
PS: 使用“!”運算符的方式由於只能運行在SQLServer和DB2兩種數據庫系統上,所以如果應用程序有移植到其他數據庫系統上的需求的話,就應該避免使用這種方式; 使用同義運算符的方式能夠運行在所有主流數據庫系統上,不過由於粗心等原因,很容易將“不大於”表示成“<”,而忘記了“不大於”是包含“小於”和“等於”這兩個意思的,這 樣就會造成檢索數據的錯誤,造成應用程序的Bug;而采用NOT運算符的方式能比較容易的表達要實現的需求,而且能夠實現復雜的嵌套,最重要的是避免了潛在的應用 程序的Bug,所以除了“<>”這種方式之外,所以推薦使用NOT運算符的方式來表示“非”的語義。
7.(1)多值檢測使用 in
(2)范圍檢測使用 between and 用來檢測一個值是否處於某個范圍中(包括范圍的邊界值,也就是閉區間)。使用方法如下“字段名BETTWEEN 左范圍值AND 右范圍值”,
PS: 數據庫系統對“BETTWEEN AND”進行了查詢優化,使用它進行范圍值檢測將會得到比其他方式更好的性能,因此在進行范圍值檢測的時候應該優先使“BETTWEEN AND”。需要注意的就是“BETTWEEN AND”在進行檢測的時候是包括了范圍的邊界值的(也就是閉區間),如果需要進行開區間或者半開半閉區間的范圍值檢測的話就必 須使用其他的解決方案了
8. where 1=1 一般用來動態拼接sql,這樣很可能會造成非常大的性能損失,因為使用添加了“1=1”的過濾條件以后數據庫系統就無法使用索引等查詢優化策略,數據庫系統將 被迫對每行數據進行掃描(也就是全表掃描)以比較此行是否滿足過濾條件,當表中數據量比較大的時候查詢速度會非常慢。因此如果數據檢索對性能有比較高的要求就不 要使用這種“簡便”的方式。
9. GROUP BY
(1) 數據分組 group by 常常伴隨聚合函數一起使用,gorup by子句負責將數據分成邏輯組,聚合還是這對每一個組進行統計計算,需要分組的所有列必須位於group by子句的 列名列表中沒有出現在group by子句中的列(聚合函數除外)是不能放到select語句后的列名列表中的group by子句可以指定多個列,用逗號隔開即可,系統會按照分組順序來逐 層分組,實現組中組的效果
(2) having語句用於對分組進行過濾, 聚合函數不能在where語句中使用,必須使用having子句來代替
having語句也可以像where語句一樣使用復雜的過濾條件,特別注意having語句中不能包含未分組的列名
10. row_number()函數可以計算每一行數據在結果集中的行號(從1開始計數) 語法: row_number() over(排序規則)
開窗函數只能出現在 select 或 order by 子句中
11. 抑制重復數據: distinct 所有數據庫都支持的關鍵字
distinct是對整個數據集進行數據重復抑制的,而不是針對每一個列
12. 數據處理函數
(1)計算字符串長度的函數 LEN() MSSQL LENGTH() MYSQL,Oracle,DB2
(2)取得字符串的子串的函數 SUBSTRING(1,2,3) MSSQL MYSQL SUBSTR(1,2,3) Oracle DB2 第一個參數為要取的主字符串 第二個參數為字串的起始位置 第三參數為字 串的長度
PS:多個函數可以嵌套使用
(3)SIN() 正弦函數 ABS() 絕對值函數
(4) 字符串拼接函數 CONCAT() 支持一個或者多個參數 MSSQL與MYSQL不同 MSSQL可以直接使用"+"來拼接字符串,Oracle使用"||"進行字符串拼接使用方式和MSSQL 中的"+"一樣,也支持CONCAT()函數,但是只支持兩個參數,不支持兩個以上字符串的拼接,進行多個字符串拼接時可以使用函數嵌套
13. 計算字段的用途:不僅能在SELECT中使用計算字段可以在進行數據過濾,刪除,更新的時候使用計算字段
14. 聯合結果集:UNION可以連接多個結果集,就像"+"可以連接多個數字一樣簡單,只要在每個結果集之間加入UNION即可
聯合結果集的原則:
不必受被聯合的多個結果集之間的關系限制,使用UNION有兩個基本原則要遵守:
(1)每個結果集必須有相同的列數
(2)每個結果集的列必須類型相容
UNION和UNION ALL的區別:
UNION 會將完全重復的數據合並為一條,如果聯合結果集中返回所有數據而不管他們是否唯一,可以使用UNION ALL聯合結果集在制作報表的時候經常用到
15. 函數部分
日期時間函數: 數據庫中的日期時間數據類型分為日期,時間,日期時間以及時間戳四種類型
1.日期類型用來表示"年-月-日"信息的數據類型,精確到"日" 一般用Date來表示日期類型
2.時間類型用來表示"小時:分:秒"信息的數據類型,精確到"秒"一般用Time表示時間類型
3.日期時間類型用來表示"年-月-日 小時:分:秒"信息的數據類型,精確到秒,一般用DateTime來表示日期時間類型
4.時間戳類型一般用TimeStamp來表示
PS: 不同的數據庫系統對日期、時間、日期時間與時間戳等數據類型的支持差異性非常大,有的數據類型在有的數據庫系統中不被支持,而有的數據類型的表示精度則 和其類型名稱所暗示的精度不同,比如MSSQLServer 中不支持Time 類型、Oracle 中的Date 類型中包含時間信息。數據庫中的日期時間函數對這些類型的支持差別是 非常小的,因此在一般情況下我們將這些類型統一稱為“日期時間類型”
GETDATE() 獲取當前日期時間的函數
DATEADD() 用於進行日期時間的加法運算 DATEADD (datepart , number, date )
datepart取值: year(年份) quarter(季度) month(月份) dayofyear(當年度的第幾天) day(日) week(當年度的第幾天) weekday(星期幾) hour(小時) minute(分) second(秒) millisecond(毫秒)
Oracle可以通過"+,-"來對時間進行賦值
DATEDIFF(datepart,startdate,enddate) 計算日期差額 datepart為計算差額使用的單位
DATENAME(datepart,date) 計算一個日期是星期幾 datepart:要返回的日期部分的參數 如果使用Weekday(或者使用別名dw)做為datepart參數調用DATENAME()函數 就可以得到一個日期是星期幾
DATEPART(DATEPART,date) 返回一個日期的特定部分
PS: DATEPART()函數和DATENAME()函數完全一樣,不過其實它們並不是只是名稱不同的別名函數,雖然都是用來提取日期的特定部分的,不過DATEPART()函數的 返回值是數字而DATENAME()函數則會將盡可能的以名稱的方式做為返回值
16. 類型轉換
MSSQLServer提供了名稱為CASE()和CONVERT()兩個函數用於進行類型轉換
參數格式 :CAST(expression AS data_type)和CONVERT(data_type,expression)
17. 空值處理
COALESCE()函數,這個函數主要用來進行空值處理, 格式: COALESCE ( expression,value1,value2……,valuen)
PS: COALESCE()函數的第一個參數expression為待檢測的表達式,而其后的參數個數不定。COALESCE()函數將會返回包括expression在內的所有參數中的第一個非 空表達式。如果expression不為空值則返回expression;否則判斷value1是否是空值,如果value1不為空值則返回value1;否則判斷value2是否是空值,如果value2不 為空值則返回value3;……以此類推,如果所有的表達式都為空值,則返回NULL
COALESCE()函數的簡化版: ISNULL() 只接受兩個變量 格式: ISNULL(expression,value)
NULLIF()函數 格式: NULLIF ( expression1 , expression2 )
PS: 如果兩個表達式不等價,則 NULLIF 返回第一個 expression1的值。如果兩個表達式等價,則 NULLIF 返回第一個 expression1類型的空值。也就是返回類型與第 一 個 expression 相同。
18. 流程控制函數
CASE用法: case when then else end 和switch語句非常類似,在制作報表的時候非常有用
19. 開窗函數
開窗函數在聚合函數后增加了一個OVER關鍵字 格式:函數名(列)OVER(選項)