SQLite(5) 高级用法大全,sqlite用法大全
- 1 SQLite 约束
- 2 SQLite Joins 联合查询
- 21 交叉连接 - CROSS JOIN
- 22 内连接 - INNER JOIN
- 23 外连接 - OUTER JOIN
- 3 SQLite Unions 合并
- 4 SQLite NULL 值
- 5 SQLite AS 别名
- 6 SQLite Trigger 触发器
- 7 SQLite Index 索引
- 8 SQLite Indexed By
- 9 SQLite Alter 修改表
- 10 SQLite View 模板
- 11 SQLite Transaction 事务
- 111 事务的属性
- 112 事务控制
- 113 BEGIN TRANSACTION 开始事务
- 114 COMMIT 提交结束事务
- 115 ROLLBACK 撤销事务
- 12 SQLite 子查询嵌套查询
- 121 SELECT 语句中的子查询使用
- 122 INSERT 语句中的子查询使用
- 123 UPDATE 语句中的子查询使用
- 124 DELETE 语句中的子查询使用
- 13 SQLite Autoincrement自动递增
- 14 SQLite 注入与安全
- 15 SQLite 日期 时间
- 16 SQLite 常用函数
- 161 SQLite COUNT 函数
- 162 SQLite MAX 函数
- 163 SQLite MIN 函数
- 164 SQLite AVG 函数
- 165 SQLite SUM 函数
- 166 SQLite RANDOM 函数
- 167 SQLite ABS 函数
- 168 SQLite UPPER 函数
- 169 SQLite LOWER 函数
- 1610 SQLite LENGTH 函数
1. SQLite 约束
- NOT NULL 约束:确保某列不能有 NULL 值。
- DEFAULT 约束:当某列没有指定值时,为该列提供默认值。
- UNIQUE 约束:确保某列中的所有值是不同的。
- PRIMARY Key 约束:唯一标识数据库表中的各行/记录。
- CHECK 约束:CHECK 约束确保某列中的所有值满足一定条件。
-- 示例
CREATE TABLE COMPANY3(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL UNIQUE,
ADDRESS CHAR(50),
SALARY REAL CHECK(SALARY > 0)
);
2. SQLite Joins 联合查询
SQLite 的 Joins 子句用于结合两个或多个数据库中表的记录。JOIN 是一种通过共同值来结合两个表中字段的手段。
SQL 定义了三种主要类型的连接:
- 交叉连接 - CROSS JOIN
- 内连接 - INNER JOIN
- 外连接 - OUTER JOIN
2.1. 交叉连接 - CROSS JOIN
交叉连接(CROSS JOIN)把第一个表的每一行与第二个表的每一行进行匹配。如果两个输入表分别有 x 和 y 列,则结果表有 x+y 列。由于交叉连接(CROSS JOIN)有可能产生非常大的表,使用时必须谨慎,只在适当的时候使用它们。
-- 示例
SELECT EMP_ID, NAME, DEPT FROM table1 CROSS JOIN table2;
2.2. 内连接 - INNER JOIN
内连接(INNER JOIN)根据连接谓词结合两个表(table1 和 table2)的列值来创建一个新的结果表。查询会把 table1 中的每一行与 table2 中的每一行进行比较,找到所有满足连接谓词的行的匹配对。当满足连接谓词时,A 和 B 行的每个匹配对的列值会合并成一个结果行。
内连接(INNER JOIN)是最常见的连接类型,是默认的连接类型。INNER 关键字是可选的
-- 写法1
SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...;
-- 写法2
SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...;
-- 写法3
SELECT ... FROM table1 NATURAL JOIN table2...;
SELECT EMP_ID, NAME, DEPT FROM table1 INNER JOIN table2 ON table1.ID = table2.EMP_ID;
2.3. 外连接 - OUTER JOIN
外连接(OUTER JOIN)是内连接(INNER JOIN)的扩展。虽然 SQL 标准定义了三种类型的外连接:LEFT、RIGHT、FULL,但 SQLite 只支持 左外连接(LEFT OUTER JOIN)。
外连接(OUTER JOIN)声明条件的方法与内连接(INNER JOIN)是相同的,使用 ON、USING 或 NATURAL 关键字来表达。最初的结果表以相同的方式进行计算。一旦主连接计算完成,外连接(OUTER JOIN)将从一个或两个表中任何未连接的行合并进来,外连接的列使用 NULL 值,将它们附加到结果表中。
-- 写法1
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...;
-- 写法2
SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...;
-- 示例
SELECT EMP_ID, NAME, DEPT FROM table1 LEFT OUTER JOIN table2 ON table1.ID = table2.EMP_ID;
3. SQLite Unions 合并
SQLite的 UNION 子句/运算符用于合并两个或多个 SELECT 语句的结果,不返回任何重复的行。
为了使用 UNION,每个 SELECT 被选择的列数必须是相同的,相同数目的列表达式,相同的数据类型,并确保它们有相同的顺序,但它们不必具有相同的长度。
未完待续………
4. SQLite NULL 值
SQLite 的 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
);
在这里,NOT NULL 表示列总是接受给定数据类型的显式值。这里有两个列我们没有使用 NOT NULL,这意味着这两个列不能为 NULL。
带有 NULL 值的字段在记录创建的时候可以保留为空。
-- 使用 UPDATE 语句来设置一些允许空值的值为 NULL
UPDATE COMPANY SET ADDRESS = NULL, SALARY = NULL where ID IN(6,7);
IS NOT NULL 运算符的用法,它用来列出所有 SALARY 不为 NULL 的记录:
SELECT ID, NAME, AGE, ADDRESS, SALARY FROM COMPANY WHERE SALARY IS NOT NULL;
5. SQLite AS 别名
您可以暂时把表或列重命名为另一个名字,这被称为别名。使用表别名是指在一个特定的 SQLite 语句中重命名表。重命名是临时的改变,在数据库中实际的表的名称不会改变。
- 表 别名
SELECT column1, column2.... FROM table_name AS new_table_name WHERE [condition];
-- 表别名 的用法,在这里我们使用 C 和 D 分别作为 COMPANY 和 DEPARTMENT 表的别名:
SELECT C.ID, C.NAME, C.AGE, D.DEPT FROM COMPANY AS C, DEPARTMENT AS D WHERE C.ID = D.EMP_ID;
- 列 别名
SELECT column_name AS new_colum_name FROM table_name WHERE [condition];
-- 列别名 的实例,在这里 COMPANY_ID 是 ID 列的别名,COMPANY_NAME 是 name 列的别名:
SELECT C.ID AS COMPANY_ID, C.NAME AS COMPANY_NAME, C.AGE, D.DEPT FROM COMPANY AS C, DEPARTMENT AS D WHERE C.ID = D.EMP_ID;
6. SQLite Trigger 触发器
未完待续………
7. SQLite Index 索引
索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。
索引有助于加快 SELECT 查询和 WHERE 子句,但它会减慢使用 UPDATE 和 INSERT 语句时的数据输入。索引可以创建或删除,但不会影响数据。
使用 CREATE INDEX 语句创建索引,它允许命名索引,指定表及要索引的一列或多列,并指示索引是升序排列还是降序排列。
索引也可以是唯一的,与 UNIQUE 约束类似,在列上或列组合上防止重复条目。
- 单列索引: 单列索引是一个只基于表的一个列上创建的索引。
CREATE INDEX index_name ON table_name (column_name);
-- 示例
CREATE INDEX salary_index ON COMPANY (salary);
- 唯一索引: 使用唯一索引不仅是为了性能,同时也为了数据的完整性。唯一索引不允许任何重复的值插入到表中。
CREATE UNIQUE INDEX index_name on table_name (column_name);
- 组合索引: 组合索引: 组合索引是基于一个表的两个或多个列上创建的索引。
CREATE INDEX index_name on table_name (column1, column2);
隐式索引: 隐式索引是在创建对象时,由数据库服务器自动创建的索引。索引自动创建为主键约束和唯一约束。
DROP INDEX 删除索引: 一个索引可以使用 SQLite 的 DROP 命令删除。当删除索引时应特别注意,因为性能可能会下降或提高。
DROP INDEX index_name;
8. SQLite Indexed By
“INDEXED BY index-name” 子句规定必须需要命名的索引来查找前面表中值。可以与 DELETE、UPDATE 或 SELECT 语句一起使用:
SELECT|DELETE|UPDATE column1, column2... INDEXED BY (index_name) table_name WHERE (CONDITION);
-- 示例
CREATE INDEX salary_index ON COMPANY(salary);
-- 示例
SELECT * FROM COMPANY INDEXED BY salary_index WHERE salary > 5000;
9. SQLite Alter 修改表
SQLite 的 ALTER TABLE 命令不通过执行一个完整的转储和数据的重载来修改已有的表。您可以使用 ALTER TABLE 语句重命名表,使用 ALTER TABLE 语句还可以在已有的表中添加额外的列。
在 SQLite 中,除了重命名表和在已有的表中添加列,ALTER TABLE 命令不支持其他操作。
-- 用来重命名已有的表的 ALTER TABLE 的基本语法如下:
ALTER TABLE database_name.table_name RENAME TO new_table_name;
-- 用来在已有的表中添加一个新的列的 ALTER TABLE 的基本语法如下:
ALTER TABLE database_name.table_name ADD COLUMN column_def...;
-- 使用 ALTER TABLE 语句重命名该表:
ALTER TABLE COMPANY RENAME TO OLD_COMPANY;
--上面的 SQLite 语句将重命名 COMPANY 表为 OLD_COMPANY。现在,让我们尝试在 OLD_COMPANY 表中添加一个新的列
ALTER TABLE OLD_COMPANY ADD COLUMN SEX char(1);
10. SQLite View 模板
视图(View)是一种虚表,允许用户实现以下几点:
- 用户或用户组查找结构数据的方式更自然或直观。
- 限制数据访问,用户只能看到有限的数据,而不是完整的表。
- 汇总各种表中的数据,用于生成报告。
SQLite 视图是只读的,因此可能无法在视图上执行 DELETE、INSERT 或 UPDATE 语句。
-- 创建视图
CREATE [TEMP | TEMPORARY] VIEW view_name AS SELECT column1, column2..... FROM table_name WHERE [condition];
| 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 |
//
-- 从 COMPANY 表创建视图的实例。视图只从 COMPANY 表中选取几列:
CREATE VIEW COMPANY_VIEW AS SELECT ID, NAME, AGE FROM COMPANY;
-- 查询 COMPANY_VIEW,与查询实际表的方式类似
SELECT * FROM COMPANY_VIEW;
删除视图
要删除视图,只需使用带有 view_name 的 DROP VIEW 语句。
DROP VIEW view_name;
DROP VIEW COMPANY_VIEW;
11. SQLite Transaction 事务
事务(Transaction)是一个对数据库执行工作单元。事务(Transaction)是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可以是由某种数据库程序自动完成。
11.1. 事务的属性
- 事务(Transaction)具有以下四个标准属性,通常根据首字母缩写为 ACID:
- 原子性(Atomicity):确保工作单位内的所有操作都成功完成,否则,事务会在出现故障时终止,之前的操作也会回滚到以前的状态。
- 一致性(Consistency):确保数据库在成功提交的事务上正确地改变状态。
- 隔离性(Isolation):使事务操作相互独立和透明。
- 持久性(Durability):确保已提交事务的结果或效果在系统发生故障的情况下仍然存在。
11.2. 事务控制
- BEGIN TRANSACTION:开始事务处理。
- COMMIT:保存更改,或者可以使用 END TRANSACTION 命令。
- ROLLBACK:回滚所做的更改。
- 事务控制命令只与 DML 命令 INSERT、UPDATE 和 DELETE 一起使用。他们不能在创建或删除表时使用,因为这些操作在数据库中是自动提交的。
11.3. BEGIN TRANSACTION 开始事务
事务(Transaction)可以使用 BEGIN TRANSACTION 命令或简单的 BEGIN 命令来启动。此类事务通常会持续执行下去,直到遇到下一个 COMMIT 或 ROLLBACK 命令。不过在数据库关闭或发生错误时,事务处理也会回滚。以下是启动一个事务的简单语法:
BEGIN;
or
BEGIN TRANSACTION;
11.4. COMMIT 提交/结束事务
COMMIT 命令是用于把事务调用的更改保存到数据库中的事务命令。
COMMIT 命令把自上次 COMMIT 或 ROLLBACK 命令以来的所有事务保存到数据库。
COMMIT;
or
END TRANSACTION;
11.5. ROLLBACK 撤销事务
ROLLBACK 命令是用于撤消尚未保存到数据库的事务的事务命令。
ROLLBACK 命令只能用于撤销自上次发出 COMMIT 或 ROLLBACK 命令以来的事务。
ROLLBACK;
-- 开始一个事务,并从表中删除 age = 25 的记录,最后,我们使用 ROLLBACK 命令撤消所有的更改。
BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
ROLLBACK;
-- 开始另一个事务,从表中删除 age = 25 的记录,最后我们使用 COMMIT 命令提交所有的更改。
BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
COMMIT;
12. SQLite 子查询(嵌套查询)
| 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 |
//
12.1. SELECT 语句中的子查询使用
SELECT * FROM COMPANY WHERE ID IN (SELECT ID FROM COMPANY WHERE SALARY > 45000) ;
- 结果
| ID | NAME | AGE | ADDRESS | SALARY |
|---|---|---|---|---|
| 4 | Mark | 25 | Rich-Mond | 65000.0 |
| 5 | David | 27 | Texas | 85000.0 |
12.2. INSERT 语句中的子查询使用
-- 语法
INSERT INTO table_name [ (column1 [, column2 ]) ]
SELECT [ *|column1 [, column2 ]
FROM table1 [, table2 ]
[ WHERE VALUE OPERATOR ]
假设 COMPANY_BKP 的结构与 COMPANY 表相似,且可使用相同的 CREATE TABLE 进行创建,只是表名改为 COMPANY_BKP。现在把整个 COMPANY 表复制到 COMPANY_BKP
-- 示例
INSERT INTO COMPANY_BKP SELECT * FROM COMPANY WHERE ID IN (SELECT ID FROM COMPANY) ;
12.3. UPDATE 语句中的子查询使用
-- 语法
UPDATE table SET column_name = new_value WHERE OPERATOR [ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME) WHERE)
有 COMPANY_BKP 表,是 COMPANY 表的备份。下面的实例把 COMPANY 表中所有 AGE 大于或等于 27 的客户的 SALARY 更新为原来的 0.50 倍:
-- 示例
UPDATE COMPANY SET SALARY = SALARY * 0.50 WHERE AGE IN (SELECT AGE FROM COMPANY_BKP WHERE AGE >= 27 );
12.4. DELETE 语句中的子查询使用
-- 语法
DELETE FROM TABLE_NAME WHERE OPERATOR [ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME WHERE )
有 COMPANY_BKP 表,是 COMPANY 表的备份。下面的实例删除 COMPANY 表中所有 AGE 大于或等于 27 的客户记录:
DELETE FROM COMPANY WHERE AGE IN (SELECT AGE FROM COMPANY_BKP WHERE AGE > 27 );
13. SQLite Autoincrement(自动递增)
- SQLite 的 AUTOINCREMENT 是一个关键字,用于表中的字段值自动递增。我们可以在创建表时在特定的列名称上使用.只能用于整型(INTEGER)字段。
-- 示例
CREATE TABLE COMPANY(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
14. SQLite 注入与安全
如果您的站点允许用户通过网页输入,并将输入内容插入到 SQLite 数据库中,这个时候您就面临着一个被称为 SQL 注入的安全问题。
注入通常在请求用户输入时发生,比如需要用户输入姓名,但用户却输入了一个 SQLite 语句,而这语句就会在不知不觉中在数据库上运行。
15. SQLite 日期 & 时间
SQLite 支持以下五个日期和时间函数:
| 序号 | 函数 | 实例 |
|---|---|---|
| 1 | date(timestring, modifier, modifier, …) | 以 YYYY-MM-DD 格式返回日期。 |
| 2 | time(timestring, modifier, modifier, …) | 以 HH:MM:SS 格式返回时间。 |
| 3 | datetime(timestring, modifier, modifier, …) | 以 YYYY-MM-DD HH:MM:SS 格式返回。 |
| 4 | julianday(timestring, modifier, modifier, …) | 这将返回从格林尼治时间的公元前 4714 年 11 月 24 日正午算起的天数。 |
| 5 | strftime(format, timestring, modifier, modifier, …) | 这将根据第一个参数指定的格式字符串返回格式化的日期。具体格式见下边讲解。 |
//
- 时间字符串
| 序号 | 时间字符串 | 实例 |
|---|---|---|
| 1 | YYYY-MM-DD | 2010-12-30 |
| 2 | YYYY-MM-DD HH:MM | 2010-12-30 12:10 |
| 3 | YYYY-MM-DD HH:MM:SS.SSS | 2010-12-30 12:10:04.100 |
| 4 | MM-DD-YYYY HH:MM | 30-12-2010 12:10 |
| 5 | HH:MM | 12:10 |
| 6 | YYYY-MM-DDTHH:MM | 2010-12-30 12:10 |
| 7 | HH:MM:SS | 12:10:01 |
| 8 | YYYYMMDD HHMMSS | 20101230 121001 |
| 9 | now | 2013-05-07 |
//
- 格式化
SQLite 提供了非常方便的函数 strftime() 来格式化任何日期和时间。您可以使用以下的替换来格式化日期和时间:
替换 描述 %d 一月中的第几天,01-31 %f 带小数部分的秒,SS.SSS %H 小时,00-23 %j 一年中的第几天,001-366 %J 儒略日数,DDDD.DDDD %m 月,00-12 %M 分,00-59 %s 从 1970-01-01 算起的秒数 %S 秒,00-59 %w 一周中的第几天,0-6 (0 is Sunday) %W 一年中的第几周,01-53 %Y 年,YYYY %% % symbol
-- 计算当前日期
SELECT date('now');
2017-12-13
-- 下面是计算当前月份的最后一天:
SELECT date('now','start of month','+1 month','-1 day');
2017-12-31
-- 下面是计算给定 UNIX 时间戳 1092941466 的日期和时间:
SELECT datetime(1092941466, 'unixepoch');
2004-08-19 18:51:06
-- 下面是计算给定 UNIX 时间戳 1092941466 相对本地时区的日期和时间:
SELECT datetime(1092941466, 'unixepoch', 'localtime');
2004-08-19 11:51:06
-- 下面是计算当前的 UNIX 时间戳:
SELECT strftime('%s','now');
1367926057
-- 下面是计算从 2004 年某一特定时刻以来的秒数:
SELECT strftime('%s','now') - strftime('%s','2004-01-01 02:34:56');
295001572
16. SQLite 常用函数
SQLite 有许多内置函数用于处理字符串或数字数据。下面列出了一些有用的 SQLite 内置函数,且所有函数都是大小写不敏感,
| 序号 | 函数 & 描述 |
|---|---|
| 1 | SQLite COUNT 函数 SQLite COUNT 聚集函数是用来计算一个数据库表中的行数。 |
| 2 | SQLite MAX 函数 SQLite MAX 聚合函数允许我们选择某列的最大值。 |
| 3 | SQLite MIN 函数 SQLite MIN 聚合函数允许我们选择某列的最小值。 |
| 4 | SQLite AVG 函数 SQLite AVG 聚合函数计算某列的平均值。 |
| 5 | SQLite SUM 函数 SQLite SUM 聚合函数允许为一个数值列计算总和。 |
| 6 | SQLite RANDOM 函数 SQLite RANDOM 函数返回一个介于 -9223372036854775808 和 +9223372036854775807 之间的伪随机整数。 |
| 7 | SQLite ABS 函数 SQLite ABS 函数返回数值参数的绝对值。 |
| 8 | SQLite UPPER 函数 SQLite UPPER 函数把字符串转换为大写字母。 |
| 9 | SQLite LOWER 函数 SQLite LOWER 函数把字符串转换为小写字母。 |
| 10 | SQLite LENGTH 函数 SQLite LENGTH 函数返回字符串的长度。 |
| 11 | SQLite sqlite_version 函数 SQLite sqlite_version 函数返回 SQLite 库的版本。 |
//表
| 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 |
//
16.1. SQLite COUNT 函数
-- SQLite COUNT 聚集函数是用来计算一个数据库表中的行数。
SELECT count(*) FROM COMPANY;
16.2. SQLite MAX 函数
-- SQLite MAX 聚合函数允许我们选择某列的最大值。
SELECT max(salary) FROM COMPANY;
16.3. SQLite MIN 函数
-- SQLite MIN 聚合函数允许我们选择某列的最小值。
SELECT min(salary) FROM COMPANY;
16.4. SQLite AVG 函数
-- SQLite AVG 聚合函数计算某列的平均值。下面是实例:
SELECT avg(salary) FROM COMPANY;
16.5. SQLite SUM 函数
-- SQLite SUM 聚合函数允许为一个数值列计算总和。下面是实例:
SELECT sum(salary) FROM COMPANY;
16.6. SQLite RANDOM 函数
-- SQLite RANDOM 函数返回一个介于 -9223372036854775808 和 +9223372036854775807 之间的伪随机整数。
SELECT random() AS Random;
16.7. SQLite ABS 函数
-- SQLite ABS 函数返回数值参数的绝对值。
sqlite> SELECT abs(5), abs(-15), abs(NULL), abs(0), abs("ABC");
16.8. SQLite UPPER 函数
-- SQLite UPPER 函数把字符串转换为大写字母
sqlite> SELECT upper(name) FROM COMPANY;
16.9. SQLite LOWER 函数
SQLite LOWER 函数把字符串转换为小写字母。
SELECT lower(name) FROM COMPANY;
16.10. SQLite LENGTH 函数
-- SQLite LENGTH 函数返回字符串的长度。下面是实例:
SELECT name, length(name) FROM COMPANY;