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;
sqlite3经常使用命令&语法的更多相关文章
- Windows命令行语法说明
摘自:http://lavasoft.blog.51cto.com/62575/1113234 Windows命令行语法说明 说来惭愧,用windows这么多年了,对其命令行语法看得似懂非懂, ...
- 在SQL Server中如何快速查找DBCC命令和语法?
DBCC命令非常好用,但是命令很多语法就很多,如何快速记忆呢?是否都要背下来.其实不用,只要能知道每个命令的作用并且记住DBCC HELP命令就可以了. --查找所有的DBCC命令 DBCC HEL ...
- Learn Rails5.2- ActiveRecord: sqlite3的用法, Query查询语法。乐观锁和悲观锁案例,查询语法includes(), 多态关联,destory和delete, Scope, Validats, Migrations
rails generate model photo title:string album:references 这会产生一个album_id列,当建立belongs_to关联时,需要用到. refe ...
- Android SQLite3工具常用命令行总结
Android SDK的tools目录下提供了一个sqlite3.exe工具,这是一个简单的sqlite数据库管理工具.开发者可以方便的使用其对sqlite数据库进行命令行的操作. 程序运行生成的*. ...
- Linux新手学堂 Crontab命令的语法
crontab 命令的用途就是:提交.编辑.列出或除去 cron 作业. 语法 crontab [ -e [UserName] | -l [UserName] | -r [UserName] | -v ...
- grep,awk和sed的常用命令和语法
Grep的常用命令语法 1. 双引号引用和单引号引用在g r e p命令中输入字符串参数时,最好将其用双引号括起来.例如:“m y s t r i n g”.这样做有两个原因,一是以防被误解为 s h ...
- MySQL数据库的数据备份和恢复(导入和导出)命令操作语法【转】
不管是Oracle数据库还是SQL Server数据库,每个数据库都有自己的一套数据备份和恢复的方法,MySQL数据库也不例外.MySQL数据库备份和恢复用到了两个命令,分别是“mysqldump”和 ...
- fish(自动推荐命令;语法高亮等)
Fish 是 Linux/Unix/Mac OS 的一个命令行 shell,有一些很好用的功能. 自动推荐 VGA 颜色 完美的脚本支持 基于网页的配置 帮助文档自动补全 语法高亮 以及更多 自动推荐 ...
- 从windows拷贝到linux的脚本报错:未找到命令 or 语法错误
可能真的是命令拼错了或者参数有误,也可能是语法错误. 但是但是但是,如果之前脚本运行的好好的,没做任何改动或者仅仅改了一丁点儿. 那么脚本可能在格式上存在问题,解决方案: 安装dos2unix sud ...
随机推荐
- [Linux]三种方案在Windows系统下安装ubuntu双系统(转)
在学习linux的过程中,ubuntu无疑是初学者的最佳选择. 下面来列举给Windows系统安装ubuntu双系统的三种方法. 一.虚拟机安装(不推荐) 使用工具:Vmware 如果不是因为迫不得已 ...
- bootstrap初探
bootstrap资源 http://getbootstrap.com http://github.com/twbs http://www.bootcss.com bootstrap栅格系统 容器:流 ...
- junit测试用例加载spring配置文件
junit加载pom引用项目的xml配置文件,如果定义了<beans profile="dev">,必须在测试用例类上面加上标记 @ActiveProfiles(&qu ...
- MySQL性能调优与架构设计读书笔记
可扩展性设计之数据切分 14.2 数据的垂直切分 如何切分,切分到什么样的程度,是一个比较考验人的难题.只能在实际的应用场景中通过平衡各方面的成本和利益,才能分析出一个真正适合自己的拆分方案. 14. ...
- 让 IE 支持HTML5 placeholder
HTML5 新增的placeholder属性已经得到现代浏览器的支持,旨在提供简单的API可以为文本输入框设置 描述输入字段预期值的提示信息(hint). 这是W3C在标准化的过程中对用户体验的更多考 ...
- (四 )Knockout - ViewModel 的使用3 - 对象属性变化的实时更新
ko.observableArray()就可以自动检测属性,其实他只是监控对象,而不是对象中的属性 使用ko.observable()进行处理 DEMO1 实时更新属性 //定义user数据对象 va ...
- 3D dungeon
算法:广搜: 描述 You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is comp ...
- php微信简单接口
<?php $appid = "xxxxxxxxxx"; $secret = "xxxxxxxxxxxxxxxxxxxxxxxxx"; $url = &q ...
- 关于ASP.NET MVC中的视图生成
在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Model 用来表示处理的数据. 从控制器到视图 ...
- Linux学习——粘粘今天看的东西
由二分割表就叧有64 bytes而已,最多叧能容纳四笔分割的记录, 这四个分割的记录被称为主要(Primary)戒延伸(Extended)分割槽.分割槽的最小单位为磁柱(cylinder)请注意, 延 ...