SQLite语法知识和使用实例

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;

六、常用函数与特性

  1. 日期时间函数

    复制代码
    -- 获取当前时间
    SELECT CURRENT_TIMESTAMP;  -- 2023-10-01 12:34:56
    -- 格式化时间(如提取年份)
    SELECT STRFTIME('%Y', reg_time) AS 注册年份 FROM users;
  2. 聚合函数COUNT()SUM()AVG()MAX()MIN()例:SELECT MAX(amount) AS 最大订单金额 FROM orders;

  3. 空值处理COALESCE(列, 默认值)(若列为 NULL 则取默认值)例:SELECT name, COALESCE(email, '无邮箱') FROM users;

七、命令行常用辅助命令

  • .exit:退出 SQLite 命令行

  • .mode column:以列对齐格式显示查询结果

  • .header on:显示列名

  • .output result.txt:将查询结果输出到文件

通过以上语法和实例,可以覆盖 SQLite 日常使用的大部分场景。其轻量、无需配置的特性,非常适合嵌入式设备、移动应用和小型项目。

相关推荐
艾斯比的日常1 小时前
JVM 内存结构:全面解析与面试重点
jvm·面试·职场和发展
w***4242 小时前
SQL-Server链接服务器访问Oracle数据
服务器·sql·oracle
大头an3 小时前
JVM 内存结构深度解析(上篇):核心原理与运行时数据区
jvm
稚辉君.MCA_P8_Java5 小时前
Gemini永久会员 Java HotSpot 虚拟机(JVM)的优点
java·jvm·后端
一只会写代码的猫9 小时前
面向高性能计算与网络服务的C++微内核架构设计与多线程优化实践探索与经验分享
java·开发语言·jvm
q***721913 小时前
oracle使用PLSQL导出表数据
数据库·oracle
数据库生产实战13 小时前
Oracle DG备库日志切换解析,Private strand flush not complete如何理解?(基础知识)
数据库·oracle
百***757413 小时前
从 SQL 语句到数据库操作
数据库·sql·oracle