第五章 SQLite数据库:3、SQLite 常用语法及使用案例
SQLite Insert 语句
SQLite 的 INSERT INTO 语句用于向表中添加新数据行。
语法
INSERT INTO 有两种常见语法形式:
- 使用列名指定要插入的列:
-- 插入数据并指定列名
INSERT INTO TABLE_NAME (column1, column2, ..., columnN)
VALUES (value1, value2, ..., valueN);
- 不指定列名,按顺序插入数据(确保值与表列的顺序一致):
-- 不指定列名,直接插入数据
INSERT INTO TABLE_NAME
VALUES (value1, value2, ..., valueN);
实例
假设我们在数据库 Library.db
中有一个 BOOKS
表:
-- 创建 BOOKS 表
CREATE TABLE BOOKS(ID INTEGER PRIMARY KEY NOT NULL, -- 主键列,不能为空TITLE TEXT NOT NULL, -- 书名列,不能为空AUTHOR TEXT NOT NULL, -- 作者列,不能为空PUBLISH_YEAR INTEGER, -- 出版年份列PRICE REAL -- 价格列
);
向表中插入数据:
-- 向 BOOKS 表插入数据
INSERT INTO BOOKS (ID, TITLE, AUTHOR, PUBLISH_YEAR, PRICE)
VALUES (1, 'The Great Gatsby', 'F. Scott Fitzgerald', 1925, 10.99);
通过如下查询查看数据:
-- 查询 BOOKS 表中的所有数据
SELECT * FROM BOOKS;
使用一个表填充另一个表
使用 SELECT
语句从一个表填充数据到另一个表:
-- 从第二个表中选择数据并插入到第一个表
INSERT INTO first_table [(column1, column2, ...)]
SELECT column1, column2, ...
FROM second_table
WHERE condition;
SQLite Select 语句
SQLite 的 SELECT 语句用于从数据库表中获取数据。
语法
基本的 SELECT 语法:
-- 查询指定列的数据
SELECT column1, column2, ... FROM table_name;
若要查询所有列:
-- 查询所有列的数据
SELECT * FROM table_name;
实例
假设 MOVIES
表包含如下数据:
-- 创建 MOVIES 表
CREATE TABLE MOVIES(ID INTEGER PRIMARY KEY, -- 主键TITLE TEXT NOT NULL, -- 电影名称,不能为空DIRECTOR TEXT NOT NULL, -- 导演,不能为空YEAR INTEGER, -- 发布年份GENRE TEXT -- 电影类型
);
查询所有数据:
-- 查询 MOVIES 表中的所有数据
SELECT * FROM MOVIES;
查询特定列:
-- 查询 MOVIES 表中的特定列
SELECT TITLE, YEAR, GENRE FROM MOVIES;
设置输出格式
调整输出格式,以便更清晰查看结果:
-- 打开表头显示,查询结果第一行会显示字段名(列名)
.headers on
-- 设置输出模式为“列”模式,这样结果会按列整齐对齐显示
.mode column
-- 查询 MOVIES 表中的所有数据
SELECT * FROM MOVIES;
SQLite Update 语句
SQLite 的 UPDATE 语句用于修改表中已存在的记录。
语法
更新指定列的值:
-- 更新表中记录的某些列值
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
实例
假设 STUDENTS
表有如下数据:
-- 创建 STUDENTS 表
CREATE TABLE STUDENTS(ID INTEGER PRIMARY KEY, -- 学生 ID,主键NAME TEXT NOT NULL, -- 学生姓名,不能为空AGE INTEGER, -- 学生年龄MAJOR TEXT -- 学生专业
);
更新 ID = 2
的记录:
-- 更新 ID 为 2 的学生记录
UPDATE STUDENTS SET AGE = 23, MAJOR = 'Data Science' WHERE ID = 2;
SQLite Delete 语句
SQLite 的 DELETE 语句用于删除表中的记录。
语法
删除指定条件的记录:
-- 删除符合条件的记录
DELETE FROM table_name
WHERE condition;
实例
删除 ID = 3
的记录:
-- 删除 ID 为 3 的记录
DELETE FROM STUDENTS WHERE ID = 3;
SQLite Where 子句
WHERE 子句用于指定查询数据的条件。
语法
-- 查询符合条件的数据
SELECT column1, column2, ... FROM table_name WHERE condition;
实例
选择 AGE > 20
的学生记录:
-- 查询年龄大于 20 的学生记录
SELECT * FROM STUDENTS WHERE AGE > 20;
SQLite Limit 子句
LIMIT 子句用于限制查询结果的行数。
语法
-- 限制查询结果的返回行数
SELECT column1, column2, ... FROM table_name LIMIT number_of_rows;
下面是 LIMIT 子句与 OFFSET 子句一起使用时的语法:
-- 限制查询返回的行数,并指定起始位置
SELECT column1, column2, ... FROM table_name LIMIT number_of_rows OFFSET row_num;
实例
查询前 2 条记录:
-- 查询 MOVIES 表中的前 2 条记录
SELECT * FROM MOVIES LIMIT 2;
查询从第 2 条开始的 3 条记录:
-- 查询 MOVIES 表中从第 2 条开始的 3 条记录
SELECT * FROM MOVIES LIMIT 3 OFFSET 2;
SQLite Order By 子句
ORDER BY 子句用于按指定列的升序(ASC)或降序(DESC)对结果进行排序。
语法
-- 按指定列的顺序排序查询结果
SELECT column-list
FROM table_name
[WHERE condition]
[ORDER BY column1, column2, .. columnN] [ASC | DESC];
- ASC 默认值,从小到大,升序排列
- DESC 从大到小,降序排列
实例
按 GENRE
升序排序:
-- 查询 MOVIES 表并按 GENRE 升序排列
SELECT * FROM MOVIES ORDER BY GENRE ASC;
SQLite Group By 子句
GROUP BY 子句用于将数据分组,并按组进行聚合操作。
语法
-- 根据指定列分组数据,并可结合聚合函数
SELECT column-list
FROM table_name
WHERE [ conditions ]
GROUP BY column1, column2....columnN
ORDER BY column1, column2....columnN
实例
按 GENRE
分组并计算每个类别的电影数量:
-- 查询 MOVIES 表,按 GENRE 分组并计算每个 GENRE 的电影数量
SELECT GENRE, COUNT(*) FROM MOVIES GROUP BY GENRE;
SQLite Having 子句
HAVING 子句用于过滤由 GROUP BY
子句返回的分组结果。
语法
-- 过滤由 GROUP BY 子句分组后的结果
SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2
实例
选择每个 GENRE
中电影数量大于 1 的记录:
-- 查询 MOVIES 表中,GENRE 下的电影数量大于 1 的记录
SELECT GENRE, COUNT(*) FROM MOVIES GROUP BY GENRE HAVING COUNT(*) > 1;
SQLite Distinct 关键字
DISTINCT 关键字用于去除查询结果中的重复记录。
语法
-- 查询唯一的记录
SELECT DISTINCT column1, column2, ..... FROM table_name WHERE [condition]
实例
查询不同的 GENRE
:
-- 查询 MOVIES 表中不同的 GENRE
SELECT DISTINCT GENRE FROM MOVIES;
综合使用案例
以下是一个综合的使用案例,展示了如何使用 SQLite 执行常见操作:
-- 创建 MOVIES 表
CREATE TABLE MOVIES(ID INTEGER PRIMARY KEY, -- 主键TITLE TEXT NOT NULL, -- 电影名称,不能为空DIRECTOR TEXT NOT NULL, -- 导演,不能为空YEAR INTEGER, -- 发布年份GENRE TEXT -- 电影类型
);-- 插入数据
INSERT INTO MOVIES (ID, TITLE, DIRECTOR, YEAR, GENRE)
VALUES
(1, 'Inception', 'Christopher Nolan', 2010, 'Sci-Fi'),
(2, 'The Dark Knight', 'Christopher Nolan', 2008, 'Action'),
(3, 'Parasite', 'Bong Joon-ho', 2019, 'Drama');-- 查询所有记录
SELECT * FROM MOVIES;-- 更新数据
UPDATE MOVIES SET GENRE = 'Action' WHERE ID = 1;-- 删除记录
DELETE FROM MOVIES WHERE ID = 3;-- 使用 GROUP BY 和 HAVING 过滤数据
SELECT GENRE, COUNT(*) FROM MOVIES GROUP BY GENRE HAVING COUNT(*) > 1;-- 使用 LIMIT 和 OFFSET 分页查询
SELECT * FROM MOVIES LIMIT 2 OFFSET 1;-- 排序数据
SELECT * FROM MOVIES ORDER BY YEAR DESC;