LV07-02-SQLite-数据类型、运算符和表达式
本文主要是SQLite
数据库的数据类型、运算符和表达式相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows | windows11 |
Ubuntu | Ubuntu16.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
SecureCRT | Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日 |
开发板 | 正点原子 i.MX6ULL Linux阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) |
linux内核 | linux-4.15(NXP官方提供) |
STM32开发板 | 正点原子战舰V3(STM32F103ZET6) |
点击查看本文参考资料
参考方向 | 参考原文 |
SQLite官网 | SQLite Home Page |
SQLite中文网 | SQLite 中文网 |
SQLite 基础教程 | SQLite参考手册 - 在线原生手册 |
菜鸟教程 | SQLite 教程 |
易百教程 | SQLite 教程 |
一、数据类型
我们既然要通过数据库来存储数据,自然需要数据类型啦,不然怎么知道这列都存储了什么样的数据呢?
SQLite
数据类型是一个用来指定任何对象的数据类型的属性。SQLite
中的每一列,每个变量和表达式都有相关的数据类型。我们可以在创建表的同时使用这些数据类型。SQLite
使用一个更普遍的动态类型系统。在 SQLite
中,值的数据类型与值本身是相关的,而不是与它的容器相关。说实话,这段话我并不怎么理解,但是吧,暂时会用就好,哈哈哈,后边懂了再补充。
1. SQLite
存储类
存储类 | 描述 |
NULL | 值是一个 NULL 值。 |
INTEGER | 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。 |
REAL | 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。 |
TEXT | 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。 |
BLOB | 值是一个 blob 数据,完全根据它的输入存储。 |
2. SQLite
亲和(Affinity
)类型
2.1 什么是亲和类型?
SQLite
不强制数据类型约束,也就是说任何数据都可以插入任何列。例如,我们可以向一个整型列中插入任意长度的字符串,向布尔型列中插入浮点数,或者向字符型列中插入日期型值。
在创建数据表时所指定的数据类型不会限制在该列中插入任何数据。任何列均可接受任意长度的字符串(只有一种情况除外,就是标志为INTEGER PRIMARY KEY
的列只能存储64
位整数, 当向这种列中插数据除整数以外的数据时,将会产生错误。)
SQLite
确实使用声明的列类型来指示我们所期望的格式。所以,当我们向一个整型列中插入字符串时,SQLite
会试图将该字符串转换成一个整数。如果可以转换,它将插入该整数;否则,将插入字符串。这是一个特性,而不是一个bug
。这种特性被称为列亲和性(type or column affinity
).
而列的亲和类型是指该列数据的推荐类型。需要注意,这个类型只是推荐的,而不是必须的。上边已经说过任何列可以存储任何类型的数据,只是说根据选择,某些列更倾向于使用一个存储类型而不是另一个存储类型。
2.2 SQLite
支持的亲和类型
上边我们知道了SQLite
支持列的类型近似性。列可以存储任何类型的数据,而列的首选存储类称为它的近似性类型。在SQLite3
数据库中有以下类型近似可用于分配:
亲和类型 | 描述 |
TEXT | 数值型数据在被插入之前,需要先被转换为文本格式,之后再插入到目标字段中。 |
NUMERIC | 当文本数据被插入到亲缘性为NUMERIC的字段中时,如果转换操作不会导致数据信息丢失以及完全可逆,那么SQLite就会将该文本数据转换为INTEGER或REAL类型的数据,如果转换失败,SQLite仍会以TEXT方式存储该数据。对于NULL或BLOB类型的新数据,SQLite将不做任何转换,直接以NULL或BLOB的方式存储该数据。需要额外说明的是,对于浮点格式的常量文本,如"30000.0",如果该值可以转换为INTEGER同时又不会丢失数值信息,那么SQLite就会将其转换为INTEGER的存储方式。 |
INTEGER | 对于亲缘类型为INTEGER的字段,其规则等同于NUMERIC,唯一差别是在执行CAST表达式时。 |
REAL | 其规则基本等同于NUMERIC,唯一的差别是不会将"30000.0"这样的文本数据转换为INTEGER存储方式。 |
NONE | 不做任何的转换,直接以该数据所属的数据类型进行存储。 |
当创建 SQLite3
表时可使用的各种数据类型名称,同时也显示了相应的亲和类型:
亲和类型 | 数据类型 |
INTEGER | INT, INTEGER, TINYINT, SMALLINT, MEDIUMINT, BIGINT, UNSIGNED BIG INT, INT2, INT8 |
TEXT | CHARACTER(20), VARCHAR(255), VARYING CHARACTER(255), NCHAR(55), NATIVE CHARACTER(70), NVARCHAR(100), TEXT, CLOB |
NONE | BLOB, no datatype specified |
REAL | REAL, DOUBLE, DOUBLE PRECISION, FLOAT |
NUMERIC | NUMERIC, DECIMAL(10,5), BOOLEAN, DATE, DATETIME |
二、运算符
运算符用于指定 SQLite
语句中的条件,并在语句中连接多个条件。常用于where
子句中,以便于对指定数据记录执行相关操作。SQlite
中的运算符主要有算术运算符、比较运算符、逻辑运算符和位运算符。
1. 算术运算符
假设变量 a=10
,变量 b=20
,则:
运算符 | 说明 | 示例 |
+ | 加法运算符:用于将运算符两侧的值相加。 | a+b = 50 |
- | 减法运算符:用于从左操作数减去右操作数。 | a-b = -10 |
* | 乘法运算符:用于将运算符两边的操作数相乘。 | a*b = 200 |
/ | 除法运算符:它是将左操作数除以右操作数。 | b/a = 2 |
% | 取模运算符:用于通过左操作数除以右操作数并返回余数。 | b%a = 0 |
2. 比较运算符
假设变量 a=10
,变量 b=20
,则:
运算符 | 描述 | 实例 |
== | 检查两个操作数的值是否相等,如果相等则返回true,否则返回false。 | (a == b) 不为真。 |
= | 检查两个操作数的值是否相等,如果相等则返回true,否则返回false。 | (a = b) 不为真。 |
!= | 检查两个操作数的值是否不相等,如果不相等则返回true,否则返回false。 | (a != b) 为真。 |
<> | 检查两个操作数的值是否不相等,如果不相等则返回true,否则返回false。 | (a <> b) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是则返回true,否则返回false。 | (a > b) 不为真。 |
< | 检查左操作数的值是否小于右操作数的值,如果是则返回true,否则返回false。 | (a < b) 为真。 |
>= | 检查左操作数的值是否大于等于右操作数的值,如果是则返回true,否则返回false。 | (a >= b) 不为真。 |
<= | 检查左操作数的值是否小于等于右操作数的值,如果是则返回true,否则返回false。 | (a <= b) 为真。 |
!< | 检查左操作数的值是否不小于(大于等于)右操作数的值,如果是则返回true,否则返回false。 | (a !< b) 为假。 |
!> | 检查左操作数的值是否不大于(小于等于)右操作数的值,如果是则返回true,否则返回false。 | (a !> b) 为真。 |
3. 逻辑运算符
运算符 | 描述 |
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 运算符搜索指定表中的每一行,确保唯一性(无重复)。 |
4. 位运算符
4.1 一个真值表
位运算符作用于位,并逐位执行操作。真值表 &
和 |
如下:
p | q | p & q | p | q |
0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 1 | 1 | 1 |
1 | 0 | 0 | 1 |
4.2 运算符说明
假设变量 A=60(0011 1100)
,变量 B=13(0000 1101)
,则:
运算符 | 描述 | 实例 |
& | 如果同时存在于两个操作数中,二进制 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 |
三、表达式
表达式是一个或多个值、运算符和计算值的SQL
函数的组合。SQL
表达式与公式类似,都写在查询语言中,我们还可以使用特定的数据集来查询数据库。
1. 语法格式
SQLite
表达式用查询语言(SQL
)编写,并与SELECT
(后边会详细学习)语句一起使用。一般语法格式如下:
1 | -- 多行语句 |
【注意】
(1)写成小写也是可以的。
(2)关于SELECT
和WHERE
后边会详细学习,这里就简单了解就好啦。
2. 布尔表达式
2.1 语法格式
一般语法格式如下:
1 | SELECT column1, column2, columnN |
2.2 使用实例
假设 COMPANY
表有以下记录:
1 | ID NAME AGE ADDRESS SALARY |
在SQLite
命令提示符中输入以下语句:
1 | sqlite> SELECT * FROM COMPANY WHERE SALARY = 10000; |
则会看到如下输出(默认的输出可不是这样的格式,后边学习到SQLite
命令的时候就会了解到如何设置成这样的显示格式啦):
1 | ID NAME AGE ADDRESS SALARY |
3. 数值表达式
3.1 语法格式
一般语法格式如下:
1 | SELECT numerical_expression as OPERATION_NAME |
numerical_expression
:用于数学表达式或任何公式。
3.2 使用实例
3.2.1 实例1
在SQLite
命令提示符中输入以下语句:
1 | sqlite> SELECT (15 + 6) AS ADDITION; |
3.2.2 实例2
有几个内置的函数,比如 avg()
、sum()
、count()
,等等,执行被称为对一个表或一个特定的表列的汇总数据计算。例如,
假设 COMPANY
表有以下记录:
1 | ID NAME AGE ADDRESS SALARY |
在SQLite
命令提示符中输入以下语句:
1 | sqlite> SELECT COUNT(*) AS "RECORDS" FROM COMPANY; |
4. 日期表达式
日期表达式返回当前系统日期和时间值,这些表达式可以被用于各种数据操作。
4.1 语法格式
这里的话似乎没什么固定的语法格式,直接看实例把
4.2 使用实例
4.2.1 获取当前时间
在SQLite
命令提示符中输入以下语句:
1 | sqlite> SELECT datetime('now','localtime'); |