SQLite 核心知识点讲解

目录

[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))

SELECT (读取 - Read)

聚合与分组 (Aggregation & Grouping)

UPDATE (更新 - Update)

[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 的主要特点

  1. 零配置 (Zero-Configuration):

    • 不需要安装、设置或管理一个单独的服务器进程。

    • 开箱即用。

  2. 便携性 (Portability):

    • 整个数据库存储在一个跨平台的文件中。

    • 你可以轻松地复制、移动或通过电子邮件发送数据库文件。

  3. 自包含 (Self-Contained):

    • 它不需要任何外部依赖。
  4. 事务性 (Transactional):

    • SQLite 中的所有事务都是完全符合 ACID 标准的(原子性、一致性、隔离性、持久性),确保数据安全可靠。
  5. 标准 SQL (Standard SQL):

    • SQLite 支持绝大多数 SQL92 标准,并添加了一些自己的扩展。
  6. 应用场景:

    • 移动应用: Android 和 iOS 都内置了 SQLite。

    • 桌面应用: 许多应用程序(如浏览器、Skype)用它来存储本地数据。

    • 嵌入式设备和物联网 (IoT): 非常适合资源有限的设备。

    • 小型网站: 适用于低到中等流量的网站。

    • 原型设计: 在开发早期快速搭建应用原型。

3. SQLite 数据类型(类型亲和力)

这是 SQLite 的一个独特之处。大多数数据库使用静态类型 (Static Typing),而 SQLite 使用动态类型 ,更准确地说是类型亲和力 (Type Affinity)

这意味着你存储在列中的值的数据类型取决于值本身,而不是列的声明类型。不过,在 CREATE TABLE 时声明类型仍然很重要,因为它会"建议"SQLite 倾向于使用哪种类型。

SQLite 只有 5 种主要的存储类型(亲和力):

  1. TEXT: 文本字符串,使用 UTF-8 编码。

  2. NUMERIC: 包含所有数字类型。SQLite 会根据数字的大小自动存储为整数或浮点数。

  3. INTEGER: 整数。

  4. REAL: 浮点数(小数)。

  5. 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)

更新表中的现有数据。

警告: UPDATEDELETE 语句一定要带 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 (主键):

    • 唯一标识表中的每一行。

    • 自动包含 UNIQUENOT 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 查询并返回结果。

为什么使用视图?

  1. 简化复杂查询: 将一个复杂的多表连接(JOIN)查询保存为一个视图,之后你就可以像查询一个普通表一样查询它。

  2. 安全性: 可以只暴露表中的特定列或行给用户,隐藏敏感数据。

  3. 数据抽象: 即使底层表的结构改变了,只要视图的输出不变,依赖视图的应用程序就无需修改。

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;
相关推荐
小宋10213 小时前
Neo4j-图数据库入门图文保姆攻略
数据库·neo4j
lang201509283 小时前
Spring数据库连接控制全解析
java·数据库·spring
十八岁讨厌编程3 小时前
【后端SQL训练营】高频 SQL 50 题(基础版·上篇)
数据库·sql
迷失的walker4 小时前
【Qt C++ QSerialPort】QSerialPort fQSerialPortInfo::availablePorts() 执行报错问题解决方案
数据库·c++·qt
程序新视界4 小时前
什么是OLTP ,MySQL是如何支持OLTP的?
数据库·后端·mysql
pen-ai4 小时前
【数据工程】14. Stream Data Processing
数据库·oracle
倔强的石头1065 小时前
【金仓数据库】ksql 指南(三) —— 创建与管理表空间和模式
数据库·金仓数据库
金仓拾光集5 小时前
__金仓数据库平替MongoDB:银行存款系统国产化实践__
数据库·mongodb
流烟默5 小时前
MongoDB入门指南基础篇
数据库·mongodb