sqlite數據庫只用一個文件就ok,小巧方便,因此是一個很是不錯的嵌入式數據庫,SQLite大量的被用於手機,PDA,MP3播放器以及機頂盒設備。
Mozilla Firefox使用SQLite做爲數據庫。
Mac計算機中的包含了多份SQLite的拷貝,用於不一樣的應用。
PHP將SQLite做爲內置的數據庫。
Skype客戶端軟件在內部使用SQLite。
SymbianOS(智能手機操做平臺的領航)內置SQLite。
AOL郵件客戶端綁定了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;
10ACCOUNTING NEW YORK
20RESEARCH DALLAS
30SALES CHICAGO
40OPERATIONS 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;
html
練習員工表:mysql
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;sql