SQLite3语法(二)

文章目录

  • SQLite3 (二)
    • 八、 数据库配置
      • 1、 语法
      • 2、 常用配置
        • 2.1 auto_vacuum
          • 2.1.1 VACUUM
          • 2.1.2 自动VACUUM
        • 2.2 cache_size
        • 2.3 case_sensitive_like
        • 2.4 count_changes
        • 2.5 database_list
        • 2.6 encoding
        • 2.7 freelist_count
        • 2.8 journal_mode
        • 2.9 max_page_count
        • 2.10 page_size
        • 2.11 parser_trace
        • 2.12 secure_delete
        • 2.13 temp_store
        • 2.14 temp_store_directory
        • 2.15 writable_schema
    • 九、 sqlite约束
      • 1、NOT NULL 约束
      • 2、DEFAULT 约束
      • 3、UNIQUE 约束
      • 4、PRIMARY KEY 约束
      • 5、CHECK 约束
      • 6、 AUTOINCREMENT 约束
    • 十、 高阶查询
      • 1、 多表查询
        • 1.1 交叉连接
        • 1.2 内连接
        • 1.3 外连接
      • 2、 Unions 子句
        • 2.1 语法
        • 2.2 UNION ALL
      • 3、 查询嵌套
        • 3.1 子查询
        • 3.2 语法
    • 十一、 空值和别名
      • 1、 空值
      • 2、 别名
    • 十二、 触发器
      • 1、 简介
      • 2、 语法
      • 3、 触发器其他操作
    • 十三、 索引
      • 1、 简介
      • 2、 创建
        • 2.1 单列索引
        • 2.2 唯一索引
        • 2.3 组合索引
      • 3、 查看索引
      • 4、 删除索引
      • 5、 使用索引
    • 十四、 视图
      • 1、 简介
      • 2、 创建
      • 3、 删除
    • 十五、 事务
      • 1、 简介
      • 2、 语法
        • 2.1 开启事务
        • 2.2 提交事务
      • 2.3 撤销事务
    • 十六、常用函数
      • 1、 时间日期
      • 2、 其他函数
        • 2.1 语法
        • 2.2 使用示例

SQLite3 (二)

八、 数据库配置

1、 语法

SQLite 的 PRAGMA 命令是一个特殊的命令,可以用在 SQLite 环境内控制各种环境变量和状态标志。一个 PRAGMA 值可以被读取,也可以根据需求进行设置。

PRAGMA pragma_name;  --查询pragma_name的值
PRAGMA pragma_name = value;  --设置该值

2、 常用配置

2.1 auto_vacuum
2.1.1 VACUUM

VACUUM 命令通过复制主数据库中的内容到一个临时数据库文件,然后清空主数据库,并从副本中重新载入原始的数据库文件。这消除了空闲页,把表中的数据排列为连续的,另外会清理数据库文件结构。

如果表中没有明确的整型主键(INTEGER PRIMARY KEY),VACUUM 命令可能会改变表中条目的行 ID(ROWID)。VACUUM 命令只适用于主数据库,附加的数据库文件是不可能使用 VACUUM 命令。

如果有一个活动的事务,VACUUM 命令就会失败。VACUUM 命令是一个用于内存数据库的任何操作。由于 VACUUM 命令从头开始重新创建数据库文件,所以 VACUUM 也可以用于修改许多数据库特定的配置参数

语法:

sqlite3 database_name "VACUUM;" --对整个数据库进行重载
VACUUM;
VACUUM table_name;  --对特定表上进行数据重载
2.1.2 自动VACUUM
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 进行覆盖。
2.2 cache_size

获取或暂时设置在内存中页面缓存的最大尺寸

PRAGMA [database.]cache_size;
PRAGMA [database.]cache_size = pages;

pages:表示在缓存中的页面数。内置页面缓存的默认大小为 2,000 页,最小尺寸为 10 页

2.3 case_sensitive_like

控制内置的 LIKE 表达式的大小写敏感度。默认情况下,该 Pragma 为 false,这意味着,内置的 LIKE 操作符忽略字母的大小写。语法如下:

PRAGMA case_sensitive_like = [true|false];
2.4 count_changes

获取或设置数据操作语句的返回值,如 INSERT、UPDATE 和 DELETE

PRAGMA count_changes;
PRAGMA count_changes = [true|false];

默认情况下,该 Pragma 为 false,这些语句不返回任何东西。如果设置为 true,每个所提到的语句将返回一个单行单列的表,由一个单一的整数值组成,该整数表示操作影响的行

2.5 database_list

将用于列出了所有的数据库连接

PRAGMA database_list;

返回一个单行三列的表格,每当打开或附加数据库时,会给出数据库中的序列号,它的名称和相关的文件

