SQLite
SQLite
参考:
数据类型
数据类型 | 说明 |
---|---|
NULL | 0 |
INTEGER | 有符号整数,最多 8 字节 |
REAL | 8字节浮点数 |
TEXT | 字符,无限制 |
BLOB | 二进制对象 |
命令
连接与配置
sqlite3 数据库名.db
//创建或打开数据库
.open 数据库名.db
//打开数据库.mode column
//设置显示模式为柱.headers on
//开启表头显示.schema
//查看数据库结构.nullvalue NULL
//将 NULL 值显示为指定字符串.indices
//查看索引信息
数据库操作
参照隔壁MySQL,这里记几个例子算了
创建表
1 | create table students ( |
改表
1 | alter table students add email text; |
1 | create table newstudent as select * from stu; -- 复制表结构和数据,但不复制约束 |
加数据
1 | insert into student values (1, '张三', 18, 90, '2023-01-01'); |
改数据
1 | update student set score = 95 where name = '张三'; |
1 | delete from student where sid = 1; |
排序和分组
1 | select * from student order by score desc limit 2; -- 降序排列,显示前两条 |
1 | select info.id, info.name, info.age, info.score, dept.dname from info, dept where info.did = dept.did; -- 连接查询(隐式内连接) |
事务
命令 | 说明 |
---|---|
BEGIN | 开启事务 |
ROLLBACK | 回滚事务 |
COMMIT | 提交事务 |
SAVEPOINT 名称 | 创建保存点 |
ROLLBACK TO 名称 | 回滚到指定保存点 |
RELEASE 名称 | 释放保存点 |
1 | BEGIN; |
函数
聚合函数
命令 | 说明 |
---|---|
COUNT(列名) | 统计行数 |
SUM(列名) | 求和 |
AVG(列名) | 求平均值 |
MAX(列名) | 求最大值 |
MIN(列名) | 求最小值 |
select count(*) from student;
select sum(score) from student;
select avg(score) from student;
select max(score) from student;
select min(score) from student;
文本函数
命令 | 说明 |
---|---|
LENGTH(文本) | 返回文本长度 |
UPPER(文本) | 转换为大写 |
LOWER(文本) | 转换为小写 |
SUBSTR(文本, 开始位置, 长度) | 截取子字符串 |
REPLACE(文本, 旧文本, 新文本) | 替换文本 |
TRIM(文本) | 去掉首尾空格 |
CONCAT(文本1, 文本2, …) | 连接文本 |
INSTR(文本, 子文本) | 返回子文本位置 |
LEFT(文本, 长度) | 从左侧截取指定长度 |
RIGHT(文本, 长度) | 从右侧截取指定长度 |
REVERSE(文本) | 反转文本 |
SUBSTRING(文本, 开始位置, 长度) | 截取子字符串 |
select strftime('%Y-%m-%d %H:%M:%S', datetime('now','+8 hours')) as current_datetime;
select round(3.14159, 2) as rounded_value;
数值函数
命令 | 说明 |
---|---|
ROUND(数值, 小数位数) | 四舍五入 |
CEIL(数值) | 向上取整 |
FLOOR(数值) | 向下取整 |
ABS(数值) | 取绝对值 |
SQRT(数值) | 平方根 |
LOG(数值) | 自然对数 |
EXP(数值) | 指数函数 |
日期函数
命令 | 说明 |
---|---|
STRFTIME(格式, 时间戳) | 格式化时间 |
DATE(时间戳) | 提取日期 |
TIME(时间戳) | 提取时间 |
DATETIME(时间戳, 格式) | 格式化日期时间 |
JULIANDAY(日期) | 计算日期到儒略日的天数 |
STRFTIME(‘%Y-%m-%d %H:%M:%S’, DATETIME(‘now’, ‘+8 hours’)) | 获取当前时间 |
约束
约束 | 说明 |
---|---|
PRIMARY KEY | 主键,唯一且非空 |
NOT NULL | 非空 |
UNIQUE | 唯一 |
CHECK(表达式) | 检查约束 |
DEFAULT 值 | 默认值 |
FOREIGN KEY | 外键 |
触发器
触发器 | 说明 |
---|---|
BEFORE | 触发前 |
AFTER | 触发后 |
FOR EACH ROW | 行级触发器(一般默认) |
WHEN 表达式 | 触发条件 |
DO 语句 | 触发语句 |
BEGIN | 开始 |
END | 结束 |
OLD.列名 | 旧值 |
NEW.列名 | 新值 |
RAISE EXCEPTION ‘错误信息’ | 触发异常 |
create trigger 触发器名 before/after insert/update/delete on table_name [for each row] [when (condition)] [begin ... end];
create trigger update_score before update on student begin set NEW.score = OLD.score + 1; end;
create trigger check_age before insert on student begin if NEW.age < 0 or NEW.age > 100 then raise exception '年龄必须在0到100之间'; end if; end;
create trigger deldtu after delete on student begin delete from info where info.id = OLD.id; end;
日志
1 | create table info ( |
索引
1 | create index 索引名 on 表名(列名); |
啥时候用索引?
- 数据量很大
- 主要用于查询而不是修改
- 没啥NULL
比较适合建索引的列:
- 主键
- 经常需要排序
- 要用where,加速
参考
https://www.runoob.com/sqlite/sqlite-tutorial.html
后记
T*D老师要求实训用SQLite,所以我上集连夜编译的Qt驱动和上上集学的MySQL算是白搞了罢(悲