当前位置: 首页 > news >正文

SQLite3常用语句汇总

SQLite 命令行工具(sqlite3 shell) 中的内置命令

命令作用说明
.open filename.db打开或创建一个 SQLite 数据库文件
.tables列出当前数据库中的所有表
.schema [table]查看某个表或所有表的建表语句(DDL)
.headers ON/OFF开启或关闭结果显示中的列标题
.read filename.sql执行指定的 SQL 文件内容
.exit / .quit退出 SQLite 命令行
.databases查看当前连接的数据库文件
.nullvalue NULL_REPLACEMENT设置 NULL 显示为什么字符串
.output filename.txt将查询结果输出到文件

基本操作语句

1.打开/创建数据库文件

SQLite 使用命令行或程序语言(如 Python、C 等)调用 SQLite 引擎来打开或创建数据库文件。文件不存在时会自动创建。

sqlite3 mydatabase.db

该命令会在当前目录中创建一个名为 mydatabase.db 的数据库文件(如果尚不存在),并进入 SQLite 的交互式终端。你可以在里面执行 SQL 命令。

2. 查看数据库中所有表

SELECT name FROM sqlite_master WHERE type='table';

或者使用 SQLite 命令行工具提供的快捷命令:

.tables

3. 查看表结构(PRAGMA 语句)

PRAGMA table_info(table_name);

示例:

PRAGMA table_info(users);
cid | name  | type    | notnull | dflt_value | pk
----+-------+---------+---------+------------+----
0   | id    | INTEGER | 0       | NULL       | 1
1   | name  | TEXT    | 0       | NULL       | 0
2   | age   | INTEGER | 0       | NULL       | 0

表相关操作

