sqlite3经常使用命令&语法

http://blog.csdn.net/linchunhua/article/details/7184439

sqlite数据库仅仅用一个文件就ok,小巧方便,所以是一个很不错的嵌入式数据库,SQLite大量的被用于手机,PDA,MP3播放器以及机顶盒设备。

Mozilla Firefox使用SQLite作为数据库。

Mac计算机中的包括了多份SQLite的拷贝,用于不同的应用。

PHP将SQLite作为内置的数据库。

Skypeclient软件在内部使用SQLite。

SymbianOS(智能手机操作平台的领航)内置SQLite。

AOL邮件client绑定了SQLite。

Solaris 10在启动过程中须要使用SQLite。

McAfee杀毒软件使用SQLite。

iPhones使用SQLite。

Symbian和Apple以外的非常多手机生产厂商使用SQLite。

以下就sqlite中的经常使用命令和语法介绍

http://www.sqlite.org/download.html可下载不同操作系统的相关版本号sqlite  gedit

也能够使用火狐中的插件sqlite manager

新建数据库

sqlite3 databasefilename

检查databasefilename是否存在,假设不存在就创建并进入数据库(假设直接退出,数据库文件不会创建)  假设已经存在直接进入数据库 对数据库进行操作

sqlite中命令:

以.开头,大写和小写敏感(数据库对象名称是大写和小写不敏感的)

.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 默认不显示 也就是显示空字符串

sqlite> .mode column

sqlite> select * from emp;

7369        SMITH       CLERK       7902        17-12-1980  800                     20

7499        ALLEN       SALESMAN    7698        20-02-1981  1600        300         30

7521        WARD        SALESMAN    7698        22-02-1981  1250        500         30

sqlite> .mode insert

sqlite> select * from dept;

INSERT INTO table VALUES(10,‘ACCOUNTING‘,‘NEW YORK‘);

INSERT INTO table VALUES(20,‘RESEARCH‘,‘DALLAS‘);

INSERT INTO table VALUES(30,‘SALES‘,‘CHICAGO‘);

INSERT INTO table VALUES(40,‘OPERATIONS‘,‘BOSTON‘);

sqlite> .mode line

sqlite> select * from dept;

DEPTNO = 10

DNAME = ACCOUNTING

LOC = NEW YORK

DEPTNO = 20

DNAME = RESEARCH

LOC = DALLAS

DEPTNO = 30

DNAME = SALES

LOC = CHICAGO

DEPTNO = 40

DNAME = OPERATIONS

LOC = BOSTON

sqlite> .mode tabs

sqlite> select * from dept;

10 ACCOUNTING
NEW YORK

20 RESEARCH
DALLAS

30 SALES
CHICAGO

40 OPERATIONS
BOSTON

sqlite> .mode tcl

sqlite> select * from dept;

"10" "ACCOUNTING""NEW YORK"

"20" "RESEARCH""DALLAS"

"30" "SALES"
"CHICAGO"

"40" "OPERATIONS""BOSTON"

sqlite> .mode csv

sqlite> select * from dept;

10,ACCOUNTING,"NEW YORK"

20,RESEARCH,DALLAS

30,SALES,CHICAGO

40,OPERATIONS,BOSTON

.separator "X" 更改分界符号为X

sqlite> .separator ‘**‘

sqlite> select * from dept;

10**ACCOUNTING**"NEW YORK"

20**RESEARCH**DALLAS

30**SALES**CHICAGO

40**OPERATIONS**BOSTON

.dump ?TABLE?            生成形成数据库表的SQL脚本

.dump 生成整个数据库的脚本在终端显示

.output stdout           将输出打印到屏幕  默认

.output filename  将输出打印到文件(.dump  .output 结合可将数据库以sql语句的形式导出到文件里)

.nullvalue STRING        查询时用指定的串取代输出的NULL串 默觉得.nullvalue ‘‘

字段类型:

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

NULL: 这个值为空值

