[轉(zhuǎn)]Sqlite的基本日常SQL操作語句匯總

原文地址:http://blog.itpub.net/26230597/viewspace-1289857/
序言:
** ****嵌入式數(shù)據(jù)庫****Sqlite****的基本****sql****使用匯總鱼的,使用測(cè)試起來,與關(guān)系型數(shù)據(jù)庫****mysql****在語法上有很多的相似之處痘煤,先準(zhǔn)備測(cè)試數(shù)據(jù):**
CREATE TABLE COMPANY(ID INT NOT NULL, NAME VARCHAR(20),AGE INT,ADDRESS VARCHAR(20),SALARY DECIMAL(7,2));
INSERT INTO "COMPANY" VALUES(1,'Paul',32,'California',20000);
INSERT INTO "COMPANY" VALUES(2,'Allen',25,'Texas',15000);
INSERT INTO "COMPANY" VALUES(3,'Teddy',23,'Norway',20000);
INSERT INTO "COMPANY" VALUES(4,'Mark',25,'Rich-Mond',65000);
INSERT INTO "COMPANY" VALUES(5,'David',27,'Texas',85000);
INSERT INTO "COMPANY" VALUES(6,'Kim',22,'South-Hall',45000);
INSERT INTO "COMPANY" VALUES(7,'James',24,NULL,10000);
INSERT INTO "COMPANY" VALUES(8,'Xiaoteng',29,NULL,NULL);
1凑阶,分組統(tǒng)計(jì)排序
GROUP BY ****進(jìn)行分組統(tǒng)計(jì)數(shù)據(jù),命令如下:
sqlite> SELECT NAME, SUM(SALARY) SALARY_SUM, COUNT(1) COUNT_NUM FROM COMPANY GROUP BY NAME;


ORDER BY ****進(jìn)行排序,命令如下:
sqlite> SELECT NAME, SUM(SALARY) SALARY_SUM, COUNT(1) COUNT_NUM FROM COMPANY GROUP BY NAME ORDER BY SALARY_SUM ASC;

****

****
HAVING ****字句過濾數(shù)據(jù)記錄,命令如下:
SELECT c.*,COUNT(1) COUNT_NUM FROM COMPANY c GROUP BY c.NAME HAVING (COUNT_NUM) > 1 ORDER BY COUNT_NUM ;
PS:在一個(gè)查詢中吞瞪,HAVING 子句必須放在 GROUP BY 子句之后,必須放在 ORDER BY 子句之前养匈。下面是包含 HAVING 子句的 SELECT 語句的語法:


2,Limit分頁統(tǒng)計(jì)語句
SQLite 的 LIMIT 子句用于限制由 SELECT 語句返回的數(shù)據(jù)數(shù)量都伪。
第一頁取值SQL: SELECT * FROM COMPANY ORDER BY ID LIMIT 0,3; 也可以從一個(gè)特定的偏移開始提取記錄呕乎,從第四位開始提取 3 個(gè)記錄,使用OFFSET關(guān)鍵字陨晶,SELECT * FROM COMPANY ORDER BY ID LIMIT 3 OFFSET 0猬仁;PS:首頁從0開始取值。


第二頁取值SQL: SELECT * FROM COMPANY ORDER BY ID LIMIT 3,3; 也可以從一個(gè)特定的偏移開始提取記錄先誉,從第四位開始提取 3 個(gè)記錄湿刽,使用OFFSET關(guān)鍵字,SELECT * FROM COMPANY ORDER BY ID LIMIT 3 OFFSET 3褐耳;如下圖所示:


3诈闺,Glob匹配字句
SQLite 的 GLOB 運(yùn)算符是用來匹配通配符指定模式的文本值。如果搜索表達(dá)式與模式表達(dá)式匹配铃芦,GLOB 運(yùn)算符將返回真(true)雅镊,也就是 1。與 LIKE 運(yùn)算符不同的是刃滓,GLOB 是大小寫敏感的仁烹,對(duì)于下面的通配符,它遵循 UNIX 的語法咧虎。
星號(hào) (
問號(hào) (?)
星號(hào)(
)代表零個(gè)卓缰、一個(gè)或多個(gè)數(shù)字或字符。問號(hào)(?)代表一個(gè)單一的數(shù)字或字符。這些符號(hào)可以被組合使用征唬。
下面一些實(shí)例演示了 帶有 '*' 和 '?' 運(yùn)算符的 GLOB 子句不同的地方:


下面是一個(gè)實(shí)例震叮,它顯示 COMPANY 表中 AGE 以 2 開頭的所有記錄,如下所示:


下面是一個(gè)實(shí)例鳍鸵,它顯示 COMPANY 表中 ADDRESS 文本里包含一個(gè)連字符(-)的所有記錄:


4,Distinct關(guān)鍵字過濾重復(fù)記錄
SQLite 的 DISTINCT 關(guān)鍵字與 SELECT 語句一起使用尉间,來消除所有重復(fù)的記錄偿乖,并只獲取唯一一次記錄。
有可能出現(xiàn)一種情況哲嘲,在一個(gè)表中有多個(gè)重復(fù)的記錄贪薪。當(dāng)提取這樣的記錄時(shí),DISTINCT 關(guān)鍵字就顯得特別有意義眠副,它只獲取唯一一次記錄画切,而不是獲取重復(fù)記錄。

5囱怕,字符串連接操作
問題地址:http://bbs.csdn.net/topics/390886865
sqlite> CREATE TABLE t1(id int, name varchar(60));
sqlite> INSERT INTO "t1" VALUES(4,'1@test.cn');
sqlite> select * from t1;

id name


4 1@test.cn

sqlite>

sqlite> update t1 set name=(id/2)||substr(name,instr(name,'@'),length(name)-instr(name,'@')+1)  where id=4;
sqlite> select * from t1;

id name


4 2@test.cn
sqlite>

6霍弹,對(duì)Null值的處理
往表里面錄入Null值

sqlite> INSERT INTO COMPANY(ID,NAME,AGE,ADDRESS,SALARY) VALUES(8,'Xiaoteng',29,NULL,18000);

sqlite>
修改某個(gè)字段為null值

sqlite> UPDATE COMPANY SET SALARY = NULL WHERE ID=8;

sqlite>
查詢?yōu)閚ull的記錄

