sqlite学习笔记之sql语法
2013-06-06 11:04:07 阿炯

---------------
如何添加一张数据表
create table student(name varchar(10), age smallint);

---------------
如何往数据表中添加数据
insert into student values('张君', 20);

---------------
如何在字符串中使用单引号(')
SQL 标准规定,在字符串中,单引号需要使用逃逸字符,即在一行中使用两个单引号

---------------
查看数据库有哪些数据表
命令是:.tables

---------------
查看数据表的结构
针对整个数据库
.schema

针对仅仅是freeoa表
.schema freeoa
注意:没有分号

---------------
SQLite的注释问题
SQL error: near "sqlite3": syntax error
SQL指令都是以分号(;)结尾的。如果遇到两个减号(--)则代表注解,sqlite3会略过去。

---------------
如何建立索引
create index index_name on table_name(field_to_be_indexed);

---------------
如何删除一张数据表
drop table contact;

---------------
查看当前的数据库
.database

---------------
如何删除一个数据表的数据
delete from contact;

---------------
如何导入一个文件到某个表中
.import 文件路径 表名
注意:这并非SQL语句,所以不用加分号。

---------------
如何设置文件字段的分隔符
.separator “,”
.import e:/contact.txt contact

---------------
如何查看当前sqllite字段的分隔符是什么?
.show

---------------
SQLite支持哪些数据类型些
NULL 值为NULL
INTEGER 值为带符号的整型,根据类别用1,2,3,4,6,8字节存储
REAL 值为浮点型,8字节存储,存储为8-byte IEEE浮点数
TEXT 值为text字符串,使用数据库编码(UTF-8, UTF-16BE or UTF-16-LE)存储
BLOB 值为二进制数据,具体看实际输入


但实际上,sqlite3也接受如下的数据类型:
smallint  16 位元的整数
interger  32 位元的整数
decimal(p,s)  p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值 ,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。
float   32位元的实数。
double   64位元的实数。
char(n)   n 长度的字串,n不能超过 254。
varchar(n)  长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n)  和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。 这个形态是为了支援两个字元长度的字体,例如中文字。
vargraphic(n)  可变长度且其最大长度为 n 的双字元字串,n不能超过 2000。
date   包含了 年份、月份、日期。
time   包含了 小时、分钟、秒。
timestamp  包含了 年、月、日、时、分、秒、千分之一秒。

---------------
如果将某个字段设置为INTEGER PRIMARY KEY属性,有什么特性
如果将声明表的一列设置为 INTEGER PRIMARY KEY,则具有:
1.每当你在该列上插入一NULL值时, NULL自动被转换为一个比该列中最大值大1的一个整数;
2.如果表是空的,将会是1;

注意:该整数会比表中该列上的插入之前的最大值大1,该键值在当前的表中是唯一的。但有可能与已从表中删除的值重叠,要想建立在整个表的生命周期中唯一的键值,需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT声明。那么,新的键值将会比该表中曾能存在过的最大值大1。

---------------
字段声明中有AUTOINCREMENT属性,有什么与众不同的含义
要想建立在整个表的生命周期中唯一的键值,需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT声明,在插入数据时,它的值会在上次最大值的基础上自我增长步长1。

---------------
如何在一个表上添加或删除一列
SQLite 有有限地 ALTER TABLE 支持。你可以使用它来在表的末尾增加一列,可更改表的名称。如果需要对表结构做更复杂的改变,则必须重新建表。 重建时可以先将已存在的数据放到一个临时表中,删除原表, 创建新表,然后将数据从临时表中复制回来。

如,假设有一个 t1 表,其中有 "a", "b", "c" 三列, 如果要删除列 c ,以下过程描述如何做:
开始事物处理
BEGIN TRANSACTION;
创建临时表格t1-backup
CREATE TEMPORARY TABLE t1_backup(a,b);

将数据库表t1中的所有数据拷贝到表t1-backup中
INSERT INTO t1_backup SELECT a,b FROM t1;

删除表格t1
DROP TABLE t1;

创建表格t1
CREATE TABLE t1(a,b);

