简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français

站内搜索

搜索

活动公告

11-02 12:46
10-23 09:32
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,将及时处理!
10-23 09:31
10-23 09:28
通知:签到时间调整为每日4:00(东八区)
10-23 09:26

SQLite3命令行实战教程 快速上手数据库管理的利器 从基础查询到复杂操作一步到位 轻松应对各种数据管理需求

3万

主题

423

科技点

3万

积分

大区版主

木柜子打湿

积分
31916

三倍冰淇淋无人之境【一阶】财Doro小樱(小丑装)立华奏以外的星空【二阶】⑨的冰沙

发表于 2025-9-29 17:00:00 | 显示全部楼层 |阅读模式 [标记阅至此楼]

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
SQLite3简介

SQLite是一个轻量级的、基于文件的 relational database management system(关系型数据库管理系统)。它无需独立的服务器进程,允许直接读写常规的磁盘文件,因此非常适合嵌入式设备和中小型应用程序。SQLite3是其第三个主要版本,提供了更多的功能和更好的性能。

SQLite3的命令行工具(sqlite3)是一个强大的交互式shell,允许用户直接操作SQLite数据库而无需编写复杂的程序。通过这个工具,你可以执行SQL查询、管理数据库结构、导入导出数据以及执行各种数据库管理任务。

安装SQLite3

在开始使用SQLite3命令行工具之前,你需要先安装它。SQLite3在大多数操作系统上都可以轻松安装:

Linux系统(基于Debian/Ubuntu)
  1. sudo apt-get update
  2. sudo apt-get install sqlite3
复制代码

Red Hat/CentOS/Fedora
  1. sudo yum install sqlite3  # 对于旧版系统
  2. # 或者
  3. sudo dnf install sqlite3  # 对于新版系统
复制代码

macOS

macOS通常预装了SQLite3,你可以通过以下命令检查:
  1. sqlite3 --version
复制代码

如果没有安装,可以使用Homebrew安装:
  1. brew install sqlite
复制代码

Windows

