1. sqlite 运算符是什么?
运算符是一个保留字或字符,主要用于 sqlite 语句的 where 子句中执行操作,如比较和算术运算。
运算符用于指定 sqlite 语句中的条件,并在语句中连接多个条件。
- 算术运算符
- 比较运算符
- 逻辑运算符
- 位运算符
2. 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
3. sqlite 比较运算符
假设变量 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
下面的范例演示了各种 sqlite 比较运算符的用法。
在这里,我们使用 where 子句,这将会在后边单独的一个章节中讲解,但现在您需要明白,where 子句是用来设置 select 语句的条件语句。下面的 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
下面的 select 语句列出了 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
下面的 select 语句列出了 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
下面的 select 语句列出了 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
下面的 select 语句列出了 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
4. 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 表有以下记录:
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 逻辑运算符的用法。
下面的 select 语句列出了 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
下面的 select 语句列出了 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
下面的 select 语句列出了 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
下面的 select 语句列出了 name 以 'ki' 开始的所有记录,'ki' 之后的字符不做限制:
sqlite> select * from company where name like 'ki%'; id name age address salary ---------- ---------- ---------- ---------- ---------- 6 kim 22 south-hall 45000.0
下面的 select 语句列出了 name 以 'ki' 开始的所有记录,'ki' 之后的字符不做限制:
sqlite> select * from company where name glob 'ki*'; id name age address salary ---------- ---------- ---------- ---------- ---------- 6 kim 22 south-hall 45000.0
下面的 select 语句列出了 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
下面的 select 语句列出了 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
下面的 select 语句列出了 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
下面的 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
5. 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); (~60) = -61 sqlite> select (60 << 2); (60 << 2) = 240 sqlite> select (60 >> 2); (60 >> 2) = 15