一个SQLite典型table样例:
卡号 车牌号 入场时间 照片路径
------- ---------- -------------------- ------------------------------
0xb212f 渝HKB9DT 2015/8/22 04:35:23 /path/to/photos/渝HKB9DT.jpg
0x756ed 宁V29DTH 2015/8/22 04:35:24 /path/to/photos/宁V29DTH.jpg
0xa175d 台D09DTH 2015/8/22 04:35:27 /path/to/photos/台D09DTH.jpg
0x4784e 台WAKB9D 2015/8/22 04:35:29
0x032ed 沪E4LSAK 2015/8/22 04:35:31 /path/to/photos/沪E4LSAK.jpg
0x083fd 桂J8CXF5 2015/8/22 04:35:33 /path/to/photos/桂J8CXF5.jpg
0xee16d 鄂J4LSAK 2015/8/22 04:35:35 /path/to/photos/鄂J4LSAK.jpg
0x30fbd 桂CVXF5E 2015/8/22 04:35:37 /path/to/photos/桂CVXF5E.jpg
0xd80bd 吉AKB9DT 2015/8/22 04:35:39
0xbf89d 宁J34LSA 2015/8/22 04:35:42
0x9573d 粤FPNDTH 2015/8/22 04:35:43 /path/to/photos/粤FPNDTH.jpg
0xc81bd 台PVXF5E 2015/8/22 04:35:45
0xd3ccf 吉XXF5EX 2015/8/22 04:35:47 /path/to/photos/吉XXF5EX.jpg
创建上述table的SQL语句:
sqlite> CREATE TABLE carinfo(cardid text primary key,
> licence text not null,
> time_in text not null,
> photo text,
> check(length(licence)==7));
NULL不是真,也不是假,也不是0,也不是空字符串,它表示未知,它就是它自己。
SQLite约束条件:
not null 不可为空
unique 不可重复
primary key 主键,不可为空,不可重复
check 测试特定的字段值是否符合自定义表达式的约束
主键和unique字段的区别:
A) 主键不可为null(如果为null系统为自动递增),unique字段可以是null
B) 一个表有且只有一个主键,但可以有0个或多个unique字段
C) 逻辑设计上,主键用以标识记录,而unique字段就是说明不重复
一言以蔽之:primary key = unique + not null
SQLite的表总有且只有一个主键,这是一个64bits的整型字段.
SQLite系统视图sqlite_master记录了数据库中所有的表、视图、索引和trigger。
SQLite存储类(数据类型):
integer 整数,可以是1、2、3、4、6或8个字节,SQLite会根据数值大小自动调整。
real 实数(浮点数),一律使用8个字节存储
text 文本,最大支持长度为1,000,000,000个字符的单个字符串
blob 二进制对象,最大支持长度为1,000,000,000个字节
null 没有值
说明:
SQLite支持动态数据类型,根据具体的输入决定其类型。
经典SQL
======
1,gec@ubuntu:~ $ sqlite3 parking.db
解析:
启动sqlite3,并指定一个数据库名parking.db。如果该数据库不存在,sqlite3并不会立即创建它,而是要等到其中有了实质性的内容(比如表、视图等)才会真正创建。
2,sqlite> create table carinfo(_id integer primary key not null, licence text);
解析:
在数据库parking.db中(后续的所有命令都是针对此数据库,故不再另做说明)创建表carinfo
此表包括两个域:_id和licence,其中
A) _id是类型是整数,并且是主键,并且不能为空
B) licence类型是文本,没有约束条件
3,sqlite> insert into carinfo(licence) values(‘粤B9MK48’); // 第1辆车信息
sqlite> insert into carinfo(_id, licence) values(100, ‘粤ASLF45’); // 第2辆车信息
解析:
在表carinfo中插入两条记录。
由于_id是主键,因此如果没写的话,系统会自动递增填充
4,sqlite> select * from carinfo;
解析:
将carinfo中的信息全部列出来。
5,sqlite> select last_insert_rowid();
解析:
汇报最后一条记录的主键的值
6,sqlite> .tables
carinfo
解析:
汇报当前所有的表(包括其视图,如果有的话)
7,sqlite> .schema
CREATE TABLE carinfo(_id integer primary key not null, licence text);
解析:
返回所有DLL(表、索引和视图的定义)语句
8,sqlite> select * from sqlite_master;
type name tbl_name sql
---------- ---------- --------------- ------------------------------------------------
table carinfo carinfo CREATE TABLE carinfo(_id integer primary key, licence text)
index carinfo_id carinfo CREATE INDEX carinfo_idx on carinfo (licence)
view schema schema CREATE VIEW schema as select * from sqlite_master
解析:
查看系统详细的schema信息,即所有的表、索引、视图和trigger。
9,sqlite> .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE carinfo(_id integer primary key not null, licence text);
INSERT INTO “carinfo” VALUES(1,‘粤B9MK48’);
INSERT INTO “carinfo” VALUES(5,‘粤F8EI45’);
INSERT INTO “carinfo” VALUES(44,NULL);
INSERT INTO “carinfo” VALUES(100,‘粤ASLF4’);
INSERT INTO “carinfo” VALUES(101,‘未知车牌’);
CREATE INDEX carinfo_idx on carinfo (licence);
CREATE VIEW schema as select * from sqlite_master;
COMMIT;
解析:
不带参数的.dump将导出整个数据库的DDL(数据库定义语句)和DML(数据库操作语句)命令。
注意:
.dump默认从屏幕输出,如果要将DDL和DML保存为一个文件,做法如下:
sqlite> .output parking.sql
sqlite> .dump
sqlite> .output stdout
10,sqlite> .read parking.sql
解析:
读取导出的SQL语句,并立即执行里面的所有内容
11,sqlite> .prompt ‘SQLite > ‘
解析:
修改sqlite命令提示符
12,sqlite> .mode col
解析:
修改输出模式为列模式
13,sqlite> .header on
解析:
修改输出模式为开启首行头部信息
14,sqlite> .width 5 10 20
解析:
修改输出模式中从左到右每一个字段的宽度
15,sqlite> .show
解析:
查看当前的输出模式格式
16,sqlite> drop table example;
sqlite> drop table if exists example;
解析:
第一行表示直接丢弃表example
第二行表示在表example存在的情况下,将其丢弃
17,sqlite> alter table carinfo rename to parkinginfo;
解析:
将表carinfo更名为parkinginfo
18,sqlite> alter table parkinginfo add column time_in text;
解析:
为表parkinginfo增加一个字段:time_in,后面的text是类型,还可以加上可选的约束列表
19,sqite> select * from parkinginfo where licence like ‘粤%’;
解析:
找出表parkinginfo中字段licence以粤字开头的记录
注意:
like不区分大小写字母,如果要区分,请用glob代替like,并用*代替%
%代表任意长度的任意字符,类似于shell中的通配符*;%是贪婪匹配
_代表一个任意字符,类似于shell中的通配符?
20,sqlite> select * from parkinginfo where licence not like ‘粤%’;
解析:
找出表parkinginfo中字段licence不以粤字开头的记录
21,sqlite> select * from parkinginfo order by licence;
解析:
按licence排序输出(默认升序,即asc),降序使用如下命令:
select * from parkinginfo order by licence desc;
22,sqlite> select * from parkinginfo limit 10, 20;
解析:
限制输出结果集中的第10到20行记录
23,sqlite> insert into parkinginfo values(83, ‘粤L99NK5’, ‘2011/11/11 11:11:11’);
sqlite> insert into parkinginfo values(NULL, ‘赣SU097L’, ‘2011/11/11 11:11:12’);
解析:
如果插入的记录包含所有的字段,则可省略字段列表。NULL可以用来出发主键的自动增长,NULL可以写成null。
24,sqlite> insert into 粤 select cardid, licence from carinfo where licence like ‘粤%’;
解析:
将表carinfo中凡是车牌(license)以粤开头的记录插入表粤中。
注意:
由于insert子句没有指定字段列表,因此select子句中的cardid、licence必须是表粤的所有字段。
25,sqlite> update 台 set cardid=‘0x88880000’ where cardid=‘0x4784e059’;
解析:
修改一个表台中的字段cardid。
26,sqlite> select distinct * from 台 order by cardid;
解析:
选择不重复的记录