sqlite> SELECT * FROM COMPANY WHERE ADDRESS IS NULL;

ID NAME AGE ADDRESS SALARY


7 James 24 10000
8 Xiaoteng 29
sqlite>
查詢不為null的記錄

sqlite> SELECT * FROM COMPANY WHERE ADDRESS IS NOT NULL;

ID NAME AGE ADDRESS SALARY


1 Paul 32 California 20000
2 Allen 25 Texas 15000
3 Teddy 23 Norway 20000
4 Mark 25 Rich-Mond 65000
5 David 27 Texas 85000
6 Kim 22 South-Hall 45000
sqlite>

7,子查詢
SELECt中的基本語法如下:
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name OPERATOR
(SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE])
實(shí)例如下:
sqlite> SELECT * FROM COMPANY WHERE ID IN (SELECT ID FROM COMPANY WHERE SALARY > 45000);

INSERT語句中的子查詢使用娃弓,基本語法:
INSERT INTO table_name [ (column1 [, column2 ]) ]
SELECT [ *|column1 [, column2 ]
FROM table1 [, table2 ]
[ WHERE VALUE OPERATOR ]
實(shí)例如下:
sqlite> INSERT INTO COMPANY_BKP
SELECT * FROM COMPANY
WHERE ID IN (SELECT ID
FROM COMPANY) ;
UPDATE語句中的子查詢使用典格,基本語法如下:
UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
實(shí)例如下:
sqlite> UPDATE COMPANY
SET SALARY = SALARY * 0.50
WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
WHERE AGE >= 27 );
DELETE語句中的子查詢使用,語法如下:
DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
實(shí)例如下:
sqlite> DELETE FROM COMPANY
WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
WHERE AGE > 27 );

8台丛,EXPLAIN分析
沒有建立索引之前耍缴,分析都是表掃描:
sqlite> EXPLAIN SELECT * FROM COMPANY WHERE Salary < 20000;
addr opcode p1 p2 p3 p4 p5 comment


