SQLite 数据库入门教程 (最新)
SQLite 数据库入门教程 (最新)
引言
在当今数据驱动的世界中,数据库管理系统 (DBMS) 对于任何需要存储、检索和管理数据的应用程序都至关重要。SQLite 作为一种轻量级、嵌入式、无服务器的数据库引擎,因其易用性、可移植性和高性能而广受欢迎。尤其是在移动应用开发、桌面应用开发、小型 Web 应用以及物联网 (IoT) 设备中,SQLite 都是一个理想的选择。
本教程将全面介绍 SQLite 的基础知识,并逐步指导您如何使用 SQLite。我们将涵盖从安装配置到创建数据库、表、执行 SQL 查询、数据操作以及更高级的主题。无论您是数据库新手还是有经验的开发者,希望快速掌握 SQLite,本教程都将为您提供坚实的基础。
1. 什么是 SQLite?
SQLite 是一个遵循 ACID(原子性、一致性、隔离性、持久性)事务的嵌入式关系型数据库管理系统。这意味着 SQLite 不需要单独的服务器进程或配置。数据库直接存储在单个磁盘文件中,这使得它具有极高的可移植性。
主要特点:
- 无服务器 (Serverless): SQLite 不需要独立的服务器进程。应用程序直接与数据库文件交互,无需网络配置或管理。
- 零配置 (Zero-Configuration): 无需复杂的安装或设置。只需包含 SQLite 库,即可开始使用。
- 自包含 (Self-Contained): SQLite 引擎是单个库文件,包含了所有必要的功能,易于集成到各种项目中。
- 事务性 (Transactional): 支持 ACID 事务,确保数据完整性和一致性。
- 完全兼容 SQL (SQL Compliant): 支持标准 SQL 语法,并提供了许多扩展功能。
- 跨平台 (Cross-Platform): 可在各种操作系统上运行,包括 Windows、macOS、Linux、Android 和 iOS。
- 开源 (Open Source): SQLite 是公共领域软件,可以免费使用、修改和分发。
- 轻量级 (Lightweight): 库文件小巧,内存占用少,非常适合资源受限的环境。
2. SQLite 的优势和局限性
优势:
- 简单易用: SQLite 的设计理念就是简单,易于学习和使用。
- 无需管理: 由于没有服务器进程,无需管理员维护、备份或监控。
- 高可移植性: 数据库文件可以轻松地在不同平台之间复制和共享。
- 嵌入式: 可以直接集成到应用程序中,无需额外的网络连接。
- 适用于小型应用: 对于数据量不大、并发访问不高的应用,SQLite 是一个理想的选择。
局限性:
- 并发性有限: SQLite 使用文件锁来处理并发访问。在高并发场景下,性能可能不如客户端/服务器数据库(如 MySQL 或 PostgreSQL)。
- 不适合大型数据集: 虽然 SQLite 可以处理 GB 级别的数据,但对于 TB 级别或更大的数据集,客户端/服务器数据库通常更适合。
- 缺少高级功能: 与大型数据库系统相比,SQLite 缺少一些高级功能,如存储过程、触发器(部分支持)和复杂的权限管理。
3. 安装和配置 SQLite
SQLite 的安装非常简单,通常有两种方式:
3.1. 下载预编译的二进制文件
- 访问 SQLite 下载页面: https://www.sqlite.org/download.html
- 选择适合您操作系统的二进制文件: 根据您的操作系统(Windows、macOS、Linux)选择相应的预编译二进制文件。
- 下载并解压: 下载压缩包并解压到您选择的目录。通常,您会得到
sqlite3.exe
(Windows)或sqlite3
(macOS/Linux)可执行文件。 - (可选) 将 SQLite 添加到系统 PATH: 为了方便在命令行中直接使用
sqlite3
命令,您可以将 SQLite 可执行文件所在的目录添加到系统 PATH 环境变量中。- Windows: 在“系统属性” -> “高级” -> “环境变量”中,编辑
Path
变量,添加 SQLite 目录。 - macOS/Linux: 编辑
~/.bashrc
或~/.zshrc
文件,添加export PATH=$PATH:/path/to/sqlite
(将/path/to/sqlite
替换为实际路径)。
- Windows: 在“系统属性” -> “高级” -> “环境变量”中,编辑
3.2. 使用包管理器安装
大多数 Linux 发行版和 macOS 都可以通过包管理器安装 SQLite:
- Debian/Ubuntu:
bash
sudo apt-get update
sudo apt-get install sqlite3 - Fedora/CentOS/RHEL:
bash
sudo yum install sqlite
或者
bash
sudo dnf install sqlite - macOS (Homebrew):
bash
brew install sqlite3
4. SQLite 命令行工具 (CLI)
安装完成后,您可以通过 SQLite 命令行工具 (CLI) 与数据库进行交互。
4.1. 启动 CLI
打开终端或命令提示符,输入 sqlite3
命令:
bash
sqlite3
如果一切正常,您将看到 SQLite 的版本信息和提示符:
SQLite version 3.42.0 2023-05-16 12:36:15
Enter ".help" for usage hints.
sqlite>
4.2. 创建或打开数据库
要创建或打开一个数据库,可以使用以下命令:
sqlite
sqlite3 mydatabase.db
- 如果
mydatabase.db
文件不存在,SQLite 将创建一个新的数据库文件。 - 如果文件已存在,SQLite 将打开该数据库。
注意: SQLite 数据库文件通常以 .db
、.sqlite
或 .sqlite3
为扩展名,但实际上任何扩展名都可以,甚至没有扩展名也可以。
4.3. 常用 CLI 命令
.help
: 显示帮助信息。.tables
: 列出当前数据库中的所有表。.schema [table_name]
: 显示表的结构(CREATE TABLE 语句)。 如果省略table_name
,则显示所有表的结构。.databases
: 显示当前连接的数据库。.mode [mode]
: 设置输出模式。常见的模式有:
*list
(默认): 以竖线分隔值。
*column
: 以列对齐的方式显示。
*csv
: 以逗号分隔值。
*html
: 以 HTML 表格的形式显示。
*line
: 每行一个字段。.headers [on|off]
: 控制是否显示列标题。.quit
或.exit
: 退出 SQLite CLI。.read filename
: 执行指定文件中的SQL语句。
5. SQL 基础
SQLite 支持标准的 SQL(结构化查询语言)语法。下面是一些基本的 SQL 语句:
5.1. 创建表 (CREATE TABLE)
sqlite
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
email TEXT,
age INTEGER
);
* CREATE TABLE
: 创建表的关键字。
* users
: 表名。
* id INTEGER PRIMARY KEY AUTOINCREMENT
:
* id
: 列名。
* INTEGER
: 数据类型(整数)。
* PRIMARY KEY
: 指定该列为主键(唯一标识每一行)。
* AUTOINCREMENT
: 自动递增(通常与主键一起使用)。
* username TEXT NOT NULL UNIQUE
:
* TEXT
: 数据类型(文本字符串)。
* NOT NULL
: 该列不能为空。
* UNIQUE
: 该列的值必须唯一。
* email TEXT
: 允许为空的文本列。
* age INTEGER
: 允许为空的整数列。
5.2. 插入数据 (INSERT INTO)
sqlite
INSERT INTO users (username, email, age) VALUES ('john_doe', '[email protected]', 30);
INSERT INTO users (username, email) VALUES ('jane_doe', '[email protected]');
* INSERT INTO
: 插入数据的关键字。
* users
: 表名。
* (username, email, age)
: 要插入数据的列(可选,如果省略,则按表中列的顺序插入)。
* VALUES
: 指定要插入的值。
5.3. 查询数据 (SELECT)
```sqlite
-- 查询所有列
SELECT * FROM users;
-- 查询特定列
SELECT username, email FROM users;
-- 添加 WHERE 子句进行条件过滤
SELECT * FROM users WHERE age > 25;
-- 使用 LIKE 进行模糊查询
SELECT * FROM users WHERE username LIKE 'john%'; -- 以 'john' 开头的用户名
-- 使用 ORDER BY 进行排序
SELECT * FROM users ORDER BY age DESC; -- 按年龄降序排序
-- 使用 LIMIT 限制结果数量
SELECT * FROM users LIMIT 5; -- 只返回前 5 行
-- 使用 AND 和 OR 组合条件
SELECT * FROM users WHERE age > 25 AND email LIKE '%example.com';
``
SELECT *
*: 查询所有列。
FROM users
*: 从
users表中查询。
WHERE
*: 条件过滤。
LIKE
*: 模糊查询。
%表示任意字符(零个或多个),
_表示单个字符。
ORDER BY
*: 排序。
DESC表示降序,
ASC(默认)表示升序。
LIMIT`: 限制结果数量。
*
5.4. 更新数据 (UPDATE)
sqlite
UPDATE users SET email = '[email protected]' WHERE id = 1;
* UPDATE
: 更新数据的关键字。
* users
: 表名。
* SET
: 指定要更新的列和值。
* WHERE
: 指定要更新的行(通常使用主键)。
5.5. 删除数据 (DELETE)
sqlite
DELETE FROM users WHERE id = 2;
* DELETE FROM
: 删除数据
* WHERE
: 指定删除条件
5.6. 删除表 (DROP TABLE)
sqlite
DROP TABLE users;
6. SQLite 数据类型
SQLite 采用动态类型系统,这意味着列的数据类型是灵活的,可以存储不同类型的值。但是,为了兼容性和性能考虑,建议在创建表时指定适当的数据类型。
SQLite 支持以下主要数据类型:
- NULL: 表示空值。
- INTEGER: 整数(有符号,根据值的大小占用 1、2、3、4、6 或 8 个字节)。
- REAL: 浮点数(8 字节 IEEE 浮点数)。
- TEXT: 文本字符串(使用数据库编码,如 UTF-8、UTF-16BE 或 UTF-16LE)。
- BLOB: 二进制数据(例如图像、文件等)。
7. SQLite 事务
SQLite 支持 ACID 事务,可以确保一组操作要么全部成功,要么全部失败,从而保持数据的一致性。
事务相关的关键字:
- BEGIN TRANSACTION; 或 BEGIN;: 开始一个事务。
- COMMIT;: 提交事务(将更改永久保存到数据库)。
- ROLLBACK;: 回滚事务(撤销自上次
BEGIN
以来的所有更改)。
示例:
```sqlite
BEGIN TRANSACTION;
INSERT INTO users (username, email) VALUES ('user1', '[email protected]');
INSERT INTO users (username, email) VALUES ('user2', '[email protected]');
-- 如果一切正常,提交事务
COMMIT;
-- 如果出现错误,可以回滚事务
-- ROLLBACK;
```
8. 使用编程语言操作 SQLite
SQLite 提供了各种编程语言的 API,可以方便地在应用程序中集成 SQLite 数据库。
8.1. Python (sqlite3 模块)
Python 内置了 sqlite3
模块,无需额外安装。
```python
import sqlite3
连接到数据库(如果不存在,则创建)
conn = sqlite3.connect('mydatabase.db')
创建一个游标对象
cursor = conn.cursor()
创建表
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
email TEXT
)
''')
插入数据
cursor.execute("INSERT INTO users (username, email) VALUES (?, ?)", ('john_doe', '[email protected]'))
提交更改
conn.commit()
查询数据
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall() # 获取所有行
for row in rows:
print(row)
关闭连接
conn.close()
**8.2 C/C++**
c++
你需要引入`#include <sqlite3.h>`头文件。
include
include
int main() {
sqlite3* db;
int rc = sqlite3_open("test.db", &db); // 打开(或创建)数据库
if (rc != SQLITE_OK) {
std::cerr << "无法打开数据库: " << sqlite3_errmsg(db) << std::endl;
sqlite3_close(db);
return 1;
}
const char* sql = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT);";
rc = sqlite3_exec(db, sql, nullptr, nullptr, nullptr); // 执行SQL语句
if (rc != SQLITE_OK) {
std::cerr << "SQL 错误: " << sqlite3_errmsg(db) << std::endl;
}
// 插入数据
sql = "INSERT INTO users (name) VALUES ('Alice');";
rc = sqlite3_exec(db, sql, nullptr, nullptr, nullptr);
// 查询
sql = "SELECT * FROM users;";
sqlite3_stmt* stmt;
// 预编译SQL语句
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, nullptr);
if(rc == SQLITE_OK){
// 逐行获取结果
while (sqlite3_step(stmt) == SQLITE_ROW) {
int id = sqlite3_column_int(stmt, 0);
const unsigned char* name = sqlite3_column_text(stmt, 1);
std::cout << "ID: " << id << ", Name: " << name << std::endl;
}
}
// 清理
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
```
8.3 Java (JDBC)
1. 下载 JDBC 驱动: 从 https://github.com/xerial/sqlite-jdbc 下载 SQLite JDBC 驱动的 JAR 文件。
2. 将 JAR 文件添加到项目: 将下载的 JAR 文件添加到您的 Java 项目的类路径中。
```java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SQLiteExample {
public static void main(String[] args) {
String url = "jdbc:sqlite:test.db"; // 数据库连接 URL
try (Connection conn = DriverManager.getConnection(url)) {
// 创建表
String sql = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)";
try (Statement stmt = conn.createStatement()) {
stmt.execute(sql);
}
// 插入数据 (预处理语句)
sql = "INSERT INTO users (name) VALUES (?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, "Bob");
pstmt.executeUpdate();
}
// 查询数据
sql = "SELECT * FROM users";
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
}
} catch (SQLException e) {
System.err.println("数据库错误: " + e.getMessage());
}
}
}
```
9. 高级主题
- 索引 (Indexes): 索引可以加快查询速度,尤其是在大型表中。
sqlite
CREATE INDEX idx_username ON users (username); - 视图 (Views): 视图是虚拟表,其内容由查询定义。
sqlite
CREATE VIEW user_emails AS SELECT username, email FROM users; - 触发器 (Triggers): 触发器是在特定数据库事件(INSERT、UPDATE、DELETE)发生时自动执行的 SQL 代码块 (SQLite 3.35+ 提供了较好的支持)。
```sqlite
CREATE TRIGGER update_email_log
AFTER UPDATE ON users
BEGIN
INSERT INTO email_log(user_id, old_email, new_email)
VALUES(OLD.id, OLD.email, NEW.email);
END;
-- 需要事先创建email_log表
CREATE TABLE email_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
old_email TEXT,
new_email TEXT,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
```
* 全文搜索 (FTS): SQLite 提供了 FTS5 扩展,支持全文搜索。
* 自定义函数 (User-Defined Functions): 可以使用 C/C++ 编写自定义函数并在 SQLite 中使用。
总结
SQLite 是一种功能强大且易于使用的嵌入式数据库引擎。它非常适合于小型项目、移动应用、桌面应用和嵌入式系统。本教程提供了 SQLite 的全面入门指南,包括安装、基本 SQL 语法、事务、编程语言 API 以及一些高级主题。通过学习本教程,您应该能够开始使用 SQLite 构建自己的应用程序。
希望这个详细的教程对您有所帮助! 如果您有任何其他问题,请随时提出。