Sqlite Sqlite3 test.db — 创建数据库 sqlite3 test.db .dump > test.sql — .dump 点命令来导出完整的数据库在一个文本文件中 sqlite3 test.db < test.sql — 从生成的 test.sql 恢复 ———————————————————————— 所有的点命令只在 SQLite命令行中可用 sqlite_master ———————————————————————— 在命令行中打开一个已存在的数据库 .open /Users/zhangzhennan/test.db ———————————————————————— 列出所有数据库中的表 .tables SELECT tbl_name FROM sqlite_master WHERE type = 'table'; 列出表信息 .schema wp_posts select sql from sqlite_master where type='table' and tbl_name = 'wp_posts' ———————————————————————— Insert 语句 import sqlite3; connect = sqlite3.connect('/Users/xxx/test.db'); print('connection successful') c = connect.cursor(); c.execute(''' INSERT INTO wp_posts (post_title,post_content) VALUES ('我是一个标题', '我是一段内容') ''') c.close() connect.commit() connect.close() ———————————————————————— 无法删除列的变通方法 (使用一个表来填充另一个表) ALTER TABLE wp_posts RENAME TO wp_posts_back;//先将表重命名 CREATE TABLE wp_posts( id INTEGER PRIMARY KEY AUTOINCREMENT, post_title CHAR(150), post_content TEXT ); //重新创建表 INSERT INTO wp_posts (post_title, post_content) select post_title,post_content from wp_posts_back //将旧表的内容插入到新表中 DROP TABLE wp_posts_back; //删除旧表 ———————————————————————— Select 语句 sqlite> select * from wp_posts; Where 语句 sqlite> select * from wp_posts where id ==5; Update 语句 update wp_posts set post_title = '我要修改标题' where id in (9,11) // 修改 9 11 update wp_posts set post_title = '我要修改标题' where id between 9 and 11 // 修改9 10 11 Like 语句 百分号(%)代表零个、一个或多个数字或字符。下划线(_)代表一个单一的数字或字符 select * from wp_posts where post_title like '%标'; // 以标结尾 select * from wp_posts where post_title like '标%'; // 以标开头 select * from wp_posts where post_title like ‘%标%’; // 有标的 glob 语句 与 LIKE 运算符不同的是,GLOB 是大小写敏感 星号(*)代表零个、一个或多个数字或字符。问号(?)代表一个单一的数字或字符 Limit 语句 sqlite> select * from wp_posts limit 4 offset 2; // 从第二行开始取4行数据 Order by 语句 asc desc sqlite> select * from wp_posts order by id desc; // 根据某列可以多列进行升降序排列 group by GROUP BY 子句放在 WHERE 子句之后(如果有的话),放在 ORDER BY 子句之前 sqlite> select post_title,sum(post_content) from wp_posts group by post_title; aa|11 bb|77 cc|99 having 语句 WHERE 子句在所选列上设置条件,而 HAVING 子句则在由 GROUP BY 子句创建的分组上设置条件 sqlite> select post_title,sum(post_content) from wp_posts group by post_title having post_title == 'bb'; bb|77 Distinct 语句 去重复 sqlite> select distinct post_title from wp_posts; aa bb cc ———————————————————————— 约束 Not null、 default、 unique、 primary key 、check(约束确保某列中的所有值满足一定条件) CREATE TABLE wp_posts5( id INTEGER PRIMARY KEY AUTOINCREMENT, post_title CHAR(150) UNIQUE, post_content TEXT CHECK(LENGTH(post_content) > 0) // post_content字符长度必须大于0 ); ———————————————————————— Join 连接 cross join inner join outer join Cross join 返回被连接的两个表所有数据行的笛卡尔积,返回到的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 比如a表有5条数据,b表有3条数据,那么最后的结果有5*3=15条数据 sqlite> select * from wp_posts,wp_posts3; // 等同于下面sql sqlite> select * from wp_posts cross join wp_posts3; sqlite> select * from wp_posts 'wp1',wp_posts3 'wp3' where wp1.id = wp3.id; // 等同下面sql sqlite> select * from wp_posts cross join wp_posts3 where wp_posts.id = wp_posts3.id; Inner join 每个匹配对的列值会合并成一个结果行,在两张表进行连接查询时,只保留两张表中完全匹配的结果集 join(默认inner join) sqlite> select * from wp_posts 'wp1' join wp_posts3 'wp3' on wp1.id = wp3.id; 1|aa|11|1|我是一个标题|我是内容 如果两张表的关联字段名相同,也可以使用USING子句 sqlite> select * from wp_posts 'wp1' join wp_posts3 'wp3' using (id); 左外连接就是关联的两张或多张表中,根据关联条件,显示匹配的记录,左表中有的记录,但是右表中没有匹配上的,以空(null)显示。 LEFT OUTER JOIN也可以简写成LEFT JOIN,效果是一样的 ,在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录 sqlite> select * from wp_posts3 left join wp_posts on wp_posts3.id == wp_posts.id; 1|我是一个标题|我是内容|1|aa|11 7|我是一个标题2|我是内容2||| Sqlite3 不支持 right join 、full join ———————————————————————— Union 合并两个或多个 SELECT 语句的结果,不返回任何重复的行 UNION ALL 不去重复 SELECT 被选择的列数必须是相同 sqlite> select * from wp_posts3 union select * from wp_posts4; ———————————————————————— Null 、is not null null和空白有区别的  As 别名 可以省略as ———————————————————————— Trigger 触发器 BEFORE 或 AFTER 关键字决定何时执行触发器动作 for each row 是操作语句每影响到一行的时候就触发一次,也就是删了 10 行就触发 10 次,而 for each state 一条操作语句就触发一次,有时没有被影响的行也执行。sqlite 只实现了 for each row 的触发 // 更新wp_posts4表中行的post_title则触发触发器 create trigger leyi after update of post_title on wp_posts4 begin insert into wp_posts5 (post_title,post_content) values ('在wp_posts4中更新了一条数据','如题'); end; // wp_posts4表中插入行时则触发触发器 create trigger hello after insert on wp_posts4 begin insert into wp_posts5 (post_title, post_content) values ('hello', 'world'); end; Sqlite笔记二 ———————————————————————— 索引 Create index tb_idx on tb_name (column_name, column_name) Drop index index_name Indexed by 索引不应该使用在较小的表上。 索引不应该使用在有频繁的大批量的更新或插入操作的表上。 索引不应该使用在含有大量的 NULL 值的列上。 索引不应该使用在频繁操作的列上。 Create index tb_index on wp_posts4 (post_title); Drop index tb_index; sqlite> .open /Users/xxx/test.db sqlite> .tables _wp_posts3_old_20191129 wp_posts2 wp_posts5 _wp_posts4_old_20191129 wp_posts3 wp_posts wp_posts4 sqlite> .schema wp_posts4 CREATE TABLE IF NOT EXISTS "wp_posts4" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT, "post_title" CHAR(150) DEFAULT NULL, "post_content" TEXT DEFAULT NULL ); CREATE INDEX haha on wp_posts4(post_title); CREATE INDEX tb_index on wp_posts4(post_title); sqlite> .indexes haha sqlite_autoindex__wp_posts3_old_20191129_1 sqlite_autoindex_wp_posts3_1 sqlite_autoindex_wp_posts5_1 tb_index sqlite> select * from wp_posts4 INDEXED by haha where post_title = 'test'; 2|test| 3|test| ———————————————————————— Alter Alter table tb_name rename to xxx // 修改表名 Alter table tb_name add column column_name // 增加列 ———————————————————————— 视图 SQLite 视图是只读的 无法在视图上执行 DELETE、INSERT 或 UPDATE 语句 是通过相关的名称存储在数据库中的一个 SQLite 语句 视图(View)是一种虚表,允许用户实现以下几点: 用户或用户组查找结构数据的方式更自然或直观。 限制数据访问,用户只能看到有限的数据,而不是完整的表。 汇总各种表中的数据,用于生成报告。 create view tb_view as select post_title from wp4;  sqlite> select * from tb_view ...> ; 111 333 drop view tb_view; ———————————————————————— 事务 把许多的 SQLite 查询联合成一组一起作为事务的一部分进行执行 原子性(Atomicity):确保工作单位内的所有操作都成功完成,否则,事务会在出现故障时终止,之前的操作也会回滚到以前的状态。 一致性(Consistency):确保数据库在成功提交的事务上正确地改变状态。 隔离性(Isolation):使事务操作相互独立和透明。 持久性(Durability):确保已提交事务的结果或效果在系统发生故障的情况下仍然存在 BEGIN 等同 BEGIN TRANSACTION COMMIT 等同 END TRANSACTION sqlite> BEGIN; sqlite> delete from wp4 where id = 1; sqlite> ROLLBACK; // 是用于撤消尚未保存到数据库的事务的事务命令。 sqlite> BEGIN; sqlite> delete from wp4 where id = 1; sqlite> COMMIT; // 用于把事务调用的更改保存到数据库中的事务命令 ———————————————————————— 子查询 子查询或称为内部查询、嵌套查询 一个 SELECT 语句的查询结果能够作为另一个语句的输入值 子查询可以与 SELECT、INSERT、UPDATE 和 DELETE 语句一起使用,可伴随着使用运算符如 =、<、>、>=、<=、IN、BETWEEN 等 子查询必须遵循的几个规则: 子查询必须用括号括起来 子查询在 SELECT 子句中只能有一个列 ORDER BY 不能用在子查询中,可以在子查询中使用 GROUP BY,功能与 ORDER BY 相同。 子查询返回多于一行,只能与多值运算符一起使用,如 IN 运算符 BETWEEN 运算符不能与子查询一起使用,但是,BETWEEN 可在子查询内使用 select * from wp4 where id > 21; 等同于下面 select * from wp4 where id in (select id from wp4 where id > 21) insert into wp5 select * from wp4 where id in(select id from wp4)