将数据库表t1-backup中的所有数据拷贝到表t1中
INSERT INTO t1 SELECT a,b FROM t1_backup;

删除备份表格t1-backup
DROP TABLE t1_backup;

事物提交,执行上面的操作
COMMIT;

---------------
SQL查询语句
select * from film order by year limit 10;
select * from film order by year desc limit 10;
select count(*) from film;
select * from film where starring like 'Jodie%';
select * from film where starring='Jodie Foster';
select title, year from film order by year desc limit 10;
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;

(进一步的各种组合,要去看SQL专书,不过你大概已经知道SQL为什么这么流行了:这种语言允许你将各种查询条件组合在一起──而我们还没提到「跨数据库的联合查询」呢!)

---------------
如何更改或删除资料
了解select的用法非常重要,因为要在sqlite更改或删除一笔资料,也是靠同样的语法。
例如有一笔资料的名字打错了:
update film set starring='Jodie Foster' where starring='Jodee Foster';
就会把主角字段里,被打成'Jodee Foster'的那笔(或多笔)资料,改回成Jodie Foster。

delete from film where year < 1970;
就会删除所有年代早于1970年(不含)的电影了。

---------------
创建索引
CREATE  INDEX [IX_Account] ON  [Account]([IsCheck], [UserName]);
还可以视图等等。

---------------
其它很有用的SQL
  Select * from Sqlite_master
  Select datetime('now')
  Select date('now')
  Select time('now')

---------------
SQLite 内建函数表
算术函数
abs(X)
返回给定数字表达式的绝对值。
max(X,Y[,...])
返回表达式的最大值。
min(X,Y[,...])
返回表达式的最小值。
random(*)
返回随机数。
round(X[,Y])
返回数字表达式并四舍五入为指定的长度或精度。

字符处理函数
length(X)
返回给定字符串表达式的字符个数。
lower(X)
将大写字符数据转换为小写字符数据后返回字符表达式。
upper(X)
返回将小写字符数据转换为大写的字符表达式。
substr(X,Y,Z)
返回表达式的一部分。
randstr()
quote(A)
like(A,B)
确定给定的字符串是否与指定的模式匹配。
glob(A,B)

条件判断函数
coalesce(X,Y[,...])
ifnull(X,Y)
nullif(X,Y)

集合函数
avg(X)
返回组中值的平均值。
count(X)
返回组中项目的数量。
max(X)
返回组中值的最大值。
min(X)
返回组中值的最小值。
sum(X)
返回表达式中所有值的和。

其他函数
typeof(X)
返回数据的类型。
last_insert_rowid()
返回最后插入的数据的 ID 。
sqlite_version(*)
返回 SQLite 的版本。
change_count()
返回受上一语句影响的行数。
last_statement_change_count()

---------------
先判断表如果不存在,则再创建表
SQL可以如下写,供参考:
create table if not exists student(id integer primary key autoincrement,/
age smallint ,anchor smallint);

---------------
b<=a && a <= c 的SQL语句如何写
在SQLite中, 表达式"a BETWEEN b AND c"等于表达式 "a >= b AND a <= c",在比较表达式时,a可以是具有任何亲和性

---------------
a的值是x,y,z其中一个值,SQL语句如何写
SQLite把表达式 "a IN (x, y, z)" 和 "a = z OR a = y OR a = z"视为相等.

常见操作语句一览

ANALYZE 语句:
ANALYZE;
or
ANALYZE database_name;
or
ANALYZE database_name.table_name;

AND/OR 子句:
SELECT column1, column2....columnN
FROM   table_name
WHERE  CONDITION-1 {AND|OR} CONDITION-2;

ALTER TABLE 语句:
ALTER TABLE table_name ADD COLUMN column_def...;

ALTER TABLE 语句(Rename):
ALTER TABLE table_name RENAME TO new_table_name;

ATTACH DATABASE 语句:
ATTACH DATABASE 'DatabaseName' As 'Alias-Name';

BEGIN TRANSACTION 语句:
BEGIN;
or
BEGIN EXCLUSIVE TRANSACTION;

BETWEEN 子句:
SELECT column1, column2....columnN
FROM   table_name
WHERE  column_name BETWEEN val-1 AND val-2;