INTEGER: 值被标识为整数,根据值的大小能够依次被存储为1,2,3,4,5,6,7,8个字节

REAL: 全部值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.

TEXT: 文本. 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).

BLOB: 值是BLOB数据,怎样输入就怎样存储,不改变格式.

值被定义为什么类型仅仅和值自身有关,和列没有关系,和变量也没有关系.所以sqlite被称作 弱类型 数据库

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

SQL语句中部分的带双引號或单引號的文字被定义为文本,

假设文字没带引號并没有小数点或指数则被定义为整数,

假设文字没带引號但有小数点或指数则被定义为实数,

假设值是空则被定义为空值.

BLOB数据使用符号X‘ABCD‘来标识.

但实际上,sqlite3也接受例如以下的数据类型:

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 包括了 年、月、日、时、分、秒、千分之中的一个秒。

SQLite包括了例如以下时间/日期函数:

datetime() 产生日期和时间    无參数表示获得当前时间和日期

sqlite> select datetime();

2012-01-07 12:01:32

有字符串參数则把字符串转换成日期

sqlite> select datetime(‘2012-01-07 12:01:30‘);

2012-01-07 12:01:30

select date(‘2012-01-08‘,‘+1 day‘,‘+1 year‘);

2013-01-09

select datetime(‘2012-01-08 00:20:00‘,‘+1 hour‘,‘-12 minute‘);

2012-01-08 01:08:00

select datetime(‘now‘,‘start of year‘);

2012-01-01 00:00:00

select datetime(‘now‘,‘start of month‘);

2012-01-01 00:00:00

select datetime(‘now‘,‘start of day‘);

2012-01-08 00:00:00

select datetime(‘now‘,‘start of week‘);错误

select datetime(‘now‘,‘localtime‘);

结果:2006-10-17 21:21:47

date()产生日期

sqlite> select date(‘2012-01-07 12:01:30‘);

2012-01-07

同理 有參和无參

select date(‘now‘,‘start of year‘);

2012-01-01

select date(‘2012-01-08‘,‘+1 month‘);

2012-02-08

time() 产生时间

select time();

03:14:30

select time(‘23:18:59‘);

23:18:59

select time(‘23:18:59‘,‘start of day‘);

00:00:00

select time(‘23:18:59‘,‘end of day‘);错误

在时间/日期函数里能够使用例如以下格式的字符串作为參数:

YYYY-MM-DD

YYYY-MM-DD HH:MM

YYYY-MM-DD HH:MM:SS

YYYY-MM-DD HH:MM:SS.SSS

HH:MM

HH:MM:SS

HH:MM:SS.SSS

now

当中now是产生如今的时间。

日期不能正确比較大小,会按字符串比較,日期默认格式 dd-mm-yyyy

select hiredate from emp order by hiredate;

17-11-1981

17-12-1980

19-04-1987

20-02-1981

22-02-1981

strftime() 对以上三个函数产生的日期和时间进行格式化

strftime()函数能够把YYYY-MM-DD HH:MM:SS格式的日期字符串转换成其他形式的字符串。 strftime(格式, 日期/时间, 修正符, 修正符, …)  select strftime(‘%d‘,datetime());

它能够用下面的符号对日期和时间进行格式化:

%d 在该月中的第几天, 01-31

%f 小数形式的秒,SS.SSS

%H 小时, 00-23

%j 算出某一天是该年的第几天,001-366

%m 月份,00-12

%M 分钟, 00-59

%s 从1970年1月1日到如今的秒数

%S 秒, 00-59

%w 星期, 0-6 (0是星期天)

%W 算出某一天属于该年的第几周, 01-53

%Y 年, YYYY

%% 百分号

select strftime(‘%Y.%m.%d %H:%M:%S‘,‘now‘);

select strftime(‘%Y.%m.%d %H:%M:%S‘,‘now‘,‘localtime‘);

结果:2006.10.17 21:41:09

select hiredate from emp

