SQL的语法像自然语言,以命令模式表达语句。以描述行为的动词开始,接下来是主语和谓语,由分号";"结尾。如下所示:
SQL的易用性非常高,因为它是声明式语言而非命令式语言,它是为非技术人员设计的。声明式语言是描述想要什么,命令式语言是描述达到目标的如何做的过程,如C语言。
1 常量
SQL中有3种类型常量,分别为:字符串常量、数字常量和二进制常量。
1.1 字符串常量
与C/C++中类似,字符串常量由一个或多个字母和数字字符组成,但是SQLite中用单引号(')引起来(虽然SQLite支持单引号和双引号,但是单引号才是SQL标准)。如果字符串中本身包含单引号,需要用两个单引号,例如kenny's chicken:
'kenny''s chicken'
SQLite中的字符串常量值是大小写敏感的,但是关键字例如select/updata/insert/create等是不区分大小写的。
1.2 数字常量
数字常量有整数、十进制数和科学记数法表示的数。例如:-1、3.14、2.0E19。
1.3 二进制值
二进制值的形式为:x'xx',其中每位是一个16进制数,二进制值必须由两个及以上16进制数组成。例如:x'20'、x'ff'。
2 创建表
SQLite中创建表的命令如下:
create [temp] table table_name (column_definitions [, constraints]);
·[temp]是可选项,用temp/temporary关键字声明创建的表是临时表,一旦连接断开,就会被自动销毁。
·table_name是创建表的表名。
·column_definitions由逗号分隔的字段列表组成,每个字段定义包括一个名称、一个类型说明符(也称域)和一个逗号分隔的字段约束。例如:
"CREAT TABLE media(idx integer primary key autoincrement, chn int, recType int, startTime long, endTime long, pos int, path vchar, name vchar, alarmsrc vchar,\
playTime long)";
其实SQLite存储类中并没有int/long/vchar/等,之所以这样用是为了代码表达清晰、方便程序员交流使用,之所以可以这样用是因为SQLite数据库会根据值来分配存储与字段类型无关,但是主键必须申明为整型integer。详细了解可以看:。
3 数据库查询
select是SQL命令中最大、最复杂的命令,也是查询数据库的唯一命令。select语句提供混合、比较和过滤数据的“关系操作”。
select命令的通用形式为:
select [distinct] heading
from tables
where predicate
group by columns
having predicate
order by columns
limit count, offset;
类似于Linux中的管道命令,select命令从from开始,接收一个或多个表;将它们组合成单一复合表,传递给后续操作链。
2.1 过滤
where子句的操作对象是行,子句中的限制条件对行进行逻辑判断,为真的所有行将会包含在结果集中,为假则被排除。例如:他是一个帅气的江西男孩,翻译成等价的关系操作就是:select * from people where gender='male' and province='Jiangxi';
2.1.1 运算符
1)二元运算符
与C/C++中二元运算符相差不大,除了几个需特别注意外,其他可类比C/C++。
·'||':其作用是连接字符串,类似于C++中string类的重载运算符'+',例如"app"||"le"其结果为“apple”。
·IN:它允许我们where子句中规定多个值。例如:Persons表,
Id | LastName | FirstName | Address | City |
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijin |
执行"select Id, LastName from Persons where LastName IN ('Bush'. Carter);"得到结果集:
Id | LastName |
2 | Bush |
3 | Carter |
其实等同于:"select Id, LastName from Persons where LastName = 'Bush' or LastName='Carter';",但是显然IN操作符比较简洁。
·like:like的作用类似于'=',都是通过一个模式来进行字符串匹配。like是大小写不敏感的,例如:
·like操作符对象中可以使用SQL通配符①'%'匹配一个或多个字符;②'_'匹配一个字符;通配符'[]'在SQLite中不能获取结果,like操作符不区分大小写。
·glob:在行为上与like操作符非常相似,不同之处在于它使用的通配符类似于Linux下的Shell脚本和Makefile,①'*'匹配一个或多个字符;②'?'匹配一个字符;而且glob操作符是区分大小写的。
2.2 限定与排序
2.2.1 限定
SQLite中用limit和offset关键字来限定最后结果集的大小和范围。limit指定返回记录的最大数量,offset指定偏移的记录数(也就是指出了从那条记录开始返回)。例如:
"limit m offset n"等价于"limit n, m"。如果是单独的"limit m"则是限制记录数量并不对结果集进行偏移。
2.2.2 排序
SQLite中用order by子句进行排序,它使记录集在返回之前按一个或多个字段值进行排序。order by子句以逗号分隔的一系列字段组成,每个字段都带有排序方向asc(默认升序)或desc(降序)。例如:
多个字段进行排序时,先按第一个字段进行排序,再依次排序后续字段,后续的排序并不会打乱相等元素原有的相对顺序,可知SQLite中order by子句由稳定的排序算法实现。
2.3 分组(grouping)
在select语句的作用流程上,group by介于where和select子句之间,group by接收where的输出,并将其分隔成共享某个字段(或多个字段)上同等值的小组,这些在传递给select子句。例如:
group by对某字段进行分组,但是没有再select子句之前过滤这些分组,而having可以实现该功能。与where子句过滤结果集中的行类似,having过滤的是分组。例如:
2.4 去掉重复—distinct
distinct出来select的结果并过滤掉其中重复的行。例如:"select distinct type_id from foods;",select提取出foods表的type_id字段,distinct删除重复的行。
接下来是3个修改数据的SQL命令:
4 插入记录
使用insert命令向表中插入记录,在一个表上工作时,insert命令可以一次插一条记录,利用select可以一次插入多行。insert语句的一般格式为:
insert into table (column_list) values (value_list);
·table:是数据待插入的表名。
·column_list:是用逗号分隔的字段名称,字段必须在表中存在。
·vaules:表示后面括号内的是值。
·value_list:是用逗号分隔的值,值与column_list的字段一一对应。
例如:"insert into foods (name, type_id) values ('Cinnamon Bobka', 1);",该例中没有id字段,是因为id是整型主键,它会自动产生相关的新值。可以用select命令验证是否成功插入数据,"select * from foods where name='Cinnamon Bobka' and type_id=1;"。
如果insert语句中为所有的字段提供值,那么可以省略字段列表。例如:"insert into foods values (NULL, 1, 'Blueberry Bobka');",值列表的顺序需与表字段顺序一致。
5 更新记录
updata命令用于更新表中的记录,该命令可以修改一个表中一行或多行中的一个或多个字段。一般格式为:
update table set update_list where predicate;
·table:待跟新的表名。
·update_list:一个或多个“字段赋值”的列表,字段赋值格式为column_name=value。
·where predicate:where子句与select语句相同。
6 删除记录
delete命令可以删除表中的记录。它的一般格式为:
delete from table where predicate;
"where predicate"与updata和select命令的where子句一样。例如:“delete from foods where name='Chocolate BOBKA';”。
该篇博客是自己的学习博客,水平有限,如果有哪里理解不对的地方,希望大家可以指正!