1. 程式人生 > >sqlite3學習之運算子的使用

sqlite3學習之運算子的使用

運算子是一個保留字或字元,主要用於 SQLite 語句的 WHERE 子句中執行操作,如比較和算術運算,它用於指定 SQLite 語句中的條件,並在語句中連線多個條件,常用的有四種,如下:

  • 算術運算子

  • 比較運算子

  • 邏輯運算子

  • 位運算子

先來看算數運算子,我們先來假設變數 a=10,變數 b=20:

運算子 描述 例項
+ 加法 - 把運算子兩邊的值相加 a + b 將得到 30
- 減法 - 左運算元減去右運算元 a - b 將得到 -10
* 乘法 - 把運算子兩邊的值相乘 a * b 將得到 200
/ 除法 - 左運算元除以右運算元 b / a 將得到 2
% 取模 - 左運算元除以右運算元後得到的餘數 b % a will give 0

來看下SQLite 算術運算子的簡單例項:

sqlite> .mode line
sqlite> select 10 + 20;
10 + 20 = 30


sqlite> select 10 - 20;
10 - 20 = -10


sqlite> select 10 * 20;
10 * 20 = 200


sqlite> select 10 / 5;
10 / 5 = 2


sqlite> select 12 %  5;
12 %  5 = 2

再來是比較運算子,我們來假設變數 a=10,變數 b=20:

運算子 描述 例項
== 檢查兩個運算元的值是否相等,如果相等則條件為真。 (a == b) 不為真。
= 檢查兩個運算元的值是否相等,如果相等則條件為真。 (a = b) 不為真。
!= 檢查兩個運算元的值是否相等,如果不相等則條件為真。 (a != b) 為真。
<> 檢查兩個運算元的值是否相等,如果不相等則條件為真。 (a <> b) 為真。
> 檢查左運算元的值是否大於右運算元的值,如果是則條件為真。 (a > b) 不為真。
< 檢查左運算元的值是否小於右運算元的值,如果是則條件為真。 (a < b) 為真。
>= 檢查左運算元的值是否大於等於右運算元的值,如果是則條件為真。 (a >= b) 不為真。
<= 檢查左運算元的值是否小於等於右運算元的值,如果是則條件為真。 (a <= b) 為真。
!< 檢查左運算元的值是否不小於右運算元的值,如果是則條件為真。 (a !< b) 為假。
!> 檢查左運算元的值是否不大於右運算元的值,如果是則條件為真。 (a !> b) 為真。

我們來假設 COMPANY 表有以下記錄:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

來看例項:

#SALARY 大於 50,000.00 的所有記錄
sqlite> SELECT * FROM COMPANY WHERE SALARY > 50000;
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

#SALARY 等於 20,000.00 的所有記錄
sqlite>  SELECT * FROM COMPANY WHERE SALARY = 20000;
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
3           Teddy       23          Norway      20000.0

#SALARY 不等於 20,000.00 的所有記錄
sqlite>  SELECT * FROM COMPANY WHERE SALARY != 20000;
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
2           Allen       25          Texas       15000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

#SALARY 不等於 20,000.00 的所有記錄
sqlite> SELECT * FROM COMPANY WHERE SALARY <> 20000;
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
2           Allen       25          Texas       15000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

#SALARY 大於等於 65,000.00 的所有記錄
sqlite> SELECT * FROM COMPANY WHERE SALARY >= 65000;
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

再來看下所有的邏輯運算子列表:

運算子 描述
AND AND 運算子允許在一個 SQL 語句的 WHERE 子句中的多個條件的存在。
BETWEEN BETWEEN 運算子用於在給定最小值和最大值範圍內的一系列值中搜索值。
EXISTS EXISTS 運算子用於在滿足一定條件的指定表中搜索行的存在。
IN IN 運算子用於把某個值與一系列指定列表的值進行比較。
NOT IN IN 運算子的對立面,用於把某個值與不在一系列指定列表的值進行比較。
LIKE LIKE 運算子用於把某個值與使用萬用字元運算子的相似值進行比較。
GLOB GLOB 運算子用於把某個值與使用萬用字元運算子的相似值進行比較。GLOB 與 LIKE 不同之處在於,它是大小寫敏感的。
NOT NOT 運算子是所用的邏輯運算子的對立面。比如 NOT EXISTS、NOT BETWEEN、NOT IN,等等。它是否定運算子。
OR OR 運算子用於結合一個 SQL 語句的 WHERE 子句中的多個條件。
IS NULL NULL 運算子用於把某個值與 NULL 值進行比較。
IS IS 運算子與 = 相似。
IS NOT IS NOT 運算子與 != 相似。
|| 連線兩個不同的字串,得到一個新的字串。
UNIQUE UNIQUE 運算子搜尋指定表中的每一行,確保唯一性(無重複)。

