目录
[1. 什么是 SQLite?](#1. 什么是 SQLite?)
[2. SQLite 的主要特点](#2. SQLite 的主要特点)
[3. SQLite 数据类型(类型亲和力)](#3. SQLite 数据类型(类型亲和力))
[4. 核心 SQL 命令](#4. 核心 SQL 命令)
[4.1 DDL (数据定义语言)](#4.1 DDL (数据定义语言))
[CREATE TABLE (创建表)](#CREATE TABLE (创建表))
[DROP TABLE (删除表)](#DROP TABLE (删除表))
[ALTER TABLE (修改表)](#ALTER TABLE (修改表))
[4.2 DML (数据操作语言) - CRUD](#4.2 DML (数据操作语言) - CRUD)
[INSERT INTO (创建 - Create)](#INSERT INTO (创建 - Create))
聚合与分组 (Aggregation & Grouping)
[DELETE FROM (删除 - Delete)](#DELETE FROM (删除 - Delete))
[5. 约束 (Constraints)](#5. 约束 (Constraints))
[6. 索引 (Indexes)](#6. 索引 (Indexes))
[7. 视图 (Views)](#7. 视图 (Views))
[CREATE VIEW (创建视图)](#CREATE VIEW (创建视图))
[DROP VIEW (删除视图)](#DROP VIEW (删除视图))
[8. 事务 (Transactions)](#8. 事务 (Transactions))
1. 什么是 SQLite?
SQLite 是一个 C 语言库,它实现了一个小型的、快速的、自包含的、高可靠性的、功能齐全的 SQL 数据库引擎。
与许多其他 SQL 数据库(如 MySQL, PostgreSQL)不同,SQLite 不是 一个客户端/服务器(Client/Server)架构的数据库。相反,它是一个嵌入式数据库。这意味着数据库引擎不是一个独立的进程,而是作为应用程序的一部分直接运行。
SQLite 数据库本身就是一个单一的磁盘文件 (通常以 .sqlite, .sqlite3 或 .db 结尾)。
2. SQLite 的主要特点
-
零配置 (Zero-Configuration):
-
不需要安装、设置或管理一个单独的服务器进程。
-
开箱即用。
-
-
便携性 (Portability):
-
整个数据库存储在一个跨平台的文件中。
-
你可以轻松地复制、移动或通过电子邮件发送数据库文件。
-
-
自包含 (Self-Contained):
- 它不需要任何外部依赖。
-
事务性 (Transactional):
- SQLite 中的所有事务都是完全符合 ACID 标准的(原子性、一致性、隔离性、持久性),确保数据安全可靠。
-
标准 SQL (Standard SQL):
- SQLite 支持绝大多数 SQL92 标准,并添加了一些自己的扩展。
-
应用场景:
-
移动应用: Android 和 iOS 都内置了 SQLite。
-
桌面应用: 许多应用程序(如浏览器、Skype)用它来存储本地数据。
-
嵌入式设备和物联网 (IoT): 非常适合资源有限的设备。
-
小型网站: 适用于低到中等流量的网站。
-
原型设计: 在开发早期快速搭建应用原型。
-
3. SQLite 数据类型(类型亲和力)
这是 SQLite 的一个独特之处。大多数数据库使用静态类型 (Static Typing),而 SQLite 使用动态类型 ,更准确地说是类型亲和力 (Type Affinity)。
这意味着你存储在列中的值的数据类型取决于值本身,而不是列的声明类型。不过,在 CREATE TABLE 时声明类型仍然很重要,因为它会"建议"SQLite 倾向于使用哪种类型。
SQLite 只有 5 种主要的存储类型(亲和力):
-
TEXT: 文本字符串,使用 UTF-8 编码。 -
NUMERIC: 包含所有数字类型。SQLite 会根据数字的大小自动存储为整数或浮点数。 -
INTEGER: 整数。 -
REAL: 浮点数(小数)。 -
BLOB: (Binary Large Object) 二进制数据,用于存储任何原始数据(如图片、文件)。
常见声明类型对应的亲和力:
-
INT,INTEGER,TINYINT... ->INTEGER -
CHAR,VARCHAR,TEXT... ->TEXT -
DOUBLE,FLOAT,REAL... ->REAL -
BOOLEAN-> 存储为INTEGER(0 或 1) -
DATE,DATETIME-> 存储为TEXT(ISO 格式),REAL(Julian 天数), 或INTEGER(Unix 时间戳)。推荐使用TEXT。
4. 核心 SQL 命令
4.1 DDL (数据定义语言)
CREATE TABLE (创建表)
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
email TEXT,
age INTEGER
);
DROP TABLE (删除表)
DROP TABLE IF EXISTS users;
ALTER TABLE (修改表)
主要用于重命名表或添加新列。
-- 重命名表
ALTER TABLE users RENAME TO app_users;
-- 添加新列
ALTER TABLE app_users ADD COLUMN created_at TEXT;
4.2 DML (数据操作语言) - CRUD
INSERT INTO (创建 - Create)
向表中插入新数据。
-- 插入所有列
INSERT INTO users (username, email, age)
VALUES ('alice', 'alice@example.com', 30);
-- 插入多行
INSERT INTO users (username, email, age)
VALUES
('bob', 'bob@example.com', 25),
('charlie', NULL, 42); -- email 可以为 NULL (如果没设置 NOT NULL)
SELECT (读取 - Read)
从表中查询数据。
-- 查询所有列
SELECT * FROM users;
-- 查询特定列
SELECT username, email FROM users;
-- 带条件的查询 (WHERE)
SELECT * FROM users WHERE age > 28;
-- 排序 (ORDER BY)
SELECT * FROM users ORDER BY age DESC; -- DESC (降序), ASC (升序,默认)
-- 限制数量 (LIMIT)
SELECT * FROM users LIMIT 10;
聚合与分组 (Aggregation & Grouping)
聚合函数对一组行进行计算,并返回一个单一的值。
-
COUNT(*): 计算总行数。 -
COUNT(column): 计算某列中非 NULL 值的数量。 -
SUM(column): 计算某列的总和(必须是数字)。 -
AVG(column): 计算某列的平均值(必须是数字)。 -
MAX(column): 找出某列的最大值。 -
MIN(column): 找出某列的最小值。
GROUP BY 语句通常与聚合函数一起使用,将结果集按一个或多个列进行分组。
-- 计算用户总数
SELECT COUNT(*) FROM users;
-- 计算平均年龄
SELECT AVG(age) FROM users;
-- 假设我们有一个 'department' (部门) 列
-- 统计每个部门有多少人
SELECT department, COUNT(*)
FROM users
GROUP BY department;
-- 找出每个部门的最高年龄
SELECT department, MAX(age)
FROM users
GROUP BY department;
UPDATE (更新 - Update)
更新表中的现有数据。
警告: UPDATE 和 DELETE 语句一定要带 WHERE 子句,否则它们将作用于表中的所有行!
-- 更新特定用户的信息
UPDATE users
SET email = 'new_email@example.com'
WHERE username = 'alice';
-- 更新多列
UPDATE users
SET age = age + 1, email = 'charlie@new.com'
WHERE username = 'charlie';
DELETE FROM (删除 - Delete)
从表中删除数据。
-- 删除特定用户
DELETE FROM users
WHERE username = 'bob';
5. 约束 (Constraints)
约束是在创建表时定义的规则,用于确保数据的完整性。
-
PRIMARY KEY(主键):-
唯一标识表中的每一行。
-
自动包含
UNIQUE和NOT NULL约束。 -
使用
INTEGER PRIMARY KEY AUTOINCREMENT可以创建一个自动递增的 ID。
-
-
NOT NULL(非空):-
确保该列的值不能为
NULL。 -
username TEXT NOT NULL
-
-
UNIQUE(唯一):-
确保该列中的所有值都是唯一的。
-
username TEXT NOT NULL UNIQUE
-
-
DEFAULT(默认值):-
如果插入数据时未提供该列的值,则使用默认值。
-
status TEXT DEFAULT 'active'
-
-
CHECK(检查):-
确保值满足特定条件。
-
age INTEGER CHECK (age > 0)
-
-
FOREIGN KEY(外键): -
用于在两个表之间建立联系,确保引用完整性。
-
(在 SQLite 中,外键约束默认是关闭的,需要通过
PRAGMA foreign_keys = ON;来开启)
6. 索引 (Indexes)
索引是一种数据结构,用于提高 SELECT 查询的速度。它就像一本书的目录。
-
优点: 大大加快数据检索(
SELECT)速度。 -
缺点: 减慢数据写入(
INSERT,UPDATE,DELETE)的速度,因为每次写入时也需要更新索引。
主键(PRIMARY KEY)和唯一约束(UNIQUE)会自动创建索引。
-- 为 users 表的 email 列创建一个索引
CREATE INDEX idx_user_email ON users (email);
7. 视图 (Views)
视图(View)是一个虚拟表 ,其内容由一个 SELECT 查询定义。
视图本身并不存储数据(它只是一个保存下来的查询)。当你查询视图时,数据库会实时执行这个 SELECT 查询并返回结果。
为什么使用视图?
-
简化复杂查询: 将一个复杂的多表连接(JOIN)查询保存为一个视图,之后你就可以像查询一个普通表一样查询它。
-
安全性: 可以只暴露表中的特定列或行给用户,隐藏敏感数据。
-
数据抽象: 即使底层表的结构改变了,只要视图的输出不变,依赖视图的应用程序就无需修改。
CREATE VIEW (创建视图)
-- 创建一个只显示 30 岁以上用户用户名和邮箱的视图
CREATE VIEW v_adult_users AS
SELECT username, email
FROM users
WHERE age > 30;
使用视图
创建后,你可以像查询普通表一样查询它:
-- 查询视图
SELECT * FROM v_adult_users;
-- 视图也可以带 WHERE 子句
SELECT * FROM v_adult_users WHERE username = 'alice';
DROP VIEW (删除视图)
DROP VIEW IF EXISTS v_adult_users;
8. 事务 (Transactions)
事务是一个工作单元,它包含一个或多个 SQL 语句。事务是原子性的:要么所有语句都成功执行,要么全部不执行(回滚)。
这对于保持数据的一致性至关重要(例如:银行转账)。
-- 开始一个事务
BEGIN TRANSACTION;
-- H假设从账户 1 向账户 2 转账 100 元
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 检查是否有错误发生
-- ... (如果在应用程序代码中,这里会有逻辑检查) ...
-- 如果一切正常,提交事务(永久保存更改)
COMMIT;
-- 如果发生错误,回滚事务(撤销所有更改)
-- ROLLBACK;