這是SQLite系列文章第一篇。
SQLite 是遵守 ACID 的關(guān)系數(shù)據(jù)庫管理系統(tǒng)(Relational database management system,簡稱RDBMS),包含在 C 庫中。與其他數(shù)據(jù)庫相比,SQLite 不是客戶端、服務(wù)端數(shù)據(jù)庫引擎濒翻,而是將其嵌入到客戶端中。
這里將分為兩篇文章介紹「SQLite的使用」啦膜,這一篇包含以下內(nèi)容:
- 術(shù)語
- 數(shù)據(jù)庫
- 數(shù)據(jù)庫管理系統(tǒng)
- 關(guān)系數(shù)據(jù)庫管理系統(tǒng)
- SQL
- SQLite 簡介
- 安裝 SQLite
- 數(shù)據(jù)類型
- 創(chuàng)建數(shù)據(jù)庫
- 表
- 創(chuàng)建表
- 刪除表
- 插入 INSERT
- 查詢 SELECT
- 運(yùn)算符
- 算數(shù)運(yùn)算符
- 邏輯運(yùn)算符
- 比較運(yùn)算符
- WHERE
- 更新 UPDATE
- 刪除 DELETE
1. 術(shù)語
在學(xué)習(xí) SQLite 之前有送,先了解幾個(gè)與此相關(guān)的術(shù)語。
1.1 數(shù)據(jù)庫
數(shù)據(jù)庫(database)是有組織的數(shù)據(jù)集合僧家,通常在計(jì)算機(jī)系統(tǒng)中以電子的形式存儲雀摘、查詢。
1.2 數(shù)據(jù)庫管理系統(tǒng)
數(shù)據(jù)庫管理系統(tǒng)(database management system八拱,簡稱DBMS)是與數(shù)據(jù)庫交互的軟件阵赠。數(shù)據(jù)庫、DBMS和關(guān)聯(lián)的應(yīng)用程序總和稱為數(shù)據(jù)庫系統(tǒng)肌稻。通常清蚀,數(shù)據(jù)庫還用于寬泛的指代任何DBMS、數(shù)據(jù)庫系統(tǒng)爹谭,或與數(shù)據(jù)庫關(guān)聯(lián)的應(yīng)用程序枷邪。
1.3 關(guān)系數(shù)據(jù)庫管理系統(tǒng)
每個(gè)DBMS都有一個(gè)基礎(chǔ)模型,該模型決定數(shù)據(jù)庫的結(jié)構(gòu)和恢復(fù)數(shù)據(jù)的方式诺凡。關(guān)系數(shù)據(jù)庫管理系統(tǒng)是創(chuàng)建在關(guān)系模型基礎(chǔ)上的數(shù)據(jù)庫东揣,借助集合代數(shù)等數(shù)學(xué)概念和方法來處理數(shù)據(jù)庫中的數(shù)據(jù)。
關(guān)系模型由關(guān)系數(shù)據(jù)結(jié)構(gòu)腹泌、關(guān)系操作集合嘶卧、關(guān)系完整性約束三部分組成。
RDBMS 以表的形式存儲數(shù)據(jù)凉袱,DBMS 以文件的形式存儲數(shù)據(jù)芥吟。
DBMS 也可能使用表,但表之間沒有關(guān)系绑蔫。其數(shù)據(jù)通常以分層形式或?qū)Ш叫问酱鎯υ寺佟_@意味著單個(gè)數(shù)據(jù)單元將具有一個(gè)父節(jié)點(diǎn)泵额,零個(gè)配深、一個(gè)或多個(gè)子節(jié)點(diǎn)。
在 RDBMS 中嫁盲,表具有稱為主鍵(primary key)的標(biāo)識符篓叶,數(shù)據(jù)以 table 的形式存儲烈掠,這些數(shù)值之間的關(guān)系也將以 table 的形式存儲。數(shù)值可以由系統(tǒng)更新缸托,數(shù)據(jù)在物理和邏輯上是相互獨(dú)立的左敌。
常見 RDBMS 有 MySql、PostgreSQL俐镐、SQL Server Express矫限、SQLite等。
1.4 SQL
SQL 全稱是 structured query language佩抹,指結(jié)構(gòu)化查詢語言叼风。也就是 SQL 是用于訪問和處理數(shù)據(jù)庫的標(biāo)準(zhǔn)化的計(jì)算機(jī)語言。
雖然 SQL 是一門 ANSI 標(biāo)準(zhǔn)的計(jì)算機(jī)語言棍苹,但仍然存在著多種不同版本的 SQL 語言无宿。為了與 ANSI 標(biāo)準(zhǔn)相兼容,它們必須以相似的方式共同支持一些主要的命令枢里。例如孽鸡,SELECT、UPDATE栏豺、DELETE坑鱼、INSERT、WHERE等衬廷。
2. SQLite 簡介
SQLite 是遵守 ACID 的關(guān)系數(shù)據(jù)庫管理系統(tǒng)褐奴,它包含在 C 庫中,實(shí)現(xiàn)了大多數(shù) SQL 標(biāo)準(zhǔn)溉卓,通常遵循 PostgreSQL 語法皮迟。與其他數(shù)據(jù)庫系統(tǒng)不同,SQLite 不是客戶端/服務(wù)端數(shù)據(jù)庫引擎桑寨,而是被集成到客戶端中伏尼。
另外,SQLite 具有以下特點(diǎn):
- 無需單獨(dú)的服務(wù)器進(jìn)程尉尾,或操作的系統(tǒng)(無服務(wù)器的)爆阶。
- 無需配置,也就是無需安裝沙咏、管理辨图。
- 一個(gè)完整的 SQLite 數(shù)據(jù)庫是存儲在一個(gè)單一的跨平臺的磁盤文件。
- 文件小肢藐。完全配置時(shí)小于400kb故河,省略可選功能時(shí)小于250kb。
- 自給自足吆豹,無需任何外部依賴鱼的。
- 完全兼容ACID理盆,允許從多個(gè)進(jìn)程、線程安全訪問凑阶。
- 支持SQL92 標(biāo)準(zhǔn)的大多數(shù)查詢語言猿规。
- 可在 UNIX(Linux、macOS宙橱、iOS姨俩、Android)和 Windows 中運(yùn)行。
- 許可協(xié)議為公有領(lǐng)域(public domain)师郑。
與其它 RDBMS 相比哼勇,SQLite 具有以下缺點(diǎn):
- 沒有用戶管理和安全功能。
- 無法輕松擴(kuò)展呕乎。
- 當(dāng)數(shù)據(jù)量變大時(shí)积担,占用內(nèi)存隨之增多,且不易優(yōu)化猬仁。
- 無法自定義帝璧。
SQLite 是嵌入式數(shù)據(jù)庫軟件的首選,是部署最廣泛的數(shù)據(jù)庫引擎之一湿刽,被主流瀏覽器的烁、操作系統(tǒng)、移動設(shè)備所使用诈闺。
ACID 是指 DBMS 在寫入渴庆、更新資料過程中,為保證事務(wù)(transaction)是正確可靠的雅镊,所必須具備的四個(gè)特性:
- 原子性 atomicity:一個(gè)事務(wù)中的所有操作襟雷,或者全部完成,或者全部不完成仁烹,不會結(jié)束在中間某個(gè)環(huán)節(jié)耸弄。事務(wù)在執(zhí)行過程中發(fā)生錯(cuò)誤,會被回滾(rollback)到事務(wù)開始前的狀態(tài)卓缰,就像這個(gè)事務(wù)從來沒有執(zhí)行過一樣计呈。即,事務(wù)不可分割征唬、不可約簡捌显。
- 一致性 consistency:在事務(wù)開始之前和結(jié)束之后,數(shù)據(jù)庫的完整性沒有被破壞总寒。即寫入的資料完全符合預(yù)設(shè)約束扶歪、觸發(fā)器、級聯(lián)回滾等偿乖。
- 隔離性 isolation:數(shù)據(jù)庫允許多個(gè)并發(fā)事務(wù)同時(shí)對其數(shù)據(jù)進(jìn)行讀寫和修改的能力击罪,隔離性可以防止多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)哲嘲,由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致贪薪。
- 持久性 durability:事務(wù)處理結(jié)束后媳禁,對數(shù)據(jù)的修改就是持久的,即便系統(tǒng)故障也不會丟失画切。
在數(shù)據(jù)庫系統(tǒng)中竣稽,一個(gè)事務(wù)指:由一系列數(shù)據(jù)庫操作組成的一個(gè)完整的邏輯過程。如銀行轉(zhuǎn)賬霍弹,從原賬戶扣除金額毫别、向目標(biāo)賬戶添加金額,這兩個(gè)數(shù)據(jù)庫操作的總和構(gòu)成一個(gè)完整的邏輯過程典格,不可拆分岛宦。這個(gè)過程被稱為一個(gè)事務(wù),具有ACID特性耍缴。
3. 安裝 SQLite
在命令后輸入sqlite3
即可查看是否安裝了SQLite
:
$ sqlite3
SQLite version 3.28.0 2019-04-15 14:49:49
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>
Linux 和 macOS 預(yù)裝了 SQLite砾肺。如果你的操作系統(tǒng)沒有預(yù)裝 SQLite,訪問SQLite 下載頁面根據(jù)提示安裝即可防嗡。
4. 點(diǎn)命令
這一部分介紹 SQLite 的點(diǎn)命令变汪,其不以分號結(jié)束。
輸入.help
可獲取點(diǎn)命令清單蚁趁。如下所示:
sqlite> .help
.databases List names and files of attached databases
.mode MODE ?TABLE? Set output mode
.quit Exit this program
.save FILE Write in-memory database into FILE
.schema ?PATTERN? Show the CREATE statements matching PATTERN
.show Show the current values for various settings
.stats ?on|off? Show stats or turn stats on or off
.tables ?TABLE? List names of tables matching LIKE pattern TABLE
.timeout MS Try opening locked tables for MS milliseconds
.timer on|off Turn SQL timer on or off
.width NUM1 NUM2 ... Set column widths for "column" mode\
...
可以使用下面點(diǎn)命令自定義輸出格式:
sqlite> .header on
sqlite> .mode column
sqlite> .timer on
上面設(shè)置將產(chǎn)生如下格式的輸出:
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
Run Time: real 0.001 user 0.000113 sys 0.000087
5. 數(shù)據(jù)類型
SQLite 使用一個(gè)更普遍的動態(tài)類型系統(tǒng)裙盾,值的數(shù)據(jù)類型與值本身是相關(guān)的,與其容器無關(guān)他嫡。
5.1 存儲類
每個(gè)存儲在 SQLite 數(shù)據(jù)庫中的值都具有以下存儲類之一:
存儲類 | 描述 |
---|---|
NULL | 值是一個(gè) NULL 值番官。 |
INTEGER | 值是一個(gè)帶符號的整數(shù)。根據(jù)值大小存儲在1钢属、2鲤拿、3、4署咽、6或8個(gè)字節(jié)中近顷。 |
REAL | 值是一個(gè)浮點(diǎn)值。存儲為8個(gè)字節(jié)的 IEEE 浮點(diǎn)數(shù)字宁否。 |
TEXT | 值是一個(gè)文本字符串窒升,使用數(shù)據(jù)庫編碼(UTF-8、UTF-16BE或 UTF-16LE)存儲慕匠。 |
BLOB | 完全根據(jù)輸入存儲饱须。 |
存儲類比數(shù)據(jù)類稍微普遍些。例如台谊,INTEGER 存儲類包含六種不同長度的整數(shù)數(shù)據(jù)類型蓉媳。
5.2 親和類型 Affinity
SQLite 支持親和類型概念譬挚,列內(nèi)可以存儲任何類型的數(shù)據(jù)。當(dāng)數(shù)據(jù)插入時(shí)酪呻,該字段的數(shù)據(jù)將會優(yōu)先采用親緣類型作為該值的存儲方式减宣。目前支持以下五種親緣類型:
親和類型 | 描述 |
---|---|
TEXT | 數(shù)值型數(shù)據(jù)在被插入之前,需要先被轉(zhuǎn)換為文本格式再插入到目標(biāo)字段中玩荠。 |
NUMERIC | 當(dāng)文本數(shù)據(jù)被插入到親緣性為NUMERIC的字段中時(shí)漆腌,如果轉(zhuǎn)換操作不會導(dǎo)致信息丟失以及完全可逆,會將文本數(shù)據(jù)轉(zhuǎn)換為INTEGER或REAL類型數(shù)據(jù)阶冈,如果轉(zhuǎn)換失敗闷尿,仍會以TEXT方式存儲該數(shù)據(jù); NULL和BLOB類型數(shù)據(jù)女坑,不做任何轉(zhuǎn)換填具,直接存儲; 浮點(diǎn)格式的常量文本匆骗,如 3000.0 劳景。如果該值可以轉(zhuǎn)換為INTEGER,同時(shí)又不丟失數(shù)值信息绰筛,則會轉(zhuǎn)為INTEGER存儲枢泰。 |
INTEGER | 規(guī)則與NUMERIC相同,唯一差別在執(zhí)行CAST表達(dá)式铝噩。 |
REAL | 規(guī)則基本等同于NUMERIC衡蚂。唯一差別是不會將3000.0 這樣的文本數(shù)據(jù)轉(zhuǎn)換為INTEGER存儲。 |
NONE | 不做任何轉(zhuǎn)換骏庸,直接以該數(shù)據(jù)所屬的數(shù)據(jù)類型進(jìn)行存儲毛甲。 |
5.3 數(shù)據(jù)類型與親和類型對照
下面列出了數(shù)據(jù)類型和親和類型的對應(yīng)關(guān)系:
親和類型 | 數(shù)據(jù)類型 |
---|---|
INTEGER | INT、INTEGER具被、TINYINT玻募、SMALLINT、MEDIUMINT一姿、BEGINT七咧、UNSIGNED BIG INT、INT2叮叹、INT8 |
TEXT | CHARACTER(20)艾栋、VARCHAR(255)、VARYING CHARACTER(255)蛉顽、NCHAR(55)蝗砾、NATIVE CHARACTER(70)、NVARCHAR(100)、TEXT悼粮、CLOB |
NONE | BLOB闲勺、no datatype specified |
REAL | REAL、DOUBLE扣猫、DOUBLE PRECISION菜循、FLOAT |
NUMERIC | NUMERIC、DECIMAL(10.5)苞笨、BOOLEAN债朵、DATEDATETIME |
SQLite 沒有單獨(dú) Boolean 存儲類子眶。布爾值被存儲為整數(shù)0和1瀑凝。也沒有日期、時(shí)間存儲類臭杰,將日期粤咪、時(shí)間存儲為TEXT、REAL或INTEGER值渴杆。
6. 創(chuàng)建數(shù)據(jù)庫
6.1 語法
使用sqlite3
命令創(chuàng)建數(shù)據(jù)庫寥枝,語法如下:
$ sqlite3 DatabaseName.db
6.2 示例
如果想創(chuàng)建名稱為LearnDB.db
的數(shù)據(jù)庫,命令如下:
$ sqlite3 LearnDB.sql
SQLite version 3.28.0 2019-04-15 14:49:49
Enter ".help" for usage hints.
sqlite>
數(shù)據(jù)庫名稱應(yīng)唯一磁奖。
與其他數(shù)據(jù)庫管理系統(tǒng)不同囊拜,SQLite 不支持 DROP DATABASE 語句。如果想要刪除數(shù)據(jù)庫比搭,直接刪除文件即可冠跷。
7. 表 Table
7.1 創(chuàng)建表
CREATE TABLE
語句用于創(chuàng)建表。創(chuàng)建時(shí)指定表名稱身诺,定義列以及每列數(shù)據(jù)類型蜜托。
7.1.1 語法
CREATE TABLE 語法如下:
CREATE TABLE table_name(
column1 datatype PRIMARY KEY,
column2 datatype,
column3 datatype,
...
columnN datatype,
);
7.1.2 示例
下面創(chuàng)建了一個(gè) COMPANY 表,ID 作為主鍵霉赡,NOT NULL 約束標(biāo)記字段不能為 NULL:
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è) CLASS 表橄务,以便后續(xù)部分使用:
sqlite> CREATE TABLE CLASS(
...> ID INT PRIMARY KEY NOT NULL,
...> NAME TEXT NOT NULL,
...> CLASS_ID INT NOT NULL
...> );
.tables
命令可以列出數(shù)據(jù)庫中的所有表:
sqlite> .tables
CLASS COMPANY
.schema
命令可以查看表的完整信息:
sqlite> .schema
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
7.2 刪除表
DROP TABLE 語句刪除使用 CREATE TABLE 語句創(chuàng)建的表,刪除的表會徹底從數(shù)據(jù)庫穴亏、文件中移除蜂挪,不可恢復(fù)。表關(guān)聯(lián)的索引嗓化、觸發(fā)器棠涮、約束會被同步刪除。
7.2.1 語法
DROP TABLE 語句語法如下:
DROP TABLE IF EXISTS table-name
可選的 IF EXISTS 子句可抑制表不存在導(dǎo)致的錯(cuò)誤蟆湖。
7.2.2 示例
先確認(rèn) CLASS 表存在故爵,再將其刪除:
sqlite> .tables
CLASS COMPANY
sqlite> DROP TABLE IF EXISTS CLASS;
sqlite> .tables
COMPANY
現(xiàn)在已經(jīng)無法找到 CLASS 表了。
8. 插入 INSERT
INSERT INTO 語句用于向表中添加新的行。
8.1 語法
INSERT INTO 語句有兩種語法诬垂,如下所示:
// 第一種
INSERT INTO TABLE_NAME [(column1, column2, column3, ... columnN)]
VALUES (value1, value2, value3, ... valueN);
// 第二種
INSERT INTO TABLE_NAME VALUES (value1, value2, value3, ... valueN);
column1劲室、column2 是要插入數(shù)據(jù)列的名稱。如果要為所有列添加值结窘,可以使用第二種方式很洋,但值順序必須與列在表中的順序一致。
8.2 示例
LearnDB.sql 數(shù)據(jù)庫中已經(jīng)有了 COMPANY 表隧枫,如下所示:
sqlite> .schema
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
使用以下語句在表中創(chuàng)建七條記錄:
sqlite> INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY)
...> VALUES (1, 'Paul', 32, 'California', 20000.00 );
sqlite> INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY)
...> VALUES (2, 'Allen', 25, 'Texas', 15000.00 );
sqlite> INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY)
...> VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );
sqlite> INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY)
...> VALUES (4, 'Mark', 25, 'Rich-Mond', 65000.00 );
sqlite> INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY)
...> VALUES (5, 'David', 27, 'Texas', 85000.00 );
sqlite> INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY)
...> VALUES (6, 'Kim', 22, 'South-Hall', 45000.00 );
sqlite> INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00 );
目前表記錄如下:
sqlite> SELECT * FROM COMPANY;
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
Run Time: real 0.001 user 0.000113 sys 0.000087
8.3 使用一個(gè)表來填充另一個(gè)表
還可以通過在有一組字段的表上使用 select 語句喉磁,填充數(shù)據(jù)到另一個(gè)表中。如下所示:
sqlite> INSERT INTO target_table_name [(column1, column2, ... columnN)]
...> SELECT column1, column2, ... columnN
...> FROM source_table_name
...> [WHERE condition];
9. 查詢 SELECT
SELECT 語句用于從數(shù)據(jù)庫中獲取數(shù)據(jù)官脓,以表的形式返回?cái)?shù)據(jù)协怒。
9.1 語法
SELECT 語句基本語法如下:
SELECT column1, column2, columnN FROM table_name;
column1、column2... 是表的字段卑笨,即想要獲取的值孕暇。如果想要獲取所有字段,使用下面語句:
SELECT * FROM table_name;
9.2 示例
使用SELECT語句獲取 COMPANY 表所有記錄:
sqlite> SELECT * FROM COMPANY;
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
Run Time: real 0.000 user 0.000108 sys 0.000096
如果只想獲取指定字段赤兴,使用以下語句:
sqlite> SELECT ID, NAME, ADDRESS FROM COMPANY;
ID NAME ADDRESS
---------- ---------- ----------
1 Paul California
2 Allen Texas
3 Teddy Norway
4 Mark Rich-Mond
5 David Texas
6 Kim South-Hall
7 James Houston
Run Time: real 0.000 user 0.000145 sys 0.000109
9.3 Schema 信息
點(diǎn)命令只能在 SQLite 提示符中使用妖滔,編程時(shí)如需列出數(shù)據(jù)庫中所有的表,使用以下語句:
sqlite> SELECT tbl_name FROM sqlite_master WHERE type = 'table';
tbl_name
----------
COMPANY
Run Time: real 0.001 user 0.000101 sys 0.000142
如需獲取 COMPANY 完整信息桶良,使用以下語句:
sqlite> SELECT sql FROM sqlite_master WHERE type = 'table' AND tbl_name = 'COMPANY';
sql
--------------------------------------------------------------------------------------
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
)
Run Time: real 0.000 user 0.000082 sys 0.000073
10. 運(yùn)算符
運(yùn)算符是一個(gè)保留字座舍、字符,主要用于 WHERE 子句中執(zhí)行操作陨帆。
10.1 算數(shù)運(yùn)算符
支持的算數(shù)運(yùn)算符有+曲秉、-、*歧譬、/岸浑、%五種,
10.2 比較運(yùn)算符
比較運(yùn)算符支持以下類型:
- == 檢查操作數(shù)值是否相等瑰步。如果相等則條件為真矢洲。
- = 與 == 一樣。
- != 檢查操作數(shù)值是否相等缩焦。如果不相等則條件為真读虏。
- <> 與 != 一樣。
- 此外袁滥,還支持>盖桥、<、>=题翻、<=揩徊、!<、!>。
10.3 邏輯運(yùn)算符
邏輯運(yùn)算符支持以下類型:
- AND:允許 WHERE 子句存在多個(gè)條件塑荒,均成立時(shí)熄赡,子句為真。
- BETWEEN:指定值范圍齿税。
- EXISTS:用于在滿足一定條件的指定表中搜索行是否存在彼硫。
- IN:用于把指定值與一系列值進(jìn)行比較。
- NOT IN:IN 的對立面凌箕。
- LIKE:將指定值與使用通配符的值進(jìn)行比較拧篮。
- GLOB:與 LIKE 類似,但 GLOB 區(qū)分大小寫牵舱。
- NOT:否定運(yùn)算符串绩,
- OR:允許 WHERE 子句存在多個(gè)條件,有一個(gè)成立即為真仆葡。
- IS NULL:與 NULL 比較赏参。
- IS:與 = 相似志笼。
- IS NOT:與 != 相似沿盅。
- || :連接兩個(gè)不同的字符串,得到一個(gè)新的字符串纫溃。
- UNIQUE:搜索表中的每一行腰涧,確保無重復(fù)。
11. WHERE
WHERE 指定獲取數(shù)據(jù)的條件紊浩。表中每一行均會與 WHERE 表達(dá)式匹配窖铡,只有表達(dá)式為真時(shí),才返回指定值坊谁。
11.1 語法
帶有 WHERE 子句的 SELECT 語句的基本語法如下:
SELECT column1, column2, columnN
FROM table_name
WHERE [condition]
11.2 示例
下面的 SELECT 語句列出了 COMPANY 表 AGE 大于等于25且工資大于等于65000.00的所有記錄:
sqlite> SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000.00;
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
Run Time: real 0.005 user 0.000316 sys 0.002061
下面 SELECT 語句列出了 COMPANY 表 NAME 以 'Ki' 開始的所有記錄费彼,‘Ki’之后字符不做限制:
sqlite> SELECT * FROM COMPANY WHERE NAME LIKE 'KI%';
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
6 Kim 22 South-Hall 45000.0
Run Time: real 0.000 user 0.000130 sys 0.000155
下面的 SELECT 語句,子查詢查找 SALARY > 65000 的帶有 AGE 字段的所有記錄口芍,后邊的 WHERE 子句與 EXISTS 運(yùn)算符一起使用箍铲,列出了外查詢中的 AGE 存在于子查詢返回的結(jié)果中的所有記錄:
sqlite> SELECT AGE FROM COMPANY
...> WHERE EXISTS (SELECT AGE FROM COMPANY WHERE SALARY > 65000);
AGE
----------
32
25
23
25
27
22
24
Run Time: real 0.000 user 0.000112 sys 0.000128
WHERE子句不僅可以用在 SELECT 語句中,還可以用在UPDATE鬓椭、DELETE語句中颠猴。
12. 更新 UPDATE
UPDATE 語句用于修改表中的零行、多行的值小染。
12.1 語法
UPDATE 語句基本語法如下:
UPDATE table_name
SET column1 = value1, column2 = value2 ..., columnN = valueN
WHERE [condition];
WHERE 子句可以組合使用運(yùn)算符翘瓮。如果沒有 WHERE 子句,則修改所有行的值裤翩;反之资盅,只修改 WHERE 子句為真的行。
SET 關(guān)鍵字后賦值語句決定修改哪些字段。每個(gè)賦值語句左側(cè)指定要修改的字段呵扛,右側(cè)指定值振峻。如果單個(gè)字段名稱出現(xiàn)多次,則只采取最后一次設(shè)置的值择份,并忽略前面所有賦值扣孟。未出現(xiàn)字段名稱的行,值保持不變荣赶。WHERE 表達(dá)式可能引用要更新的行凤价,此時(shí)會先評估所有表達(dá)式,再進(jìn)行賦值拔创。
12.2 示例
下面語句會更新 ID 為6的客戶地址:
sqlite> SELECT * FROM COMPANY;
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
Run Time: real 0.000 user 0.000145 sys 0.000097
sqlite> UPDATE COMPANY SET ADDRESS = 'Texas' WHERE ID = 6;
Run Time: real 0.004 user 0.000165 sys 0.003125
sqlite> SELECT * FROM COMPANY;
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 Texas 45000.0
7 James 24 Houston 10000.0
Run Time: real 0.000 user 0.000160 sys 0.000160
可以看到地址信息更新前為”South-Hall“利诺,更新后為“Texas”。
13. 刪除 DELETE
DELETE 語句用于刪除表中已有記錄剩燥。
13.1 語法
DELETE FROM table_name
WHERE [condition];
如果沒有 WHERE 子句慢逾,則刪除所有記錄;如果提供了 WHERE 子句灭红,則僅刪除子句表達(dá)式為true的行侣滩,表達(dá)式為false或NULL的行會被保留。
13.2 示例
下面語句會刪除 ID 為7的客戶:
sqlite> DELETE FROM COMPANY WHERE ID = 7;
Run Time: real 0.002 user 0.000128 sys 0.001266
sqlite> SELECT * FROM COMPANY;
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 Texas 45000.0
Run Time: real 0.001 user 0.000166 sys 0.000179
下一篇文章SQLite的使用二將繼續(xù)介紹SQLite的用法变擒。
歡迎更多指正:https://github.com/pro648/tips
本文地址:https://github.com/pro648/tips/blob/master/sources/SQLite%E7%9A%84%E4%BD%BF%E7%94%A8%E4%B8%80.md