1. 程式人生 > >[瘋狂Java]SQL:常量、變數、運算子、字串匹配運算子like

[瘋狂Java]SQL:常量、變數、運算子、字串匹配運算子like

1. 常量和變數以及運算:

    1) SQL中的常量和C語言以及其它語言中的常量定義完全相同,就是一些字面值,比如15、'xyz'就分別是數值型字面值和字串型字面值,它們都屬於常量;

    2) 而變數是可以定義在SQL指令碼中的,但是我們平時寫查詢語句中用的最多的變數就是列(屬性)了,例如:select col1, col2 from table1;中的col1、col2分別表示table1中的兩個列,但其實可以理解為當前查詢出的條目中col1列和col2列的值,而這兩個值先分別臨時存放在臨時變數col1和col2中了,因此這兩個當然是變數,並且完全可以當做變數使用;

    3) 所有的常量和變數都可以參與到SQL的運算當中(算術運算(加減乘除)、邏輯運算(與或非)、比較運算(大於、小於等);

!!SQL規定,任何運算裡有null參與(即算術表示式中有null作為運算元)那麼整個表示式的結果將是null,比如5 + null = null,true and null = null等等,同時字串連線時如果連線的一方有null那麼結果還是null,比如concat('haha', null) = null!!

2. 算術運算子:

    1) SQL中的算術運算子包括+、-、*、/四則運算,這四個運算子可以運用到任何數值型別資料上(整型、浮點型等等);

    2) 有些特殊型別,比如日期型別,只允許走+和-兩種運算(算天數、時間差等等);

    3) 示例:select stu_age + 5 from table_stu; // 查詢結果的那一列就是學生的歲數的再加上5的結果!

    4) 字串連線:在SQL中不使用+連線字串,SQL中沒有運算子過載的概念,SQL僅僅是一種查詢語言,並不是一種嚴格的程式語言,因此不提供運算子過載的功能;

!!SQL字串連線只能使用SQL庫函式concat,用法是:concat(str1, str2); // 直接將str1+str2的結果返回;

3. 比較運算子:

    1) SQL中有>、>=、<、<=、=、<>,注意!相等比較就是一個=而不是C或Java中的==!而不等於是<>而不是!=,而SQL中的輔助運算子是:=

    2) 上述的最基本的比較運算子,任何比較都可以用上述的組合來完成,但SQL還定義了一些特殊比較運算子可以簡化查詢語句的編寫:expr都是指SQL中具有值的表示式

         i. 區間檢查:expr between expr1 and expr2   // 即檢查expr是否∈[expr1, expr2],這是閉區間

         ii. 範圍檢查:expr in(expr1, expr2, ...)  // 檢查expr的值是否落在in()中指定的各值中

         iii. 空檢查:expr is null  // 檢查expr是否是空值

    3) 示例:

select * from table_stu
where

1. id between 2 and 999
2. 88 between stu_num and id + 15
3. id in(2, 5, 90)
4. id in(3, stu_num)
5. name is null

!這裡給出了5中寫法,可以看到只要是表示式(不管是常量還是變數)都可以放入這些運算子的相應位置上;

4. 邏輯運算子:

    1) 主要就是與或非三種,分別是and、or、not,這裡不再是C/Java中的&&、||、!,一定要注意;

    2) 邏輯常量只有true和false兩種;

    3) 一般用來連線各種比較運算形成複雜的邏輯推理;

5. 運算子優先順序:

    1) SQL運算子的優先順序完全和C/Java一樣,都是算術運算子>比較運算子>邏輯運算子,並且表示式是從左往右計算的;

    2) 如果想打破這種優先順序規律,就必須使用()運算子進行組合;

6. SQL專門為字串匹配提供了一個運算子like——實現模糊查詢:

    1) 也是一種特殊的比較運算子,用於模糊匹配字串,是專門為字串準備的,可以模糊查詢字串;

    2) like支援兩種萬用字元,_代表任意的一個字元,而%代表任意多個字元,如果匹配的剛好就包含下劃線和百分號,那麼就需要轉義,轉義符號是\,那麼下劃線和百分號就是這樣表示的'\_'和'\%';

    3) 舉例:

name like '孫%';  // 姓孫的名字
name like '__';  // 兩個字的名字
id like '\_%';  // 以下劃線開頭的ID
id like '\%%';  // 以百分號開頭的ID
    4) 笨笨的like:like預設情況下將反斜槓\作為轉義字元(\也是like的特殊字元,特殊字元有_、%和\),那麼如何匹配'\'本身呢?你可能會想這樣like '\\%'就是匹配以反斜槓開頭的字串,那你就錯了,like有點笨,在like中一旦一個字元被當做轉移字元,那它就一輩子都是轉義字元,like掃描到第一個\,發現它是個轉移字元,然後接著掃描第二個\,發現還是一個轉義字元,兩個連續的轉義字元當然是錯誤的了;

!!因此like處理轉義字元的邏輯和其它語言完全不同,其它語言都是掃描到轉義字元之後,無論後面跟著的字元是什麼字元,都會當成純字元處理;

!!那麼這樣該如何轉義特殊字元\,like有一個escape語法,可以讓你自定義轉義字元而不是頑固地死用預設的\作為轉義字元,比如:id like '@\%' escape '@';的意思就是在這條like語句裡將@作為轉義字元,那麼當@遇到特殊字元\時就將\轉義成純文字字元了;

!!!轉義的意思就是將語句中起到特殊作用的特殊字元轉變成對應的純文字字元;

!!因此上述的4個例子也可以這樣寫:

id like '/_%' escape '/';
id like '$%%' escape '$';
!!注意:顯然不能將特殊字元本身(%、_、\)定義成轉義字元,即一個字元不能有兩種身份,這三個字元已經有一種身份了(即特殊字元),因此不能再給它們加另外的身份(轉義字元),只能將那些沒有任何身份的純文字字元指定為轉義字元;
!!escape指定的轉義字元只在所在的like中有效;