如果资料表有相当多的资料,我们便会建立索引来加快速度。好比说: create index film_title_index on film(title); 意思是针对film资料表的name字段,建立一个名叫film_name_index的索引。这个指令的语法为 create index index_name on table_name(field_to_be_indexed); 一旦建立了索引,sqlite3会在针对该字段作查询时,自动使用该索引。这一切的操作都是在幕后自动发生的,无须使用者特别指令。
(4)加入一笔资料
接下来我们要加入资料了,加入的方法为使用insert into指令,语法为: insert into table_name values(data1, data2, data3, ...); 例如我们可以加入 insert into film values (‘Silence of the Lambs, The‘, 118, 1991, ‘Jodie
Foster‘);insert into film values (‘Contact‘, 153,1997, ‘Jodie
Foster‘);insert into film values (‘Crouching Tiger, Hidden Dragon‘, 120,
2000, ‘Yun-Fat Chow‘);insert into film values (‘Hours, The‘,114, 2002,
‘Nicole Kidman‘); 如果该字段没有资料,我们可以填NULL。
(5)查询资料
讲到这里,我们终于要开始介绍SQL最强大的select指令了。我们首先简单介绍select的基本句型: select columns from table_name where expression;
最常见的用法,当然是倒出所有数据库的内容: select * from film;
如果资料太多了,我们或许会想限制笔数: select * from film limit 10;
或是照着电影年份来排列: select * from film order by year limit 10;
或是年份比较近的电影先列出来: select * from film order by year desc limit 10;
或是我们只想看电影名称跟年份: select title, year from film order by year desc limit 10;
查所有茱蒂佛斯特演过的电影: select * from film where starring=‘Jodie Foster‘;
查所有演员名字开头叫茱蒂的电影(‘%‘ 符号便是 SQL 的万用字符): select * from film where starring like ‘Jodie%‘;
查所有演员名字以茱蒂开头、年份晚于1985年、年份晚的优先列出、最多十笔,只列出电影名称和年份: select title, year from film where starring like ‘Jodie%‘
and year >= 1985 order by year desc limit 10;
有时候我们只想知道数据库一共有多少笔资料: select count(*) from film;
有时候我们只想知道1985年以后的电影有几部: select count(*) from film where year >= 1985;
(2)创建表 create table Test(Id Integer primary key, value text); 此时即可完成表的创建,当把主键设为Integer时,则该主键为自动增长,插入数据时,可直接使用如下语句: insert into Test values(null,‘Acuzio‘);
(3)获取最后一次插入的主键 select last_insert_rowid();
(4)显示行数和头 sqlite>.mode col sqlite>.headers on 在数据库查询的时候,显示行数和头!
(5)在DOS中,键入Ctrl+C,退出数据库,Unix中,使用Ctrl+D
(6)SQLite Master Table Schema
----------------------------------------------------------------- Name Description ----------------------------------------------------------------- type The object’s type (table, index, view, trigger) name The object’s name tbl_name The table the object is associated with rootpage The object’s root page index in the database (where it begins) sql The object’s SQL definition (DDL)
eg. sqlite> .mode col sqlite> .headers on sqlite> select type, name, tbl_name, sql from sqlite_master order by type; 这样就能看到所有数据库中的信息,表、索引、视图等等
可以用关键字UNIQUE eg. CREATE TABLE contacts ( id INTEGER PRIMARY KEY, name TEXT NOT NULL COLLATE NOCASE, phone TEXT NOT NULL DEFAULT ‘UNKNOWN‘, UNIQUE (name,phone) );
(19)修改表
ALTER TABLE table { RENAME TO name | ADD COLUMN column_def } eg. sqlite> ALTER TABLE contacts ADD COLUMN email TEXT NOT NULL DEFAULT ‘‘ COLLATE NOCASE; sqlite> .schema contacts CREATE TABLE contacts ( id INTEGER PRIMARY KEY, name TEXT NOT NULL COLLATE NOCASE, phone TEXT NOT NULL DEFAULT ‘UNKNOWN‘, email TEXT NOT NULL DEFAULT ‘‘ COLLATE NOCASE, UNIQUE (name,phone) );
(20)查询
SELECT DISTINCT heading FROM tables WHERE predicate GROUP BY columns HAVING predicate ORDER BY columns LIMIT count,offset;
(21)Limit和Offset关键字
Limit 指返回记录的最大行数 Offset 指跳过多少行数据
(22)连接
SELECT heading FROM LEFT_TABLE join_type RIGHT_TABLE ON join_condition; eg. SELECT * FROM A INNER JOIN B ON A.a=B.a; SELECT * FROM A LEFT JOIN B ON A.a=B.a; SELECT * FROM A NATURAL JOIN B ON A; SELECT * FROM A CROSS JOIN B ON A; Remark:当连接条件建立在相同名字的行上,我们可以简单的用关键字(using) eg. SELECT * FROM A INNER JOIN B USING(a);
(23)别名(AS)
eg. SELECT f.name, t.name FROM foods f, food_types t WHERE f.type_id=t.id LIMIT 10; SELECT e.name AS Episode, COUNT(f.id) AS Foods FROM foods f JOIN foods_episodes fe on f.id=fe.food_id JOIN episodes e on fe.episode_id=e.id GROUP BY e.id ORDER BY Foods DESC LIMIT 10;
(24)子查询(IN)
SELECT COUNT(*) FROM foods WHERE type_id IN (SELECT id FROM food_types WHERE name=‘Bakery‘ OR name=‘Cereal‘);
(25)混合查询
关键字:UNION, INTERSECT, EXCEPT 混合查询必须满足以下条件: --关系结果必须有相同的行数 --混合查询只能使用一个order by eg. SELECT f.* FROM foods f INNER JOIN (SELECT food_id, count(food_id) as count FROM foods_episodes GROUP BY food_id ORDER BY count(food_id) DESC LIMIT 10) top_foods ON f.id=top_foods.food_id INTERSECT SELECT f.* FROM foods f INNER JOIN foods_episodes fe ON f.id = fe.food_id INNER JOIN episodes e ON fe.episode_id = e.id WHERE e.season BETWEEN 3 and 5 ORDER BY f.name;
(26)更新数据
插入数据 (insert)INSERT INTO table (column_list) VALUES (value_list); insert语句用于单表操作,他能在同一时刻插入一条或多条数据 更新数据 (update)UPDATE table SET update_list WHERE predicate; 更新操作不能用于约束条件为唯一的字段 删除数据 (delete)DELETE FROM table WHERE predicate;