0 Trace 0 0 0 00
1 Integer 20000 1 0 00
2 Goto 0 16 0 00
3 OpenRead 0 2 0 5 00
4 Rewind 0 14 0 00
5 Column 0 4 2 00
6 Ge 1 13 2 collseq(BI 6b
7 Column 0 0 4 00
8 Column 0 1 5 00
9 Column 0 2 6 00
10 Column 0 3 7 00
11 Column 0 4 8 00
12 ResultRow 4 5 0 00
13 Next 0 5 0 01
14 Close 0 0 0 00
15 Halt 0 0 0 00
16 Transactio 0 0 0 00
17 VerifyCook 0 1 0 00
18 TableLock 0 2 0 COMPANY 00
19 Goto 0 3 0 00
sqlite> EXPLAIN QUERY PLAN SELECT * FROM COMPANY WHERE Salary < 20000;
order from detail


0 0 TABLE COMPANY
sqlite>

建立索引,再進(jìn)行****EXPLAIN****分析查看結(jié)果挽霉,走了****idx_sal****索引掃描:
sqlite> CREATE INDEX idx_sal ON COMPANY(SALARY);
sqlite> EXPLAIN SELECT * FROM COMPANY WHERE Salary < 20000;
addr opcode p1 p2 p3 p4 p5 comment


0 Trace 0 0 0 00
1 Integer 20000 1 0 00
2 Goto 0 25 0 00
3 OpenRead 0 2 0 5 00
4 OpenRead 1 3 0 keyinfo(1, 00
5 Affinity 2 0 0 cb 00
6 Rewind 1 22 2 0 00
7 SCopy 1 2 0 00
8 IsNull 2 22 0 00
9 Affinity 2 1 0 cb 00
10 IdxGE 1 22 2 1 00
11 Column 1 0 3 00
12 IsNull 3 21 0 00
13 IdxRowid 1 3 0 00
14 Seek 0 3 0 00
15 Column 0 0 4 00
16 Column 0 1 5 00
17 Column 0 2 6 00
18 Column 0 3 7 00
19 Column 1 0 8 00
20 ResultRow 4 5 0 00
21 Next 1 10 0 00
22 Close 0 0 0 00
23 Close 1 0 0 00
24 Halt 0 0 0 00
25 Transactio 0 0 0 00
26 VerifyCook 0 2 0 00
27 TableLock 0 2 0 COMPANY 00
28 Goto 0 3 0 00
sqlite> EXPLAIN QUERY PLAN SELECT * FROM COMPANY WHERE Salary < 20000;
order from detail


0 0 TABLE COMPANY WITH INDEX idx_sal
sqlite>******9****防嗡,刪除重復(fù)數(shù)據(jù)但是一條記錄**
錄入測(cè)試數(shù)據(jù)
sqlite> .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE COMPANY(ID INT NOT NULL, NAME VARCHAR(20),AGE INT,ADDRESS VARCHAR(20),SALARY DECIMAL(7,2));
INSERT INTO "COMPANY" VALUES(2,'Allen',25,'Texas',15000);
INSERT INTO "COMPANY" VALUES(3,'Teddy',23,'Norway',20000);
INSERT INTO "COMPANY" VALUES(4,'Mark',25,'Rich-Mond',65000);
INSERT INTO "COMPANY" VALUES(5,'David',27,'Texas',85000);
INSERT INTO "COMPANY" VALUES(6,'Kim',22,'South-Hall',45000);
INSERT INTO "COMPANY" VALUES(7,'James',24,'Houston',10000);
INSERT INTO "COMPANY" VALUES(7,'James',28,'Houston',20000);
INSERT INTO "COMPANY" VALUES(4,'Mark',29,'Rich-Mond',95000);
COMMIT;
sqlite>

查看重復(fù)記錄數(shù)
sqlite> select * from company order by name;
ID NAME AGE ADDRESS SALARY


2 Allen 25 Texas 15000
5 David 27 Texas 85000
7 James 24 Houston 10000
7 James 28 Houston 20000
6 Kim 22 South-Hall 45000
4 Mark 25 Rich-Mond 65000
4 Mark 29 Rich-Mond 95000
3 Teddy 23 Norway 20000
sqlite>

通過rowid來刪除重復(fù)記錄
sqlite> DELETE FROM COMPANY WHERE rowid NOT IN(SELECT MAX(rowid) rowid FROM COMPANY GROUP BY NAME);
sqlite>

再查看最新的數(shù)據(jù)記錄,已經(jīng)刪除了重復(fù)NAME的記錄
sqlite> select * from company;
ID NAME AGE ADDRESS SALARY


2 Allen 25 Texas 15000
3 Teddy 23 Norway 20000
5 David 27 Texas 85000
6 Kim 22 South-Hall 45000
7 James 28 Houston 20000
4 Mark 29 Rich-Mond 95000
sqlite>


<版權(quán)所有侠坎,文章允許轉(zhuǎn)載蚁趁,但必須以鏈接方式注明源地址,否則追究法律責(zé)任!>原博客地址:http://blog.itpub.net/26230597/abstract/1/原作者:黃杉 (mchdba)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末硅蹦,一起剝皮案震驚了整個(gè)濱河市荣德,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌童芹,老刑警劉巖涮瞻,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異假褪,居然都是意外死亡署咽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宁否,“玉大人窒升,你說我怎么就攤上這事∧浇常” “怎么了饱须?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)台谊。 經(jīng)常有香客問我蓉媳,道長(zhǎng),這世上最難降的妖魔是什么锅铅? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任酪呻,我火速辦了婚禮,結(jié)果婚禮上盐须,老公的妹妹穿的比我還像新娘玩荠。我一直安慰自己,他們只是感情好贼邓,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布阶冈。 她就那樣靜靜地躺著,像睡著了一般立帖。 火紅的嫁衣襯著肌膚如雪眼溶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天晓勇,我揣著相機(jī)與錄音堂飞,去河邊找鬼。 笑死绑咱,一個(gè)胖子當(dāng)著我的面吹牛绰筛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播描融,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼铝噩,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了窿克?” 一聲冷哼從身側(cè)響起骏庸,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎年叮,沒想到半個(gè)月后具被,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡只损,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年一姿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了七咧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叮叹,死狀恐怖艾栋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛉顽,我是刑警寧澤蝗砾,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站携冤,受9級(jí)特大地震影響遥诉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜噪叙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望霉翔。 院中可真熱鬧睁蕾,春花似錦、人聲如沸债朵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽序芦。三九已至臭杰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谚中,已是汗流浹背渴杆。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宪塔,地道東北人磁奖。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像某筐,于是被迫代替她去往敵國(guó)和親比搭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容