SQL基礎知識點總結(一)


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(選項)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM