android SQLite3常用命令&语法

[color=red][b]sqlite数据库只用一个文件就ok,小巧方便,所以是一个非常不错的嵌入式数据库[/b][/color],SQLite大量的被用于手机,PDA,MP3播放器以及机顶盒设备。

[size=medium][color=red][b]新建数据库[/b][/color][/size]

sqlite3 databasefilename


检查databasefilename是否存在,如果不存在就创建并进入数据库(如果直接退出,数据库文件不会创建) [b]如果已经存在直接进入数据库 对数据库进行操作。[/b]


[size=medium][color=red][b]sqlite中命令[/b][/color][/size]

[color=red][b]以.开头,大小写敏感(数据库对象名称是大小写不敏感的)[/b][/color]


.exit
.help 查看帮助 针对命令
.database 显示数据库信息;包含当前数据库的位置
.tables 或者 .table 显示表名称 没有表则不显示
.schema 命令可以查看创建数据对象时的SQL命令;
.schema databaseobjectname查看创建该数据库对象时的SQL的命令;如果没有这个数据库对象就不显示内容,不会有错误提示
.read FILENAME 执行指定文件中的SQL语句
.headers on/off 显示表头 默认off
.mode list|column|insert|line|tabs|tcl|csv 改变输出格式

sqlite> .mode list
sqlite> select * from emp;
7369|SMITH|CLERK|7902|17-12-1980|800||20
7499|ALLEN|SALESMAN|7698|20-02-1981|1600|300|30
如果字段值为NULL 默认不显示 也就是显示空字符串

.dump ?TABLE? 生成形成数据库表的SQL脚本
.dump 生成整个数据库的脚本在终端显示
.output stdout 将输出打印到屏幕 默认
.output filename 将输出打印到文件(.dump .output 结合可将数据库以sql语句的形式导出到文件中)
.nullvalue STRING 查询时用指定的串代替输出的NULL串 默认为.nullvalue ''


[size=medium][color=red][b]字段类型[/b][/color][/size]

数据库中存储的每个值都有一个类型,都属于下面所列类型中的一种,(被数据库引擎所控制)

[b]NULL[/b]: 这个值为空值
[b]INTEGER[/b]: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8个字节
[color=blue][b]REAL[/b][/color]: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号
[color=red][b]TEXT[/b][/color]: 文本. 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE)
[b]BLOB[/b]: 值是BLOB数据,如何输入就如何存储,不改变格式

[b][color=red]值被定义为什么类型只和值自身有关,和列没有关系,和变量也没有关系。[/color][/b]

[size=medium][color=red][b]所以sqlite被称作 弱类型 数据库。[/b][/color][/size]

数据库引擎将在执行时检查、解析类型,并进行数字存储类型(整数和实数)和文本类型之间的转换。

SQL语句中部分的带双引号或单引号的文字被定义为文本,
如果文字没带引号并没有小数点或指数则被定义为整数,
如果文字没带引号但有小数点或指数则被定义为实数,
如果值是空则被定义为空值.
BLOB数据使用符号X'ABCD'来标识.

[color=red][b]但实际上,sqlite3也接受如下的数据类型:[/b][/color]

smallint 16位的整数。
interger 32位的整数。
decimal(p,s) 精确值p是指全部有几个十进制数,s是指小数点后可以有几位小数。如果没有特别指定,则系统会默认为p=5 s=0 。
float 32位元的实数。
double 64位元的实数。
char(n) n 长度的字串,n不能超过 254。
varchar(n) 长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n) 和 char(n) 一样,不过其单位是两个字节, n不能超过127。这个形态是为了支持两个字节长度的字体,如中文字。
vargraphic(n) 可变长度且其最大长度为n的双字元字串,n不能超过2000
date 包含了 年份、月份、日期。
time 包含了 小时、分钟、秒。
timestamp 包含了 年、月、日、时、分、秒、千分之一秒。

ast_insert_rowid() 返回最后插入的数据的ID。

[color=blue][b]sqlite_version()[/b][/color] 返回SQLite的版本。
sqlite> select sqlite_version();



change_count() 返回受上一语句影响的行数。
last_statement_change_count()

[color=blue][b]create table emp_bak select * from EMP;不能在sqlite中使用[/b][/color]


[color=red][b]插入记录[/b][/color]

insert into table_name values (field1, field2, field3...);
--查看table_name表中所有记录
select * from table_name;
--查询符合指定条件的记录
select * from table_name where field1='xxxxx';
select .....
from table_name[,table_name2,...]
where .....
group by....
having ....
order by ...

select .....
from table_name inner join | left outer join | right outer join table_name2
on ...
where .....
group by....
having ....
order by ...




[color=red][b]子查询[/b][/color]


select * from EMP m
where SAL>
(select avg(SAL) from EMP where DEPTNO=m.DEPTNO);


--支持case when then 语法
update EMP
set SAL=
(
case
when DEPTNO=10 and JOB='MANAGER' then SAL*1.1
when DEPTNO=20 and JOB='CLERK' then SAL*1.2
when DEPTNO=30 then SAL*1.1
when DEPTNO=40 then SAL*1.2
else SAL
END
);

select ENAME,
case DEPTNO
when 10 then '后勤部'
when 20 then '财务部'
when 30 then '内务部门'
else '其他部门'
end as dept
from EMP;

--支持关联子查询 in后面的语法中可以有limit(MySQL不可以)
select *
from emp e
where e.EMPNO in
(
select empno
from EMP
where deptno=e.DEPTNO
order by SAL desc
limit 0,2
);


