zoukankan      html  css  js  c++  java
  • sqlite3笔记

    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)
    

      

  • 相关阅读:
    python 的基础 学习 第六天 基础数据类型的操作方法 字典
    python 的基础 学习 第五天 基础数据类型的操作方法
    python 的基础 学习 第四天 基础数据类型
    ASP.NET MVC 入门8、ModelState与数据验证
    ASP.NET MVC 入门7、Hellper与数据的提交与绑定
    ASP.NET MVC 入门6、TempData
    ASP.NET MVC 入门5、View与ViewData
    ASP.NET MVC 入门4、Controller与Action
    ASP.NET MVC 入门3、Routing
    ASP.NET MVC 入门2、项目的目录结构与核心的DLL
  • 原文地址:https://www.cnblogs.com/leyi/p/11959328.html
Copyright © 2011-2022 走看看