SQLite 运算符

我们已经创建了 companydepartment 表,又插入了很多数据,但是如果数据量再大个10倍左右,那么列出所有数据的方式查看数据就显得工作效率太低了。我们能不能在列出数据的时候设置一些条件呢? 比如 年龄大于 25,薪水高于 20000 的。

这时候,SQLite 的运算符就排上用场了

SQLite 运算符是什么?

运算符是一个保留字或字符,主要用在 SQLite 语句的 WHERE 子句中指定条件。

运算符可以在 WHERE 子句中连接多个条件。

SQLite 的运算符有:

  • 算术运算符
  • 比较运算符
  • 逻辑运算符
  • 位运算符

SQLite 算术运算符

假设变量 a= 3,变量 b= 7 ,那么

运算符 描述 范例
+ 加法 : 把运算符两边的值相加 a + b 将得到 10
- 减法 : 左操作数减去右操作数 a - b 将得到 -4
* 乘法 : 把运算符两边的值相乘 a * b 将得到 21
/ 除法 : 左操作数除以右操作数 b / a 将得到 2
% 取模 : 左操作数除以右操作数后得到的余数 b % a 将得到 1

范例: SQLite 算术运算符

sqlite> select 13 + 17;
13 + 17 = 30
sqlite> select 13 - 17;
13 - 17 = -4
sqlite> select 13 * 17;
13 * 17 = 221
sqlite> select 17 / 13;
17 / 13 = 1 
-- 两个整数相除,返回的结果为整数,直接抛弃小数点
sqlite> select 17.0 / 13;
17.0 / 13 = 1.30769230769231 
-- 两个数相除,只要有一个是浮点数,那么返回的结果也是浮点数
sqlite> select 17 % 13;
17 % 13 = 4
select 17 % 13.0;
17 % 13.0 = 4.0

SQLite 比较运算符

假设变量 a=13,变量 b=17

运算符 描述 范例
== 如果两个操作数的值相等,结果为真 (a == b) 不为真
= 如果两个操作数的值相等,结果为真 (a = b) 不为真
!= 如果两个操作数的值不相等,结果为真 (a != b) 为真
<> 如果两个操作数的值不相等,结果为真 (a <> b) 为真
> 如果左操作数的值大于右操作数的值,结果为真 (a > b) 不为真
< 如果左操作数的值小于右操作数的值,结果为真 (a < b) 为真
>= 如果左操作数的值大于等于右操作数的值,结果为真 (a >= b) 不为真
<= 如果左操作数的值小于等于右操作数的值,结果为真 (a <= b) 为真
!< 如果左操作数的值不小于右操作数的值,结果为真 (a !< b) 为假
!> 如果左操作数的值不大于右操作数的值,结果为真 (a !> b) 为真

范例

假设我们之前往 company 中添加的数据如下

sqlite> SELECT * FROM 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

接下来的范例演示了各种 SQLite 比较运算符的用法

在这里,我们使用了 WHERE 子句,这将会在后边单独的一个章节中讲解 但现在你只需要知道:WHERE 子句是用来设置 SELECT 语句的条件语句

列出 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

SQLite 逻辑运算符

下表是 SQLite 中所有的逻辑运算符

运算符 描述
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 运算符搜索指定表中的每一行,确保唯一性(无重复)

范例

假设我们之前往 company 中添加的数据如下

sqlite> SELECT * FROM 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

下面的范例演示了 SQLite 逻辑运算符的用法

列出 age 大于等于 25 工资大于等于 65000.00 的记录

sqlite> SELECT * FROM company WHERE age >= 25 AND salary >= 65000;
id          name        age         address     salary
----------  ----------  ----------  ----------  ----------
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

列出 age 大于等于 25 工资大于等于 65000.00 的所有记录

sqlite> SELECT * FROM company WHERE AGE >= 25 OR salary >= 65000;
id          name        age         address     salary
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

列出 age 不为 NULL 的所有记录

结果显示所有的记录,意味着没有一个记录的 age 等于 NULL

sqlite> SELECT * FROM company WHERE age IS NOT NULL;
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

列出 name 以 'Ki' 开始的所有记录,'Ki' 之后的字符不做限制

sqlite> SELECT * FROM company WHERE name LIKE 'Ki%';
id          name        age         address     salary
----------  ----------  ----------  ----------  ----------
6           Kim         22          South-Hall  45000.0

列出 name 以 'Ki' 开始的所有记录,'Ki' 之后的字符不做限制

sqlite> SELECT * FROM company WHERE name GLOB 'Ki*';
id          name        age         address     salary
----------  ----------  ----------  ----------  ----------
6           Kim         22          South-Hall  45000.0

列出 age 的值为 25 或 27 的所有记录

sqlite> SELECT * FROM company WHERE age IN ( 25, 27 );
id          name        age         address     salary
----------  ----------  ----------  ----------  ----------
2           Allen       25          Texas       15000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

列出 age 的值既不是 25 也不是 27 的记录

sqlite> SELECT * FROM company WHERE age NOT IN ( 25, 27 );
id          name        age         address     salary
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
3           Teddy       23          Norway      20000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

列出 age 的值在 25 与 27 之间的所有记录

sqlite> SELECT * FROM company WHERE age BETWEEN 25 AND 27;
id          name        age         address     salary
----------  ----------  ----------  ----------  ----------
2           Allen       25          Texas       15000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

使用 SQL 子查询

下面的 SELECT 语句使用 SQL 子查询,子查询查找 salary 大于 65000 的带有 age 字段的所有记录,后边的 WHERE 子句与 EXISTS 运算符一起使用,列出了外查询中的 age 存在于子查询返回的结果中的所有记录:

sqlite> SELECT age FROM company
        WHERE EXISTS (SELECT age FROM company WHERE salary > 65000);
age
-----
32
25
23
25
27
22
24

下面的 SELECT 语句使用 SQL 子查询,子查询查找 salary 大于 65000 的带有 age 字段的所有记录,后边的 WHERE 子句与 > 运算符一起使用,列出了外查询中的 age 大于子查询返回的结果中的年龄的所有记录:

sqlite> SELECT * FROM company
        WHERE age > (SELECT age FROM company WHERE salary > 65000);
id          name        age         address     salary
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0

SQLite 位运算符

位运算符作用于位,并逐位执行操作。

真值表 & 和 | 如下:

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 二进制操作符用法

sqlite> .mode line
sqlite> select 60 | 13;
60 | 13 = 61
sqlite> select 60 & 13;
60 & 13 = 12
sqlite> select  60 ^ 13;
10 * 20 = 200
sqlite>  select  (~60);
(~60) = -61
sqlite>  select  (60 << 2);
(60 << 2) = 240
sqlite>  select  (60 >> 2);
(60 >> 2) = 15


Copyright © 简单教程 www.twle.cn