高级SQL语句
改变数据
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之间的关系。有四种完整性
- domain integrity。列中的数据
- entity integrity。表中行的数据。
- referential integrity。表间列的关系,比如外键。
- 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有五种。
set null
set default
cascade
restrict
- `no action
Collation
Collation是指文本是如何比较的。
binary
。 使用memcmp()函数比较nocase
. 大小写一样。reverse
. reverse ofbinary
collation.
collate
关键字定义了某一行的collation
Storage class
- integer. vary in size 1,2,3,4,6,8 bytes.SQLite会根据数值大小判断空间大小。
- real. 有小数部分或指数部分,存储方式为8字节浮点数。
- text. 支持各种字符编码(UTF8,UTF16)。
- bolb. Binary large object。
x'ABCD'
开头。 - NULL.
在一列中可以包含不同storage class的值。比较方式如下:
- NULL最小。NULL之间没有特定顺序。
- integer和real次之。
- text次之。text之间比较由collation决定。
- 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支持savepoint
和release
命令。
savepoint
用户在事务中设置一个点,SQLite可以revert到这个点。
savepoint justincase
rollback [transaction] to justincase
冲突解决
以严格程度排序如下
replace
.unique
约束。移除旧的列,插入新的列。SQL操作继续进行。not null
约束。NULL
值被默认值替代。如果没有默认值,使用abort
策略。- 删除时不会触发触发器。
ignore
.约束被违反时,命令继续进行,触发违反行保持不变。fail
. 违反约束时,transaction结束,已经发生的改变不会被回滚。abort
. 恢复当前命令已经进行的操作,transaction结束。默认的策略。rollback
. abort当前命令和整个transaction。
update or resolution table set (value_list) where predicate
数据库锁
锁和事务是紧密相关的。SQLite使用粗粒度的锁,当一个session在向数据库中写数据时,其他的session都被锁定。
unlocked
shared
.读数据库时需要先获取shared lock
reserved
.写数据之前要先获取reserved lock
。获取reserved lock
后,可以写数据了,但是不会被写入到磁盘中,会写入到缓存里。pending
. 写完数据后,要获取exclusive lock
之前要获取pending lock
。此时其他共享锁不能不被获取,可以继续读取。exclusive
. 其他所有的共享锁结束后,可以获取互斥锁。所有缓存的改变被写入内存。
死锁
事务类型
deferred
。不获取任何锁,直到必须获取 。(默认的)immediate
. 获取reserved lock
当begin
开始时。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
同步写
- FULL 在关键时刻会暂停,保证数据已经被写入磁盘。如果操作系统崩溃或掉电,数据库仍会在重启后不会被破坏。
- Normal 在大多数关键时刻会暂停。掉电后可能会被破坏。
- Off 在把数据交给操作系统后会继续执行。可能会加快操作速度。如果程序崩溃,数据是安全的。如果操作系统崩溃或电脑掉电,数据库可能会被破坏。
Temporary Storage
temp_store:, default
,file
或memory
。临时数据的位置
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语句的更多相关文章
- 29.MySQL高级SQL语句
MySQL高级SQL语句 目录 MySQL高级SQL语句 创建两个表 SELECT DISTINCT WHERE AND OR IN BETWEEN 通配符 LIKE ORDER BY 函数 数学函数 ...
- 50句高级SQL语句
一个题目涉及到的50个Sql语句 --(下面表的结构以给出,自己在数据库中建立表.并且添加相应的数据,数据要全面些. 其中Student表中,SId为学生的ID) ------------------ ...
- MySQL 数据库SQL语句——高阶版本2
MySQL 数据库SQL语句--高阶版本2 实验准备 数据库表配置: mysql -uroot -p show databases; create database train_ticket; use ...
- ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪
ASP.NET MVC深入浅出(被替换) 一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...
- 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)
浅谈c#的三个高级参数ref out 和Params c#的三个高级参数ref out 和Params 前言:在我们学习c#基础的时候,我们会学习到c#的三个高级的参数,分别是out .ref 和 ...
- MySQL高级(进阶)SQL语句
MySQL高级(进阶)SQL语句 目录 MySQL高级(进阶)SQL语句 一.实例准备--制表 1. 表1(商店区域表) 2. 表2(商店销售表) 3. 表3(城市表) 4. 表4(total_sal ...
- Sql语法高级应用之一:使用sql语句如何实现不同的角色看到不同的数据
前言 在常见的管理系统中,通常都有这样的需求,管理员可以看到所有数据,部门可以看到本部门的数据,组长可以看到自己组的数据,组员只能看到自己相关的数据. 一般人的做法是,根据不同的角色通过if...el ...
- SQL语句中的select高级用法
#转载请联系 为了更好的了解下面的知识点,我们先创建两张表并插入数据. # 学生表 +----+-----------+------+--------+--------+--------+------ ...
- Mybatis高级:Mybatis注解开发单表操作,Mybatis注解开发多表操作,构建sql语句,综合案例学生管理系统使用接口注解方式优化
知识点梳理 课堂讲义 一.Mybatis注解开发单表操作 *** 1.1 MyBatis的常用注解 之前我们在Mapper映射文件中编写的sql语句已经各种配置,其实是比较麻烦的 而这几年来注解开发越 ...
随机推荐
- APPSCAN使用外部浏览器
在使用appscan扫描时,自带浏览器可能存在兼容性问题(比如HTML5),故需要用到其他浏览器.在做139邮箱HTML5项目,需要使用chrome浏览器进行扫描.因此分享下如何使用外部浏览器,将之前 ...
- tomcat连接器
Connector是Tomcat最核心的组件之一,负责处理一个WebServer最核心的连接管理.Net IO.线程(可选).协议解析和处理的工作.一.连接器介绍在开始Connector探索之路之前, ...
- [New Portal]Windows Azure Virtual Machine (12) 在本地使用Hyper-V制作虚拟机模板,并上传至Azure (2)
<Windows Azure Platform 系列文章目录> 本章介绍的内容是将本地Hyper-V的VHD,上传到Azure数据中心,作为自定义的虚拟机模板. 注意:因为在制作VHD的最 ...
- 第21/24周 性能监控(PAL工具)
大家好,欢迎来到性能调优培训的最后一个月.在过去的5个月里,我们谈了SQL Server的各种性能相关的话题,包括性能调优的技术和问题. 但当在你面前,SQL Server没有按你预想的运行时,你会怎 ...
- 运用javascript的成员访问特性来实现通用版的兼容所有浏览器的打开对话框功能
打开网页对话框,一般有三种方法:window.open.window.showModalDialog.window.showModelessDialog,每一种都有它的优点与不足.第一种方法:wind ...
- 六、GAIA
1. GAIA CSR GAIA (Generic Application Interface Architecture)提供了一个端到端的,与主机无关的生态系统来实现主机应用程序对设备的功 ...
- C#深入.NET平台的软件系统分层开发
今天我们来讲讲分层开发,你从标题能不能简单的认识一下什么是分层呢? 不懂也没关系,接下来我来给你讲讲. 第一章 软件系统的分层开发 (1)其实分层模式可以这样定义:将解决方案中功能不同的模块分到不同的 ...
- 2013最新版Subversion 1.7.10 for Windows x86 + Apache 2.4.4 x64 安装配置教程+错误解决方案
一 .工作环境 操作系统:Windows Server 2008 R2 SP1 x64 Apache版本:2.4.4 Subversion版本: Setup-Subversion-1.7.10.msi ...
- ListActivity的使用
Android中经常用到列表,ListActivity是实现列表的一种好方法. 使用ListActivity的方法,首先定义布局文件: <?xml version="1.0" ...
- Verilog学习笔记设计和验证篇(四)...............状态机的置位与复位
1)状态机的异步置位和复位 异步置位与复位是于时钟无关的.当异步置位或复位信号来临时,他们立即分别置触发器的输出为1或0,不需要等待时钟沿的到来.要将他们列入always块的事件控制信号内就能触发al ...