1. 创建表(CREATE TABLE

CREATE TABLE table_name (column1 datatype [constraints],column2 datatype [constraints],...
);

用于定义一个新的数据表,并指定字段名、数据类型和约束(如主键、非空等)。

CREATE TABLE users (id INTEGER PRIMARY KEY,name TEXT NOT NULL,age INTEGER
);

补充:查看某个表的建表语句. schema 表名

sqlite> .schema users
CREATE TABLE users (id INTEGER PRIMARY KEY,name TEXT NOT NULL,age INTEGER
);

2. 修改表结构(ALTER TABLE

SQLite 支持的 ALTER TABLE 功能比较有限,主要包括:

#修改表名
ALTER TABLE table_name RENAME TO new_table_name;
#新增列
ALTER TABLE table_name ADD COLUMN column_def;

示例:添加一个 email 字段

ALTER TABLE users ADD COLUMN email TEXT;sqlite> .schema users
CREATE TABLE users (id INTEGER PRIMARY KEY,name TEXT NOT NULL,age INTEGER,email TEXT
);

你会发现 email 字段已经添加在表结构末尾。注意:SQLite 不支持删除列或修改列类型。

3. 删除表(DROP TABLE

DROP TABLE [IF EXISTS] table_name;
DROP TABLE IF EXISTS users;

4. 复制表结构与数据

SQLite 没有 CREATE TABLE ... LIKE 语法,可以用以下方式复制结构和数据:

CREATE TABLE new_table AS SELECT * FROM old_table;

如果只想复制结构(不含数据):

CREATE TABLE new_table AS SELECT * FROM old_table WHERE 0;

数据操作语句

1. 插入数据(INSERT INTO

INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);

也可以省略列名(前提是所有列都有值):

INSERT INTO table_name VALUES (value1, value2, ...);

示例:

INSERT INFO uesrs (id, name, age, email) VALUES (1, "alice", 25, "a@.com");sqlite> SELECT * FROM users;
id | name  | age | email
---+-------+-----+--------------------
1  | Alice | 25  | a@.com

2. 更新数据(UPDATE

UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;

示例:

UPDATE users SET age = 26 WHRER id = 1;sqlite> SELECT * FROM users;
id | name  | age | email
---+-------+-----+--------------------
1  | Alice | 26  | a@.com

3. 删除数据(DELETE

DELETE FROM table_name WHERE condition;注意:如果不加 WHERE,会删除整张表的数据

示例:

sqlite> SELECT * FROM users;
id | name  | age | email
---+-------+-----+--------------------
1  | Alice | 26  | a@.comDELETE FROM users WHERE id = 1;sqlite> SELECT * FROM users;
-- 空表,无结果

4. 查询数据(SELECT

SELECT column1, column2, ... FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...];

SELECT * 表示查询所有列。

查询进阶

1. 条件筛选(WHERE

SELECT column1, column2 FROM table_name WHERE condition;

常用操作符包括:=, !=, >, <, >=, <=, LIKE, IN, BETWEEN, IS NULL 等。

示例:

SELECT * FROM users WHERE age > 25;id | name  | age | email
---+-------+-----+---------------------
2  | Bob   | 30  | bob@example.com
3  | Carol | 28  | carol@example.com

2. 排序(ORDER BY

SELECT * FROM table_name ORDER BY column [ASC|DESC];

示例:

SELECT * FROM users ORDER BY age DESC;id | name  | age | email
---+-------+-----+---------------------
2  | Bob   | 30  | bob@example.com
3  | Carol | 28  | carol@example.com
1  | Alice | 25  | alice@example.com

3. 分组与过滤(GROUP BY + HAVING

SELECT group_column, aggregate_function(...) FROM table_name GROUP BY group_column [HAVING condition];

示例:

SELECT age, COUNT(*) FROM users GROUP BY age HAVING COUNT(*) > 1;假设有两名用户都 30 岁
age | COUNT(*)
----+----------
30  | 2

4. 多表连接(JOIN

SELECT columns FROM table1
JOIN table2 ON table1.column = table2.column;

示例:

表users
id | name  | age | email
---+-------+-----+---------------------
2  | Bob   | 30  | bob@example.com
3  | Carol | 28  | carol@example.com
1  | Alice | 25  | alice@example.com
表orders
user_id | amount
--------+--------
2       | 100
3       | 150SELECT users.name, orders.amount
FROM users
JOIN orders ON users.id = orders.user_id;-- 输出:
name  | amount
------+--------
Bob   | 100
Carol | 150

5. 子查询与嵌套查询

SELECT * FROM table WHERE column IN (SELECT ... FROM ... WHERE ...);

示例:

SELECT name FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);输出:
name
-----
Carol

6. 分页查询(LIMIT / OFFSET

SELECT * FROM table_name LIMIT 限制行数 OFFSET 起始行偏移量;指令说明LIMIT:限制最多返回多少行结果。OFFSET:跳过前面多少行数据再开始返回(可选)。

例如在一个页面中只显示 10 条数据,就可以:

SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 0;   -- 第1页
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 10;  -- 第2页
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20;  -- 第3页

或者用更常见的公式:

LIMIT 每页条数 OFFSET (页码 - 1) * 每页条数

示例:

原始数据为:
id | name  | age
---+-------+-----
1  | Alice | 25
2  | Bob   | 30
3  | Carol | 28SELECT * FROM users ORDER BY id LIMIT 2 OFFSET 1;
按 id 排序后,跳过第1条数据,从第2条开始取,最多取2条。执行结果:
id | name  | age
---+-------+-----
2  | Bob   | 30
3  | Carol | 28

索引与性能

1.sqlite3中的索引是什么?

在 SQLite 中,索引是一种数据库对象,它的作用类似于书本的目录,可以加快查询特定数据的速度。索引会为一个或多个列生成一个排序的数据结构(通常是 B-tree),从而使查询更快。

2.索引的特性?

加速查询(尤其是 WHERE、JOIN、ORDER BY 等)

当你查询某张表时:

SELECT * FROM users WHERE age > 25;

如果 age 上有索引,SQLite 会用索引快速定位符合条件的数据,而不用全表扫描。

提升排序效率

SELECT * FROM users ORDER BY name;

如果 name 列已建索引,排序可以直接利用索引顺序完成,而无需临时排序。

加速多表连接(JOIN)

SELECT * FROM users JOIN orders ON users.id = orders.user_id;

如果 orders.user_id 建了索引,那么连接时匹配效率会更高。

不适用于频繁变动的字段

索引虽然能加速查询,但会减慢 INSERTUPDATEDELETE 的性能,因为每次数据改动,索引也要同步更新

3. 创建索引(CREATE INDEX

为单列创建索引

CREATE [UNIQUE] INDEX index_name ON table_name(column_name);UNIQUE 表示不允许重复值(可选)。

示例:

CREATE INDEX idx_users_age ON users(age);#查看是否命中索引
EXPLAIN QUERY PLAN SELECT * FROM users WHERE age > 25;
#输出
SEARCH TABLE users USING INDEX idx_users_age (age>?)
说明查询使用了你创建的索引。

为多列创建联合索引

CREATE INDEX index_name ON table_name(column1, column2, ...);

适用于查询中使用多个字段组合的情况。

遵守“最左前缀原则”

示例:

SELECT * FROM users WHERE name = 'Alice' AND age = 25;#查看是否命中索引
EXPLAIN QUERY PLAN SELECT * FROM users WHERE name = 'Alice' AND age = 25;
#输出
SEARCH TABLE users USING INDEX idx_users_name_age (name=? AND age=?)

最左前缀原则: 复合索引只有在查询中使用了从左到右的“最前面的列”时,SQLite 才会使用该索引来优化查询。

示例:

id | name  | age
---+-------+-----
1  | Alice | 25
2  | Bob   | 30
3  | Carol | 28#创建复合索引
CREATE INDEX idx_name_age ON users(name, age);

分别执行以下查询并查看是否命中索引

①使用 name(最左列),可以命中索引

EXPLAIN QUERY PLAN SELECT * FROM users WHERE name = 'Alice';SEARCH TABLE users USING INDEX idx_name_age (name=?)

②使用 name + age(最左列 + 第二列),仍命中索引

EXPLAIN QUERY PLAN SELECT * FROM users WHERE name = 'Alice' AND age = 30;SEARCH TABLE users USING INDEX idx_name_age (name=? AND age=?)

③只使用 age,不命中索引

EXPLAIN QUERY PLAN SELECT * FROM users WHERE age = 30;SCAN TABLE users

④使用 age + name(第二列 + 最左列),仍命中索引,顺序不影响

EXPLAIN QUERY PLAN SELECT * FROM users WHERE age = 30 AND name = 'Alice';SEARCH TABLE users USING INDEX idx_name_age (age=? AND name=?)

注意:复合索引 idx_name_age(name, age) 是一棵按 name 排序、再按 age 排序的 B 树结构。查询必须从最左的列开始匹配,否则无法用上这个索引。

4. 删除索引(DROP INDEX

DROP INDEX [IF EXISTS] index_name;

事务控制

1. 开始事务(BEGIN

BEGIN;
  • 用于开始一个事务。在事务开始后,所有的操作(如 INSERTUPDATEDELETE)都将在这个事务中进行。

  • 如果事务内的操作没有出现错误,事务可以被提交(COMMIT)。如果出错,可以回滚(ROLLBACK)整个事务。

2. 提交事务(COMMIT

COMMIT;

提交当前事务所做的所有更改。这会将事务中所有修改的数据写入数据库并使它们永久生效。

示例:提交事务

BEGIN;INSERT INTO users (name, age, city) VALUES ('Eve', 40, 'Chengdu');
UPDATE users SET age = 45 WHERE name = 'Alice';COMMIT;

3. 回滚事务(ROLLBACK

ROLLBACK;

如果在事务中执行某些操作时发生错误,可以使用 ROLLBACK 来撤销所有在当前事务中的操作,恢复到事务开始前的状态。

示例:回滚事务

BEGIN;INSERT INTO users (name, age, city) VALUES ('Eve', 40, 'Chengdu');
UPDATE users SET age = 45 WHERE name = 'Alice';-- 假设此时发生了错误,我们决定回滚事务
ROLLBACK;

事务回滚后,EveAlice 的更新都将被撤销,users 表中的数据保持不变。

4. 自动提交模式

  • 在默认情况下,SQLite 在每个独立的 SQL 语句后自动提交。也就是说,每次执行一条语句时,SQLite 会自动把它作为一个单独的事务提交。

  • 为了防止自动提交,可以显式地使用 BEGIN 开始事务,直到使用 COMMITROLLBACK

5. 提交或回滚事务的应用场景

  • 批量操作: 比如一次性插入大量数据,使用事务能够保证所有数据同时插入成功,避免数据不一致。

  • 处理失败的操作: 在多步操作中,如果中途某一步失败,ROLLBACK 可以保证整个操作的原子性。

事务控制的典型应用场景:

假设有一个转账操作,其中两个表分别是 accounts(账户余额)和 transactions(交易记录),我们需要确保转账操作成功或者完全回滚。

try {executeOrThrow(db, "BEGIN;");executeOrThrow(db, "UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A001';");// 故意出错:列名 balxxx 不存在executeOrThrow(db, "UPDATE accounts SET balxxx = balance + 100 WHERE account_id = 'A002';");executeOrThrow(db, "INSERT INTO transactions (from_account, to_account, amount) VALUES ('A001', 'A002', 100);");//没问题就提交executeOrThrow(db, "COMMIT;");std::cout << "Transaction committed.\n";} catch (const std::exception& ex) {std::cerr << ex.what() << "\n";//出错回滚sqlite3_exec(db, "ROLLBACK;", nullptr, nullptr, nullptr);std::cout << "Transaction rolled back.\n";}

视图与临时表

视图(VIEW)

视图是 虚拟的表,本质上是对一个 SELECT 查询结果的封装,它本身不存储数据,而是每次访问时执行背后的查询语句。它的存在意义主要在于以下几点:

1. 简化复杂查询

当你有一些经常要执行的复杂 JOIN子查询聚合查询 时,把它们写进视图,可以像操作普通表一样简单调用:

-- 查询最近30天订单金额前10的用户
SELECT * FROM top_users_last_30_days;

而不用每次都写长查询。

一个视图可以作为多个后续查询的中间层,避免重复 JOINGROUP BY 逻辑,提高可复用性和效率。

2. 增强可读性与可维护性

把复杂查询逻辑隐藏到视图中后,业务 SQL 更清晰:

-- 直接查视图
SELECT * FROM user_purchases_summary WHERE total_spent > 1000;

而不是写重复的 SQL 逻辑多处维护。

3.提高安全性

你可以只授予用户对视图的访问权限,而非对底层表的权限,从而达到权限隔离的效果。

创建视图:
CREATE [TEMP | TEMPORARY] VIEW view_name AS
SELECT ...;view_name:视图名称
SELECT ...:视图对应的查询语句
TEMP:可选,创建临时视图,仅在当前连接中可见

示例:创建一个只读用户信息视图

CREATE VIEW active_users AS
SELECT id, name, email
FROM users
WHERE status = 'active';

你可以像查询普通表一样使用视图:

SELECT * FROM active_users;
假设 users 表如下:
| id | name  | email                                   | status   |
| -- | ----- | --------------------------------------- | -------- |
| 1  | Alice | [alice@mail.com](mailto:alice@mail.com) | active   |
| 2  | Bob   | [bob@mail.com](mailto:bob@mail.com)     | inactive |
| 3  | Carol | [carol@mail.com](mailto:carol@mail.com) | active   |那么 active_users 视图返回:
| id | name  | email                                   |
| -- | ----- | --------------------------------------- |
| 1  | Alice | [alice@mail.com](mailto:alice@mail.com) |
| 3  | Carol | [carol@mail.com](mailto:carol@mail.com) |

 注意:如果你没有显式使用 TEMPTEMPORARY 关键字,那么你创建的视图就是持久视图

删除视图:
DROP VIEW active_users;

临时表(TEMP TABLE)

临时表是只在当前数据库连接中可见的表,连接关闭后自动销毁。它们的主要目的是用于临时数据的存储与处理,不污染正式的数据表结构。它的存在意义主要在于以下几点:

1. 存放中间结果,简化复杂操作

在处理多步 SQL 逻辑(如报表、分析、批量更新)时,临时表可以存放中间结果,让后续查询更清晰:

CREATE TEMP TABLE temp_summary AS
SELECT user_id, SUM(amount) AS total
FROM orders
GROUP BY user_id;

然后你可以继续基于 temp_summary 做筛选、排序等操作。

2. 提高性能,避免重复计算

有些数据在多个地方会用到,而计算代价较高(例如聚合、大量连接),你可以先写入临时表,然后反复查询:

-- 避免重复 JOIN 操作,提高整体查询速度
SELECT * FROM temp_result WHERE score > 80;

3.并发安全,每个连接互不干扰

SQLite 的临时表是连接隔离的

  • 多个连接可以使用同名临时表

  • 它们之间的数据互不影响

这使得临时表非常适合多线程/多连接场景下的临时数据隔离处理

总结:临时表的作用是为当前连接提供一个安全、高效、隔离的临时数据空间,专注于中间处理、性能优化与调试而不影响正式数据库结构与数据。

创建临时表:
CREATE TEMP TABLE temp_table_name (column1 TYPE,column2 TYPE,...
);
  • 临时表只在当前数据库连接中有效

  • 连接关闭后自动删除

  • 临时表与视图不同,它是真实存储数据的表,只是生命周期短

示例:创建并使用一个临时表

CREATE TEMP TABLE temp_orders (id INTEGER,product TEXT,quantity INTEGER
);INSERT INTO temp_orders VALUES (1, 'Book', 2);
INSERT INTO temp_orders VALUES (2, 'Pen', 5);SELECT * FROM temp_orders;查询结果(临时表内容):
| id | product | quantity |
| -- | ------- | -------- |
| 1  | Book    | 2        |
| 2  | Pen     | 5        |

视图 vs 临时表

项目视图(VIEW)临时表(TEMP TABLE)
本质基于 SELECT 的虚拟表,不存储数据存储真实数据的临时性表
是否持久存在是(除非使用 TEMP 创建)否,只在当前连接中存在,断开即销毁
数据存储不存储数据,每次使用实时查询底层表存储数据,像普通表一样支持增删改查
创建语法CREATE [TEMP] VIEW view_name AS ...CREATE TEMP TABLE table_name (...)
删除方式DROP VIEW view_name;自动销毁(连接关闭)或手动 DROP TABLE
生命周期持久(数据库文件的一部分)连接会话级,连接断开即清除
可更新性只读(除非符合可更新视图条件)可读可写,完全等同于普通表
典型用途封装复杂查询、简化 SQL、权限控制存储中间数据、性能优化、测试临时数据
是否支持索引否(依赖底层表索引)是(可为临时表单独建索引)
作用范围所有连接(持久视图)或当前连接(TEMP)当前连接
是否写入磁盘是(除 TEMP VIEW否(仅存储在内存或临时磁盘空间)

 

常用函数与表达式

字符串处理函数

函数名功能说明示例 SQL返回结果
length(X)返回字符串 X 的字符长度SELECT length('SQLite');6
substr(X,Y,Z)提取 X 中从第 Y 位开始的 Z 个字符SELECT substr('SQLite3', 2, 4);'QLit'
lower(X) / upper(X)转换为小写 / 大写SELECT upper('abc');'ABC'
trim(X)去除前后空白字符SELECT trim(' abc ');'abc'
replace(X,Y,Z)X 中所有 Y 替换为 ZSELECT replace('hello', 'l', 'L');'heLLo'
instr(X, Y)查找 YX 中首次出现的位置(1 开始)SELECT instr('abcdef', 'cd');3
printf(FMT, ...)格式化字符串,类似 C 的 printfSELECT printf('%.2f', 3.14159);'3.14'
hex(X)将字符串或 BLOB 转为十六进制表示SELECT hex('abc');'616263'

数值函数

函数名功能说明示例 SQL返回结果
abs(X)绝对值SELECT abs(-10);10
round(X[,Y])四舍五入到 Y 位小数,默认 0SELECT round(3.14159, 2);3.14
random()返回一个大范围随机整数SELECT random();随机整数
random() % N控制随机值范围(常配合 abs 使用)SELECT abs(random() % 10);0 ~ 9
typeof(X)返回数据类型(如 integer, text)SELECT typeof(3.14);'real'
coalesce(X, Y, ...)返回第一个非 NULL 的值SELECT coalesce(NULL, '', 'abc');''
nullif(X, Y)如果 X == Y,返回 NULL,否则返回 XSELECT nullif(5, 5);NULL
sign(X)不内置,可用 CASE 模拟,判断数正负SELECT CASE WHEN X > 0 THEN 1 WHEN X < 0 THEN -1 ELSE 0 END-1 / 0 / 1

日期与时间函数

函数名功能说明示例 SQL返回结果
date('now')当前日期SELECT date('now');2025-05-08
datetime('now')当前日期时间SELECT datetime('now');2025-05-08 13:50:00
time('now')当前时间(不含日期)SELECT time('now');13:50:00
strftime('%Y-%m-%d', 'now')日期格式化输出SELECT strftime('%Y-%m-%d', 'now');2025-05-08
strftime('%s', 'now')当前时间戳(秒)SELECT strftime('%s', 'now');UNIX 时间戳
strftime('%w', 'now')星期几(0 表示周日)SELECT strftime('%w', 'now');4(周四)
julianday('now')当前日期的儒略日表示法(浮点)SELECT julianday('now');2460451.08
datetime('now', '+7 days')时间加减(也支持 -2 hours, +1 month 等)SELECT datetime('now', '-1 day');昨天的时间

 聚合函数

函数名功能说明示例 SQL返回结果
COUNT(X)非 NULL 值数量SELECT COUNT(name) FROM users;42(示例)
COUNT(*)所有行数量SELECT COUNT(*) FROM users;100
SUM(X)求和SELECT SUM(price) FROM orders;2300.50
AVG(X)平均值SELECT AVG(score) FROM exams;82.5
MAX(X)最大值SELECT MAX(age) FROM people;64
MIN(X)最小值SELECT MIN(age) FROM people;18

 条件表达式

表达式功能说明示例 SQL返回结果
CASE WHEN ... THEN ...条件判断(if-else)SELECT CASE WHEN score > 90 THEN '优' WHEN score > 60 THEN '中' ELSE '差' END'优' / '中' / '差'
CASE X WHEN A THEN ...值匹配(更紧凑形式)SELECT CASE grade WHEN 'A' THEN 4 WHEN 'B' THEN 3 ELSE 0 END4 / 3 / 0
coalesce(X, Y, Z)返回第一个非 NULL 值SELECT coalesce(NULL, NULL, 'hello');'hello'
nullif(X, Y)如果 X == Y 则返回 NULL,否则返回 XSELECT nullif(5, 5);NULL
IFNULL(X, Y)如果 X 是 NULL,则返回 Y,否则返回 X(别名)SELECT ifnull(NULL, 'default');'default'

 示例:

下面是一个综合性 SQL 示例,它模拟了一个电商订单分析的场景

建表:

-- 创建客户表
CREATE TABLE customers (id INTEGER PRIMARY KEY,           -- 客户 ID,主键name TEXT,                        -- 客户名称email TEXT                        -- 客户邮箱
);-- 创建订单表
CREATE TABLE orders (id INTEGER PRIMARY KEY,           -- 订单 ID,主键customer_id INTEGER,              -- 关联客户 IDproduct_name TEXT,                -- 商品名称price REAL,                       -- 商品单价quantity INTEGER,                 -- 购买数量order_date TEXT,                  -- 下单时间(格式:YYYY-MM-DD HH:MM:SS)FOREIGN KEY (customer_id) REFERENCES customers(id)  -- 外键关联客户表
);

插入数据: 

-- 插入客户
INSERT INTO customers (id, name, email) VALUES
(1, 'Alice', 'alice@example.com'),
(2, 'Bob', 'bob@example.net'),
(3, 'Charlie', 'charlie@example.org');-- 插入订单
INSERT INTO orders (customer_id, product_name, price, quantity, order_date) VALUES
(1, 'Laptop', 899.99, 1, '2025-01-15 10:00:00'),
(1, 'Mouse', 19.99, 2, '2025-02-10 12:30:00'),
(2, 'Keyboard', 49.99, 1, '2025-03-05 14:20:00'),
(2, 'Monitor', 199.99, 1, '2025-03-06 15:10:00'),
(2, 'USB Cable', 9.99, 3, '2025-04-01 09:00:00'),
(3, 'Desk Chair', 129.99, 1, '2025-01-22 16:00:00');

 sql

SELECTc.name AS customer_name,  -- 客户名称upper(substr(c.email, 1, instr(c.email, '@') - 1)) AS email_user,  -- 提取 email @ 前部分并转为大写COUNT(o.id) AS total_orders,  -- 订单总数SUM(o.price * o.quantity) AS total_spent,  -- 总消费金额round(AVG(o.price * o.quantity), 2) AS avg_order_value,  -- 平均订单金额(保留2位小数)MAX(o.order_date) AS last_order_date,  -- 最后一笔订单的时间strftime('%Y-%m', o.order_date) AS order_month,  -- 订单月份(用于聚合)-- 消费金额区间分级:VIP / Gold / RegularCASE WHEN SUM(o.price * o.quantity) > 1000 THEN 'VIP'WHEN SUM(o.price * o.quantity) > 500 THEN 'Gold'ELSE 'Regular'END AS customer_levelFROMcustomers c
LEFT JOINorders o ON c.id = o.customer_id  -- 关联订单表
WHEREo.order_date >= date('now', '-6 months')  -- 仅查询最近6个月的订单
GROUP BYc.id
HAVINGtotal_orders > 0  -- 排除没有订单的客户
ORDER BYtotal_spent DESC  -- 按总消费金额降序排列
LIMIT 10;  -- 仅显示前10个客户

SQLite 专有特性

AUTOINCREMENT 和 INTEGER PRIMARY KEY

  • INTEGER PRIMARY KEY 是 SQLite 中用于定义主键并且自动增长的特殊类型。

  • 如果你定义了某个列为 INTEGER PRIMARY KEY,当向表中插入一行数据时SQLite 会自动为该列赋值(自增),无需显式使用 AUTOINCREMENT

  • AUTOINCREMENT 是一种“更严格”的版本,它会防止重复使用已删除的 ID。

特性INTEGER PRIMARY KEYINTEGER PRIMARY KEY AUTOINCREMENT
自动增长
会复用已删除的 ID? 会不会
是否推荐? 推荐(性能更好)不推荐,除非必须保证唯一不复用

示例:

-- 普通自增主键
CREATE TABLE users (id INTEGER PRIMARY KEY,name TEXT
);-- 带 AUTOINCREMENT 的主键
CREATE TABLE logs (id INTEGER PRIMARY KEY AUTOINCREMENT,message TEXT
);

WITHOUT ROWID 表

SQLite 默认使用一个隐藏的 rowid 来标识每一行。但你可以显式使用 WITHOUT ROWID 表来:

  • 减少存储开销(适合复合主键场景)

  • 提高某些查询性能(尤其当不需要 rowid 时)

示例:

-- 默认带有 rowid
CREATE TABLE cities (name TEXT PRIMARY KEY,population INTEGER
);-- 不使用 rowid
CREATE TABLE cities_norowid (name TEXT PRIMARY KEY,population INTEGER
) WITHOUT ROWID;

说明WITHOUT ROWID 表要求必须有主键,且主键不可为 ROWID

PRAGMA 指令

PRAGMA 是 SQLite 的一组特殊命令,用于查看或设置数据库的内部参数或行为。

指令用途说明示例
PRAGMA table_info(table_name)查看表结构(字段信息)PRAGMA table_info(users);
PRAGMA foreign_keys查看外键是否启用(1 为开启)PRAGMA foreign_keys;
PRAGMA foreign_keys = ON;启用外键约束PRAGMA foreign_keys = ON;
PRAGMA database_list查看当前连接的数据库列表PRAGMA database_list;
PRAGMA index_list(table_name)查看表上的索引列表PRAGMA index_list(users);
PRAGMA cache_size设置或查看内存页缓存大小PRAGMA cache_size = 2000;
PRAGMA journal_mode设置事务日志模式(如 WAL)PRAGMA journal_mode = WAL;
PRAGMA synchronous控制同步级别(性能 vs 安全)PRAGMA synchronous = NORMAL;

 

相关文章:

SQLite3常用语句汇总

SQLite 命令行工具&#xff08;sqlite3 shell&#xff09; 中的内置命令 命令作用说明.open filename.db打开或创建一个 SQLite 数据库文件.tables列出当前数据库中的所有表.schema [table]查看某个表或所有表的建表语句&#xff08;DDL&#xff09;.headers ON/OFF开启或关闭…...

数据库设计三范式

第一范式 (1NF) 每个表中的每一列都是原子值 每个表中的每一行都是唯一的 下面这个表格就是不符合第一范式的例子&#xff1a;因为学时数能够拆分为讲课和实验。所以他并不是每一列都是原子值。 不仅要考虑列是否是原子值&#xff0c;还需要考虑每列的值是否可拆分。 第二范…...

GoWeb开发

学习目标&#xff1a; 本篇要达到的目的&#xff0c;能为后续复习提供极大便利。 &#xff08;当我写下本篇博客时&#xff0c;已复习3遍&#xff09; 一、网络通信概述 &#xff08;为本篇基础核心内容&#xff09; 1、什么是网络通信&#xff1f; 网络通信是指不同设备&…...

(7)Nokov 室内光学跟踪系统

文章目录 前言 7.1 所需硬件 7.2 Nokov 系统设置 7.3 配置旋翼机 7.4 启动 Nokov 模块 7.5 MAVProxy 准备 7.6 测试飞行 7.7 参数说明 前言 本文将介绍如何通过 Nokov 运动捕捉系统向旋翼机传输姿势信息。联系方式&#xff1a;NOKOV | Optical Motion Capture System。…...

Linux Shell编程和循环语句

一.for循环语句 1.for语句的结构2.for循环语句实例①根据姓名列表来批量创建多个用户②根据IP地址列表检查主机状态 二.使用while循环语句1.while语句结构2.while循环语句应用①批量添加规律编号用户②猜价格游戏 三 until循环语句1.until语句结构① 计算1-50的和 1.for语句的结…...

Java后端程序员学习前端之JavaScript

1.什么是JavaScript 1.1.概述 JavaScript是一门世界上最流行的脚本语言javaScript 一个合格的后端人员&#xff0c;必须要精通JavaScript 1.2.历史 JavaScript的起源故事-CSDN博客 2.快速入门 2.1.引入JavaScript 1.内部标签 <script>//.......</script> --…...

redis多路复用IO模型 以及 6.0引入的多线程模型

redis为什么选择单线程 采用多线程的话&#xff0c;会出现上下文切换的开销采用多线程&#xff0c;会带来共享资源的竞争控制&#xff0c;比如多个线程同时访问同一个资源&#xff08;键值&#xff09;时&#xff0c;需要额外的手段来保障共享资源的正确性&#xff0c;会带来额…...

101alpha_第6个

第6个alpha (-1 * correlation(open, volume, 10)) 这个就是看这两个相似性。10天之内的 如果结果为正且数值较大&#xff0c;投资者可能会认为在开盘价上涨时成交量萎缩&#xff0c;市场上涨动力不足&#xff0c;可能是卖出信号&#xff1b;反之&#xff0c;开盘价下跌时成交…...

crawl4ai能替代scrapy等传统爬虫框架吗?

传统爬虫框架就像拿着渔网在数字海洋中捕鱼——虽然能捞到东西&#xff0c;但面对现代网站的复杂性时常常"漏网之鱼"满天飞。以Scrapy为代表的工具存在三大致命短板&#xff1a;首先是JavaScript盲区&#xff0c;对动态渲染内容束手无策&#xff0c;就像试图用收音机…...

Sui Basecamp 2025 全栈出击

“我们不仅仅是在构建一个 L1&#xff0c;我们是在重建互联网。” — — Mysten Labs 首席产品官 Adeniyi Abiodun 本届 Sui Basecamp 汇聚了 Web3 领域的建设者、合作伙伴和思想领袖&#xff0c;为期两天&#xff0c;不仅展示了 Sui 的未来&#xff0c;也展现了去中心化互联网…...

计算机体系架构-----设计模式:状态模式(从程序员加班问题切入)

文章目录 1.梦开始的地方2.代码1.0版本3.代码2.0版本4.代码3.0版本5.梦结束的地方 最近在学习这个专业课里面的体系结构这门课程&#xff0c;作为专业里面的一门基础课&#xff0c;这个课程里面主要讲解的就是软件的设计思想&#xff0c;一些历程之类的&#xff0c;包括了面向对…...

【C/C++】RPC与线程间通信:高效设计的关键选择

文章目录 RPC与线程间通信&#xff1a;高效设计的关键选择1 RPC 的核心用途2 线程间通信的常规方法3 RPC 用于线程间通信的潜在意义4 主要缺点与限制4.1 缺点列表4.2 展开 5 替代方案6 结论 RPC与线程间通信&#xff1a;高效设计的关键选择 在C或分布式系统设计中&#xff0c;…...

数据结构之串

一、串的定义与基本概念 1. 串的定义 定义&#xff1a;串是由零个或多个字符组成的有限序列&#xff0c;记作 s"a1​a2​…an​"&#xff0c;例如 "data structure"、"123" 等。 空串&#xff1a;无任何字符&#xff0c;长度为 0&#xff0c;…...

基于腾讯云MCP广场的AI自动化实践:爬取小红书热门话题

基于腾讯云MCP广场的AI自动化实践&#xff1a;爬取小红书热门话题 我正在参加Trae「超级体验官」创意实践征文&#xff0c;本文所使用的 Trae 免费下载链接&#xff1a;www.trae.com.cn/?utm_source… &#x1f50e; 背景 在人工智能快速发展的时代&#xff0c;AI技术不仅重…...

AI领域的MCP(Model-Centric Paradigm)

1. 什么是MCP&#xff08;Model-Centric Paradigm&#xff09;&#xff1f; MCP&#xff08;Model-Centric Paradigm&#xff09;是人工智能开发中的一种核心理念&#xff0c;强调以模型的优化与改进作为主要驱动因素来提升AI系统的表现。在MCP模式下&#xff0c;开发者专注于…...

裸辞8年前端的面试笔记——JavaScript篇(一)

裸辞后的第二个月开始准备找工作&#xff0c;今天是第三天目前还没有面试&#xff0c;现在的行情是一言难尽&#xff0c;都在疯狂的压价。 下边是今天复习的个人笔记 一、事件循环 JavaScript 的事件循环&#xff08;Event Loop&#xff09;是其实现异步编程的关键机制。 从…...

力扣刷题Day 41:除自身以外数组的乘积(238)

1.题目描述 2.思路 方法1&#xff1a;搞一个数组存放各元素之前所有数的乘积&#xff08;头为1&#xff09;&#xff0c;再搞一个数组存放各元素之后所有数的乘积&#xff08;尾为1&#xff09;。 方法2&#xff1a;上面的方法是很好理解的&#xff0c;在此基础上应该如何优化…...

金仓数据库征文-金仓KES数据同步优化实践:逻辑解码与增量同步

目录 一.同步场景与方案选型 二.同步环境配置 1.前置条件验证 2.逻辑解码配置 三.同步实施与问题排查 1.结构映射规则 2.增量数据捕获 3.数据一致性校验 四.性能调优实践 1.同步线程优化 2.批量提交优化 3.资源监控指标 五.典型场景解决方案 1.双向同步冲突处理 …...

【前端基础】9、CSS的动态伪类(hover、visited、hover、active、focus)【注:本文只有几个粗略说明】

一、什么是伪类 选择器的一种&#xff0c;用于选择处于特定状态的元素。 最常见的现象&#xff1a;鼠标放在某些文字上面&#xff0c;文字就会加上颜色。 鼠标没放上去之前&#xff1a; 鼠标放上去之后&#xff1a; 二、动态伪类 图片来源&#xff08;链接文章也有其他伪…...

企业开发平台大变革:AI 代理 + 平台工程重构数字化转型路径

在企业数字化转型的浪潮中&#xff0c;开发平台正经历着前所未有的技术革命。从 AST&#xff08;抽象语法树&#xff09;到 AI 驱动的智能开发&#xff0c;从微服务架构到信创适配&#xff0c;这场变革不仅重塑了软件开发的底层逻辑&#xff0c;更催生了全新的生产力范式。本文…...

ZooKeeper工作机制与应用场景

目录 1.1、概述1.2、选举机制1.2.1、选举触发条件1.2.2、选举规则1.2.3、选举过程详解 1.3、数据同步机制1.3.1、正常同步1.3.2、宕机同步 1.4、客户端常用命令1.5、应用场景1.5.1、配置管理1.5.2、命令服务1.5.3、分布式锁服务1.5.4、集群管理1.5.5、分布式ID1.5.6、分布式协调…...

VR制作软件用途(VR制作软件概述)

虚拟现实&#xff08;VR&#xff09;制作软件作为现代科技的瑰宝&#xff0c;正以独特的魅力重塑各行各业。 通过构建三维虚拟环境&#xff0c;这些软件提供了前所未有的沉浸式体验&#xff0c;还推动了技术革新与产业升级。本文将探讨VR制作软件的主要用途&#xff0c;并重点…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】电商数据分析案例-9.1 业务场景与数据准备

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 9.1 业务场景与数据准备9.1.1 业务场景描述核心业务目标业务挑战 9.1.2 数据来源与获取数据源构成数据获取方案 9.1.3 数据结构与字段说明核心数据表设计1. 订单事实表&…...

PyTorch 入门与核心概念详解:从基础到实战问题解决

PyTorch 入门与核心概念详解&#xff1a;从基础到实战问题解决 前言 用PyTorch 编写 Transformer 模型时遇到了多个错误&#xff0c;包括维度不匹配、NaN 损失、注意力权重未记录以及 OpenMP 库初始化等问题。 本文基于以上&#xff0c;对 PyTorch 的基本解释&#xff0c;并对…...

【办公类-99-05】20250508 D刊物JPG合并PDF便于打印

背景需求 委员让我打印2024年2025年4月的D刊杂志&#xff0c;A4彩打&#xff0c;单面。 有很多JPG&#xff0c;一个个JPG图片打开&#xff0c;实在太麻烦了。 我需要把多个jpg图片合并成成为一个PDF&#xff0c;按顺序排列打印。 deepseek写Python代码 代码展示 D刊jpg图片合…...

【C++】手搓一个STL风格的string容器

C string类的解析式高效实现 GitHub地址 有梦想的电信狗 1. 引言&#xff1a;字符串处理的复杂性 ​ 在C标准库中&#xff0c;string类作为最常用的容器之一&#xff0c;其内部实现复杂度远超表面认知。本文将通过一个简易仿照STL的string类的完整实现&#xff0c;揭示其设…...

无实体对话式社交机器人 拟人化印象形成机制:基于多模态交互与文化适配的拓展研究

《如何感知AI对话者:无实体对话式社交机器人拟人化对其印象形成效果影响机制的实验研究》解析 一、研究背景与核心问题 (一)技术背景与研究动机 随着生成式AI技术发展,以ChatGPT、文心一言为代表的无实体对话式社交机器人兴起,用户对其高度拟人化特征有显著需求,如扮演…...

存储器:DDR和独立显卡的GDDR有什么区别?

本文来简要对比DDR&#xff08;Double Data Rate SDRAM&#xff09;和GDDR&#xff08;Graphics Double Data Rate SDRAM&#xff09;的区别&#xff0c;重点说明它们在设计、性能和应用上的差异&#xff1a; 1. 设计目标与架构 DDR&#xff1a;通用型DRAM&#xff0c;设计为…...

viewDesign里的table内嵌套select动态添加表格行绑定内容丢失

问题 描述 viewDesign里的table内嵌套select&#xff0c;表格的行数是手动点击按钮添加的&#xff0c;添加第一行选择select的内容能正常展示&#xff0c;添加第二行第一行的select的内容消失 代码 <FormItem label"内饰颜色"><Tableclass"mt_10&q…...

vue v-html无法解析<

vue v-html无法解析字符串的小于号 方法一&#xff1a;可以替换成转义符 (实际还是会报错) let str 12345<445667 str.replaceAll(<, <)方法二&#xff1a;可以替换成中文小于号 let str 12345<445667 str.replaceAll(<, &#xff1c;)...

COLT_CMDB_linux_userInfo_20250508.sh修复历史脚本输出指标信息中userName与输出信息不一致问题

#!/bin/bash #IT_BEGIN #IT_TYPE3 #IT SYSTEM_LINUX_AGENTUSERDISCOVER|discovery.user[disc] #原型指标 #IT_RULE SYSTEM_LINUX_AGENTUSERGROUPID|groupId[{#USERNAME}] #IT_RULE SYSTEM_LINUX_AGENTUSERHOME|userHome[{#USERNAME}] #IT_RULE SYSTEM_LINUX_AGENTUSERNAME|user…...

A. Row GCD(gcd的基本性质)

Problem - 1458A - Codeforces 思路&#xff1a; 首先得知道gcd的两个基本性质&#xff1a; (1) gcd(a,b)gcd(a,|b-a|) (2) gcd(a,b,c)gcd(a,gcd(b,c)) 结合题目所给的a1bj&#xff0c;a2bj...... anbj 根据第一条性质得到&#xff1a; gcd(a1bj&#xff0c;a2bj)gcd(…...

k8s术语之Horizontal Pod Autoscaling

应用的资源使用率通常都有高峰和低谷的时候&#xff0c;如何削峰填谷&#xff0c;提高整体的整体资源利用率&#xff0c;让service中的Pod个数自动调整呢&#xff1f;Horizontal Pod Autoscaling:使pod水平自动缩放。这个Object也是最能体现kubernetes之于传统运维价值的地方&a…...

函数级重构:如何写出高可读性的方法?

1. 引言:为什么方法级别的重构如此重要? 在软件开发中,方法(函数)是程序逻辑的基本单元。一个高质量的方法不仅决定了程序是否能正常运行,更直接影响到: 代码的可读性:能否让其他开发者快速理解可维护性:未来修改是否容易出错可测试性:是否便于编写单元测试协作效率…...

手撕基于AMQP协议的简易消息队列-8(单元测试的编写)

在MQTest中编写模块的单元测试 在MQTest中编写makefile文件来编译客户端模块 all:Test_FileHelper Test_Exchange Test_Queue Test_Binding Test_Message Test_VirtualHost Test_Route Test_Consumer Test_Channel Test_Connection Test_VirtualHost:Test_VirtualHost.cpp ..…...

硬件选型:工控机的选择要素

在机器视觉应用中&#xff0c;工控机作为核心计算设备&#xff0c;承担着图像处理、数据分析和设备控制等多重任务。由于机器视觉常常在工业自动化、质量检测和精密控制中发挥重要作用&#xff0c;工控机的选型直接影响系统的性能和可靠性。 1. 应用场景与需求 机器视觉系统广…...

【芯片设计- RTL 数字逻辑设计入门 4.1 -- verilog 组合逻辑和时序逻辑延时比较】

文章目录 Overview时间线简单示意Overview 我们来详细分析下面这段 RTL Code , sbcs_sbbusy 为什么会比 sbcs_sbbusy_nx 慢一拍(晚一个时钟周期变化)。 assign sbcs_sbbusy_nx = set_sbcs_sbbusy;always @(posedge clk or negedge dmi_resetn) beginif (!dmi_resetn) begi…...

关于ubuntu下交叉编译arrch64下的gtsam报错问题,boost中boost_regex.so中连接libicui18n.so.55报错的问题

交叉编译gtsam时遇到的报错信息如下&#xff1a;gtsam需要连接boost&#xff0c; 解决办法&#xff1a; 1.重新编译boost可解决。 2.自己搞定生成一个libicui18n.so.55。 由于我们的boost是公用的&#xff0c;因此1不太可能&#xff08;我试过重新编译完boost,在编译gtsam完…...

IoT平台和AIoT平台的区别

1. 什么是AIoT平台&#xff1f; AIoT&#xff08;人工智能物联网&#xff0c;Artificial Intelligence of Things&#xff09;平台 是 人工智能&#xff08;AI&#xff09; 与 物联网&#xff08;IoT&#xff09; 深度融合的技术框架&#xff0c;通过将AI算法嵌入物联网终端或…...

iOS 模块化开发流程

iOS模块化开发是一种将大型项目拆分为独立、可复用模块的开发模式&#xff0c;能够提升代码可维护性、团队协作效率和动态交付能力。以下是iOS模块化开发的核心流程与关键要点&#xff1a; 一、模块化设计阶段 业务解耦与模块划分 横向分层&#xff1a;基础层&#xff08;网络、…...

云原生安全治理体系建设全解:挑战、框架与落地路径

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:云原生环境下,安全治理正在被重构 在传统IT架构中,安全防护多依赖边界设备(如防火墙、WAF、堡垒机)进行集中式防护。然而,在云原生环境下,这种“边界式”安全模型正面临颠覆。 应用微服务化…...

如何在Vue-Cli中使用Element-UI和Echarts和swiper插件(低版本)

1st.Element-UI 1.1 安装 在终端输入 npm install element-ui 1.2 导入 在全局main.js中全局导入Element-UI&#xff1a; // 导入element-ui组件库 import ElementUI from element-ui; // 导入element-ui组件库的样式 import element-ui/lib/theme-chalk/index.css; // 注…...

[特殊字符]【实战教程】用大模型LLM查询Neo4j图数据库(附完整代码)

&#x1f31f; 核心要点速览 ✅ 基于LangChain框架实现LLM查询Neo4j ✅ 使用Qwen2.5模型(实测Llama3.1查不出内容) ✅ 包含完整数据准备代码实现效果演示 ✅ GitHub/Gitee源码已同步(文末获取) &#x1f6e0;️ 环境准备 1️⃣ 安装Neo4j图数据库 # Windows安装指南参考&…...

Qt获取CPU使用率及内存占用大小

Qt 获取 CPU 使用率及内存占用大小 文章目录 Qt 获取 CPU 使用率及内存占用大小一、简介二、关键函数2.1 获取当前运行程序pid2.2 通过pid获取运行时间2.3 通过pid获取内存大小 三、具体实现五、写在最后 ​ 一、简介 近期在使用软件的过程中发现一个有意思的东西。如下所示&a…...

算法解密:除自身以外数组的乘积问题详解

算法解密:除自身以外数组的乘积问题详解 一、引言 在算法的奇妙旅程中,我们时常会遇到一些看似简单却蕴含深刻智慧的问题,“除自身以外数组的乘积”就是其中之一。这个问题不仅考验我们对数组操作的熟练程度,还要求我们在特定的限制条件下(不能使用除法且时间复杂度为O(n…...

基于Kubernetes的Apache Pulsar云原生架构解析与集群部署指南(上)

#作者&#xff1a;闫乾苓 文章目录 概念和架构概述主要特点消息传递核心概念Pulsar 的消息模型Pulsar 的消息存储与分发Pulsar 的高级特性架构BrokerBookKeeperZooKeeper 概念和架构 概述 Pulsar 是一个多租户、高性能的服务器到服务器消息传递解决方案。Pulsar 最初由雅虎开…...

信创生态核心技术栈:数据库与中间件

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…...

CMU-15445(3)——PROJECT#1-BufferPoolManager-Task#1

PROJECT#1-BufferPoolManager 在完成了前面基础的PROJECT#0后&#xff0c;从本节开始才正式进入了CMU-15445的学习&#xff0c;最终目的是构建一个面向磁盘的数据库管理系统。 PROJECT#1 的主要任务是实现数据库管理系统的缓冲池管理器&#xff0c;缓冲池负责在主存缓冲区与持…...

《数据结构初阶》【链式二叉树】

《数据结构初阶》【链式二叉树】 前言&#xff1a;---------------树---------------什么是树&#xff1f;&#x1f4cc;爱心❤小贴士&#xff1a;树与非树&#xff1f;树的基本术语有哪些&#xff1f;关于节点的一些定义&#xff1a;关于树的一些定义&#xff1a;关于森林的定…...

Oracle免费认证来袭

1、Oracle Cloud Infrastructure 2025 Foundations Associate” &#x1f517; 考证地址&#xff1a;https://mylearn.oracle.com/ou/exam-unproctored/oracle-cloud-infrastructure-2025-foundations-associate-1z0-1085-25/148056/241954 2、Oracle Cloud Infrastructure 2…...