2.6 encoding

控制字符串如何编码及存储在数据库文件中。语法如下:

PRAGMA encoding;
PRAGMA encoding = format;

格式值可以是 UTF-8、UTF-16le 或 UTF-16be 之一

2.7 freelist_count

返回一个整数,表示当前被标记为免费和可用的数据库页数

PRAGMA [database.]freelist_count;
2.8 journal_mode

获取或设置控制日志文件如何存储和处理的日志模式

PRAGMA [database.]journal_mode;
PRAGMA [database.]journal_mode = mode;
Pragma 值 描述
DELETE 默认模式。在该模式下,在事务结束时,日志文件将被删除。
TRUNCATE 日志文件被阶段为零字节长度。
PERSIST 日志文件被留在原地,但头部被重写,表明日志不再有效。
MEMORY 日志记录保留在内存中,而不是磁盘上。
OFF 不保留任何日志记录。
2.9 max_page_count

为数据库获取或设置允许的最大页数

PRAGMA [database.]max_page_count;
PRAGMA [database.]max_page_count = max_page;
2.10 page_size

获取或设置数据库页面的大小

PRAGMA [database.]page_size;
PRAGMA [database.]page_size = bytes;
--重新设置大小后,使用vacuum刷新页面
VACUUM;
2.11 parser_trace

随着它解析 SQL 命令来控制打印的调试状态 ,默认为flaseSQL 解析器不会随着它解析 SQL 命令来打印出它的状态

PRAGMA parser_trace = [true|false];
2.12 secure_delete
PRAGMA [database.]secure_delete;
PRAGMA [database.]secure_delete = [true|false];

控制内容是如何从数据库中删除 ,安全删除标志的默认值通常是关闭的

2.13 temp_store

获取或设置临时数据库文件所使用的存储模式

PRAGMA temp_store;
PRAGMA temp_store = mode;
Pragma 值 描述
0 或 DEFAULT 默认使用编译时的模式。通常是 FILE。
1 或 FILE 使用基于文件的存储。
2 或 MEMORY 使用基于内存的存储。
2.14 temp_store_directory

获取或设置用于临时数据库文件的位置

PRAGMA temp_store_directory;
PRAGMA temp_store_directory = 'directory_path';
2.15 writable_schema

获取或设置是否能够修改系统表

PRAGMA writable_schema;
PRAGMA writable_schema = [true|false];

如果设置了该 Pragma,则表以 sqlite_ 开始,可以创建和修改,包括 sqlite_master 表。使用该 Pragma 时要注意,因为它可能导致整个数据库损坏

还有一些其他的配置方法,可以去官方文档自己了解一下

九、 sqlite约束

约束是在表的数据列上强制执行的规则。这些是用来限制可以插入到表中的数据类型。这确保了数据库中数据的准确性和可靠性

约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整个表

  • NOT NULL 约束:确保某列不能有 NULL 值
  • DEFAULT 约束:当某列没有指定值时,为该列提供默认值
  • UNIQUE 约束:确保某列中的所有值是不同的
  • PRIMARY Key 约束:唯一标识数据库表中的各行/记录
  • CHECK 约束:CHECK 约束确保某列中的所有值满足一定条件

1、NOT NULL 约束

默认情况下,列可以保存 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
);

2、DEFAULT 约束

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
);

3、UNIQUE 约束

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
);

4、PRIMARY KEY 约束

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
);

5、CHECK 约束

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)
);

6、 AUTOINCREMENT 约束

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 seqname 记录自增列所在的表,seq 记录当前序号(下一条记录的编号就是当前序号加 1)。如果想把某个自增列的序号归零,只需要修改 sqlite_sequence 表就可以了

UPDATE sqlite_sequence SET seq = 0 WHERE name = 'table_name';

十、 高阶查询

1、 多表查询

SQLite 的 Join 子句用于结合两个或多个数据库中表的记录。JOIN 是一种通过共同值来结合两个表中字段的手段。

SQL 定义了三种主要类型的连接:

  • 交叉连接 - CROSS JOIN
  • 内连接 - INNER JOIN
  • 外连接 - OUTER JOIN
1.1 交叉连接

交叉连接(CROSS JOIN)把第一个表的每一行与第二个表的每一行进行匹配。如果两个输入表分别有 x 和 y 行,则结果表有 x*y 行。由于交叉连接(CROSS JOIN)有可能产生非常大的表,使用时必须谨慎,只在适当的时候使用它们

交叉连接的操作,它们都返回被连接的两个表所有数据行的笛卡尔积,返回到的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数

SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;  --选取两张表的id,name,dept
1.2 内连接

