SQLite 是一款轻量级嵌入式数据库,语法简洁且兼容标准 SQL,同时有其独特特性。以下结合核心语法 和实用实例,帮助快速掌握其使用:
一、数据库基础操作
SQLite 数据库以单一文件存储,无需服务器,直接通过文件操作。
1. 创建 / 连接数据库
# 命令行中执行,若 test.db 不存在则创建,存在则连接
sqlite3 test.db
2. 查看数据库信息
-- 查看当前连接的数据库文件路径
.databases
-- 查看所有表(命令行辅助命令)
.tables
二、表操作(DDL)
1. 创建表(CREATE TABLE)
语法:
CREATE TABLE [IF NOT EXISTS] 表名 (
列名 数据类型 [约束],
...
[表级约束]
);
实例 :创建用户表 users 和订单表 orders
-- 用户表:含自增主键、非空、唯一约束
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY, -- 自增主键(默认ROWID别名)
name TEXT NOT NULL, -- 姓名非空
age INTEGER CHECK(age > 0), -- 年龄必须为正数
email TEXT UNIQUE, -- 邮箱唯一
reg_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 注册时间默认当前时间
);
-- 订单表:含外键关联用户表
CREATE TABLE IF NOT EXISTS orders (
order_id INTEGER PRIMARY KEY,
user_id INTEGER,
amount REAL NOT NULL, -- 订单金额(浮点数)
status TEXT DEFAULT 'pending', -- 状态默认“待支付”
-- 外键约束:关联users表的id,删除用户时级联删除订单
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-- 开启外键支持(SQLite默认关闭)
PRAGMA foreign_keys = ON;
2. 查看表结构
-- 查看表的列信息(字段名、类型、约束等)
PRAGMA table_info(users);
-- 查看建表语句(命令行)
.schema users
3. 修改表(ALTER TABLE)
SQLite 对 ALTER TABLE 支持有限,主要支持重命名表和添加列:
-- 重命名表
ALTER TABLE orders RENAME TO user_orders;
-- 给users表添加“性别”列
ALTER TABLE users ADD COLUMN gender TEXT CHECK(gender IN ('male', 'female', 'other'));
若需删除列或修改类型,需通过 "创建新表→迁移数据→删除旧表" 实现:
-- 示例:修改users表的age列为非空(原表可能有NULL)
CREATE TABLE IF NOT EXISTS users_new (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER NOT NULL CHECK(age > 0), -- 新增非空约束
email TEXT UNIQUE,
reg_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
gender TEXT CHECK(gender IN ('male', 'female', 'other'))
);
-- 迁移数据(将旧表age为NULL的设为默认值0)
INSERT INTO users_new SELECT id, name, COALESCE(age, 0), email, reg_time, gender FROM users;
-- 替换旧表
DROP TABLE users;
ALTER TABLE users_new RENAME TO users;
4. 删除表(DROP TABLE)
-- 删除表(若存在)
DROP TABLE IF EXISTS user_orders;
三、数据操作(DML)
1. 插入数据(INSERT)
-- 插入完整数据(按列顺序)
INSERT INTO users (name, age, email, gender)
VALUES ('张三', 28, 'zhangsan@test.com', 'male');
-- 插入部分列(未指定的列用默认值,如reg_time自动取当前时间)
INSERT INTO users (name, age, gender)
VALUES ('李四', 32, 'female');
-- 批量插入
INSERT INTO users (name, age, email)
VALUES
('王五', 25, 'wangwu@test.com'),
('赵六', 40, 'zhaoliu@test.com');
-- 插入订单(关联用户ID=1)
INSERT INTO orders (user_id, amount) VALUES (1, 99.9);
2. 查询数据(SELECT)
语法:
SELECT [DISTINCT] 列1, 列2...
FROM 表名
[JOIN 关联表 ON 条件] -- 连接查询
[WHERE 过滤条件]
[GROUP BY 分组列 HAVING 分组过滤]
[ORDER BY 排序列 [ASC|DESC]]
[LIMIT 数量 OFFSET 偏移量]; -- 分页
实例 1:基础查询
-- 查询所有用户的姓名和年龄
SELECT name, age FROM users;
-- 查询年龄>30的用户,按年龄降序排列
SELECT name, age FROM users WHERE age > 30 ORDER BY age DESC;
-- 去重查询所有存在的性别
SELECT DISTINCT gender FROM users;
实例 2:连接查询(用户 + 订单)
-- 查询用户姓名及其订单金额(内连接:只显示有订单的用户)
SELECT u.name, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- 左连接:显示所有用户,无订单则金额为NULL
SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
实例 3:分组与聚合
-- 按性别分组,统计每组人数和平均年龄
SELECT gender, COUNT(*) AS 人数, AVG(age) AS 平均年龄
FROM users
GROUP BY gender
HAVING 人数 > 1; -- 只显示人数>1的分组
实例 4:分页查询(第 2 页,每页 2 条)
-- LIMIT 2 OFFSET 2:跳过前2条,取2条(即第3-4条)
SELECT * FROM users ORDER BY id LIMIT 2 OFFSET 2;
3. 更新数据(UPDATE)
-- 将张三的年龄改为29
UPDATE users
SET age = 29
WHERE name = '张三';
-- 批量更新:将所有未填邮箱的用户邮箱设为默认值
UPDATE users
SET email = 'unknown@test.com'
WHERE email IS NULL;
4. 删除数据(DELETE)
-- 删除年龄<18的用户(若有外键级联,其订单也会被删除)
DELETE FROM users WHERE age < 18;
-- 清空表(保留表结构,自增主键不会重置)
DELETE FROM orders;
四、索引(加速查询)
对频繁查询的列创建索引(会降低插入 / 更新速度,需权衡)。
-- 给users表的email列创建唯一索引(已用UNIQUE约束可省略)
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email ON users(email);
-- 给订单表的user_id创建普通索引(加速关联查询)
CREATE INDEX IF NOT EXISTS idx_orders_user_id ON orders(user_id);
-- 删除索引
DROP INDEX IF EXISTS idx_orders_user_id;
五、事务(保证原子性)
用于批量操作,确保要么全成功,要么全失败。
-- 开始事务
BEGIN TRANSACTION;
-- 执行一系列操作(如转账:A减100,B加100)
UPDATE users SET balance = balance - 100 WHERE id = 1;
UPDATE users SET balance = balance + 100 WHERE id = 2;
-- 检查操作无误后提交(永久生效)
COMMIT;
-- 若出错,回滚(取消所有操作)
-- ROLLBACK;
六、常用函数与特性
-
日期时间函数:
-- 获取当前时间 SELECT CURRENT_TIMESTAMP; -- 2023-10-01 12:34:56 -- 格式化时间(如提取年份) SELECT STRFTIME('%Y', reg_time) AS 注册年份 FROM users; -
聚合函数 :
COUNT()、SUM()、AVG()、MAX()、MIN()例:SELECT MAX(amount) AS 最大订单金额 FROM orders; -
空值处理 :
COALESCE(列, 默认值)(若列为 NULL 则取默认值)例:SELECT name, COALESCE(email, '无邮箱') FROM users;
七、命令行常用辅助命令
-
.exit:退出 SQLite 命令行 -
.mode column:以列对齐格式显示查询结果 -
.header on:显示列名 -
.output result.txt:将查询结果输出到文件
通过以上语法和实例,可以覆盖 SQLite 日常使用的大部分场景。其轻量、无需配置的特性,非常适合嵌入式设备、移动应用和小型项目。