SQLite的使用一

這是SQLite系列文章第一篇。

  1. SQLite的使用一
  2. SQLite的使用二
  3. 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 語法
SQLitecreate-table-stmt.png

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 語法
SQLitedrop-table-stmt.png

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 語法

SQLiteinsert-stmt.png

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 語法

SQLiteselect-stmt.png

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 語法

SQLiteupdate-stmt.png

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 語法

SQLitedelete-stmt.png
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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末君珠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子娇斑,更是在濱河造成了極大的恐慌策添,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毫缆,死亡現(xiàn)場離奇詭異唯竹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)苦丁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門浸颓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芬骄,你說我怎么就攤上這事猾愿。” “怎么了账阻?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵蒂秘,是天一觀的道長。 經(jīng)常有香客問我淘太,道長姻僧,這世上最難降的妖魔是什么规丽? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮撇贺,結(jié)果婚禮上赌莺,老公的妹妹穿的比我還像新娘。我一直安慰自己松嘶,他們只是感情好艘狭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著翠订,像睡著了一般巢音。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尽超,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天官撼,我揣著相機(jī)與錄音,去河邊找鬼似谁。 笑死傲绣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巩踏。 我是一名探鬼主播秃诵,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蛀缝!你這毒婦竟也來了顷链?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤屈梁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后榛了,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體在讶,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年霜大,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了构哺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡战坤,死狀恐怖曙强,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情途茫,我是刑警寧澤碟嘴,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站囊卜,受9級特大地震影響娜扇,放射性物質(zhì)發(fā)生泄漏错沃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一雀瓢、第九天 我趴在偏房一處隱蔽的房頂上張望枢析。 院中可真熱鬧,春花似錦刃麸、人聲如沸醒叁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辐益。三九已至,卻和暖如春脱吱,著一層夾襖步出監(jiān)牢的瞬間智政,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工箱蝠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留续捂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓宦搬,卻偏偏與公主長得像牙瓢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子间校,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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

  • [TOC] sqlite3 數(shù)據(jù)類型 基礎(chǔ)的 (NULL INTEGER REAL TEXT BLOB) 親和(A...
    oceanfive閱讀 1,293評論 0 0
  • 什么是SQLite SQLite是一款輕型的數(shù)據(jù)庫矾克,是遵守ACID的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它包含在一個(gè)相對小的C庫...
    暖A暖閱讀 299評論 0 3
  • 在項(xiàng)目開發(fā)中多多少少會用到SQLite一般數(shù)據(jù)采用的固定的靜態(tài)數(shù)據(jù)類型憔足,而SQLite采用的是動態(tài)數(shù)據(jù)類型胁附,會根據(jù)...
    Czppp閱讀 398評論 1 1
  • 說明 本文是作者Lefe所創(chuàng),轉(zhuǎn)載請注明出處滓彰,如果你在閱讀的時(shí)候發(fā)現(xiàn)問題歡迎一起討論控妻。本文會不斷更新。 正文 對于...
    Lefe閱讀 3,919評論 1 18
  • 一揭绑、前言: SQLite 是一款輕量級的關(guān)系型數(shù)據(jù)庫弓候,它的運(yùn)算速度非常快他匪,占用資源很少菇存,通常只需要幾百 KB 的內(nèi)...
    因?yàn)槲业男?/span>閱讀 373評論 2 1