内连接(INNER JOIN)根据连接谓词结合两个表(table1table2)的列值来创建一个新的结果表。查询会把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;  
1.3 外连接

外连接(OUTER JOIN)是内连接(INNER JOIN)的扩展。虽然 SQL 标准定义了三种类型的外连接:LEFTRIGHTFULL,但 SQLite 只支持 左外连接(LEFT OUTER JOIN

外连接(OUTER JOIN)声明条件的方法与内连接(INNER JOIN)是相同的,使用 ONUSING 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...

2、 Unions 子句

SQLiteUNION 子句/运算符用于合并两个或多个 SELECT 语句的结果,不返回任何重复的行。

为了使用 UNION,每个 SELECT 被选择的列数必须是相同的,相同数目的列表达式,相同的数据类型,并确保它们有相同的顺序,但它们不必具有相同的长度

对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序

2.1 语法

UNION 的基本语法如下:

SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]

UNION

SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
2.2 UNION ALL

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]

3、 查询嵌套

3.1 子查询

子查询或称为内部查询、嵌套查询,指的是在 SQLite 查询中的 WHERE 子句中嵌入查询语句。

一个 SELECT 语句的查询结果能够作为另一个语句的输入值。

子查询可以与 SELECTINSERTUPDATE DELETE语句一起使用,可伴随着使用运算符如 =、<、>、>=、<=、IN、BETWEEN 等。

以下是子查询必须遵循的几个规则:

  • 子查询必须用括号括起来
  • 子查询在SELECT子句中只能有一个列,除非在主查询中有多列,与子查询的所选列进行比较
  • ORDER BY 不能用在子查询中,虽然主查询可以使用 ORDER BY。可以在子查询中使用 GROUP BY,功能与ORDER BY相同
  • 子查询返回多于一行,只能与多值运算符一起使用,如IN运算符
  • BETWEEN 运算符不能与子查询一起使用,但是,BETWEEN 可在子查询内使用
3.2 语法

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 ])]

``

十一、 空值和别名

1、 空值

SQLiteNULL 是用来表示一个缺失值的项。表中的一个 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);  --如果主键不为空

2、 别名

暂时把表或列重命名为另一个名字,这被称为别名。使用表别名是指在一个特定的 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';

十二、 触发器

1、 简介

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-nameOLD.column-name 的引用插入、删除或更新的行元素,其中 column-name 是从与触发器关联的表的列的名称。
  • 如果提供 WHEN 子句,则只针对 WHEN 子句为真的指定行执行 SQL 语句。如果没有提供 WHEN 子句,则针对所有行执行 SQL 语句。
  • BEFOREAFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。
  • 当触发器相关联的表删除时,自动删除触发器(Trigger)。
  • 要修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用 tablename,而不是 database.tablename
  • 一个特殊的 SQL 函数 RAISE() 可用于触发器程序内抛出异常。

2、 语法

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;

3、 触发器其他操作

查看

SELECT name FROM sqlite_master
WHERE type = 'trigger';  --从 sqlite_master 表中列出所有触发器

删除

DROP TRIGGER trigger_name;

十三、 索引

1、 简介

索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书的索引目录是非常相似的

拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字

索引有助于加快 SELECT 查询和WHERE子句,但它会减慢使用 UPDATE INSERT 语句时的数据输入。索引可以创建或删除,但不会影响数据

使用CREATE INDEX语句创建索引,它允许命名索引,指定表及要索引的一列或多列,并指示索引是升序排列还是降序排列

索引也可以是唯一的,与 UNIQUE 约束类似,在列上或列组合上防止重复条目

虽然索引的目的在于提高数据库的性能,但这里有几个情况需要避免使用索引。使用索引时,应重新考虑下列准则:

  • 索引不应该使用在较小的表上
  • 索引不应该使用在有频繁的大批量的更新或插入操作的表上
  • 索引不应该使用在含有大量的 NULL 值的列上
  • 索引不应该使用在频繁操作的列上

创建方法:

CREATE INDEX index_name ON table_name;

2、 创建

2.1 单列索引

单列索引是一个只基于表的一个列上创建的索引

CREATE INDEX index_name
ON table_name (column_name);
2.2 唯一索引

使用唯一索引不仅是为了性能,同时也为了数据的完整性。唯一索引不允许任何重复的值插入到表中

CREATE UNIQUE INDEX index_name
on table_name (column_name);
2.3 组合索引

组合索引是基于一个表的两个或多个列上创建的索引

CREATE INDEX index_name
on table_name (column1, column2);

隐式索引是在创建对象时,由数据库服务器自动创建的索引。索引自动创建为主键约束和唯一约束

3、 查看索引

 .indices table_name
 OR
 SELECT * FROM sqlite_master WHERE type = 'index';

