SQLite3 學習筆記總結
文章目錄
總結
命令
終端命令
sqlite3 [databaseName.db]
sqlite3 test.db .dump > db.sql
sqlite3 test.db < db.sql
sqlite 命令
.help
.exit 或 .quit
.import <file> <table>
.mode <mode>
.show
.databases
.tables
.schema <table> # 例: .schema sqlite_master
.indices [table]
子句
DISTINCT
表達式
WHERE
AND/OR
GROUP BY/HAVING
ORDER BY
OFFSET/LIMIT
運算符
算術運算符:+
、-
、*
、/
、%
比較運算符
==
=
!=
>
<
>=
<=
!<
!>
邏輯運算符
AND
BETWEEN
EXISTS
例:
AGE 存在于子查詢返回的結果中的所有記錄
SELECT AGE FROM COMPANY
WHERE EXISTS (SELECT AGE FROM COMPANY WHERE SALARY > 65000);
IN
NOT IN
LIKE:
% 代表零/一/多個數字或字符
_ 代表一個單一的數字或字符
例:
SELECT column_list
FROM table_name
WHERE column LIKE 'XXXX%'
SELECT column_list
FROM table_name
WHERE column LIKE 'XXXX_’
GLOB:與 LIKE 作用相同,不同之處在于它是大小寫敏感的
* 代表零/一/多個數字或字符
? 代表一個單一的數字或字符
例:
SELECT FROM table_name
WHERE column GLOB '*XXXX*'
SELECT FROM table_name
WHERE column GLOB 'XXXX?'
NOT
OR
IS NULL
IS
IS NOT
||:連接兩個不同的字符串,得到一個新的字符串
UNIQUE
位運算符:&
、|
、~
、<<
、>>
DDL
數據類型
- NULL
- INTEGER
- REAL(浮點數)
- TEXT
- BLOB
數據庫操作
ATTACH DATABASE ‘test.db’ AS ‘mydb’
DETACH DATABASE ‘mydb’
表操作
- CREATE
CREATE TABLE <dbName.tableName> (
colName1 dataType colAttr,
colName2 dataType colAttr
);
- DROP
DROP TABLE <dbName.tableName>;
- ALTER
重命名表:
ALTER TABLE database_name.table_name RENAME TO new_table_name;
例
ALTER TABLE COMPANY RENAME TO OLD_COMPANY;
添加列:
ALTER TABLE database_name.table_name ADD COLUMN column_def...;
例
ALTER TABLE OLD_COMPANY ADD COLUMN SEX char(1);
注:新添加的列是以 NULL 值來填充的
DML
INSERT
INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)]
VALUES (value1, value2, value3,...valueN);
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);
INSERT INTO first_table_name [(column1, column2, ... columnN)]
SELECT column1, column2, ...columnN
FROM second_table_name
[WHERE condition];
UPDATE
UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];
DELETE
DELETE FROM table_name
WHERE [condition];
實現 TRUNCATE 功能:
在 SQLite 中,并沒有 TRUNCATE TABLE 命令,但可以使用 SQLite 的 DELETE 命令從已有的表中刪除全部的數據。
DELETE FROM table_name;
DELETE FROM sqlite_sequence WHERE name = 'table_name';
當 SQLite 數據庫中包含自增列時,會自動建立一個名為 sqlite_sequence 的表。這個表包含兩個列:name 和 seq。name 記錄自增列所在的表,seq 記錄當前序號(下一條記錄的編號就是當前序號加 1)。如果想把某個自增列的序號歸零,只需要修改 sqlite_sequence 表就可以了。
UPDATE sqlite_sequence SET seq = 0 WHERE name = 'table_name';
- DQL:SELECT
SELECT column1, column2, columnN FROM table_name;
SELECT * FROM table_name;
高級
PRAGMA
PRAGMA pragma_name;
PRAGMA pragma_name = value;
字段約束
- NOT NULL
- DEFAULT
- UNIQUE
- PRIMARY KEY 只能用于 INTEGER 字段
- AUTOINCREMENT
- CHECK
例:
CREATE TABLE COMPANY3(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL UNIQUE,
AGE INT NOT NULL DEFAULT 0,
ADDRES CHAR(50),
SALARY REAL CHECK(SALARY > 0)
);
不能更改列:重命名列,刪除一列,或從一個表中添加或刪除約束都是不可能的。
JOIN
CROSS JOIN:笛卡爾積
>SELECT ... FROM table1 CROSS JOIN table2 ...
INNER JOIN:默認的連接類型
>SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...
自然連接(NATURAL JOIN)類似于 JOIN...USING,只是它會自動測試存在兩個表中的每一列的值之間相等值:
SELECT ... FROM table1 NATURAL JOIN table2...
OUTER JOIN:SQLite3 只支持 LEFT
(LEFT/RIGHT/FULL)
>SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
···
##### UNION
···sql
UNION:
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION ALL:
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION ALL
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
別名
表別名:
SELECT column1, column2....
FROM table_name AS alias_name
WHERE [condition];
字段別名:
ELECT column_name AS alias_name
FROM table_name
WHERE [condition];
關鍵字 AS 可被省略
SELECT id AS identification, name AS nickname FROM company;
SELECT id identification, name AS nickname FROM company;
觸發器
是數據庫的回調函數,它會在指定的數據庫事件發生時自動執行/調用
SQLite 只支持 FOR EACH ROW 觸發器(Trigger)
- 如果提供 WHEN 子句,則只針對 WHEN 子句為真的指定行執行 SQL 語句
- BEFORE 或 AFTER 關鍵字決定何時執行觸發器動作
- 當觸發器相關聯的表刪除時,自動刪除觸發器(Trigger)
- 要修改的表必須存在于同一數據庫中
- 一個特殊的 SQL 函數 RAISE() 可用于觸發器程序內拋出異常
語法
CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name
ON table_name
BEGIN
-- 觸發器邏輯....
END;
CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
ON table_name
BEGIN
-- 觸發器邏輯....
END;
— 刪除觸發器
DROP TRIGGER trigger_name;
例:
CREATE TRIGGER audit_log AFTER INSERT
ON COMPANY
BEGIN
INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, datetime('now'));
END;
sqlite_master
查看所有觸發器:
SELECT name FROM sqlite_master
WHERE type = 'trigger';
SELECT name FROM sqlite_master
WHERE type = 'trigger' AND tbl_name = 'COMPANY';
查看所有索引:
SELECT * FROM sqlite_master WHERE type = 'index';
索引
索引有助于加快 SELECT 查詢和 WHERE 子句,但它會減慢使用 UPDATE 和 INSERT 語句時的數據輸入
使用 CREATE INDEX 語句創建索引,它允許命名索引,指定表及要索引的一列或多列,并指示索引是升序排列還是降序排列。
CREATE INDEX index_name ON table_name;
否要創建一個單列索引還是組合索引,要考慮到您在作為查詢過濾條件的 WHERE 子句中使用非常頻繁的列。
===
單列索引:
CREATE INDEX index_name
ON table_name (column_name);
唯一索引:
CREATE UNIQUE INDEX index_name
on table_name (column_name);
組合索引:
CREATE INDEX index_name
on table_name (column1, column2);
隱式索引:
列添加 UNIQUE 約束后會自動創建隱式索引
? INDEXD BY
INDEXD BY 指定必須需要命名的索引來查找前面表中值。
如果索引名 index-name 不存在或不能用于查詢,然后 SQLite 語句的準備失敗
"NOT INDEXED" 子句規定當訪問前面的表(包括由 UNIQUE 和 PRIMARY KEY 約束創建的隱式索引)時,沒有使用索引
使指定了 "NOT INDEXED",INTEGER PRIMARY KEY 仍然可以被用于查找條目
SELECT|DELETE|UPDATE column1, column2...
FROM table_name
INDEXED BY (index_name)
WHERE (CONDITION);
例:
SELECT * FROM COMPANY INDEXED BY salary_index WHERE salary > 5000;
視圖
預定義的 SQLite 語句
SQLite 視圖是只讀的,因此可能無法在視圖上執行 DELETE、INSERT 或 UPDATE 語句
但是可以在視圖上創建一個觸發器,當嘗試 DELETE、INSERT 或 UPDATE 視圖時觸發,需要做的動作在觸發器內容中定義。
語法:
CREATE [TEMP | TEMPORARY] VIEW view_name AS
SELECT column1, column2.....
FROM table_name
WHERE [condition];
如果使用了可選的 TEMP 或 TEMPORARY 關鍵字,則將在臨時數據庫中創建視圖。
刪除視圖:
DROP VIEW view_name;
事務
事務屬性:
ACID
事務控制:只與 DML 命令 INSERT、UPDATE 和 DELETE 一起使用。他們不能在創建表或刪除表時使用,因為這些操作在數據庫中是自動提交的
BEGIN; 或 BEGIN TRANSACTION;
COMMIT; 或 END TRANSACTION;
ROLLBACK;
子查詢
SQL 注入
EXPLAIN
用于交互式分析和排除故障:
EXPLAIN [SQLite Query]
EXPLAIN QUERY PLAN [SQLite Query]
VACUUM
通過復制主數據庫中的內容到一個臨時數據庫文件,然后清空主數據庫,并從副本中重新載入原始的數據庫文件。這消除了空閑頁,把表中的數據排列為連續的,另外會清理數據庫文件結構。
如果表中沒有明確的整型主鍵(INTEGER PRIMARY KEY),VACUUM 命令可能會改變表中條目的行 ID(ROWID)。VACUUM 命令只適用于主數據庫,附加的數據庫文件是不可能使用 VACUUM 命令。
如果有一個活動的事務,VACUUM 命令就會失敗。VACUUM 命令是一個用于內存數據庫的任何操作。由于 VACUUM 命令從頭開始重新創建數據庫文件,所以 VACUUM 也可以用于修改許多數據庫特定的配置參數。
$ sqlite3 database_name "VACUUM;"
sqlite> VACUUM;
sqlite> VACUUM table_name;
其它:AUTO_VACUUM
函數
日期與時間函數
date(timestring, modifier, modifier, ...)
time(timestring, modifier, modifier, ...)
strftime(format, timestring, modifier, modifier, ...)
julianday(timestring, modifier, modifier, ...)
數學與字符串函數
數學函數:
COUNT
MAX/MIN
AVG
SUM
RANDOM
ABS
字符串函數:
UPPER
LOWER
LENGTH
其它函數
sqlite_version
接口:與編程語言交互
參考
- https://www.runoob.com/sqlite/sqlite-tutorial.html
- http://songti.net/thread-636-1-1.html
智能推薦
IOS學習筆記28—SQLite3第三方庫之FMDB
SQLite是一種小型的輕量級的關系型數據庫,在移動設備上使用是非常好的選擇,無論是Android還是IOS,都內置了SQLite數據庫,現在的版本都是SQLite3。在IOS中使用SQLite如果使用SDK提供的方法,特別麻煩也不利于理解和使用,在之前的http://blog.csdn.net/tangren03/article/details/7781930文章中就是使用IOS的SDK自帶的S...
Electron + Vue3 + Vite + Ts + Sqlite3 + Sequelize搭建筆記
1、安裝node -v16.16.0安裝參考 2、安裝全局包 3、vite框架構建 vite官網 4、 安裝代碼檢查、格式化(開發環境) eslint prettier 配置根目錄下.prttierric文件(部分配置) 5、安裝sass(需要就裝) 6、安裝router 官網(需要就裝) 7、引入electron 官網 (以上都是正常的vite + vue3配置) 這一步命...
SQLite3的基礎學習以及Python實踐讀寫db文件
Python集成自帶的最精巧的數據庫管理方案。 基礎命令行操作 鏈接:https://pan.baidu.com/s/1hU1nYRSdm8K0JOeQZVMvJQ 密碼:2cyq為Xmind文件。這里的命令雖然全是大寫,但是sqlite3并不區分大小寫,都用小寫也可以。 python基礎操作 這里寫了一個將Name這一個列表進行寫入db文件的操作,首先創建,添加等。 然后將文件導入的...
Synopse mORMot框架樣例學習02 - Embedded SQLite3 ORM
通過樣例01,學習到了數據單元的定義方法,靜態服務器的創建方式,以及ORM的基本使用方法,現在來看看樣例02 - Embedded SQLite3 ORM,同樣從字面意思猜測它應該是介紹嵌入式SQLite3數據庫的ORM方法. 通過例02的源碼,可以發現只有Project02.dpr工程文件源碼,并沒有pas單元文件,在例01里邊簡單做過說明,是因為例02共用01的所有單元,所以看到的項目管理界面...
SQLite3源碼學習(32) WAL日志詳細分析
在前面2篇文章講了有關WAL日志相關的一些基礎知識: SQLite3源碼學習(31) WAL日志的鎖機制 SQLite3源碼學習(30)WAL-Index文件中的hash表 接下來分析一下在WAL日志模式下,整個事務的處理機制和流程 1.原子提交 事務管理最核心的特性就是滿足原子提交特性,之前的回滾日志模式實現了這個特性,而WAL日志模式也實現了原子提交的特性。 在WAL日志模式下有3個文件,分別...
猜你喜歡
SQLite3源碼學習(28) Pager模塊之事務管理
事務管理是Pager模塊中最核心的要素,所有對數據庫數據的讀寫操作都在事務中進行。一個數據庫需要在多線程的使用環境下保持數據的一致性,雖然操作系統對磁盤的讀寫操作并不是原子,但是通過事務以及日志的回滾機制使每一個事務的執行都是原子的,所以即使出現系統崩潰或斷電,數據庫并不會因此而損壞。 在一...
SQLite3源碼學習(25) Pager模塊之事務鎖的實現2
在上一篇文章中介紹了SQLite怎么用Linux中的記錄鎖來實現每一種類型的事務鎖。但這只適合多進程間的互斥,不適合多線程,在Linux中每一個進程只能擁有一把鎖,也就是說一個進程里的多個線程共用一把鎖,這時會出現一個線程擁有共享鎖,另一個線程再獲取獨占鎖時并不會出現排斥,僅僅是把當前進程的鎖改為獨占鎖,還有當一個線程占有鎖的時候可能被另一個線程釋放等等,這就破壞了數據庫中多事務的隔離性。所以SQ...
SQLite3源碼學習(17) test_vfs的共享內存機制
VFS的IO接口里提供了文件的共享緩存機制,在test_vfs里內置了一個Shared memory模塊用來模擬測試文件的共享緩存,而不是使用原來的VFS提供的接口。 1.結構定義 pFd結構 每一個數據庫文件的連接都對應著一個連接句柄pFile,上層函數調用VFS接口時會傳入pFile,在test_vfs里pFile會被強制轉換為TestvfsFile*類型,相當于sqlite3_file*的一...
SQLite3源碼學習(21) pcache1分析
學習本章之前要先復習以下2篇文章: SQLite3源碼學習(9)Page Cache概述 SQLite3源碼學習(10)testpcache分析 之前講到page cache是一種可插入式的管理方式,在sqlite3GlobalConfig.pcache2里定義了對page cache管理的一系列方法接口,并且介紹了最簡單的一種接口testpcache,現在我們來分析一下默認的接口pache1,這...