sqlite3笔记

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;

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章