SQLite 的 PRAGMA 命令是一个特殊的命令,可以用在 SQLite 环境内控制各种环境变量和状态标志。一个 PRAGMA 值可以被读取,也可以根据需求进行设置。
PRAGMA pragma_name; --查询pragma_name的值
PRAGMA pragma_name = value; --设置该值
VACUUM
命令通过复制主数据库中的内容到一个临时数据库文件,然后清空主数据库,并从副本中重新载入原始的数据库文件。这消除了空闲页,把表中的数据排列为连续的,另外会清理数据库文件结构。
如果表中没有明确的整型主键(INTEGER PRIMARY KEY
),VACUUM
命令可能会改变表中条目的行 ID(ROWID
)。VACUUM
命令只适用于主数据库,附加的数据库文件是不可能使用 VACUUM
命令。
如果有一个活动的事务,VACUUM
命令就会失败。VACUUM
命令是一个用于内存数据库的任何操作。由于 VACUUM
命令从头开始重新创建数据库文件,所以 VACUUM
也可以用于修改许多数据库特定的配置参数
语法:
sqlite3 database_name "VACUUM;" --对整个数据库进行重载
VACUUM;
VACUUM table_name; --对特定表上进行数据重载
PRAGMA [database.]auto_vacuum;
PRAGMA [database.]auto_vacuum = mode;
Pragma 值 | 描述 |
---|---|
0 或 NONE | 禁用 Auto-vacuum。这是默认模式,意味着数据库文件尺寸大小不会缩小,除非手动使用 VACUUM 命令。 |
1 或 FULL | 启用 Auto-vacuum,是全自动的。在该模式下,允许数据库文件随着数据从数据库移除而缩小。 |
2 或 INCREMENTAL | 启用 Auto-vacuum,但是必须手动激活。在该模式下,引用数据被维持,自由页面只放在自由列表中。这些页面可在任何时候使用 incremental_vacuum pragma 进行覆盖。 |
获取或暂时设置在内存中页面缓存的最大尺寸
PRAGMA [database.]cache_size;
PRAGMA [database.]cache_size = pages;
pages:表示在缓存中的页面数。内置页面缓存的默认大小为 2,000 页,最小尺寸为 10 页
控制内置的 LIKE 表达式的大小写敏感度。默认情况下,该 Pragma 为 false,这意味着,内置的 LIKE 操作符忽略字母的大小写。语法如下:
PRAGMA case_sensitive_like = [true|false];
获取或设置数据操作语句的返回值,如 INSERT、UPDATE 和 DELETE
PRAGMA count_changes;
PRAGMA count_changes = [true|false];
默认情况下,该 Pragma 为 false,这些语句不返回任何东西。如果设置为 true,每个所提到的语句将返回一个单行单列的表,由一个单一的整数值组成,该整数表示操作影响的行
将用于列出了所有的数据库连接
PRAGMA database_list;
返回一个单行三列的表格,每当打开或附加数据库时,会给出数据库中的序列号,它的名称和相关的文件
控制字符串如何编码及存储在数据库文件中。语法如下:
PRAGMA encoding;
PRAGMA encoding = format;
格式值可以是 UTF-8、UTF-16le 或 UTF-16be 之一
返回一个整数,表示当前被标记为免费和可用的数据库页数
PRAGMA [database.]freelist_count;
获取或设置控制日志文件如何存储和处理的日志模式
PRAGMA [database.]journal_mode;
PRAGMA [database.]journal_mode = mode;
Pragma 值 | 描述 |
---|---|
DELETE | 默认模式。在该模式下,在事务结束时,日志文件将被删除。 |
TRUNCATE | 日志文件被阶段为零字节长度。 |
PERSIST | 日志文件被留在原地,但头部被重写,表明日志不再有效。 |
MEMORY | 日志记录保留在内存中,而不是磁盘上。 |
OFF | 不保留任何日志记录。 |
为数据库获取或设置允许的最大页数
PRAGMA [database.]max_page_count;
PRAGMA [database.]max_page_count = max_page;
获取或设置数据库页面的大小
PRAGMA [database.]page_size;
PRAGMA [database.]page_size = bytes;
--重新设置大小后,使用vacuum刷新页面
VACUUM;
随着它解析 SQL
命令来控制打印的调试状态 ,默认为flase
,SQL
解析器不会随着它解析 SQL
命令来打印出它的状态
PRAGMA parser_trace = [true|false];
PRAGMA [database.]secure_delete;
PRAGMA [database.]secure_delete = [true|false];
控制内容是如何从数据库中删除 ,安全删除标志的默认值通常是关闭的
获取或设置临时数据库文件所使用的存储模式
PRAGMA temp_store;
PRAGMA temp_store = mode;
Pragma 值 | 描述 |
---|---|
0 或 DEFAULT | 默认使用编译时的模式。通常是 FILE。 |
1 或 FILE | 使用基于文件的存储。 |
2 或 MEMORY | 使用基于内存的存储。 |
获取或设置用于临时数据库文件的位置
PRAGMA temp_store_directory;
PRAGMA temp_store_directory = 'directory_path';
获取或设置是否能够修改系统表
PRAGMA writable_schema;
PRAGMA writable_schema = [true|false];
如果设置了该 Pragma,则表以 sqlite_ 开始,可以创建和修改,包括 sqlite_master 表。使用该 Pragma 时要注意,因为它可能导致整个数据库损坏
还有一些其他的配置方法,可以去官方文档自己了解一下
约束是在表的数据列上强制执行的规则。这些是用来限制可以插入到表中的数据类型。这确保了数据库中数据的准确性和可靠性
约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整个表
默认情况下,列可以保存 NULL 值。如果您不想某列有 NULL 值,那么需要在该列上定义此约束,指定在该列上不允许 NULL 值
NULL 与没有数据是不一样的,它代表着未知的数据
例如:
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL, --不接受空值
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
DEFAULT 约束在 INSERT INTO 语句没有提供一个特定的值时,为列提供一个默认值
例如:
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL DEFAULT 50000.00 --如果没有设置,则默认值为50000.00
);
UNIQUE 约束防止在一个特定的列存在两个记录具有相同的值。在 COMPANY 表中,例如,您可能要防止两个或两个以上的人具有相同的年龄。
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL UNIQUE, --名字唯一
ADDRESS CHAR(50),
SALARY REAL DEFAULT 50000.00
);
PRIMARY KEY 约束唯一标识数据库表中的每个记录。在一个表中可以有多个 UNIQUE 列,但只能有一个主键。在设计数据库表时,主键是很重要的。主键是唯一的 ID
我们使用主键来引用表中的行。可通过把主键设置为其他表的外键,来创建表之间的关系。由于"长期存在编码监督",在 SQLite 中,主键可以是 NULL,这是与其他数据库不同的地
主键是表中的一个字段,唯一标识数据库表中的各行/记录。主键必须包含唯一值。主键列不能有 NULL 值
一个表只能有一个主键,它可以由一个或多个字段组成。当多个字段作为主键,它们被称为复合键
如果一个表在任何字段上定义了一个主键,那么在这些字段上不能有两个记录具有相同的值
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL, --使得id为主键
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
CHECK 约束启用输入一条记录要检查值的条件。如果条件值为 false,则记录违反了约束,且不能输入到表。
CREATE TABLE COMPANY3(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL CHECK(SALARY > 0)
);
AUTOINCREMENT 约束要结合主键约束来使用,同时,其只能用于整型字段
CREATE TABLE COMPANY(
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,
name TEXT NOT NULL ,
age INT CHECK ( age >= 18 and age <= 50 ), --年龄进行限制
salary REAL DEFAULT 1000.0 --默认值为1000
);
注意:使用
DELETE FROM table_name
方法无法将递增数归零DELETE FROM sqlite_sequence WHERE name = 'table_name'; --使得该表的递增数归零
SQLite
数据库中包含自增列时,会自动建立一个名为sqlite_sequence
的表。这个表包含两个列:name
和seq
。name
记录自增列所在的表,seq
记录当前序号(下一条记录的编号就是当前序号加 1)。如果想把某个自增列的序号归零,只需要修改sqlite_sequenc
e 表就可以了UPDATE sqlite_sequence SET seq = 0 WHERE name = 'table_name';
SQLite 的 Join 子句用于结合两个或多个数据库中表的记录。JOIN 是一种通过共同值来结合两个表中字段的手段。
SQL 定义了三种主要类型的连接:
交叉连接(CROSS JOIN
)把第一个表的每一行与第二个表的每一行进行匹配。如果两个输入表分别有 x 和 y 行,则结果表有 x*y 行。由于交叉连接(CROSS JOIN
)有可能产生非常大的表,使用时必须谨慎,只在适当的时候使用它们
交叉连接的操作,它们都返回被连接的两个表所有数据行的笛卡尔积,返回到的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数
SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT; --选取两张表的id,name,dept
内连接(INNER JOIN
)根据连接谓词结合两个表(table1
和 table2
)的列值来创建一个新的结果表。查询会把table1
中的每一行与table2
中的每一行进行比较,找到所有满足连接谓词的行的匹配对。当满足连接谓词时,A 和 B 行的每个匹配对的列值会合并成一个结果行
内连接(INNER JOIN
)是最常见的连接类型,是默认的连接类型。INNER 关键字是可选的
下面是内连接(INNER JOIN
)的语法:
SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...
也可以使用USING
表达式声明内连接(INNER JOIN
)条件。这个表达式指定一个或-多个列的列表:
SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...
自然连接(NATURAL JOIN
)类似于 JOIN...USING
,只是它会自动测试存在两个表中的每一列的值之间相等值:
SELECT ... FROM table1 NATURAL JOIN table2...
例如:
SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
外连接(OUTER JOIN
)是内连接(INNER JOIN
)的扩展。虽然 SQL 标准定义了三种类型的外连接:LEFT
、RIGHT
、FULL
,但 SQLite
只支持 左外连接(LEFT OUTER JOIN
)
外连接(OUTER JOIN
)声明条件的方法与内连接(INNER JOIN
)是相同的,使用 ON
、USING
或 NATURAL
关键字来表达。最初的结果表以相同的方式进行计算。一旦主连接计算完成,外连接(OUTER JOIN
)将从一个或两个表中任何未连接的行合并进来,外连接的列使用 NULL
值,将它们附加到结果表中。
下面是左外连接(LEFT OUTER JOIN
)的语法:
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
也可以使用USING
表达式声明外连接(OUTER JOIN
)条件。这个表达式指定一个或多个列的列表,返回指定列相等的结果:
SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...
自然连接(NATURAL JOIN
)类似于 JOIN...USING
,只是它会自动测试存在两个表中的每一列的值之间相等值:
SELECT ... FROM table1 NATURAL LEFT OUTER JOIN table2...
SQLite
的UNION
子句/运算符用于合并两个或多个 SELECT
语句的结果,不返回任何重复的行。
为了使用 UNION
,每个 SELECT
被选择的列数必须是相同的,相同数目的列表达式,相同的数据类型,并确保它们有相同的顺序,但它们不必具有相同的长度
对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序
UNION 的基本语法如下:
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION ALL
运算符用于结合两个 SELECT
语句的结果,包括重复行。
对两个结果集进行并集操作,包括重复行,不进行排序
适用于 UNION
的规则同样适用于UNION ALL
运算符。
UNION ALL
的基本语法如下:
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION ALL
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
子查询或称为内部查询、嵌套查询,指的是在 SQLite
查询中的 WHERE
子句中嵌入查询语句。
一个 SELECT
语句的查询结果能够作为另一个语句的输入值。
子查询可以与 SELECT
、INSERT
、UPDATE
和DELETE
语句一起使用,可伴随着使用运算符如 =、<、>、>=、<=、IN、BETWEEN
等。
以下是子查询必须遵循的几个规则:
SELECT
子句中只能有一个列,除非在主查询中有多列,与子查询的所选列进行比较ORDER BY
不能用在子查询中,虽然主查询可以使用 ORDER BY
。可以在子查询中使用 GROUP BY
,功能与ORDER BY
相同IN
运算符BETWEEN
运算符不能与子查询一起使用,但是,BETWEEN
可在子查询内使用SELECT
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name operator
(SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE])
INSERT
INSERT INTO table_name [ (column1 [, column2 ]) ]
SELECT [ *|column1 [, column2 ]
FROM table1 [, table2 ]
[ WHERE VALUE OPERATOR ]
UPDATA
UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
DELETE
DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME
[ WHERE ])]
``
SQLite
的 NULL
是用来表示一个缺失值的项。表中的一个 NULL
值是在字段中显示为空白的一个值
带有NULL
值的字段是一个不带有值的字段。NULL
值与零值或包含空格的字段是不同的,理解这点是非常重要的
CREATE TABLE users1(
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, --自增约束,非空约束,主键约束
name TEXT ,
pwd TEXT NOT NULL
);
INSERT INTO users1 (name, pwd) VALUES (NULL, '123');
INSERT INTO users1 (name, pwd) VALUES ('kun', '123234');
SELECT * FROM users1 WHERE (name IS NOT NULL); --如果主键不为空
暂时把表或列重命名为另一个名字,这被称为别名。使用表别名是指在一个特定的 SQLite
语句中重命名表。重命名是临时的改变,在数据库中实际的表的名称不会改变
列别名用来为某个特定的 SQLite
语句重命名表中的列
SELECT column1, column2....
FROM table_name AS alias_name --给表取别名
WHERE [condition];
SELECT column_name AS alias_name --给列取别名
FROM table_name
WHERE [condition];
实例:
SELECT * FROM users AS U
WHERE U.name == 'kun';
SQLite
**触发器(Trigger
)**是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用。以下是关于 SQLite
的触发器(Trigger
)的要点:
SQLite
的触发器(Trigger
)可以指定在特定的数据库表发生 DELETE、INSERT 或 UPDATE 时触发,或在一个或多个指定表的列发生更新时触发。SQLite
只支持 FOR EACH ROW
触发器(Trigger
),没有FOR EACH STATEMENT
触发器(Trigger
)。因此,明确指定 FOR EACH ROW
是可选的。WHEN
子句和触发器(Trigger
)动作可能访问使用表单 NEW.column-name
和 OLD.column-name
的引用插入、删除或更新的行元素,其中 column-name
是从与触发器关联的表的列的名称。WHEN
子句,则只针对 WHEN
子句为真的指定行执行 SQL
语句。如果没有提供 WHEN
子句,则针对所有行执行 SQL
语句。BEFORE
或 AFTER
关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。Trigger
)。tablename
,而不是 database.tablename
。CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name
ON table_name
BEGIN
-- 触发器逻辑....
END;
event_name:
INSERT、DELETE、UPDATE
例如:
--主表
CREATE TABLE COMPANY(
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,
name TEXT NOT NULL ,
age INT CHECK ( age >= 18 and age <= 50 ), --年龄进行限制
salary REAL DEFAULT 1000.0 --默认值为1000
);
--记录日志的表
CREATE TABLE log_company(
id INTEGER NOT NULL , --记录改变的表的id
time TEXT NOT NULL --记录表修改的时间
);
--创建触发器
CREATE TRIGGER log_company_t AFTER INSERT ON COMPANY --在插入表数据的时候触发
BEGIN
INSERT INTO log_company VALUES (new.id, DATETIME(CURRENT_TIMESTAMP,'localtime')); --new表示插入的数据
END;
--向表中插入数据
INSERT INTO COMPANY (id, name, age) VALUES (1, 'LIHUA', 19);
--设置输出模式,查看日志记录中的数据
.mode column
SELECT * FROM log_company;
查看
SELECT name FROM sqlite_master
WHERE type = 'trigger'; --从 sqlite_master 表中列出所有触发器
删除
DROP TRIGGER trigger_name;
索引(Index
)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书的索引目录是非常相似的
拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字
索引有助于加快 SELECT
查询和WHERE
子句,但它会减慢使用 UPDATE
和 INSERT
语句时的数据输入。索引可以创建或删除,但不会影响数据
使用CREATE INDEX
语句创建索引,它允许命名索引,指定表及要索引的一列或多列,并指示索引是升序排列还是降序排列
索引也可以是唯一的,与 UNIQUE
约束类似,在列上或列组合上防止重复条目
虽然索引的目的在于提高数据库的性能,但这里有几个情况需要避免使用索引。使用索引时,应重新考虑下列准则:
创建方法:
CREATE INDEX index_name ON table_name;
单列索引是一个只基于表的一个列上创建的索引
CREATE INDEX index_name
ON table_name (column_name);
使用唯一索引不仅是为了性能,同时也为了数据的完整性。唯一索引不允许任何重复的值插入到表中
CREATE UNIQUE INDEX index_name
on table_name (column_name);
组合索引是基于一个表的两个或多个列上创建的索引
CREATE INDEX index_name
on table_name (column1, column2);
隐式索引是在创建对象时,由数据库服务器自动创建的索引。索引自动创建为主键约束和唯一约束
.indices table_name
OR
SELECT * FROM sqlite_master WHERE type = 'index';
DROP INDEX index_name;
"INDEXED BY index-name"
子句规定必须需要命名的索引来查找前面表中值
SELECT|DELETE|UPDATE column1, column2...
FROM table_name
INDEXED BY (index_name)
WHERE (CONDITION);
视图(View
)只不过是通过相关的名称存储在数据库中的一个 SQLite
语句。视图(View
)实际上是一个以预定义的SQLite
查询形式存在的表的组合。
视图(View
)可以包含一个表的所有行或从一个或多个表选定行。视图(View
)可以从一个或多个表创建,这取决于要创建视图的SQLite
查询。、
视图(View
)是一种虚表,允许用户实现以下几点:
SQLite
视图是只读的,因此可能无法在视图上执行 DELETE
、INSERT
或UPDATE
语句。但是可以在视图上创建一个触发器,当尝试 DELETE
、INSERT
或 UPDATE
视图时触发,需要做的动作在触发器内容中定义
SQLite
的视图是使用 CREATE VIEW
语句创建的。SQLite
视图可以从一个单一的表、多个表或其他视图创建
CREATE [TEMP | TEMPORARY] VIEW view_name AS
SELECT column1, column2.....
FROM table_name
WHERE [condition];
可以在 SELECT 语句中包含多个表,这与在正常的 SQL SELECT 查询中的方式非常相似。如果使用了可选的 TEMP 或 TEMPORARY 关键字,则将在临时数据库中创建视图
要删除视图,只需使用带有 view_name
的 DROP VIEW
语句
DROP VIEW view_name;
事务是一个对数据库执行工作单元。事务是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可以是由某种数据库程序自动完成
事务是指一个或多个更改数据库的扩展。例如,如果您正在创建一个记录或者更新一个记录或者从表中删除一个记录,那么您正在该表上执行事务。重要的是要控制事务以确保数据的完整性和处理数据库错误
实际上,您可以把许多的 SQLite
查询联合成一组,把所有这些放在一起作为事务的一部分进行执行
事务属性( ACID):
事务可以使用 BEGIN TRANSACTION
命令或简单的BEGIN
命令来启动。此类事务通常会持续执行下去,直到遇到下一个 COMMIT
或 ROLLBACK
命令。不过在数据库关闭或发生错误时,事务处理也会回滚。
BEGIN;
or
BEGIN TRANSACTION;
COMMIT
命令是用于把事务调用的更改保存到数据库中的事务命令。
COMMIT
命令把自上次 COMMIT
或 ROLLBACK
命令以来的所有事务保存到数据库。
COMMIT;
or
END TRANSACTION;
ROLLBACK
命令是用于撤消尚未保存到数据库的事务的事务命令
ROLLBACK
命令只能用于撤销自上次发出 COMMIT
或 ROLLBACK
命令以来的事务命令
ROLLBACK;
函数 | 实例 |
---|---|
date(timestring, modifier, modifier, ...) |
以 YYYY-MM-DD 格式返回日期 |
time(timestring, modifier, modifier, ...) |
以 HH:MM:SS 格式返回时间 |
datetime(timestring, modifier, modifier, ...) |
以 YYYY-MM-DD HH:MM:SS 格式返回 |
julianday(timestring, modifier, modifier, ...) |
这将返回从格林尼治时间的公元前 4714 年 11 月 24 日正午算起的天数 |
strftime(format, timestring, modifier, modifier, ...) |
这将根据第一个参数指定的格式字符串返回格式化的日期 |
时间字符串 | 实例 |
---|---|
YYYY-MM-DD |
2022-06-06 |
YYYY-MM-DD HH:MM |
2022-06-06 12:10 |
YYYY-MM-DD HH:MM:SS.SSS |
2022-06-06 12:10:04.100 |
MM-DD-YYYY HH:MM |
06-06-2022 12:10 |
HH:MM |
12:10 |
YYYY-MM-DDTHH:MM |
2022-06-06 12:10 |
HH:MM:SS |
12:10:01 |
YYYYMMDD HHMMSS |
20220606 121001 |
now |
2022-06-06 |
更多的可以在:【https://www.runoob.com/sqlite/sqlite-date-time.html】学习
函数 | 描述 |
---|---|
COUNT |
用来计算一个数据库表中的行数 |
MAX |
允许我们选择某列的最大值 |
MIN |
允许我们选择某列的最小值 |
AVG |
计算某列的平均值 |
SUM |
允许为一个数值列计算总和 |
RANDOM |
返回一个介于 ±9223372036854775808 和 之间的伪随机整数 |
ABS |
返回数值参数的绝对值 |
UPPER |
把字符串转换为大写字母 |
LOWER |
把字符串转换为小写字母 |
LENGTH |
返回字符串的长度 |
sqlite_version |
返回 SQLite 库的版本 |
BEGIN ;--开始事务
SELECT UPPER('Hello'); --全部变为大写字母
SELECT SQLITE_VERSION(); --返回数据库的版本
SELECT LENGTH('HELLO'); --返回字符串的长度
SELECT DATETIME(CURRENT_TIMESTAMP, 'NOW'); --获取当前的时间,同时使用当前的时区
COMMIT ;