來(lái)源
sqlite3
進(jìn)入sqlite3數(shù)據(jù)庫(kù)命令行
.exit/.quit
退出sqlite3命令行
sqlite3 test.db
創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)
databases
檢查創(chuàng)建的數(shù)據(jù)庫(kù)是否在數(shù)據(jù)庫(kù)列表中
sqlite3 test.db .dump > test.sql
將轉(zhuǎn)換test.db數(shù)據(jù)庫(kù)的內(nèi)容到SQLite的語(yǔ)句中,并將其轉(zhuǎn)儲(chǔ)到文本文件test.sql中
sqlite3 test.db < test.sql
從生成的test.sql中恢復(fù)
create tablename person(id int primary key not null,name text not null);
創(chuàng)建一個(gè)person表
.schema person
查看表的完整信息
drop tablename person
刪除person表
.tables
列出附加數(shù)據(jù)庫(kù)中的所有的表
sqlite> CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
/*創(chuàng)建一個(gè)company表*/
insert into company (id, name, age, address, salary) values (1, 'Paul', 32, 'California', 20000.00);
INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00 );
兩種插入數(shù)據(jù)方式(不區(qū)分大小寫)
SELECT tbl_name FROM sqlite_master WHERE type = 'table';
列出所有在數(shù)據(jù)庫(kù)中創(chuàng)建的表
SELECT sql FROM sqlite_master WHERE type = 'table' AND tbl_name = 'COMPANY';
列出關(guān)于 COMPANY 表的完整信息
SELECT CURRENT_TIMESTAMP;
返回當(dāng)前系統(tǒng)日期和時(shí)間值
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000;
列出了 AGE 大于等于 25 且工資大于等于 65000.00 的所有記錄
SELECT * FROM COMPANY WHERE AGE >= 25 OR SALARY >= 65000;
AGE 大于等于 25 或工資大于等于 65000.00
SELECT * FROM COMPANY WHERE AGE IS NOT NULL;
AGE 不為 NULL
SELECT * FROM COMPANY WHERE NAME GLOB 'Ki*';
NAME 以 'Ki' 開(kāi)始的所有記錄,'Ki' 之后的字符不做限制
SELECT * FROM COMPANY WHERE AGE IN ( 25, 27 );
AGE 的值為 25 或 27
SELECT * FROM COMPANY WHERE AGE BETWEEN 25 AND 27;
AGE 的值在 25 與 27 之間
SELECT AGE FROM COMPANY WHERE EXISTS (SELECT AGE FROM COMPANY WHERE SALARY > 65000);
子查詢查找 SALARY > 65000 的帶有 AGE 字段的所有記錄,后邊的 WHERE 子句與 EXISTS 運(yùn)算符一起使用,列出了外查詢中的 AGE 存在于子查詢返回的結(jié)果中的所有記錄
SELECT * FROM COMPANY WHERE AGE > (SELECT AGE FROM COMPANY WHERE SALARY > 65000);
子查詢查找 SALARY > 65000 的帶有 AGE 字段的所有記錄,后邊的 WHERE 子句與 > 運(yùn)算符一起使用,列出了外查詢中的 AGE 大于子查詢返回的結(jié)果中的年齡的所有記錄:
SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000;
AGE 大于等于 25 且工資大于等于 65000.00(可以使用 AND 運(yùn)算符來(lái)結(jié)合 N 個(gè)數(shù)量的條件)
SELECT * FROM COMPANY WHERE AGE >= 25 OR SALARY >= 65000;
AGE 大于等于 25 或工資大于等于 65000.00 (可以使用 OR 運(yùn)算符來(lái)結(jié)合 N 個(gè)數(shù)量的條件)
UPDATE COMPANY SET ADDRESS = 'Texas' WHERE ID = 6;
更新 ID 為 6 的客戶地址
UPDATE COMPANY SET ADDRESS = 'Texas', SALARY = 20000.00;
修改 COMPANY 表中 ADDRESS 和 SALARY 列的所有值,則不需要使用 WHERE 子句
DELETE FROM COMPANY WHERE ID = 7;
刪除 ID 為 7 的客戶:
DELETE FROM COMPANY;
從 COMPANY 表中刪除所有記錄,則不需要使用 WHERE 子句
SELECT * FROM COMPANY WHERE AGE LIKE '2%';
顯示 COMPANY 表中 AGE 以 2 開(kāi)頭的所有記錄(百分號(hào)(%)代表零個(gè)、一個(gè)或多個(gè)數(shù)字或字符。下劃線(_)代表一個(gè)單一的數(shù)字或字符。這些符號(hào)可以被組合使用。)
SELECT * FROM COMPANY WHERE ADDRESS LIKE '%-%';
顯示 COMPANY 表中 ADDRESS 文本里包含一個(gè)連字符(-)的所有記錄:
SELECT * FROM COMPANY WHERE AGE GLOB '2*';
顯示 COMPANY 表中 AGE 以 2 開(kāi)頭的所有記錄(星號(hào)(*)代表零個(gè)、一個(gè)或多個(gè)數(shù)字或字符。問(wèn)號(hào)(?)代表一個(gè)單一的數(shù)字或字符。這些符號(hào)可以被組合使用。)
SELECT * FROM COMPANY WHERE ADDRESS GLOB '*-*';
顯示 COMPANY 表中 ADDRESS 文本里包含一個(gè)連字符(-)的所有記錄
SELECT * FROM COMPANY LIMIT 6;
提取前6行(限制了您想要從表中提取的行數(shù))
select * from company limit 2 offset 4;
第(4+1)位開(kāi)始提取2個(gè)記錄
SELECT * FROM COMPANY ORDER BY SALARY ASC;
將結(jié)果按 SALARY 升序排序
SELECT * FROM COMPANY ORDER BY NAME, SALARY ASC;
結(jié)果先按NAME升序排序,如果NAME中有相同的NAME,再按SALARY升序排序
SELECT * FROM COMPANY ORDER BY NAME DESC;
將結(jié)果按 NAME 降序排序
SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME;
獲取同一個(gè)名字的工資總額
SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME ORDER BY NAME DESC;
GROUP BY 子句放在 WHERE 子句之后,放在 ORDER BY 子句之前
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
/*HAVING 子句必須放在 GROUP BY 子句之后,必須放在 ORDER BY 子句之前*/
SELECT * FROM COMPANY GROUP BY name HAVING count(name) < 2
顯示名稱計(jì)數(shù)小于 2 的所有記錄
SELECT DISTINCT name FROM COMPANY;
獲取唯一一次記錄
NOT NULL 約束
默認(rèn)情況下,列可以保存 NULL 值,如果不想某列有NULL值,需要定義此約束。
DEFAULT 約束
在 INSERT INTO 語(yǔ)句沒(méi)有提供一個(gè)特定的值時(shí),為列提供一個(gè)默認(rèn)值
UNIQUE 約束
防止在一個(gè)特定的列存在兩個(gè)記錄具有相同的值
PRIMARY KEY 約束
在一個(gè)表中可以有多個(gè) UNIQUE 列,但只能有一個(gè)主鍵。在設(shè)計(jì)數(shù)據(jù)庫(kù)表時(shí),主鍵是很重要的。主鍵是唯一的 ID。
CHECK 約束
啟用輸入一條記錄要檢查值的條件。如果條件值為 false,則記錄違反了約束,且不能輸入到表。
ID DEPT EMP_ID
---------- ---------- ----------
1 IT Billing 1
2 Engineerin 2
3 Finance 7
/* DEPARTMENT */
CROSS JOIN
交叉連接————第一個(gè)表的每一行與第二個(gè)表的每一行進(jìn)行匹配,如果兩個(gè)輸入表分別有 x 和 y 列,則結(jié)果表有 x*y 列
SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
表COMPANY和表DEPARTMENT交叉連接
INNER JOIN
內(nèi)連接————把 table1 中的每一行與 table2 中的每一行進(jìn)行比較,找到所有滿足連接謂詞的行的匹配對(duì)(內(nèi)連接(INNER JOIN)是最常見(jiàn)的連接類型,是默認(rèn)的連接類型。INNER 關(guān)鍵字是可選的)
SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
表COMPANY.ID和表DEPARTMENT.EMP_ID相等的列
OUTER JOIN
外連接————從一個(gè)或兩個(gè)表中任何未連接的行合并進(jìn)來(lái),外連接的列使用 NULL 值,將它們附加到結(jié)果表中
SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
表COMPANY中沒(méi)有從表DEPARTMENT中連接的行的值為NULL
UNION
合并兩個(gè)或多個(gè) SELECT 語(yǔ)句的結(jié)果,不返回任何重復(fù)的行(為了使用 UNION,每個(gè) SELECT 被選擇的列數(shù)必須是相同的,相同數(shù)目的列表達(dá)式,相同的數(shù)據(jù)類型,并確保它們有相同的順序,但它們不必具有相同的長(zhǎng)度。)
UNION ALL
結(jié)合兩個(gè) SELECT 語(yǔ)句的結(jié)果,包括重復(fù)行。適用于 UNION 的規(guī)則同樣適用于 UNION ALL 運(yùn)算符。
UPDATE COMPANY SET ADDRESS = NULL, SALARY = NULL where ID IN(6,7);
設(shè)置一些允許空值的值為 NULL
SELECT ID, NAME, AGE, ADDRESS, SALARY FROM COMPANY WHERE SALARY IS NOT NULL;
列出所有 SALARY 不為 NULL 的記錄
SELECT ID, NAME, AGE, ADDRESS, SALARY FROM COMPANY WHERE SALARY IS NULL;
列出所有 SALARY 為 NULL 的記錄
SELECT C.ID, C.NAME, C.AGE, D.DEPT FROM COMPANY AS C, DEPARTMENT AS D WHERE C.ID = D.EMP_ID;
使用 C 和 D 分別作為 COMPANY 和 DEPARTMENT 表的別名
Trigger
觸發(fā)器(Trigger)是數(shù)據(jù)庫(kù)的回調(diào)函數(shù),它會(huì)在指定的數(shù)據(jù)庫(kù)事件發(fā)生時(shí)自動(dòng)執(zhí)行/調(diào)用
- 在特定的數(shù)據(jù)庫(kù)表發(fā)生 DELETE、INSERT 或 UPDATE 時(shí)觸發(fā),或在一個(gè)或多個(gè)指定表的列發(fā)生更新時(shí)觸發(fā)
- SQLite 只支持 FOR EACH ROW 觸發(fā)器(Trigger),沒(méi)有 FOR EACH STATEMENT 觸發(fā)器(Trigger)。因此,明確指定 FOR EACH ROW 是可選的
- 如果提供 WHEN 子句,則只針對(duì) WHEN 子句為真的指定行執(zhí)行 SQL 語(yǔ)句。如果沒(méi)有提供 WHEN 子句,則針對(duì)所有行執(zhí)行 SQL 語(yǔ)句
- BEFORE 或 AFTER 關(guān)鍵字決定何時(shí)執(zhí)行觸發(fā)器動(dòng)作,決定是在關(guān)聯(lián)行的插入、修改或刪除之前或者之后執(zhí)行觸發(fā)器動(dòng)作
- 當(dāng)觸發(fā)器相關(guān)聯(lián)的表刪除時(shí),自動(dòng)刪除觸發(fā)器(Trigger)
- 一個(gè)特殊的 SQL 函數(shù) RAISE() 可用于觸發(fā)器程序內(nèi)拋出異常。
CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
ON table_name
BEGIN
-- Trigger logic goes here....
END;
Trigger實(shí)例
為被插入到新創(chuàng)建的 COMPANY 表(如果已經(jīng)存在,則刪除重新創(chuàng)建)中的每一個(gè)記錄保持審計(jì)試驗(yàn):
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
為了保持審計(jì)試驗(yàn),我們將創(chuàng)建一個(gè)名為 AUDIT 的新表。每當(dāng) COMPANY 表中有一個(gè)新的記錄項(xiàng)時(shí),日志消息將被插入其中:
CREATE TABLE AUDIT(
EMP_ID INT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);
ID 是 AUDIT 記錄的 ID,EMP_ID 是來(lái)自 COMPANY 表的 ID,DATE 將保持 COMPANY 中記錄被創(chuàng)建時(shí)的時(shí)間戳。所以,現(xiàn)在讓我們?cè)?COMPANY 表上創(chuàng)建一個(gè)觸發(fā)器
CREATE TRIGGER audit_log AFTER INSERT
ON COMPANY
BEGIN
INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, datetime('now'));
END;
在 COMPANY 表中插入記錄,這將導(dǎo)致在 AUDIT 表中創(chuàng)建一個(gè)審計(jì)日志記錄。因此,讓我們?cè)?COMPANY 表中創(chuàng)建一個(gè)記錄
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00 );
這將在 COMPANY 表中創(chuàng)建如下一個(gè)記錄:
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 20000.0
同時(shí),將在 AUDIT 表中創(chuàng)建一個(gè)記錄。這個(gè)紀(jì)錄是觸發(fā)器的結(jié)果,這是我們?cè)?COMPANY 表上的 INSERT 操作上創(chuàng)建的觸發(fā)器(Trigger)。類似的,可以根據(jù)需要在 UPDATE 和 DELETE 操作上創(chuàng)建觸發(fā)器(Trigger)。
EMP_ID ENTRY_DATE
---------- -------------------
1 2013-04-05 06:26:00
SELECT name FROM sqlite_master WHERE type = 'trigger';
從 sqlite_master 表中列出所有觸發(fā)器
SELECT name FROM sqlite_master WHERE type = 'trigger' AND tbl_name = 'COMPANY';
列出特定表上的觸發(fā)器
DROP TRIGGER trigger_name;
刪除已有的觸發(fā)器
Transaction
事務(wù)————是指一個(gè)或多個(gè)更改數(shù)據(jù)庫(kù)的擴(kuò)展。例如,如果您正在創(chuàng)建一個(gè)記錄或者更新一個(gè)記錄或者從表中刪除一個(gè)記錄,那么您正在該表上執(zhí)行事務(wù)。重要的是要控制事務(wù)以確保數(shù)據(jù)的完整性和處理數(shù)據(jù)庫(kù)錯(cuò)誤。
實(shí)際上,您可以把許多的 SQLite 查詢聯(lián)合成一組,把所有這些放在一起作為事務(wù)的一部分進(jìn)行執(zhí)行。
- 原子性(Atomicity):確保工作單位內(nèi)的所有操作都成功完成,否則,事務(wù)會(huì)在出現(xiàn)故障時(shí)終止,之前的操作也會(huì)回滾到以前的狀態(tài)。
- 一致性(Consistency):確保數(shù)據(jù)庫(kù)在成功提交的事務(wù)上正確地改變狀態(tài)。
- 隔離性(Isolation):使事務(wù)操作相互獨(dú)立和透明。
- 持久性(Durability):確保已提交事務(wù)的結(jié)果或效果在系統(tǒng)發(fā)生故障的情況下仍然存在。
事務(wù)控制
- BEGIN TRANSACTION:開(kāi)始事務(wù)處理。
- COMMIT:保存更改,或者可以使用 END TRANSACTION 命令。
- ROLLBACK:回滾所做的更改。
事務(wù)控制命令只與 DML 命令 INSERT、UPDATE 和 DELETE 一起使用。他們不能在創(chuàng)建表或刪除表時(shí)使用,因?yàn)檫@些操作在數(shù)據(jù)庫(kù)中是自動(dòng)提交的。
sqlite> BEGIN;
sqlite> DELETE FROM COMPANY WHERE AGE = 25;
sqlite> ROLLBACK;
/*表中刪除 age = 25 的記錄,最后,我們使用 ROLLBACK 命令撤消所有的更改。*/
SELECT * FROM COMPANY WHERE ID IN (SELECT ID FROM COMPANY WHERE SALARY > 45000) ;
子查詢
INSERT INTO COMPANY_BKP SELECT * FROM COMPANY WHERE ID IN (SELECT ID FROM COMPANY) ;
假設(shè) COMPANY_BKP 的結(jié)構(gòu)與 COMPANY 表相似,且可使用相同的 CREATE TABLE 進(jìn)行創(chuàng)建,只是表名改為 COMPANY_BKP。現(xiàn)在把整個(gè) COMPANY 表復(fù)制到 COMPANY_BKP
UPDATE COMPANY SET SALARY = SALARY * 0.50 WHERE AGE IN (SELECT AGE FROM COMPANY_BKP WHERE AGE >= 27 );
假設(shè),我們有 COMPANY_BKP 表,是 COMPANY 表的備份。下面的實(shí)例把 COMPANY 表中所有 AGE 大于或等于 27 的客戶的 SALARY 更新為原來(lái)的 0.50 倍:
DELETE FROM COMPANY WHERE AGE IN (SELECT AGE FROM COMPANY_BKP WHERE AGE > 27 );
假設(shè),我們有 COMPANY_BKP 表,是 COMPANY 表的備份。下面的實(shí)例刪除 COMPANY 表中所有 AGE 大于或等于 27 的客戶記錄:
Autoincrement
用于表中的字段值自動(dòng)遞增。我們可以在創(chuàng)建表時(shí)在特定的列名稱上使用 AUTOINCREMENT 關(guān)鍵字實(shí)現(xiàn)該字段值的自動(dòng)增加。
COUNT
用來(lái)計(jì)算一個(gè)數(shù)據(jù)庫(kù)表中的行數(shù)
SELECT count(*) FROM COMPANY;
得到company表的行數(shù)
MAX
允許我們選擇某列的最大值
SELECT max(salary) FROM COMPANY;
得到salary的最大值
MIN
允許我們選擇某列的最小值
SELECT min(salary) FROM COMPANY;
得到salary的最小值
AVG
計(jì)算某列的平均值
SELECT avg(salary) FROM COMPANY;
所有的salary'的平均値
SUM
允許為一個(gè)數(shù)值列計(jì)算總和
SELECT sum(salary) FROM COMPANY;
所有的salary的和
RANDOM
返回一個(gè)介于 -9223372036854775808 和 +9223372036854775807 之間的偽隨機(jī)整數(shù)
SELECT random() AS Random;
生成一個(gè)隨機(jī)數(shù)
ABS
返回?cái)?shù)值參數(shù)的絕對(duì)值
SELECT abs(5), abs(-15), abs(NULL), abs(0), abs("ABC");
求值
UPPER
把字符串轉(zhuǎn)換為大寫字母
SELECT upper(name) FROM COMPANY;
把表中的所有name轉(zhuǎn)換為大寫
LOWER
把字符串轉(zhuǎn)換為小寫字母
SELECT lower(name) FROM COMPANY;
把表中的所有name轉(zhuǎn)換為小寫
LENGTH
返回字符串的長(zhǎng)度
SELECT name, length(name) FROM COMPANY;
返回name和name的長(zhǎng)度。
sqlite_version
返回 SQLite 庫(kù)的版本
SELECT sqlite_version() AS 'SQLite Version';
當(dāng)前版本