于Windows 和Linux。
有几种形式的二进制包供选择,以适应SQLite 的不同使用方式。包括:
静态链接的命令行程序(CLP)
SQLite 动态链接库(DLL)
Tcl 扩展
向表中插入几行数据:
sqlite> insert into test (value) values('eenie');
sqlite> insert into test (value) values('meenie');
sqlite> insert into test (value) values('miny');
sqlite> insert into test (value) values('mo');
将插入的数据取回:
sqlite> .mode col
sqlite> .headers on
sqlite> SELECT * FROM test;
系统显示:
id value
1 eenie
2 meenie
3 miny
4 mo
SELECT 语句前的两个命令(.headers and .mode)用于改进输出的格式。可以看到SQLite 为id
字段赋予了连接的整数值,而这些值我们在INSERT 语句中并没的提供。对于自动增长的字
段,你可能会关心最后插入的一条记录该字段的取值,此值可以用SQL函数last_insert_rowid()
得到。
sqlite> select last_insert_rowid();
last_insert_rowid()
4
在退出CLP 之前,让我们来为数据库创建一个索引和一个视图,后面的内容中将会用到它
们。
sqlite> create index test_idx on test (value); 索引
sqlite> create view schema as select * from sqlite_master; 视图
使用.exit 命令退出CLP。
sqlite> .exit
获得数据库的Schema 信息
有几个shell 命令用于获得有关数据库内容的信息。你可以键入命令.tables [pattern]来得到所
有表和视图的列表,其中[pattern]可以是任何类SQL 的操作符。执行上述命令会返回符合条
件的所有表和视图,如果没有pattern 项,返回所有表和视图。
sqlite> .tables
可以看到我们为表test 所创建的名为test_idx 的索引。使用.schema [table name]可以得到一
个表或视图的定义(DDL)语句。如果没提供表名,则返回所有数据库对象(包括table、indexe、
view 和index)的定义语句:
sqlite> .schema test
CREATE TABLE test (id integer primary key, value text);
CREATE INDEX test_idx on test (value);
sqlite> .schema
CREATE TABLE test (id integer primary key, value text);
CREATE VIEW schema as select * from sqlite_master;
CREATE INDEX test_idx on test (value);
更详细的schema 信息可以通过SQLite 唯一的一个系统视图sqlite_master 得到。这个视图是
一个系统目录,它的结构如表2-1 所示。
表2-1 sqlite_master 表结构
编号 字段 说明
1 type 值为"table"、 "index"、 "trigger"或"view"之一。
2 name 对象名称,值为字符串。
3 tbl_name 如果是表或视图对象,此字段值与字段2 相同。如果是索引或触
发器对象,此字段值为与其相关的表名。
4 rootpage 对触发器或视图对象,此字段值为0。对表或索引对象,此字段
值为其根页的编号。
5 SQL 字符串,创建此对象时所使用的SQL 语句。
查询当前数据库的sqlite_master 表,返回:
sqlite> .mode col
sqlite> .headers on
sqlite> select type, name, tbl_name, sql from sqlite_master order by type;
type name tbl_name sql
---------
index test_idx test CREATE INDEX test_idx on test (value)
table test test CREATE TABLE test (id integer primary
view schema schema CREATE VIEW schema as select * from s
数据导出
可以使用.dump 命令将数据库导出为SQL 格式的文件。不使用任何参数,.dump 将导出整个
数据库。如果提供参数,CLP 把参数理解为表名或视图名。
sqlite> .output file.sql
sqlite> .dump
sqlite> .output stdout
有两种方法可以导入数据,用哪种方法决定于要导入的文件的格式。如果文件由SQL 语句
构成,可以使用.read 命令导入(执行)文件。如果文件是由逗号或其它定界符分隔的值
(comma-separated values, CSV)组成,可使用.import [file][table]命令。此命令将解析指定的文
件并尝试将数据插入到指定的表中。
.read 命令用来导入由.dump 命令创建的文件。如果要使用前面作为备份文件所导出的
file.sql,需要先移除已经存在的数据库对象(test 表和schema 视图),然后用下面方法导入:
sqlite> drop table test;
sqlite> drop view schema;
sqlite> .read file.sql
CLP 提供了几个格式化选项命令。最简单的是.echo, 如果设置.echo on,则新输入的命令在
执行前都会回显,默认值是off。.headers 设置为on 时,查询结果显示时带有字段名。当遇
到NULL 值时,如果需要以一个字符串来显示,使用.nullvalue 命令设置,如:
sqlite> .nullvalue NULL
默认情况下使用空串。如果要改变CLP 的shell 提示符,使用.prompt [value],如:
sqlite> .prompt 'sqlite3> '
sqlite3>
.mode 命令可以设置结果数据的几种输出格式。可选的格式为csv、column、html、insert、
line、list、tabs 和tcl。默认值是list,在此模式下显示结果时列间以默认的分隔符分隔。如
果你想以CSV 格式输出一个表的数据,可如下操作:
sqlite3> .output file.csv
sqlite3> .separator ,
sqlite3> select * from test;
sqlite3> .output stdout
文件file.csv 的内容为:
1,eenie
2,meenie
3,miny
4,mo
因为有一个CSV 模式,所以下面的命令会得到相似的结果:
sqlite3> .output file.csv
sqlite3> .mode csv
sqlite3> select * from test;
sqlite3> .output stdout
数据库的备份有两种方法。第1 种是使用.dump,可得到SQL 格式的文件。在命令行方式下
可如下做:
sqlite3 test.db .dump > test.sql
在CLP 中可如下做:
sqlite> .output file.sql
sqlite> .dump
sqlite> .exit
相应地,导入一个SQL 格式备份的数据库可如下做:
sqlite3 test.db < test.sql
此处假设test.db 不存在
其它SQLite 工具
有很多其它开源的或商业的程序可工作于SQLite,其中具有优秀图形化界面且跨平台的有:
SQLite Database Browser (http://sqlitebrowser.sourceforge.net)
SQLite Control Center (http://bobmanc.home.comcast.net/sqlitecc.html)
SQLiteManager (www.sqlabs.net/sqlitemanager.php)
第4 章 SQL
关系模型
关系
模型要求关系型数据库能够提供一种查询语言,几年后,SQL 应运而生。
关系模型由三部分构成:表单(form)、功能(function)和一致性(consistency)。表单表示信息的
结构。在关系模型中只使用一种单独的数据结构来表达所有信息,这种结构称为关系
(relation,在SQL 中被称为表、table)。关系由多个元组(tuples,在SQL 中被称为行、记录、
rows)构成,每个元组又由多个属性(attributes,在SQL 中被称为列、字段、columns)构成。
示例数据库
示例数据库在本章和后面的章节中将会用到,其中存储了Seinfeld 所有episode(约180 个)
的食品(约412 种)。数据库中的表如图4-1 所示。
图4-1 Seinfeld 食品数据库
数据库的schema 定义如下:
create table episodes (
id integer primary key,
season int,
name text );
create table foods(
id integer primary key,
type_id integer,
name text );
create table food_types(
id integer primary key,
name text );
create table foods_episodes(
food_id integer,
episode_id integer );
主表是foods。foods 中的每条记录代表一种食品,其名称存储于name 字段。type_id 参照
food_types,food_types 表存储了食品的分类(如烘烤食品、饮品、垃圾食品等)。foods_episodes
表是foods 和episodes 的关联表。
运行示例
为了您的方便,本章的所有SQL 示例都保存在随书zip 文件根目录的sql.sql 文件中。
对于长SQL 语句,一个方便的执行方法是将其复制到一个单独的文本文件,如test.sql 中,
然后执行:
sqlite3 foods.db < test.sql
为了增加输出的易读性,你应用把下面内容包含在文件中:
.echo on
.mode col
.headers on
.nullvalue NULL
命令
SQL 由命令组成,每个命令以分号(;)结束。如下面是3 个独立的命令:
SELECT id, name FROM foods;
INSERT INTO foods VALUES (NULL, 'Whataburger');
DELETE FROM foods WHERE id=413;
常量
也称为Literals,表示确切的值,有3 种:字符串常量、数据常量和二进制常量。字符串常
量如:
'Jerry'
'Newman'
'JujyFruit'
字符串值用单引号(')括起来,如果字符串中本身包含单引号,需要双写。如“Kenny’s chicken”
需要写成:
'Kenny''s chicken'
数字常量有整数、十进制数和科学记数法表示的数,如:
-1
3.142
6.0221415E23
二进制值用如x'0000'的表示法,其中每个数据是一个16 进制数。二进制值必须由两个两个
的16 进制数(8 bits)组成,如:
x'01'
X'0fff'
x'0F0EFF'
X'0f0effab'