4、 删除索引

DROP INDEX index_name;

5、 使用索引

"INDEXED BY index-name"子句规定必须需要命名的索引来查找前面表中值

SELECT|DELETE|UPDATE column1, column2... 
FROM table_name
INDEXED BY (index_name)
WHERE (CONDITION);

十四、 视图

1、 简介

视图(View)只不过是通过相关的名称存储在数据库中的一个 SQLite 语句。视图(View)实际上是一个以预定义的SQLite查询形式存在的表的组合。

视图(View)可以包含一个表的所有行或从一个或多个表选定行。视图(View)可以从一个或多个表创建,这取决于要创建视图的SQLite查询。、

视图(View)是一种虚表,允许用户实现以下几点:

  • 用户或用户组查找结构数据的方式更自然或直观。
  • 限制数据访问,用户只能看到有限的数据,而不是完整的表。
  • 汇总各种表中的数据,用于生成报告。

SQLite 视图是只读的,因此可能无法在视图上执行 DELETEINSERTUPDATE语句。但是可以在视图上创建一个触发器,当尝试 DELETEINSERT UPDATE 视图时触发,需要做的动作在触发器内容中定义

2、 创建

SQLite 的视图是使用 CREATE VIEW 语句创建的。SQLite 视图可以从一个单一的表、多个表或其他视图创建

CREATE [TEMP | TEMPORARY] VIEW view_name AS
SELECT column1, column2.....
FROM table_name
WHERE [condition];

可以在 SELECT 语句中包含多个表,这与在正常的 SQL SELECT 查询中的方式非常相似。如果使用了可选的 TEMP 或 TEMPORARY 关键字,则将在临时数据库中创建视图

3、 删除

要删除视图,只需使用带有 view_nameDROP VIEW 语句

DROP VIEW view_name;

十五、 事务

1、 简介

事务是一个对数据库执行工作单元。事务是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可以是由某种数据库程序自动完成

事务是指一个或多个更改数据库的扩展。例如,如果您正在创建一个记录或者更新一个记录或者从表中删除一个记录,那么您正在该表上执行事务。重要的是要控制事务以确保数据的完整性和处理数据库错误

实际上,您可以把许多的 SQLite 查询联合成一组,把所有这些放在一起作为事务的一部分进行执行

事务属性( ACID):

  • 原子性:确保工作单位内的所有操作都成功完成,否则,事务会在出现故障时终止,之前的操作也会回滚到以前的状态。
  • 一致性:确保数据库在成功提交的事务上正确地改变状态。
  • 隔离性:使事务操作相互独立和透明。
  • 持久性:确保已提交事务的结果或效果在系统发生故障的情况下仍然存在。

2、 语法

2.1 开启事务

事务可以使用 BEGIN TRANSACTION 命令或简单的BEGIN命令来启动。此类事务通常会持续执行下去,直到遇到下一个 COMMIT ROLLBACK 命令。不过在数据库关闭或发生错误时,事务处理也会回滚。

BEGIN;
or 
BEGIN TRANSACTION;
2.2 提交事务

COMMIT 命令是用于把事务调用的更改保存到数据库中的事务命令。

COMMIT 命令把自上次 COMMIT ROLLBACK 命令以来的所有事务保存到数据库。

COMMIT;
or
END TRANSACTION;

2.3 撤销事务

ROLLBACK 命令是用于撤消尚未保存到数据库的事务的事务命令

ROLLBACK 命令只能用于撤销自上次发出 COMMIT ROLLBACK 命令以来的事务命令

ROLLBACK;

十六、常用函数

1、 时间日期

函数 实例
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】学习

2、 其他函数

2.1 语法
函数 描述
COUNT 用来计算一个数据库表中的行数
MAX 允许我们选择某列的最大值
MIN 允许我们选择某列的最小值
AVG 计算某列的平均值
SUM 允许为一个数值列计算总和
RANDOM 返回一个介于 ±9223372036854775808 和 之间的伪随机整数
ABS 返回数值参数的绝对值
UPPER 把字符串转换为大写字母
LOWER 把字符串转换为小写字母
LENGTH 返回字符串的长度
sqlite_version 返回 SQLite 库的版本
2.2 使用示例
BEGIN ;--开始事务
SELECT UPPER('Hello'); --全部变为大写字母
SELECT SQLITE_VERSION();  --返回数据库的版本
SELECT LENGTH('HELLO');  --返回字符串的长度
SELECT DATETIME(CURRENT_TIMESTAMP, 'NOW');  --获取当前的时间,同时使用当前的时区
COMMIT ;

你可能感兴趣的:(database,#,sqlite3,sqlite,数据库,database)