COMMIT 语句:
COMMIT;

CREATE INDEX 语句:
CREATE INDEX index_name
ON table_name ( column_name COLLATE NOCASE );

CREATE UNIQUE INDEX 语句:
CREATE UNIQUE INDEX index_name
ON table_name ( column1, column2,...columnN);

CREATE TABLE 语句:
CREATE TABLE table_name(
   column1 datatype,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
   PRIMARY KEY( one or more columns )
);

CREATE TRIGGER 语句:
CREATE TRIGGER database_name.trigger_name
BEFORE INSERT ON table_name FOR EACH ROW
BEGIN
   stmt1;
   stmt2;
   ....
END;

CREATE VIEW 语句:
CREATE VIEW database_name.view_name  AS
SELECT statement....;

CREATE VIRTUAL TABLE 语句:
CREATE VIRTUAL TABLE database_name.table_name USING weblog( access.log );
or
CREATE VIRTUAL TABLE database_name.table_name USING fts3( );

COMMIT TRANSACTION 语句:
COMMIT;

COUNT 子句:
SELECT COUNT(column_name)
FROM   table_name
WHERE  CONDITION;

DELETE 语句:
DELETE FROM table_name
WHERE  {CONDITION};

DETACH DATABASE 语句:
DETACH DATABASE 'Alias-Name';

DISTINCT 子句:
SELECT DISTINCT column1, column2....columnN
FROM   table_name;

DROP INDEX 语句:
DROP INDEX database_name.index_name;

DROP TABLE 语句:
DROP TABLE database_name.table_name;

DROP VIEW 语句:
DROP VIEW view_name;

DROP TRIGGER 语句:
DROP TRIGGER trigger_name

EXISTS 子句:
SELECT column1, column2....columnN
FROM   table_name
WHERE  column_name EXISTS (SELECT * FROM   table_name );

EXPLAIN 语句:
EXPLAIN INSERT statement...;
or
EXPLAIN QUERY PLAN SELECT statement...;

GLOB 子句:
SELECT column1, column2....columnN
FROM   table_name
WHERE  column_name GLOB { PATTERN };

GROUP BY 子句:
SELECT SUM(column_name)
FROM   table_name
WHERE  CONDITION
GROUP BY column_name;

HAVING 子句:
SELECT SUM(column_name)
FROM   table_name
WHERE  CONDITION
GROUP BY column_name
HAVING (arithematic function condition);

INSERT INTO 语句:
INSERT INTO table_name( column1, column2....columnN)
VALUES ( value1, value2....valueN);

IN 子句:
SELECT column1, column2....columnN
FROM   table_name
WHERE  column_name IN (val-1, val-2,...val-N);

Like 子句:
SELECT column1, column2....columnN
FROM   table_name
WHERE  column_name LIKE { PATTERN };

NOT IN 子句:
SELECT column1, column2....columnN
FROM   table_name
WHERE  column_name NOT IN (val-1, val-2,...val-N);

ORDER BY 子句:
SELECT column1, column2....columnN
FROM   table_name
WHERE  CONDITION
ORDER BY column_name {ASC|DESC};

PRAGMA 语句:
PRAGMA pragma_name;

For example:
PRAGMA page_size;
PRAGMA cache_size = 1024;
PRAGMA table_info(table_name);

RELEASE SAVEPOINT 语句:
RELEASE savepoint_name;

REINDEX 语句:
REINDEX collation_name;
REINDEX database_name.index_name;
REINDEX database_name.table_name;

ROLLBACK 语句:
ROLLBACK;
or
ROLLBACK TO SAVEPOINT savepoint_name;

SAVEPOINT 语句:
SAVEPOINT savepoint_name;

SELECT 语句:
SELECT column1, column2....columnN
FROM   table_name;

UPDATE 语句:
UPDATE table_name
SET column1 = value1, column2 = value2....columnN=valueN
[ WHERE  CONDITION ];

VACUUM 语句:
VACUUM;

WHERE 子句:
SELECT column1, column2....columnN
FROM   table_name
WHERE  CONDITION;