改变数据

insert record

  • 插入一行
insert into foods (name, type_id) values ('Cinnamon Bobka', 1);

如果在insert语句中为每一列都提供了值,可以省去列名,顺序是表创建时的顺序。

insert into foods values(NULL, 1, 'Blueberry Bobka');
  • 插入 a set of rows
    子查询(subqueries)可以在insert语句中使用。既可以作为要插入值的一部分,也可以作为完整的要插入值。
insert into foods
values (null,
(select id from food_types where name='Bakery'),
'Blackberry Bobka');

作为一部分。

select * from foods where name like '%Bobka';

作为全部。

  • 插入多列
insert into foods
select last_insert_rowid()+1, type_id, name from foods
where name='Chocolate Bobka';

这种创建方法(Create Table As Select),会丢失约束信息,包括自增列、indexes、UNIQUE约束等等。

update record

update table set update_list where predicate;

delete records

delete from table where predicate;

数据完整性(data integrity)

数据完整性是值创建和保持table之间的关系。有四种完整性

  1. domain integrity。列中的数据
  2. entity integrity。表中行的数据。
  3. referential integrity。表间列的关系,比如外键。
  4. user-defined integrity。catchall for everything else.

数据完整性通过约束实现。在SQLite中,数据完整性包含了对冲突解决的支持。

entity integrity

主值是为了保证每一个数据都可以被寻址。主值包括一列或更多列,其中有unique约束。

  • unique约束
  • primary key约束。创建table时候一定会被创建,无论是你是否定义。这个列名是rowid,有两个别名_rowid_oid

    如果一列的约束是integer primary key,那么SQLite会为这列创建一个默认值,保证和其他行的值不同。这里也是rowid的别名。由于SQLite使用有符号64位整数来存储主值,因此主值的最大值是9,223,372,036,854,775,807。

    • 如果删除了某条记录,这个rowid会被循环利用。因此,新创建的rowid不一定是严格的递增顺序。
    • 如果希望rowid为严格的递增,可以在integer primary key后加上autoincrement关键字。
    • 如果主值定义中包括autoinrement,那么rowid不会被重复利用,只会产生比当前最大值大的值。SQLite会保存最大的rowid在系统table中,叫做sqlite_sequence。如果大于int64max,在插入时会产生SQLITE_FULL错误。

      sqlite> select * from sqlite_sequence;
      name seq
      ---------- ----------
      maxed_out 10
      sqlite> insert into maxed_out values(2120, 'works');
      sqlite> insert into maxed_out values(null, 'works');
      Error: database or disk is full

Domain integrity

包括type和range两个方面。

- 默认值

default关键字提供了默认值。还有三个保留字

    - current_time. (HH:MM:SS)格式
- current_data. (YYYY-MM-DD)格式
- current_timestamp. (YYYY-MM-DD HH:MM:SS)格式
  • NOT NULL约束
  • check constraints
    check约束在任何更改生效之前被检查。触发器可以实现check约束的功能,并且可以做的更多。

外键约束

create table table_name
( column_definition refernces foreign_table(column_name)
on {delete|update} integrity_action
[not] deferrable [initially {deferred|immeiate},]
...);