1. 访问SQLite官方网站(https://www.sqlite.org/download.html)
2. 下载适用于Windows的预编译二进制文件(sqlite-tools-win32-*.zip)
3. 解压文件并将其中的sqlite3.exe放置在你想要的目录中
4. 将该目录添加到系统的PATH环境变量中

安装完成后,你可以通过在终端输入以下命令来验证安装:
  1. sqlite3 --version
复制代码

SQLite3命令行基础

启动SQLite3

要启动SQLite3命令行工具,只需在终端中输入sqlite3:
  1. sqlite3
复制代码

这将启动SQLite3并显示一个提示符,如下所示:
  1. SQLite version 3.36.0 2021-06-18 18:36:39
  2. Enter ".help" for usage hints.
  3. Connected to a transient in-memory database.
  4. Use ".open FILENAME" to reopen on a persistent database.
  5. sqlite>
复制代码

此时,你已经连接到了一个临时的内存数据库。任何在此会话中创建的数据在退出后将会丢失。

创建和打开数据库

要创建一个新的数据库文件或打开现有的数据库,请使用以下命令:
  1. sqlite3 mydatabase.db
复制代码

如果mydatabase.db不存在,SQLite3将创建它。如果它已存在,SQLite3将打开它。

退出SQLite3

要退出SQLite3命令行界面,可以使用以下命令之一:
  1. .quit
  2. -- 或者
  3. .exit
复制代码

SQLite3命令与SQL语句的区别

在SQLite3命令行工具中,有两类命令:

1. SQLite3命令:以点(.)开头的命令,用于控制SQLite3命令行工具本身。
2. SQL语句:标准的SQL命令,用于操作数据库。

例如:
  1. -- 这是一个SQLite3命令,用于显示数据库中的表
  2. .tables
  3. -- 这是一个SQL语句,用于查询数据
  4. SELECT * FROM users;
复制代码

注意SQL语句通常以分号(;)结尾,而SQLite3命令不需要。

数据库基本操作

创建表

在SQLite中,使用CREATE TABLE语句来创建表。以下是一个创建用户表的示例:
  1. CREATE TABLE users (
  2.     id INTEGER PRIMARY KEY AUTOINCREMENT,
  3.     name TEXT NOT NULL,
  4.     email TEXT UNIQUE NOT NULL,
  5.     age INTEGER,
  6.     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  7. );
复制代码

让我们来解释一下这个表结构:

• id:整数类型,设置为主键,自动递增
• name:文本类型,不能为空
• email:文本类型,唯一且不能为空
• age:整数类型
• created_at:时间戳类型,默认值为当前时间

查看表结构

要查看表的结构,可以使用SQLite3的.schema命令:
  1. .schema users
复制代码

输出将类似于:
  1. CREATE TABLE users (
  2.     id INTEGER PRIMARY KEY AUTOINCREMENT,
  3.     name TEXT NOT NULL,
  4.     email TEXT UNIQUE NOT NULL,
  5.     age INTEGER,
  6.     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  7. );
复制代码

列出所有表

要查看数据库中的所有表,可以使用.tables命令:
  1. .tables
复制代码

修改表结构

SQLite支持有限形式的ALTER TABLE语句,主要用于添加列或重命名表:
  1. -- 添加新列
  2. ALTER TABLE users ADD COLUMN address TEXT;
  3. -- 重命名表
  4. ALTER TABLE users RENAME TO customers;
复制代码

注意:SQLite不支持删除列或修改列的数据类型。

删除表

要删除表,使用DROP TABLE语句:
  1. DROP TABLE IF EXISTS customers;
复制代码

IF EXISTS选项可以防止在表不存在时出错。

数据操作

插入数据

使用INSERT INTO语句向表中插入数据:
  1. INSERT INTO users (name, email, age) VALUES ('John Doe', 'john@example.com', 30);
  2. INSERT INTO users (name, email, age) VALUES ('Jane Smith', 'jane@example.com', 25);
  3. INSERT INTO users (name, email, age) VALUES ('Bob Johnson', 'bob@example.com', 35);
复制代码

你也可以一次插入多行数据:
  1. INSERT INTO users (name, email, age) VALUES
  2.     ('Alice Williams', 'alice@example.com', 28),
  3.     ('Charlie Brown', 'charlie@example.com', 32),
  4.     ('Diana Prince', 'diana@example.com', 29);
复制代码

查询数据

使用SELECT语句查询数据:
  1. -- 查询所有数据
  2. SELECT * FROM users;
  3. -- 查询特定列
  4. SELECT name, email FROM users;
  5. -- 使用WHERE子句过滤数据
  6. SELECT * FROM users WHERE age > 30;
  7. -- 使用ORDER BY排序结果
  8. SELECT * FROM users ORDER BY age DESC;
  9. -- 使用LIMIT限制结果数量
  10. SELECT * FROM users LIMIT 2;
  11. -- 组合使用
  12. SELECT name, email FROM users WHERE age >= 25 ORDER BY age ASC LIMIT 3;
复制代码

更新数据

使用UPDATE语句更新现有数据:
  1. -- 更新单个记录
  2. UPDATE users SET age = 31 WHERE name = 'John Doe';
  3. -- 更新多个记录
  4. UPDATE users SET age = age + 1 WHERE age < 30;
  5. -- 更新多个列
  6. UPDATE users SET name = 'Johnathan Doe', email = 'johnathan@example.com' WHERE id = 1;
复制代码

删除数据

使用DELETE语句删除数据:
  1. -- 删除特定记录
  2. DELETE FROM users WHERE id = 5;
  3. -- 删除满足条件的所有记录
  4. DELETE FROM users WHERE age > 40;
  5. -- 删除所有记录(保留表结构)
  6. DELETE FROM users;
复制代码

高级查询技巧

使用聚合函数

SQLite提供了多种聚合函数,如COUNT、SUM、AVG、MIN和MAX:
  1. -- 计算记录总数
  2. SELECT COUNT(*) FROM users;
  3. -- 计算平均年龄
  4. SELECT AVG(age) FROM users;
  5. -- 找出最大和最小年龄
  6. SELECT MAX(age), MIN(age) FROM users;
  7. -- 计算满足条件的记录数
  8. SELECT COUNT(*) FROM users WHERE age > 30;
复制代码

使用GROUP BY进行分组
  1. -- 按年龄分组并计算每组的用户数
  2. SELECT age, COUNT(*) FROM users GROUP BY age;
  3. -- 按年龄分组并计算平均年龄
  4. SELECT age, AVG(age) FROM users GROUP BY age;
复制代码

使用HAVING过滤分组
  1. -- 找出用户数超过1个的年龄组
  2. SELECT age, COUNT(*) as user_count FROM users GROUP BY age HAVING user_count > 1;
复制代码

使用JOIN连接表

首先,让我们创建另一个表并插入一些数据:
  1. CREATE TABLE orders (
  2.     id INTEGER PRIMARY KEY AUTOINCREMENT,
  3.     user_id INTEGER NOT NULL,
  4.     product TEXT NOT NULL,
  5.     amount REAL NOT NULL,
  6.     order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  7.     FOREIGN KEY (user_id) REFERENCES users(id)
  8. );
  9. INSERT INTO orders (user_id, product, amount) VALUES
  10.     (1, 'Laptop', 1200.00),
  11.     (1, 'Mouse', 25.00),
  12.     (2, 'Keyboard', 75.00),
  13.     (3, 'Monitor', 300.00),
  14.     (3, 'Webcam', 50.00);
复制代码

现在,我们可以使用JOIN来连接这两个表:
  1. -- 内连接:获取用户及其订单信息
  2. SELECT users.name, orders.product, orders.amount
  3. FROM users
  4. INNER JOIN orders ON users.id = orders.user_id;
  5. -- 左连接:获取所有用户及其订单信息(即使没有订单)
  6. SELECT users.name, orders.product, orders.amount
  7. FROM users
  8. LEFT JOIN orders ON users.id = orders.user_id;
  9. -- 使用表别名简化查询
  10. SELECT u.name, o.product, o.amount
  11. FROM users u
  12. INNER JOIN orders o ON u.id = o.user_id;
复制代码

使用子查询
  1. -- 查询年龄大于平均年龄的用户
  2. SELECT * FROM users WHERE age > (SELECT AVG(age) FROM users);
  3. -- 查询下过订单的用户
  4. SELECT * FROM users WHERE id IN (SELECT DISTINCT user_id FROM orders);
  5. -- 使用EXISTS
  6. SELECT * FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
复制代码

索引和性能优化

创建索引

索引可以显著提高查询性能,特别是在大型数据库中:
  1. -- 创建单列索引
  2. CREATE INDEX idx_users_email ON users(email);
  3. -- 创建复合索引
  4. CREATE INDEX idx_users_name_age ON users(name, age);
  5. -- 创建唯一索引
  6. CREATE UNIQUE INDEX idx_users_email_unique ON users(email);
复制代码

查看索引
  1. -- 查看表的所有索引
  2. .indexes users
  3. -- 查看数据库中的所有索引
  4. .indexes
复制代码

删除索引
  1. DROP INDEX idx_users_name_age;
复制代码

分析查询性能

SQLite3提供了.explain和.explain on命令来分析查询的执行计划:
  1. -- 查看单个查询的执行计划
  2. EXPLAIN SELECT * FROM users WHERE email = 'john@example.com';
  3. -- 开启自动解释模式
  4. .explain on
  5. SELECT * FROM users WHERE email = 'john@example.com';
  6. .explain off
复制代码

数据导入和导出

导出数据为CSV
  1. -- 设置输出模式为CSV
  2. .mode csv
  3. -- 设置输出文件
  4. .output users.csv
  5. -- 执行查询并将结果导出到文件
  6. SELECT * FROM users;
  7. -- 恢复输出到屏幕
  8. .output stdout
复制代码

从CSV导入数据

假设你有一个名为new_users.csv的文件,内容如下:
  1. name,email,age
  2. Tom Wilson,tom@example.com,27
  3. Sarah Davis,sarah@example.com,33
  4. Mike Miller,mike@example.com,41
复制代码

你可以使用以下命令将其导入到数据库:
  1. -- 创建临时表
  2. CREATE TABLE temp_users (name TEXT, email TEXT, age INTEGER);
  3. -- 导入CSV数据
  4. .import new_users.csv temp_users
  5. -- 将数据插入到主表
  6. INSERT INTO users (name, email, age) SELECT name, email, age FROM temp_users;
  7. -- 删除临时表
  8. DROP TABLE temp_users;
复制代码

导出数据库为SQL文件
  1. -- 将整个数据库导出为SQL文件
  2. .output backup.sql
  3. .dump
  4. .output stdout
复制代码

从SQL文件导入数据库

在系统命令行中(不是SQLite3内部),可以使用以下命令:
  1. sqlite3 new_database.db < backup.sql
复制代码

事务处理

SQLite支持事务,允许你将多个操作作为一个原子单元执行:
  1. -- 开始事务
  2. BEGIN TRANSACTION;
  3. -- 执行多个操作
  4. INSERT INTO users (name, email, age) VALUES ('Eva Green', 'eva@example.com', 26);
  5. UPDATE users SET age = age + 1 WHERE name = 'John Doe';
  6. DELETE FROM users WHERE name = 'Bob Johnson';
  7. -- 提交事务
  8. COMMIT;
  9. -- 或者回滚事务
  10. -- ROLLBACK;
复制代码

事务可以确保数据库的一致性,如果事务中的任何操作失败,你可以回滚所有更改。

实用SQLite3命令

SQLite3提供了许多有用的命令来管理和查看数据库:

设置输出格式
  1. -- 设置输出模式为列(对齐显示)
  2. .mode column
  3. -- 设置列宽
  4. .width 5 20 30 10
  5. -- 设置输出模式为列表
  6. .mode list
  7. -- 设置输出模式为HTML
  8. .mode html
  9. -- 设置输出模式为插入语句
  10. .mode insert
复制代码

查看数据库信息
  1. -- 显示附加的数据库
  2. .databases
  3. -- 显示数据库架构
  4. .schema
  5. -- 显示特定表的架构
  6. .schema users
  7. -- 显示所有表和视图
  8. .tables
  9. -- 显示所有索引
  10. .indexes
复制代码

导入和导出
  1. -- 导入SQL文件
  2. .read script.sql
  3. -- 导出数据库到文件
  4. .backup backup.db
  5. -- 从备份恢复数据库
  6. .restore backup.db
复制代码

其他实用命令
  1. -- 显示帮助
  2. .help
  3. -- 显示或更改设置
  4. .show
  5. -- 执行Shell命令
  6. .shell ls -l
  7. -- 改变输出文件
  8. .output output.txt
  9. -- 改变当前工作目录
  10. .cd /path/to/directory
复制代码

常见问题和解决方案

1. 数据库被锁定

当多个进程尝试同时写入数据库时,可能会遇到”database is locked”错误。解决方案包括:
  1. -- 设置超时时间(毫秒)
  2. .timeout 5000
复制代码

或者确保没有其他进程正在使用数据库。

2. 外键约束不生效

默认情况下,SQLite不强制执行外键约束。要启用外键约束:
  1. PRAGMA foreign_keys = ON;
复制代码

3. 大小写敏感问题

SQLite默认对文本比较不区分大小写。如果需要区分大小写:
  1. -- 在查询中使用COLLATE BINARY
  2. SELECT * FROM users WHERE name = 'John' COLLATE BINARY;
复制代码

4. 日期和时间处理

SQLite没有专门的日期时间类型,但提供了一些函数来处理存储为TEXT、REAL或INTEGER的日期时间:
  1. -- 获取当前日期和时间
  2. SELECT date('now');
  3. SELECT time('now');
  4. SELECT datetime('now');
  5. -- 日期时间计算
  6. SELECT date('now', '+1 month');
  7. SELECT datetime('now', '-5 days');
复制代码

实战示例:构建一个简单的库存管理系统

让我们通过一个实际的例子来综合运用我们学到的知识。我们将创建一个简单的库存管理系统,包括产品、类别和库存记录。

1. 创建数据库和表
  1. -- 创建类别表
  2. CREATE TABLE categories (
  3.     id INTEGER PRIMARY KEY AUTOINCREMENT,
  4.     name TEXT NOT NULL UNIQUE,
  5.     description TEXT
  6. );
  7. -- 创建产品表
  8. CREATE TABLE products (
  9.     id INTEGER PRIMARY KEY AUTOINCREMENT,
  10.     name TEXT NOT NULL,
  11.     description TEXT,
  12.     price REAL NOT NULL,
  13.     category_id INTEGER,
  14.     FOREIGN KEY (category_id) REFERENCES categories(id)
  15. );
  16. -- 创建库存表
  17. CREATE TABLE inventory (
  18.     id INTEGER PRIMARY KEY AUTOINCREMENT,
  19.     product_id INTEGER NOT NULL,
  20.     quantity INTEGER NOT NULL DEFAULT 0,
  21.     last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  22.     FOREIGN KEY (product_id) REFERENCES products(id)
  23. );
  24. -- 创建交易记录表
  25. CREATE TABLE transactions (
  26.     id INTEGER PRIMARY KEY AUTOINCREMENT,
  27.     product_id INTEGER NOT NULL,
  28.     quantity INTEGER NOT NULL,
  29.     transaction_type TEXT NOT NULL, -- 'IN' 或 'OUT'
  30.     transaction_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  31.     notes TEXT,
  32.     FOREIGN KEY (product_id) REFERENCES products(id)
  33. );
复制代码

2. 插入示例数据
  1. -- 插入类别数据
  2. INSERT INTO categories (name, description) VALUES
  3.     ('Electronics', 'Electronic devices and gadgets'),
  4.     ('Clothing', 'Apparel and accessories'),
  5.     ('Books', 'Printed and digital books'),
  6.     ('Home & Kitchen', 'Items for home and kitchen use');
  7. -- 插入产品数据
  8. INSERT INTO products (name, description, price, category_id) VALUES
  9.     ('Laptop', 'High-performance laptop', 1200.00, 1),
  10.     ('Smartphone', 'Latest smartphone model', 800.00, 1),
  11.     ('T-Shirt', 'Cotton t-shirt', 20.00, 2),
  12.     ('Jeans', 'Denim jeans', 50.00, 2),
  13.     ('Fiction Novel', 'Bestselling fiction novel', 15.00, 3),
  14.     ('Cookbook', 'Recipes from around the world', 25.00, 3),
  15.     ('Blender', 'High-speed blender', 100.00, 4),
  16.     ('Knife Set', 'Professional kitchen knives', 75.00, 4);
  17. -- 插入初始库存数据
  18. INSERT INTO inventory (product_id, quantity) VALUES
  19.     (1, 10),
  20.     (2, 25),
  21.     (3, 50),
  22.     (4, 30),
  23.     (5, 40),
  24.     (6, 20),
  25.     (7, 15),
  26.     (8, 10);
复制代码

3. 创建视图简化查询
  1. -- 创建产品库存视图
  2. CREATE VIEW product_inventory AS
  3. SELECT
  4.     p.id,
  5.     p.name,
  6.     p.description,
  7.     p.price,
  8.     c.name AS category,
  9.     i.quantity,
  10.     i.last_updated
  11. FROM products p
  12. JOIN categories c ON p.category_id = c.id
  13. JOIN inventory i ON p.id = i.product_id;
  14. -- 创建低库存视图(库存少于20的产品)
  15. CREATE VIEW low_inventory AS
  16. SELECT
  17.     p.id,
  18.     p.name,
  19.     p.price,
  20.     c.name AS category,
  21.     i.quantity
  22. FROM products p
  23. JOIN categories c ON p.category_id = c.id
  24. JOIN inventory i ON p.id = i.product_id
  25. WHERE i.quantity < 20;
复制代码

4. 创建触发器自动更新库存
  1. -- 创建触发器:插入交易记录时自动更新库存
  2. CREATE TRIGGER update_inventory_after_transaction
  3. AFTER INSERT ON transactions
  4. FOR EACH ROW
  5. BEGIN
  6.     UPDATE inventory
  7.     SET quantity = quantity +
  8.         CASE NEW.transaction_type
  9.             WHEN 'IN' THEN NEW.quantity
  10.             WHEN 'OUT' THEN -NEW.quantity
  11.             ELSE 0
  12.         END,
  13.         last_updated = CURRENT_TIMESTAMP
  14.     WHERE product_id = NEW.product_id;
  15. END;
复制代码

5. 执行库存操作
  1. -- 记录进货(增加库存)
  2. INSERT INTO transactions (product_id, quantity, transaction_type, notes) VALUES
  3.     (1, 5, 'IN', 'New stock arrived'),
  4.     (3, 20, 'IN', 'Bulk purchase'),
  5.     (5, 15, 'IN', 'Reorder');
  6. -- 记录出货(减少库存)
  7. INSERT INTO transactions (product_id, quantity, transaction_type, notes) VALUES
  8.     (2, 3, 'OUT', 'Customer purchase'),
  9.     (4, 2, 'OUT', 'Customer purchase'),
  10.     (7, 1, 'OUT', 'Customer purchase');
复制代码

6. 查询库存状态
  1. -- 查看所有产品库存
  2. SELECT * FROM product_inventory;
  3. -- 查看低库存产品
  4. SELECT * FROM low_inventory;
  5. -- 按类别统计库存价值
  6. SELECT
  7.     c.name AS category,
  8.     COUNT(p.id) AS product_count,
  9.     SUM(i.quantity * p.price) AS total_value
  10. FROM products p
  11. JOIN categories c ON p.category_id = c.id
  12. JOIN inventory i ON p.id = i.product_id
  13. GROUP BY c.name
  14. ORDER BY total_value DESC;
  15. -- 查看特定产品的交易历史
  16. SELECT
  17.     t.transaction_date,
  18.     t.transaction_type,
  19.     t.quantity,
  20.     t.notes
  21. FROM transactions t
  22. JOIN products p ON t.product_id = p.id
  23. WHERE p.name = 'Laptop'
  24. ORDER BY t.transaction_date DESC;
复制代码

总结

SQLite3是一个功能强大且易于使用的数据库系统,其命令行工具提供了直观的方式来管理和查询数据。本教程从基础概念开始,逐步介绍了如何使用SQLite3命令行工具执行各种数据库操作,包括:

• 创建和管理数据库及表
• 执行基本的数据操作(增删改查)
• 使用高级查询技巧,如连接、子查询和聚合函数
• 优化查询性能通过索引
• 导入和导出数据
• 处理事务
• 解决常见问题

通过最后的实战示例,我们展示了如何结合这些知识来构建一个简单的库存管理系统,这应该能帮助你理解如何在实际应用中使用SQLite3。

随着你对SQLite3的进一步探索,你会发现它是一个灵活且强大的工具,适用于各种规模的项目,从简单的个人应用到复杂的企业系统。希望本教程能帮助你快速上手SQLite3命令行工具,成为你数据管理的得力助手。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

频道订阅

频道订阅

加入社群

加入社群

联系我们|TG频道|RSS

Powered by Pixtech

© 2025 Pixtech Team.