SQLite中的SQL

创建数据库

表是探索SQLite中SQL的起点,也是关系数据库中信息的标准单元。所有的操作都以表为中心,表由行和列组成。

创建表

像关系模型一样,SQL是由几个部分组成的。可以用如下定义的create table命令创建表:

CREATE [temp] table table_name (column_definitions [, constraints]);

用temp或temporary关键字声明的表是临时表——只存在于当前会话。一旦连接断开,就会被自动销毁。temp旁边的方括号表示该项式可选项。

create table命令至少需要一个表名和一个字段名。column_definitions由用逗号分隔的字段列表组成,每个字段定义包括一个名称,一个域和一个逗号分隔的字段约束。例如:

CREATE TABLE contacts (id integer primary key,
                    name text not null collate nocase,
                    phone text not null default 'UNKNOWN',
                    unique (name,phone) );
  • 字段id声明为integer类型,限制为主键;
  • 字段name声明为text类型,约束不能为null,并且排序不区分大小写;
  • 字段phone是text类型,也有两条约束。
  • 表一级的约束是unique,定义在字段name和phone上。

修改表

可以用alter table命令修改表的部分结构。SQLite版的alter table命令既可以修改表明,也可以增加字段。该命令的一般格式为:

alter table table_name {rename to new_name | add column column_def}

花括号括起来选项列表,表示必须从各选项中选择一个。

ALTER TABLE contacts
    add column email text not null default '' collate nocase;

数据库查询

设计数据库和创建表的最终目的是使用数据。和数据一起工作是SQL数据操作语言的工作(DML)。DML的核心是select命令,它也是查询数据库的唯一命令。

关系操作

select命令与操作管道

从语法上说,select命令用一些列字句将关系操作组成在一起,每个子句代表一种特定的关系操作。

SELECT [distinct] heading
FROM tables
WHERE predicate
GROUP BY columns
HAVING predicate
ORDER BY columns
LIMIT count,offset;
LIKE和GLOB操作符

LIKE的作用与相等(=)类似,都是通过一个模式来进行字符串匹配的。例如要查询表foods中所有名称以字符"J"开始的食品:

SELECT id,name FROM foods WHERE name LIKE 'J%';

模式中的百分比(%)可与任意0个或多个字符匹配。下划线(_)可与任意单个字符匹配。百分号是贪婪匹配,它会匹配除了该字符本身外的所有在字符之间的内容。如果百分号在模式的最左边或者最右边,它将匹配字符的另外一边。

SELECT id,name FROM foods WHERE name LIKE '%ac%P%';

GLOB操作符在行为上与LIKE操作符非常类似。关键的不同在于它有些像UNIX/Linux文件名替换语法。
也就是说,它会使用文件名替换相关通配符,例如*和_,并且匹配是大小写敏感的。

SELECT id,name FROM foods WHERE name glob 'Pine*';
限定和排序

可以用limit和offset关键字限定结果集的大小和范围。limit指定返回记录的最大数量,offset指定偏移的记录数。例如,下面的命令是使用limit和offset返回food_types表中id排第2的Cereal记录:

SELECT * FROM food_types ORDER BY id LIMIT 1 OFFSET 1;

关键字offset在结果集中跳过一行,关键字limit限制最多返回一行。order by子句使记录集在返回之前按一个或多个字段值进行排序。以逗号分隔的一系列字段,每个字段项都可能配合排序方向——asc(默认的升序)或desc(降序)。例如:

SELECT * FROM food WHERE name LIKE 'B%' 
ORDER BY type_id desc, name LIMIT 10;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容