SQLite权威指南(第二版)第三章 SQLite中的SQL
2019-10-28 本文已影响0人
明若晴空
SQL,是与关系数据库通信的唯一方法,是一种直观的用户友好的语言,功能非常强大,可以构建、读取、写、排序、过滤、映射、计算、产生、分组、聚集、管理信息。
一、语法
SQL语法的一般结构:
1.png
1、命令:
SQL由命令组成,每条命令以分号(;)结束。
分号(;),作为命令终结符,启动处理命令。
2、常量
字符串常量:建议使用单引号引起来
数字常量:整数、十进制数、科学计数法表示的数
二进制常量:使用x’0000’表示,每一位是一个16进制数
3、关键字和标识符
关键字:select、update、insert、create、drop、begin等。
标识符:数据库里的具体对象,如表或索引。
关键字和标识符,都不区分大小写。
4、注释
单行注释:两个连续连字符(--)表示
多行注释:C语言风格的/* */形式
二、创建数据库
1、创建表
创建表的语句:
create [temp | temporary] table table_name (column_definitions [, constraints]);
说明:
- temp 或 temporary,表示临时表,只存活于当前会话;
- []表示可选项
- | 表示两者选其一
2、修改表
一般格式:
alter table table_name { rename to name | add column column_def }
说明:
- {} 括起来一个选项表,表示必须从各选项中选一个;
三、数据库查询
1、select命令与操作管道
select 命令的通用形式如下:
select [distinct] heading
from tables
where predicate
group by columns
having predicate
order by columns
limit count, offset;
其处理过程:
2.png
2、信息处理的操作
- 过滤;通过算数操作符(单目、二元、三元操作符)、 逻辑操作符:AND、OR、NOT、IN、LIKE 与 GLOB 操作符(字符串匹配)等来过滤筛选数据;
- 限定和排序:limit指定返回记录最大数量,offset指定偏移的记录数;通常放在操作管道的最后;
- 函数:函数指数学函数,如(abs()、upper()和lower()等);
- 聚合:是从一组记录中计算聚合值(如sum()、avg()、count()、min()、max()等);
- 分组:group by
- 去重:distinct
3、多表连接:
语法格式:
select heading from left_table join_type right_table on join_condition;
- 内连接:通过表中的两个字段进行连接,取两个表的交集;
- 交叉连接:缺乏连接条件时,返回第一个表中的所有行和第二个表的所有行的联合;
- 外连接:SQLite不支持忧外连接和全外连接,只有左外连接。因为右外连接可以用左外连接代替,全外连接可以通过符合查询执行。
- 自然连接:实际上是内连接的另一种形式,通过表中共有的字段名称将两个表连接起来,不需要添加连接条件就可以获得内连接的结果。
4、子查询
子查询是指,select语句嵌套select语句。
5、复合查询
复合查询操作的参数必须符合:
- 涉及的关系字段数目必须相同;
- 只能有一个order by子句,并且处在符合查询的最末尾,对联合结果进行排序;
关键字有:
- union:返回A和B联合的非重复字段的单一关系。union all会保留重复数据;
- intersect:返回既在A中,也在B中的行。
- except:返回所有在A中,但不在B中的行。
6、条件结果
- 接收静态值,并列出各种情况下的case返回值:
case value
when x then value_x
when y then value_y
when z then value_z
else default_value
end
- case形式允许when条件中有表达式:
case
when condition1 then value1
when condition2 then value2
when condition3 then value3
else default_value
case 表达式只执行一个条件,也就是说,如果满足的条件超过一个,只执行第一个。
如果没有满足条件且没有定义else条件,case返回null。
7、处理SQLite中的Null
- 可以通过is null 或者is not null操作符检测null是否存在
- null不等于任何值,包括null。
-
SQLite是三态逻辑,null是真假值之一
3.png