order by strftime(‘%Y.%m.%d %H:%M:%S‘,hiredate); 正确

select strftime(‘%Y.%m.%d %H:%M:%S‘,hiredate) from emp

order by strftime(‘%Y.%m.%d %H:%M:%S‘,hiredate); 错误

算术函数

abs(X) 返回给定数字表达式的绝对值。

max(X,Y[,...]) 返回表达式的最大值。  组函数 max(列名)

sqlite> select max(2,3,4,5,6,7,12);

12

min(X,Y[,...]) 返回表达式的最小值。

random() 返回随机数。

sqlite> select random();

3224224213599993831

round(X[,Y]) 返回数字表达式并四舍五入为指定的长度或精度。

字符处理函数

length(X) 返回给定字符串表达式的字符个数。

lower(X) 将大写字符数据转换为小写字符数据后返回字符表达式。

upper(X) 返回将小写字符数据转换为大写的字符表达式。

substr(X,Y,Z) 返回表达式的一部分。  从Y開始读Z个字符  Y最小值1

sqlite> select substr(‘abcdef‘,3,3);

cde

quote(A) 给字符串加引號

sqlite> select quote(‘aaa‘);

‘aaa‘

条件推断函数

ifnull(X,Y)  假设X为null 返回Y

select ifnull(comm,0) from emp;

0

300

500

0

1400

集合函数

avg(X) 返回组中值的平均值。

count(X) 返回组中项目的数量。

max(X) 返回组中值的最大值。

min(X) 返回组中值的最小值。

sum(X) 返回表达式中全部值的和。

其它函数

typeof(X) 返回数据的类型。

sqlite> select typeof(111);

integer

sqlite> select typeof(‘233‘);

text

sqlite> select typeof(‘2012-12-12‘);

text

sqlite> select typeof(‘223.44‘);

text

sqlite> select typeof(223.44);

real

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

sqlite_version() 返回SQLite的版本号。

sqlite> select sqlite_version();

3.7.9

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

last_statement_change_count()

create table emp_bak select * from EMP;不能在sqlite中使用

插入记录

insert into table_name values (field1, field2, field3...);

查询

select * from table_name;查看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 ...

子查询:

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

);

支持表和表之间的数据合并等操作

union 去反复  union all 不去掉反复

select deptno from emp

union

select deptno from dept;

select deptno from emp

union all

select deptno from dept;

在列名前加distinct也是去反复

sqlite> select distinct deptno from emp;

删除

delete from table_name where ...

删除表

drop table_name;     删除表;

drop index_name;     删除索引;

改动

update table_name

set xxx=value[, xxx=value,...]

where ...

建立索引

假设资料表有相当多的资料,我们便会建立索引来加高速度。好比说:

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的特别使用方法

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

创建和删除视图

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;

时间: 2024-11-09 18:05:13

sqlite3经常使用命令&amp;语法的相关文章

Windows命令行语法说明

摘自:http://lavasoft.blog.51cto.com/62575/1113234 说来惭愧,用windows这么多年了,对其命令行语法看得似懂非懂,认真琢磨了下,并通过微软官方技术网站获得如下解释: Windows命令行语法说明 表示法 说明 不带方括号或大括号的文本 您必须键入如下所示的项目 < 尖括号内的文本 > 您必须为其提供值的占位符 [方括号内的文本] 可选的项目 {大括号内的文本} 一组所需的项目.选择一个 竖线 (|) 互斥项 : 的分隔符选择一个 省略号 (…)

Sed命令基本语法(一)

学习目标 Sed工作流 Sed命令基本语法 1. sed的工作流程 sed的工作流程分为以下几步 流程图解说:首先读一行存放在模式空间(pattern space); 其次从模式空间取得该内容,并且对命令进行一个解析: 然后把模式空间的内容进行清空,并且输出来: 最后反复一直读: 2. sed命令的基本语法 (1)     sed命令的格式 sed[options]{sed-commands}{input-file} (2) sed的p命令与-n选项(print, --quiet) sed ‘p