[color=darkred][b]支持表和表之间的数据合并等操作[/b][/color]


--union 去重复 union all 不去掉重复
select deptno from emp
union
select deptno from dept;


select deptno from emp
union all
select deptno from dept;



[b]在列名前加distinct也是去重复[/b]

sqlite> select distinct deptno from emp;



[color=red][b]删除[/b][/color]

delete from table_name where ...


--删除表
drop table_name; 删除表;
drop index_name; 删除索引;


--修改
update table_name
set xxx=value[, xxx=value,...]
where ...


[color=red][b]建立索引[/b][/color]


如果资料表有相当多的资料,[b]我们便会建立索引来加快速度[/b]。好比说:

create index film_title_index on film(title);

意思是针对film资料表的name字段,建立一个名叫film_name_index的索引。这个指令的语法为

CREATE [ UNIQUE ]  NONCLUSTERED  INDEX index_name
ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
create index index_name on table_name(field_to_be_indexed);


一旦建立了索引,sqlite3会在针对该字段作查询时,自动使用该索引。这一切的操作都是在幕后自动发生的,无须使用者特别指令。


sqlite可以在shell底下直接执行命令:

sqlite3 film.db "select * from emp;"



输出 HTML 表格:
sqlite3 -html film.db "select * from film;"
将数据库「倒出来」:


sqlite3 film.db ".dump" > output.sql
利用输出的资料,建立一个一模一样的数据库(加上以上指令,就是标准的SQL数据库备份了):


sqlite3 film.db < output.sql
在大量插入资料时,你可能会需要先打这个指令:


begin;
插入完资料后要记得打这个指令,资料才会写进数据库中:
commit;


sqlite> begin;
sqlite> insert into aaaa values('aaa','333');
sqlite> select * from aaaa;
2|sdfds
sdfsd|9
2012-12-12|13:13:13
aaa|333
sqlite> rollback;
sqlite> select * from aaaa;
2|sdfds
sdfsd|9
2012-12-12|13:13:13


[color=red][b]创建和删除视图[/b][/color]


CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
DROP VIEW view_name


create view e as
select avg(SAL) avgsal,DEPTNO
from EMP
group by DEPTNO;


select ENAME,EMP.DEPTNO,SAL,avgsal
from EMP inner join e
on EMP.DEPTNO=e.DEPTNO
where SAL>avgsal;
练习员工表:
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE DEPT
(
DEPTNO int(2) not null,
DNAME varchar(14),
LOC varchar(13)
);
INSERT INTO "DEPT" VALUES(10,'ACCOUNTING','NEW YORK');
INSERT INTO "DEPT" VALUES(20,'RESEARCH','DALLAS');
INSERT INTO "DEPT" VALUES(30,'SALES','CHICAGO');
INSERT INTO "DEPT" VALUES(40,'OPERATIONS','BOSTON');
CREATE TABLE EMP
(
EMPNO int(4) not null,
ENAME varchar(10),
JOB varchar(9),
MGR int(4),
HIREDATE date,
SAL int(7 ),
COMM int(7 ),
DEPTNO int(2)
);
INSERT INTO "EMP" VALUES(7369,'SMITH','CLERK',7902,'17-12-1980',800,NULL,20);
INSERT INTO "EMP" VALUES(7499,'ALLEN','SALESMAN',7698,'20-02-1981',1600,300,30);
INSERT INTO "EMP" VALUES(7521,'WARD','SALESMAN',7698,'22-02-1981',1250,500,30);
INSERT INTO "EMP" VALUES(7566,'JONES','MANAGER',7839,'02-04-1981',2975,NULL,20);
INSERT INTO "EMP" VALUES(7654,'MARTIN','SALESMAN',7698,'28-09-1981',1250,1400,30);
INSERT INTO "EMP" VALUES(7698,'BLAKE','MANAGER',7839,'01-05-1981',2850,NULL,30);
INSERT INTO "EMP" VALUES(7782,'CLARK','MANAGER',7839,'09-06-1981',2450,NULL,10);
INSERT INTO "EMP" VALUES(7788,'SCOTT','ANALYST',7566,'19-04-1987',3000,NULL,20);
INSERT INTO "EMP" VALUES(7839,'KING','PRESIDENT',NULL,'17-11-1981',5000,NULL,10);
INSERT INTO "EMP" VALUES(7844,'TURNER','SALESMAN',7698,'08-09-1981',1500,0,30);
INSERT INTO "EMP" VALUES(7876,'ADAMS','CLERK',7788,'23-05-1987',1100,NULL,20);
INSERT INTO "EMP" VALUES(7900,'JAMES','CLERK',7698,'03-12-1981',950,NULL,30);
INSERT INTO "EMP" VALUES(7902,'FORD','ANALYST',7566,'03-12-1981',3000,NULL,20);
INSERT INTO "EMP" VALUES(7934,'MILLER','CLERK',7782,'23-01-1982',1300,NULL,10);
CREATE TABLE SALGRADE
(
GRADE int,
LOSAL int,
HISAL int
);
INSERT INTO "SALGRADE" VALUES(1,700,1200);
INSERT INTO "SALGRADE" VALUES(2,1201,1400);
INSERT INTO "SALGRADE" VALUES(3,1401,2000);
INSERT INTO "SALGRADE" VALUES(4,2001,3000);
INSERT INTO "SALGRADE" VALUES(5,3001,9999);
COMMIT;

你可能感兴趣的:(android)