還是之前的表,我們來看例項:

#AGE 大於等於 25 且工資大於等於 65000.00 的所有記錄
SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000;

#AGE 大於等於 25 或工資大於等於 65000.00 的所有記錄
SELECT * FROM COMPANY WHERE AGE >= 25 OR SALARY >= 65000;

#AGE 不為 NULL 的所有記錄,結果顯示所有的記錄,意味著沒有一個記錄的 AGE 等於 NULL
SELECT * FROM COMPANY WHERE AGE IS NOT NULL;

#NAME 以 'Ki' 開始的所有記錄,'Ki' 之後的字元不做限制
SELECT * FROM COMPANY WHERE NAME LIKE 'Ki%';

#NAME 以 'Ki' 開始的所有記錄,'Ki' 之後的字元不做限制
SELECT * FROM COMPANY WHERE NAME GLOB 'Ki*';

#AGE 的值為 25 或 27 的所有記錄
SELECT * FROM COMPANY WHERE AGE IN ( 25, 27 );

#AGE 的值既不是 25 也不是 27 的所有記錄
SELECT * FROM COMPANY WHERE AGE NOT IN ( 25, 27 );

#AGE 的值在 25 與 27 之間的所有記錄
SELECT * FROM COMPANY WHERE AGE BETWEEN 25 AND 27;

#使用 SQL 子查詢,子查詢查詢 SALARY > 65000 的帶有 AGE 欄位的所有記錄
#後邊的 WHERE 子句與 EXISTS 運算子一起使用
#列出了外查詢中的 AGE 存在於子查詢返回的結果中的所有記錄
SELECT AGE FROM COMPANY WHERE EXISTS (SELECT AGE FROM COMPANY WHERE SALARY > 65000);

#使用 SQL 子查詢,子查詢查詢 SALARY > 65000 的帶有 AGE 欄位的所有記錄
#後邊的 WHERE 子句與 > 運算子一起使用
#列出了外查詢中的 AGE 大於子查詢返回的結果中的年齡的所有記錄
SELECT * FROM COMPANY WHERE AGE > (SELECT AGE FROM COMPANY WHERE SALARY > 65000);

接下來就是位運算子,它作用於位,並逐位執行操作,真值表 & 和 | 如下:

p q p & q p | q
0 0 0 0
0 1 0 1
1 1 1 1
1 0 0 1

假設如果 A = 60,且 B = 13,現在以二進位制格式,它們如下所示:

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A|B = 0011 1101

~A  = 1100 0011

我們來具體看下SQLite 語言支援的位運算子,先來假設變數 A=60,變數 B=13:

運算子 描述 例項
& 如果同時存在於兩個運算元中,二進位制 AND 運算子複製一位到結果中。 (A & B) 將得到 12,即為 0000 1100
| 如果存在於任一運算元中,二進位制 OR 運算子複製一位到結果中。 (A | B) 將得到 61,即為 0011 1101
~ 二進位制補碼運算子是一元運算子,具有"翻轉"位效應,即0變成1,1變成0。 (~A ) 將得到 -61,即為 1100 0011,一個有符號二進位制數的補碼形式。
<< 二進位制左移運算子。左運算元的值向左移動右運算元指定的位數。 A << 2 將得到 240,即為 1111 0000
>> 二進位制右移運算子。左運算元的值向右移動右運算元指定的位數。 A >> 2 將得到 15,即為 0000 1111

例項操作如下:

sqlite> .mode line
sqlite> select 60 | 13;
60 | 13 = 61

sqlite> select 60 & 13;
60 & 13 = 12

sqlite>  select  (~60);
(~60) = -61

sqlite>  select  (60 << 2);
(60 << 2) = 240

sqlite>  select  (60 >> 2);
(60 >> 2) = 15

好啦,本次記錄就到這裡了。

如果感覺不錯的話,請多多點贊支援哦。。。