謂詞和運算符配合使用是我們得到理想數據的最佳途徑。
一、淺談謂詞
謂詞的概念:一個運算結果為True、False或Unknown的邏輯表達式。它的運用范圍有:where子句、Having子句、Check約束、聯接查詢的聯接條件等。
示例1,用於實施數據完整性為數據表添加約束:在員工表中,僅允許工資大於0的員工存儲在表中。其中的謂詞是“工資大於0”(SQL表達式:工資>0)。
示例2,用於查詢篩選數據的條件:查詢員工表要求只返回銷售部的員工。其中謂詞是“部門等於銷售部”(SQL表達式:部門='銷售部')。
謂詞和運算符的相互使用:
1.通過邏輯運算符連接多個謂詞(邏輯表達式),如使用AND和OR。
2.謂詞中使用比較運算符,如某個屬性值大於或小於某指定個值。
SQL Server中有一些關鍵字可以替代謂詞語義的含義,也可以稱為SQL Server中的謂詞。
其中常用的包括:
1.IN,在...之內,檢查一個值是否存在於指定的集合內。
2.BETWEEN,檢查一個值是否在指定的區間范圍內,范圍包括兩個邊界值。
3.LIKE,判斷字符串是否滿足指定的格式,例如,查詢名字姓氏為黃的員工(where name like '黃%')。
二、運算符
比較運算符:
=(等於) | 等於 |
>(大於) | 大於 |
<(小於) | 小於 |
>=(大於或等於) | 大於或等於 |
<=(小於或等於) | 小於或等於 |
<>(不等於) | 不等於 |
!=(不等於) | 不等於(非 ISO 標准) |
!<(不小於) | 不小於(非 ISO 標准) |
!>(不大於) | 不大於(非 ISO 標准) |
算術運算符:
+(加) | 加 |
-(減) | 減 |
*(乘) | 乘 |
/ (Divide) | 除 |
%(取模) | 返回一個除法運算的整數余數。 例如,12 % 5 = 2,這是因為 12 除以 5,余數為 2。 |
邏輯運算符:
ALL | 如果一組的比較都為 TRUE,那么就為 TRUE。 |
AND | 如果兩個布爾表達式都為 TRUE,那么就為 TRUE。 |
ANY | 如果一組的比較中任何一個為 TRUE,那么就為 TRUE。 |
BETWEEN | 如果操作數在某個范圍之內,那么就為 TRUE。 |
EXISTS | 如果子查詢包含一些行,那么就為 TRUE。 |
IN | 如果操作數等於表達式列表中的一個,那么就為 TRUE。 |
LIKE | 如果操作數與一種模式相匹配,那么就為 TRUE。 |
NOT | 對任何其他布爾運算符的值取反。 |
OR | 如果兩個布爾表達式中的一個為 TRUE,那么就為 TRUE。 |
SOME | 如果在一組比較中,有些為 TRUE,那么就為 TRUE。 |
在SQL Server中運算符分為標准和非標准,如 “!=” 可用 "<>" 替代,建議使用標准的運算符。
三、關於表達式中涉及兩個操作數的運算(重點)
當表達式涉及兩個操作數使用算術運算符運算時,其運算結果的數據類型,根據兩方面判定。
1.兩個數據類型相同的數值進行運算,其結果數值的數據類型和兩個操作數的數據類型一樣:
例如,兩個整數(int)相除生成一個整數,4/2返回整數類型2。
根據這樣的一個定論,存在着一個隱患,例如用5/2的時候正常結果因為2.5,然后sql Server返回整數類型2。當然在創建表的時候可以對此類型的列設為小數類型,那就是5.0/2.0=2.5,
但就此情況非要運算,還要得到正確的結果時。可以像兩個操作數進行數據類型轉換,即:CAST(5 as Numeric(2,1)) / CAST(2 as Numeric(2,1))。
Numeric(2,1)數據類型的含義:數值一共占2位,其中小數占一位。
2.數值數據的精度和小數位:
精度的意思是數值中有多少位數,小數位指小數點精確到幾位,小數位的位數包含在精度里,故指定數據類型的小數位必須小於小於指定的精度。
3.兩個數據類不同的數值進行運算,其結果的數據類型為兩操作數中數據類型優先級較高的數據類型:
例如,5/2.0中,5的數據類型為INT,2.0的數據類型為NUMERIC。根據SQL Server的數據類型優先級的規則。判定NUMERIC優先於INT,
則,在運算之前會把操作數5隱式地轉換為5.0,得到結果就為2.5(符合其定論)。
4.SQL Server數據類型優先級順序:
可以查閱MSDN最新的“數據類型優先級順序”:https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/data-type-precedence-transact-sql?view=sql-server-2017
在查閱后可以發現一個規律,就是在同一特定的范圍內,數據容量大的數據類型優先級大於數據容量小的數據類型。例如int和decimal后者的精度長度大於int,
那么在運算時可以判斷decimal優先級較高與int,運算結果為decimal數據類型。
四、運算符優先級
當SQL中出現復雜的表達式,那么相應就會在表達式中出現多個運算符。那么這個時候,就要依靠SQL Server中的運算符優先級規則,按順序計算。
運算符的優先級別如下表中所示。 在較低級別的運算符之前先對較高級別的運算符進行求值。
級別 | 運算符 |
---|---|
1 | ()圓括號 |
2 | *(乘)、/(除)、%(取模) |
3 | +(正)、-(負)、+(加)、+(串聯)、-(減)、&(位與)、^(位異或)、|(位或) |
4 | =、>、<、>=、<=、<>、!=、!>、!<(比較運算符) |
5 | NOT |
6 | AND |
7 | ALL、ANY、BETWEEN、IN、LIKE、OR、SOME |
8 | =(賦值) |
由於運算符數量不小,死記硬背下來要花點功夫。分析規律我們可以以類型來制定順序,記住個大概:(圓括號)>算術運算符>比較運算符>邏輯運算符。