SQLite 速查表
通过实践实验室和真实场景学习 SQLite 数据库管理。LabEx 提供全面的 SQLite 课程,涵盖基本的 SQL 操作、数据操作、查询优化、数据库设计和性能调优。掌握轻量级数据库开发和高效数据管理。
数据库创建与连接
创建数据库:sqlite3 database.db
创建一个新的 SQLite 数据库文件。
# 创建或打开一个数据库
sqlite3 mydata.db
# 创建内存数据库(临时)
sqlite3 :memory:
# 使用命令创建数据库
.open mydata.db
# 显示所有已连接的数据库
.databases
# 显示所有表的结构
.schema
# 显示表列表
.tables
# 退出 SQLite
.exit
# 替代退出命令
.quit
数据库信息:.databases
列出所有已连接的数据库及其文件。
-- 连接另一个数据库
ATTACH DATABASE 'backup.db' AS backup;
-- 从已连接的数据库查询
SELECT * FROM backup.users;
-- 断开连接
DETACH DATABASE backup;
退出 SQLite: .exit 或 .quit
关闭 SQLite 命令行界面。
.exit
.quit
备份数据库:.backup
创建当前数据库的备份。
# 备份到文件
.backup backup.db
# 从备份恢复
.restore backup.db
# 导出到 SQL 文件
.output backup.sql
.dump
# 导入 SQL 脚本
.read backup.sql
表创建与结构
创建表:CREATE TABLE
使用列和约束创建一个新表。
-- 基本表创建
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE,
age INTEGER,
created_date DATE DEFAULT CURRENT_TIMESTAMP
);
-- 带外键的表
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
user_id INTEGER,
amount REAL,
FOREIGN KEY (user_id) REFERENCES users(id)
);
登录后即可答题并追踪学习进度
INTEGER PRIMARY KEY AUTOINCREMENT 在 SQLite 中做什么?数据类型:INTEGER, TEXT, REAL, BLOB
SQLite 使用动态类型和存储类来实现灵活的数据存储。
-- 常见数据类型
CREATE TABLE products (
id INTEGER, -- 整数
name TEXT, -- 文本字符串
price REAL, -- 浮点数
image BLOB, -- 二进制数据
active BOOLEAN, -- 布尔值(存储为 INTEGER)
created_at DATETIME -- 日期和时间
);
约束:PRIMARY KEY, NOT NULL, UNIQUE
定义约束以强制执行数据完整性和表关系。
CREATE TABLE employees (
id INTEGER PRIMARY KEY AUTOINCREMENT,
email TEXT NOT NULL UNIQUE,
department TEXT NOT NULL,
salary REAL CHECK(salary > 0),
manager_id INTEGER REFERENCES employees(id)
);
数据插入与修改
插入数据:INSERT INTO
添加单行或多行新记录到表中。
-- 插入单条记录
INSERT INTO users (name, email, age)
VALUES ('John Doe', 'john@email.com', 30);
-- 插入多条记录
INSERT INTO users (name, email, age) VALUES
('Jane Smith', 'jane@email.com', 25),
('Bob Wilson', 'bob@email.com', 35);
-- 插入所有列
INSERT INTO users VALUES
(NULL, 'Alice Brown', 'alice@email.com', 28, datetime('now'));
更新数据:UPDATE SET
根据条件修改现有记录。
-- 更新单列
UPDATE users SET age = 31 WHERE name = 'John Doe';
-- 更新多列
UPDATE users SET
email = 'newemail@example.com',
age = age + 1
WHERE id = 1;
-- 带子查询的更新
UPDATE products SET price = price * 1.1
WHERE category = 'Electronics';
登录后即可答题并追踪学习进度
删除数据:DELETE FROM
根据指定的条件从表中删除记录。
-- 删除特定记录
DELETE FROM users WHERE age < 18;
-- 删除所有记录(保留表结构)
DELETE FROM users;
-- 带子查询的删除
DELETE FROM orders
WHERE user_id IN (SELECT id FROM users WHERE active = 0);
Upsert: INSERT OR REPLACE
根据冲突插入新记录或更新现有记录。
-- 冲突时插入或替换
INSERT OR REPLACE INTO users (id, name, email)
VALUES (1, 'Updated Name', 'updated@email.com');
-- 冲突时插入或忽略
INSERT OR IGNORE INTO users (name, email)
VALUES ('Duplicate', 'existing@email.com');
登录后即可答题并追踪学习进度
INSERT OR REPLACE 和 INSERT OR IGNORE 有什么区别?数据查询与选择
基本查询:SELECT
使用带有各种选项的 SELECT 语句查询表中的数据。
-- 选择所有列
SELECT * FROM users;
-- 选择特定列
SELECT name, email FROM users;
-- 选择并使用别名
SELECT name AS full_name, age AS years_old FROM users;
-- 选择唯一值
SELECT DISTINCT department FROM employees;
登录后即可答题并追踪学习进度
SELECT DISTINCT 做什么?过滤:WHERE
使用各种条件和比较运算符过滤行。
-- 简单条件
SELECT * FROM users WHERE age > 25;
SELECT * FROM users WHERE name = 'John Doe';
-- 多重条件
SELECT * FROM users WHERE age > 18 AND age < 65;
SELECT * FROM users WHERE department = 'IT' OR salary > 50000;
-- 模式匹配
SELECT * FROM users WHERE email LIKE '%@gmail.com';
SELECT * FROM users WHERE name GLOB 'J*';
排序与限制:ORDER BY / LIMIT
对结果进行排序并限制返回的行数,以更好地管理数据。
-- 升序排序(默认)
SELECT * FROM users ORDER BY age;
-- 降序排序
SELECT * FROM users ORDER BY age DESC;
-- 多重排序
SELECT * FROM users ORDER BY department, salary DESC;
-- 限制结果
SELECT * FROM users LIMIT 10;
-- 带偏移量的限制(分页)
SELECT * FROM users LIMIT 10 OFFSET 20;
聚合函数:COUNT, SUM, AVG
对行组执行计算,用于统计分析。
-- 计数记录
SELECT COUNT(*) FROM users;
SELECT COUNT(DISTINCT department) FROM employees;
-- 求和与平均值
SELECT SUM(salary), AVG(salary) FROM employees;
-- 最小值和最大值
SELECT MIN(age), MAX(age) FROM users;
高级查询
分组:GROUP BY / HAVING
按指定标准对行进行分组,并过滤组以进行汇总报告。
-- 按单列分组
SELECT department, COUNT(*)
FROM employees
GROUP BY department;
-- 按多列分组
SELECT department, job_title, AVG(salary)
FROM employees
GROUP BY department, job_title;
-- 使用 HAVING 过滤组
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING avg_salary > 60000;
子查询
使用嵌套查询进行复杂的数据检索和条件逻辑。
-- 在 WHERE 子句中使用子查询
SELECT name FROM users
WHERE age > (SELECT AVG(age) FROM users);
-- 在 FROM 子句中使用子查询
SELECT dept, avg_salary FROM (
SELECT department as dept, AVG(salary) as avg_salary
FROM employees
GROUP BY department
) WHERE avg_salary > 50000;
-- EXISTS 子查询
SELECT * FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.id
);
连接:INNER, LEFT, RIGHT
使用各种连接类型组合来自多个表的数据,用于关系查询。
-- 内连接
SELECT u.name, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- 左连接(显示所有用户)
SELECT u.name, COUNT(o.id) as order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name;
-- 自连接
SELECT e1.name as employee, e2.name as manager
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.id;
集合操作:UNION / INTERSECT
使用集合操作组合多个查询的结果。
-- Union(合并结果)
SELECT name FROM customers
UNION
SELECT name FROM suppliers;
-- Intersect(共同结果)
SELECT email FROM users
INTERSECT
SELECT email FROM newsletter_subscribers;
-- Except(差集)
SELECT email FROM users
EXCEPT
SELECT email FROM unsubscribed;
索引与性能
创建索引:CREATE INDEX
在列上创建索引以加快查询速度并提高性能。
-- 单列索引
CREATE INDEX idx_user_email ON users(email);
-- 多列索引
CREATE INDEX idx_order_user_date ON orders(user_id, order_date);
-- 唯一索引
CREATE UNIQUE INDEX idx_product_sku ON products(sku);
-- 局部索引(带条件)
CREATE INDEX idx_active_users ON users(name) WHERE active = 1;
查询分析:EXPLAIN QUERY PLAN
分析查询执行计划以识别性能瓶颈。
# 分析查询性能
EXPLAIN QUERY PLAN SELECT * FROM users WHERE email = 'test@example.com';
-- 检查索引是否被使用
EXPLAIN QUERY PLAN SELECT * FROM orders WHERE user_id = 123;
数据库优化:VACUUM / ANALYZE
优化数据库文件并更新统计信息以获得更好的性能。
# 重建数据库以回收空间
VACUUM;
-- 更新索引统计信息
ANALYZE;
-- 检查数据库完整性
PRAGMA integrity_check;
性能设置:PRAGMA
通过 pragma 语句配置 SQLite 设置,以实现最佳性能和行为。
-- 设置日志模式以获得更好的性能
PRAGMA journal_mode = WAL;
-- 设置同步模式
PRAGMA synchronous = NORMAL;
-- 启用外键约束
PRAGMA foreign_keys = ON;
-- 设置缓存大小(以页为单位)
PRAGMA cache_size = 10000;
视图与触发器
视图:CREATE VIEW
创建代表存储查询的虚拟表,用于可重用的数据访问。
-- 创建一个简单视图
CREATE VIEW active_users AS
SELECT id, name, email
FROM users
WHERE active = 1;
-- 复杂视图带连接
CREATE VIEW order_summary AS
SELECT
u.name,
COUNT(o.id) as total_orders,
SUM(o.amount) as total_spent
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name;
-- 查询视图
SELECT * FROM active_users WHERE name LIKE 'J%';
-- 删除视图
DROP VIEW IF EXISTS order_summary;
使用视图
像操作常规表一样查询视图,以简化数据访问。
SELECT * FROM active_users;
SELECT * FROM order_summary WHERE total_spent > 1000;
触发器:CREATE TRIGGER
自动执行代码以响应数据库事件。
-- INSERT 触发器
CREATE TRIGGER update_user_count
AFTER INSERT ON users
BEGIN
UPDATE stats SET user_count = user_count + 1;
END;
-- UPDATE 触发器
CREATE TRIGGER log_salary_changes
AFTER UPDATE OF salary ON employees
BEGIN
INSERT INTO audit_log (table_name, action, old_value, new_value)
VALUES ('employees', 'salary_update', OLD.salary, NEW.salary);
END;
-- 删除触发器
DROP TRIGGER IF EXISTS update_user_count;
数据类型与函数
日期与时间函数
使用 SQLite 内置函数处理日期和时间操作。
-- 当前日期/时间
SELECT datetime('now');
SELECT date('now');
SELECT time('now');
-- 日期算术
SELECT date('now', '+1 day');
SELECT datetime('now', '-1 hour');
SELECT date('now', 'start of month');
-- 格式化日期
SELECT strftime('%Y-%m-%d %H:%M', 'now');
SELECT strftime('%w', 'now'); -- 星期几
字符串函数
使用各种字符串操作来处理文本数据。
-- 字符串操作
SELECT upper(name) FROM users;
SELECT lower(email) FROM users;
SELECT length(name) FROM users;
SELECT substr(name, 1, 3) FROM users;
-- 字符串连接
SELECT name || ' - ' || email as display FROM users;
SELECT printf('%s (%d)', name, age) FROM users;
-- 字符串替换
SELECT replace(phone, '-', '') FROM users;
数值函数
执行数学运算和计算。
-- 数学函数
SELECT abs(-15);
SELECT round(price, 2) FROM products;
SELECT random(); -- 随机数
-- 带数学的聚合
SELECT department, round(AVG(salary), 2) as avg_salary
FROM employees
GROUP BY department;
条件逻辑:CASE
在 SQL 查询中实现条件逻辑。
-- 简单的 CASE 语句
SELECT name,
CASE
WHEN age < 18 THEN 'Minor'
WHEN age < 65 THEN 'Adult'
ELSE 'Senior'
END as age_category
FROM users;
-- 在 WHERE 子句中使用 CASE
SELECT * FROM products
WHERE CASE WHEN category = 'Electronics' THEN price < 1000
ELSE price < 100 END;
事务与并发
事务控制
SQLite 事务完全符合 ACID,确保可靠的数据操作。
-- 基本事务
BEGIN TRANSACTION;
INSERT INTO users (name, email) VALUES ('Test User', 'test@example.com');
UPDATE users SET age = 25 WHERE name = 'Test User';
COMMIT;
-- 带回滚的事务
BEGIN;
DELETE FROM orders WHERE amount < 10;
-- 检查结果,如有需要则回滚
ROLLBACK;
-- 保存点用于嵌套事务
BEGIN;
SAVEPOINT sp1;
INSERT INTO products (name) VALUES ('Product A');
ROLLBACK TO sp1;
COMMIT;
锁定与并发
管理数据库锁定和并发访问以确保数据完整性。
# 检查锁定状态
PRAGMA locking_mode;
-- 设置 WAL 模式以获得更好的并发性
PRAGMA journal_mode = WAL;
-- 锁等待超时
PRAGMA busy_timeout = 5000;
-- 检查当前数据库连接
.databases
SQLite 命令行工具
数据库命令:.help
访问 SQLite 命令行帮助和可用点命令的文档。
# 显示所有可用命令
.help
# 显示当前设置
.show
# 设置输出格式
.mode csv
.headers on
导入/导出:.import / .export
在 SQLite 和外部文件之间传输各种格式的数据。
# 导入 CSV 文件
.mode csv
.import data.csv users
# 导出到 CSV
.headers on
.mode csv
.output users.csv
SELECT * FROM users;
结构管理:.schema / .tables
检查数据库结构和表定义,用于开发和调试。
# 显示所有表
.tables
# 显示特定表的结构
.schema users
# 显示所有结构
.schema
# 显示表信息
.mode column
.headers on
PRAGMA table_info(users);
输出格式化:.mode
控制查询结果在命令行界面中的显示方式。
# 不同的输出模式
.mode csv # 逗号分隔值
.mode column # 对齐的列
.mode html # HTML 表格格式
.mode json # JSON 格式
.mode list # 列表格式
.mode table # 表格格式(默认)
# 设置列宽
.width 10 15 20
# 将输出保存到文件
.output results.txt
SELECT * FROM users;
.output stdout
# 从文件读取 SQL
.read script.sql
# 切换数据库文件
.open another_database.db
配置与设置
数据库设置:PRAGMA
通过 pragma 语句控制 SQLite 的行为,以实现优化和配置。
-- 数据库信息
PRAGMA database_list;
PRAGMA table_info(users);
PRAGMA foreign_key_list(orders);
-- 性能设置
PRAGMA cache_size = 10000;
PRAGMA temp_store = memory;
PRAGMA mmap_size = 268435456;
-- 启用外键约束
PRAGMA foreign_keys = ON;
-- 设置安全删除模式
PRAGMA secure_delete = ON;
-- 检查约束
PRAGMA foreign_key_check;
安全设置
配置与安全相关的数据库选项和约束。
-- 启用外键约束
PRAGMA foreign_keys = ON;
-- 安全删除模式
PRAGMA secure_delete = ON;
-- 检查完整性
PRAGMA integrity_check;
安装与设置
下载与安装
下载 SQLite 工具并为您的操作系统设置命令行界面。
# 从 sqlite.org 下载
# Windows: sqlite-tools-win32-x86-*.zip
# Linux/Mac: 使用包管理器
# Ubuntu/Debian
sudo apt-get install sqlite3
# macOS 使用 Homebrew
brew install sqlite
# 验证安装
sqlite3 --version
创建您的第一个数据库
创建 SQLite 数据库文件,并使用简单命令开始处理数据。
# 创建新数据库
sqlite3 myapp.db
# 创建表并添加数据
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE
);
INSERT INTO users (name, email)
VALUES ('John Doe', 'john@example.com');
编程语言集成
使用内置或第三方库在各种编程语言中使用 SQLite。
# Python (内置 sqlite3 模块)
import sqlite3
conn = sqlite3.connect('mydb.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM users')
// Node.js (需要 sqlite3 包)
const sqlite3 = require('sqlite3')
const db = new sqlite3.Database('mydb.db')
db.all('SELECT * FROM users', (err, rows) => {
console.log(rows)
})
// PHP (内置 PDO SQLite)
$pdo = new PDO('sqlite:mydb.db');
$stmt = $pdo->query('SELECT * FROM users');