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. 下载预编译的二进制文件

  1. 访问 SQLite 下载页面: https://www.sqlite.org/download.html
  2. 选择适合您操作系统的二进制文件: 根据您的操作系统(Windows、macOS、Linux)选择相应的预编译二进制文件。
  3. 下载并解压: 下载压缩包并解压到您选择的目录。通常,您会得到 sqlite3.exe(Windows)或 sqlite3(macOS/Linux)可执行文件。
  4. (可选) 将 SQLite 添加到系统 PATH: 为了方便在命令行中直接使用 sqlite3 命令,您可以将 SQLite 可执行文件所在的目录添加到系统 PATH 环境变量中。
    • Windows: 在“系统属性” -> “高级” -> “环境变量”中,编辑 Path 变量,添加 SQLite 目录。
    • macOS/Linux: 编辑 ~/.bashrc~/.zshrc 文件,添加 export PATH=$PATH:/path/to/sqlite(将 /path/to/sqlite 替换为实际路径)。

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++**
你需要引入`#include <sqlite3.h>`头文件。
c++

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 构建自己的应用程序。

希望这个详细的教程对您有所帮助! 如果您有任何其他问题,请随时提出。

THE END