Linux命令的语法

  重要的快捷键:      TAB    命令,路径补全 1.创建一个目录/data 命令语法: mkdir /data 2.cd 切换路径 命令语法:   cd / 相对路径的概念:      不从/开始,而是从当前目录开始.例如: data/,mnt/Markin 绝对路径的概念:      从/开始的目录,就叫绝对路径.例如:/data/,/mnt/Markin 3.在/data下面创建一个文件oldboy.txt 命令语法:  touch /data/oldboy.txt  创建后可用

grep,awk和sed的常用命令和语法

Grep的常用命令语法 1. 双引号引用和单引号引用在g r e p命令中输入字符串参数时,最好将其用双引号括起来.例如:“m y s t r i n g”.这样做有两个原因,一是以防被误解为 s h e l l命令,二是可以用来查找多个单词组成的字符串,例如:“jet plane”,如果不用双引号将其括起来,那么单词 p l a n e将被误认为是一个文件,查询结果将返回“文件不存在”的错误信息.在调用变量时,也应该使用双引号,诸如: g r e p“$ M Y VA R”文件名,如果不这样,

UNIX的命令和语法

1.1 ls [语法]: ls [-RadCxmlnogrtucpFbqisf1] [目录或文件......] [说明]: ls 命令列出指定目录下的文件,缺省目录为当前目录 ./,缺省输出顺序为纵向按字符顺序排列. -R 递归地列出每个子目录的内容 -a 列出所有文件,包括第一个字符为“.”的隐藏文件 -d 若后面参数是目录,则只列出目录名而不列出目录内容,常与-l选项连 用以显示目录状态. -C 输出时多列显示 -x 横向按字符顺序排列 -m 输出按流式格式横向排列,文件名之间用逗号(,)分

Linux新手学堂 Crontab命令的语法

crontab 命令的用途就是:提交.编辑.列出或除去 cron 作业. 语法 crontab [ -e [UserName] | -l [UserName] | -r [UserName] | -v [UserName] | File ] 描述 crontab 命令提交.编辑.列出或除去 cron 作业.一个 cron 作业是一个命令,其运行是由 cron 守护程序在规则的调度间隔执行的.要提交一个 cron 作业,指定 crontab 命令用 -e 标志.crontab 命令调用一个编辑会话

Go语言入门篇-命令 与 语法

一.命令基础 1. go run : 用于运行命令源码文件(如:go run helloworld.go) 只能接受一个命令源码文件以及若干个库源码文件作为文件参数 其内部操作步骤: (1)先编译源码文件再运行 先会编译作为参数的源码文件->编译结果放入临时文件夹中->运行编译的结果. 编译结果包括:命令源码文件(.go)和编译后生成的可执行文件和编译后所生成的归档文件(.a) 示例: go run helloworld.go -p ~goc2p/src/helper/ //打印目录 go r

Docker命令与语法

Docker 命令 命令 用途 docker pull 获取image docker stop 停止容器 别名或id docker exec 在正在运行的容器中运行命令 -d在后台运行 -e设置环境变量 -i互动 -t伪终端 docker build 创建image docker imagse 列出image docker run 创建container并运行 -itd --add-host abc:192.168.1.123动态添加host主机 -e设置环境变量 -p暴露端口(宿主机:容器 d

Windbg命令的语法规则系列(二)

二.字符串通配符语法 一些调试器命令具有接受各种通配符的字符串参数.这些类型的参数支持以下语法功能: 星号(*)表示零个或多个字符. 问号(?)表示任何单个字符. 包含字符列表的括号([])表示列表中的任何单个字符.列表中只有一个字符匹配.在这些括号中,可以使用连字符(-)指定范围.例如,prog[er-t7]am匹配“progeam”.“program”.“progsam”.“progtam”和“prog7am”. 数字符号(#)表示前面零个或多个字符.例如,lo#p与“lp”.“lop”.“