integrity_action有五种。

  1. set null
  2. set default
  3. cascade
  4. restrict
  5. `no action

Collation

Collation是指文本是如何比较的。

  1. binary。 使用memcmp()函数比较
  2. nocase. 大小写一样。
  3. reverse. reverse of binary collation.

collate关键字定义了某一行的collation

Storage class

  1. integer. vary in size 1,2,3,4,6,8 bytes.SQLite会根据数值大小判断空间大小。
  2. real. 有小数部分或指数部分,存储方式为8字节浮点数。
  3. text. 支持各种字符编码(UTF8,UTF16)。
  4. bolb. Binary large object。x'ABCD'开头。
  5. NULL.

在一列中可以包含不同storage class的值。比较方式如下:

  1. NULL最小。NULL之间没有特定顺序。
  2. integer和real次之。
  3. text次之。text之间比较由collation决定。
  4. blob最大。使用memcmp()函数比较。

Views

view是虚拟的表,也被称为derived tables,因为值是由其他表生成的,在使用时候被动态生成。

create view name as select-stmt

view在SQLite中不支持update,可以用触发器来达到同样效果。

indexes(索引)

索引用来在某些情况下提高查询的速度。

索引会增加数据库的大小,因为拷贝了需要索引的列。

索引需要被维护。因此会降低插入、更新等操作的速度。

create index [unique] index_name on table_name (columns)

unique会增加约束给索引以及索引列。

drop index index_name

触发器

create [temp|temporary] trigger name
[before|after] [insert|delete|update|update of columns] on table
action
  • update触发器
    可以为某几列指定触发条件。
    create trigger name [before|after] update of column on table action
  • 错误处理
    raise(resolution, error_message);
    resolution是冲突解决策略(abort,fail,ignore,rollback...)
  • 可更新的view
    trigger可以在view上用instead of关键字定义

事务(transactions)

事务定义了一组SQL命令的边界,这组命令或者全部成功,或者全部失败。数据库完整性的atomic原则。

transaction scopes

事务和三个命令有关

1. begin
2. commit
3. rollback
默认每一个SQL语句在自己的事务中运行,每一个语句都会成功或失败后回滚。这种操作类型被称为autocommit mode

SQLite支持savepointrelease命令。
savepoint用户在事务中设置一个点,SQLite可以revert到这个点。

savepoint justincase
rollback [transaction] to justincase

冲突解决

以严格程度排序如下

  1. replace.

    • unique约束。移除旧的列,插入新的列。SQL操作继续进行。
    • not null约束。 NULL值被默认值替代。如果没有默认值,使用abort策略。
    • 删除时不会触发触发器。
  2. ignore.约束被违反时,命令继续进行,触发违反行保持不变。
  3. fail. 违反约束时,transaction结束,已经发生的改变不会被回滚。
  4. abort. 恢复当前命令已经进行的操作,transaction结束。默认的策略。
  5. rollback. abort当前命令和整个transaction。

update or resolution table set (value_list) where predicate

数据库锁

锁和事务是紧密相关的。SQLite使用粗粒度的锁,当一个session在向数据库中写数据时,其他的session都被锁定。

  1. unlocked
  2. shared.读数据库时需要先获取shared lock
  3. reserved.写数据之前要先获取reserved lock。获取reserved lock后,可以写数据了,但是不会被写入到磁盘中,会写入到缓存里。
  4. pending. 写完数据后,要获取exclusive lock之前要获取pending lock。此时其他共享锁不能不被获取,可以继续读取。
  5. exclusive. 其他所有的共享锁结束后,可以获取互斥锁。所有缓存的改变被写入内存。

死锁

事务类型

  1. deferred。不获取任何锁,直到必须获取 。(默认的)
  2. immediate. 获取reserved lockbegin开始时。
  3. exclusive.获取互斥锁在事务开始时。

当只有一个session时,使用默认的即可。

数据库管理

attaching databases

attach [database] filename as database_name

cleaning Databases

  • reindex. rebuild index.
  • vacuum. 通过重建数据库文件来清除未使用空间。

数据库配置

SQLite没有配置文件,所有的配置通过pragmas实现。

数据库连接缓存大小

一个session可以在内存中缓存多少数据库页(pages).

sqlite> pragma cache_size = 10000;
sqlite> pragma cache_size;
10000

获取数据库信息

  • database_list
  • index_info
  • index_list
  • table_info

同步写

  1. FULL 在关键时刻会暂停,保证数据已经被写入磁盘。如果操作系统崩溃或掉电,数据库仍会在重启后不会被破坏。
  2. Normal 在大多数关键时刻会暂停。掉电后可能会被破坏。
  3. Off 在把数据交给操作系统后会继续执行。可能会加快操作速度。如果程序崩溃,数据是安全的。如果操作系统崩溃或电脑掉电,数据库可能会被破坏。

Temporary Storage

temp_store:, default,filememory。临时数据的位置

temp_store_directory:,临时数据存放文件的位置。

page size, encoding, autovacuum

必须在创建数据库之前设置。

debugging

system catalog

sqlite_master是包括表、view、index、trigger的系统表。

查看查询计划(viewsing query plans)

sqlite> explain query plan select * from sqlite_master;
selectid order from detail
---------- ---------- ---------- ------------------------
0 0 0 SCAN TABLE sqlite_master

高级SQL语句的更多相关文章

  1. 29.MySQL高级SQL语句

    MySQL高级SQL语句 目录 MySQL高级SQL语句 创建两个表 SELECT DISTINCT WHERE AND OR IN BETWEEN 通配符 LIKE ORDER BY 函数 数学函数 ...

  2. 50句高级SQL语句

    一个题目涉及到的50个Sql语句 --(下面表的结构以给出,自己在数据库中建立表.并且添加相应的数据,数据要全面些. 其中Student表中,SId为学生的ID) ------------------ ...

  3. MySQL 数据库SQL语句——高阶版本2

    MySQL 数据库SQL语句--高阶版本2 实验准备 数据库表配置: mysql -uroot -p show databases; create database train_ticket; use ...

  4. ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪

    ASP.NET MVC深入浅出(被替换)   一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...

  5. 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)

    浅谈c#的三个高级参数ref out 和Params   c#的三个高级参数ref out 和Params 前言:在我们学习c#基础的时候,我们会学习到c#的三个高级的参数,分别是out .ref 和 ...

  6. MySQL高级(进阶)SQL语句

    MySQL高级(进阶)SQL语句 目录 MySQL高级(进阶)SQL语句 一.实例准备--制表 1. 表1(商店区域表) 2. 表2(商店销售表) 3. 表3(城市表) 4. 表4(total_sal ...

  7. Sql语法高级应用之一:使用sql语句如何实现不同的角色看到不同的数据

    前言 在常见的管理系统中,通常都有这样的需求,管理员可以看到所有数据,部门可以看到本部门的数据,组长可以看到自己组的数据,组员只能看到自己相关的数据. 一般人的做法是,根据不同的角色通过if...el ...

  8. SQL语句中的select高级用法

    #转载请联系 为了更好的了解下面的知识点,我们先创建两张表并插入数据. # 学生表 +----+-----------+------+--------+--------+--------+------ ...

  9. Mybatis高级:Mybatis注解开发单表操作,Mybatis注解开发多表操作,构建sql语句,综合案例学生管理系统使用接口注解方式优化

    知识点梳理 课堂讲义 一.Mybatis注解开发单表操作 *** 1.1 MyBatis的常用注解 之前我们在Mapper映射文件中编写的sql语句已经各种配置,其实是比较麻烦的 而这几年来注解开发越 ...

随机推荐

  1. js单击输入框后弹出提示信息效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 【Swift学习】Swift编程之旅---析构方法(十九)

    在一个类的实例内存被释放之前,析构方法被立即调用.使用deinit关键字来声明析构方法,类似于构造方法用init来声明.析构方法只适用于类类型.   析构方法原理 Swift会自动释放不再需要的实例以 ...

  3. 【Swift学习】Swift编程之旅---Subscripts下标(十六)

    类.结构体和枚举可以定义下标,他可以快速简单地访问集合(set,array,dict)的元素,你可以使使用下标来获取和设置集合元素. 你可以定义一个类型的多个下标,通过索引值类型的不同来进行重载,而且 ...

  4. 原生JS查找元素

    今天写了一个很简单.很粗暴的通过JS根据类来查找DOM元素. 为了降低它的粗暴等级(耗费性能)我给了三个等级. 首先性能最好的,适合FF,CH,IE8,通过querySelectorAll这个API. ...

  5. html的块级、内联、内联块级元素基础

    概念 块级:block 内联:inline 内联块级:inline-block 在html元素中,元素会有display属性 display属性默认值是block,那么该元素是块级元素. displa ...

  6. SQLServer存储过程中事务的使用

    create proc usp_Stock @GoodsId int, @Number int, @StockPrice money, @SupplierId int, @EmpId int, ), ...

  7. Mysql日期统计函数简介

    NOW() 返回当前的日期和时间 CURDATE() 返回当前的日期 CURTIME() 返回当前的时间 DATE() 提取日期或日期/时间表达式的日期部分 EXTRACT() 返回日期/时间按的单独 ...

  8. 关于Response.Redirect和Server.Execute的区别

    Server.Transfer("path")内部重定向请求,是服务器内部的接管,浏览器无法意识到这个接管的发生,浏览器地址栏也不会发生变化.而Response.Redirect( ...

  9. 背水一战 Windows 10 (4) - UI: 多窗口

    [源码下载] 背水一战 Windows 10 (4) - UI: 多窗口 作者:webabcd 介绍背水一战 Windows 10 之 UI 多窗口 示例1.自定义帮助类,用于简化 Secondary ...

  10. Go语言的编程范式

    由于比较古怪的语言特性,感觉代码的封装性是一种不同的思路. 包管理的火热程度居然没有nodejs高,这是为什么 package form import ( "encoding/gob&quo ...