# SQLite crash course 教程
## SQLite 命令
#### 與關係數據庫進行交互的標準SQLite 命令類似於SQL。命令包括CREATE、SELECT、INSERT、UPDATE、DELETE、ALTER 和DROP。這些命令基於它們的操作性質可分為以下幾種:
## DDL - 數據定義語言

## DML - 數據操作語言

## DQL - 數據查詢語言

## 在 Windows 上安裝 SQLite
* 請訪問 SQLite 下載頁面,從 Windows 區下載預編譯的二進位檔。
* 您需要下載 sqlite-tools-win32-*.zip 和 sqlite-dll-win32-*.zip 壓縮檔。
* 創建資料夾 C:\sqlite,並在此資料夾下解壓上面兩個壓縮檔,將得到 sqlite3.def、sqlite3.dll 和 sqlite3.exe 檔。
* 添加 C:\sqlite 到 PATH 環境變數,最後在命令提示符下,使用 sqlite3 命令,將顯示如下結果。
```
C:\>sqlite3
SQLite version 3.7.15.2 2013-01-09 11:53:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
```
## 在 Linux 上安装 SQLite
#### 用下面的命令來檢查您的機器上是否已經安裝了SQLite。
```
eric@eric-VirtualBox:~$ sqlite3
Command 'sqlite3' not found, but can be installed with:
sudo apt install sqlite3
eric@eric-VirtualBox:~$ sudo apt install sqlite3
```
#### 安裝完後,在執行sqlite如下:
```
eric@eric-VirtualBox:~$ sqlite3
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>
# ^z 退出 or .quit
```
## SQLite命令
#### SQLite 編程人員所使用的簡單卻有用的命令。這些命令被稱為SQLite 的"點命令",這些命令的不同之處在於它們不以分號;結束。讓我們在命令提示符下鍵入一個簡單的sqlite3命令,在SQLite 命令提示符下,您可以使用各種SQLite 命令
```
sqlite3
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>
```
#### 如需獲取可用的點命令的清單,可以在任何時候輸入".help"。例如:
`sqlite >. help`
#### 上面的命令會顯示各種重要的SQLite 點命令的列表,如下所示:
```
.archive ... Manage SQL archives
.auth ON|OFF Show authorizer callbacks
.backup ?DB? FILE Backup DB (default "main") to FILE
.bail on|off Stop after hitting an error. Default OFF
.binary on|off Turn binary output on or off. Default OFF
.cd DIRECTORY Change the working directory to DIRECTORY
.changes on|off Show number of rows changed by SQL
.check GLOB Fail if output since .testcase does not match
.clone NEWDB Clone data into NEWDB from the existing database
.databases List names and files of attached databases
.dbconfig ?op? ?val? List or change sqlite3_db_config() options
.dbinfo ?DB? Show status information about the database
.dump ?TABLE? ... Render all database content as SQL
.echo on|off Turn command echo on or off
.eqp on|off|full|... Enable or disable automatic EXPLAIN QUERY PLAN
.excel Display the output of next command in spreadsheet
.exit ?CODE? Exit this program with return-code CODE
.expert EXPERIMENTAL. Suggest indexes for queries
.explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto
.filectrl CMD ... Run various sqlite3_file_control() operations
.fullschema ?--indent? Show schema and the content of sqlite_stat tables
.headers on|off Turn display of headers on or off
.help ?-all? ?PATTERN? Show help text for PATTERN
.import FILE TABLE Import data from FILE into TABLE
.imposter INDEX TABLE Create imposter table TABLE on index INDEX
.indexes ?TABLE? Show names of indexes
.limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT
.lint OPTIONS Report potential schema issues.
.load FILE ?ENTRY? Load an extension library
.log FILE|off Turn logging on or off. FILE can be stderr/stdout
.mode MODE ?TABLE? Set output mode
.nullvalue STRING Use STRING in place of NULL values
.once (-e|-x|FILE) Output for the next SQL command only to FILE
.open ?OPTIONS? ?FILE? Close existing database and reopen FILE
.output ?FILE? Send output to FILE or stdout if FILE is omitted
.parameter CMD ... Manage SQL parameter bindings
.print STRING... Print literal STRING
.progress N Invoke progress handler after every N opcodes
.prompt MAIN CONTINUE Replace the standard prompts
.quit Exit this program
.read FILE Read input from FILE
.recover Recover as much data as possible from corrupt db.
.restore ?DB? FILE Restore content of DB (default "main") from FILE
.save FILE Write in-memory database into FILE
.scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off
.schema ?PATTERN? Show the CREATE statements matching PATTERN
.selftest ?OPTIONS? Run tests defined in the SELFTEST table
.separator COL ?ROW? Change the column and row separators
.session ?NAME? CMD ... Create or control sessions
.sha3sum ... Compute a SHA3 hash of database content
.shell CMD ARGS... Run CMD ARGS... in a system shell
.show Show the current values for various settings
.stats ?on|off? Show stats or turn stats on or off
.system CMD ARGS... Run CMD ARGS... in a system shell
.tables ?TABLE? List names of tables matching LIKE pattern TABLE
.testcase NAME Begin redirecting output to 'testcase-out.txt'
.testctrl CMD ... Run various sqlite3_test_control() operations
.timeout MS Try opening locked tables for MS milliseconds
.timer on|off Turn SQL timer on or off
.trace ?OPTIONS? Output each SQL statement as it is run
.vfsinfo ?AUX? Information about the top-level VFS
.vfslist List all available VFSes
.vfsname ?AUX? Print the name of the VFS stack
.width NUM1 NUM2 ... Set column widths for "column" mode
```
## SQLite創建數據庫
#### 语法 : sqlite3 命令的基本語法如下:
`$ sqlite3 DatabaseName.db`
另外也可以使用.open來建立新的數據庫文件:
```sqlite> .open database.db```
上面的命令創建了數據庫文件database.db,位於sqlite3 命令同一目錄下。
打開已存在數據庫也是用.open命令,以上命令如果database.db存在則直接會打開,不存在就創建它。
### .databases命令
使用SQLite 的.databases命令來檢查它是否在數據庫列表中,如下所示:
```
sqlite> .databases
main: /home/eric/database.db
```
### .quit命令
使用SQLite .quit命令退出sqlite 提示符,如下所示:
```
sqlite> .quit
eric@eric-VirtualBox:~$
```
### .dump命令
可以在命令提示符中使用SQLite .dump點命令來導出完整的數據庫在一個文本文件中,如下所示:
```
eric@eric-VirtualBox:~$ sqlite3 sqlite_db .dump > sqlite_db.sql
eric@eric-VirtualBox:~$
```
you can take a look at the sqlite_db.sql file
## SQLite ATTACH(附加)數據庫
假設這樣一種情況,當在同一時間有多個數據庫可用,您想使用其中的任何一個。SQLite 的ATTACH DATABASE語句是用來選擇一個特定的數據庫,使用該命令後,所有的SQLite 語句將在附加的數據庫下執行。
### 語法:SQLite的 ATTACH DATABASE 語句的基本語法如下:
### 實例
如果想附加一個現有的數據庫sqlite_db,則ATTACH DATABASE 語句將如下所示:
```
sqlite> ATTACH DATABASE 'sqlite_db' as 'test';
```
使用SQLite .database命令來顯示附加的數據庫。
`sqlite> .databases`
result:
```
main:
test: /home/eric/sqlite_db
```
NOTE!!!數據庫名稱main和temp被保留用於主數據庫和存儲臨時表及其他臨時數據對象的數據庫。這兩個數據庫名稱可用於每個數據庫連接,且不應該被用於附加,否則將得到一個警告消息,如下所示:
```
sqlite> ATTACH DATABASE 'sqlite_db' as 'TEMP';
Error: database TEMP is already in use
sqlite> ATTACH DATABASE 'sqlite_db' as 'main';
Error: database main is already in use
```
## SQLite DETACH(分離)數據庫
SQLite 的DETACH DATABASE語句是用來把命名數據庫從一個數據庫**連接** **分離**出來,連接是之前使用ATTACH 語句附加的。如果同一個數據庫文件已經被附加上多個別名,DETACH 命令將只斷開給定名稱的連接,而其餘的仍然有效。我們無法分離main或temp數據庫。
### 實例:假設在前面的章節中您已經創建了一個數據庫,並給它附加了'test' 和'current_db',使用.database 命令,我們可以看到:
```
sqlite> ATTACH DATABASE 'sqlite_db' as 'current_db';
sqlite> .databases
```
result:
```
main:
test: /home/eric/sqlite_db
current_db: /home/eric/sqlite_db
```
現在,讓我們嘗試把'current_db' 從test 中分離出來,如下所示:
```
sqlite> DETACH DATABASE 'current_db' ;
sqlite> .databases
```
result:
```
main:
test: /home/eric/sqlite_db
```
## SQLite CREATE 創建表
SQLite 的CREATE TABLE語句用於在任何給定的數據庫創建一個新表。創建基本表,涉及到命名表、定義列及每一列的數據類型。
### 語法:CREATE TABLE 語句的基本語法如下:
```
CREATE TABLE table_name (
column1 datatype PRIMARY KEY ( one or more columns ),
column2 datatype ,
column3 datatype , .....
columnN datatype , );
```
#### 實例:下面是一個實例,它創建了一個COMPANY 表,ID 作為主鍵,NOT NULL 的約束表示在表中創建紀錄時這些字段不能為NULL:
```
sqlite > CREATE TABLE COMPANY (
ID INT PRIMARY KEY NOT NULL ,
NAME TEXT NOT NULL ,
AGE INT NOT NULL ,
ADDRESS CHAR ( 50 ),
SALARY REAL
);
```
再創建一個表,我們將在隨後章節的練習中使用:
```
sqlite > CREATE TABLE DEPARTMENT (
ID INT PRIMARY KEY NOT NULL ,
DEPT CHAR ( 50 ) NOT NULL ,
EMP_ID INT NOT NULL
);
```
### .table 命令
使用SQLIte 命令中的.tables命令來驗證表是否已成功創建,該命令用於列出附加數據庫中的所有表。
```
sqlite> .table
COMPANY DEPARTMENT
```
### .schema 命令
使用SQLite .schema命令得到表的完整信息,如下所示:
```
sqlite> .schema COMPANY
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (50),
SALARY REAL
);
```
## SQLite DROP(刪除)表
### 實例:DROP TABLE 語句的基本語法如下。您可以選擇指定帶有表名的數據庫名稱,如下所示:
```
sqlite> DROP TABLE COMPANY;
```
現在,如果嘗試.TABLES 命令,那麼將無法找到COMPANY 表了
```
sqlite> .table
DEPARTMENT
```
## SQLite INSERT INTO 插入語句
### INSERT INTO 語句有兩種基本語法:
### 一
```
INSERT INTO TABLE_NAME [( column1 , column2 , column3 ,... columnN )]
VALUES ( value1 , value2 , value3 , ... valueN );
```
在這裡,column1, column2,...columnN 是要插入數據的表中的列表的名稱。
如果要為表中的所有列表添加值,您也可以不需要在SQLite中查詢指定列表名稱。但要確保值的順序與列表在表中的順序中一致。SQLite的INSERT INTO語法如下:
`INSERT INTO TABLE_NAME VALUES ( value1 , value2 , value3 ,... valueN );`
### 實例
假設您已經在test.db中創建了COMPANY表,如下所示:
```
sqlite > CREATE TABLE COMPANY (
ID INT PRIMARY KEY NOT NULL ,
NAME TEXT NOT NULL ,
AGE INT NOT NULL ,
ADDRESS CHAR ( 50 ),
SALARY REAL
);
```
現在,下面的語句將在COMPANY表中創建三個記錄:
```
INSERT INTO COMPANY ( ID , NAME , AGE , ADDRESS , SALARY )
VALUES ( 1 , 'Paul' , 32 , 'California' , 20000.00 );
INSERT INTO COMPANY ( ID , NAME , AGE , ADDRESS , SALARY )
VALUES ( 2 , 'Allen' , 25 , 'Texas' , 15000.00 );
INSERT INTO COMPANY ( ID , NAME , AGE , ADDRESS , SALARY )
VALUES ( 3 , 'Teddy' , 23 , 'Norway' , 20000.00 );
```
也可以使用第二種語言在公司表中創建一個記錄,如下所示:
`INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00 );`
## SQLite Select FROM 語句
### 語法:SQLite 的SELECT 語句的基本語法如下:
`SELECT column1 , column2 , columnN FROM table_name ;`
在這裡,column1, column2...是表的字段,他們的值即是您要獲取的。如果您想獲取所有可用的字段,那麼可以使用下面的語法:
`SELECT * FROM table_name ;`
### 實例:使用SELECT 語句獲取並顯示所有這些記錄。在這裡,前兩個命令被用來設置正確格式化的輸出。
```
sqlite >. header on
sqlite >. mode column
sqlite > SELECT * FROM COMPANY ;
```
## SQLite UPDATE(更新)語法
SQLite的UPDATE查詢用於修改表中已有的記錄。可以使用帶有WHERE子句的UPDATE查詢來更新選擇確定行,否則所有的行都會更新。
### 語法:帶有WHERE 子句的UPDATE 查詢的基本語言法如下:
```
UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];
```
### 實例
假設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
```
下面是一个实例,它会更新 ID 为 6 的客户地址:
`sqlite> UPDATE COMPANY SET ADDRESS = 'Texas' WHERE ID = 6;`
现在,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
```
如果您想修改 COMPANY 表中 ADDRESS 和 SALARY 列的所有值,则不需要使用 WHERE 子句,UPDATE 查询如下:
`sqlite> UPDATE COMPANY SET ADDRESS = 'Texas', SALARY = 20000.00;`
现在,COMPANY 表有以下记录:
```
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 Texas 20000.0
2 Allen 25 Texas 20000.0
3 Teddy 23 Texas 20000.0
4 Mark 25 Texas 20000.0
5 David 27 Texas 20000.0
6 Kim 22 Texas 20000.0
7 James 24 Texas 20000.0
```
## SQLite DELETE FROM(刪除)語法
SQLite的DELETE查詢用於刪除表中已經有的記錄。可以使用帶有WHERE子句的DELETE查詢來刪除選擇確定行,否則所有的記錄都會被刪除
### 語法:带有 WHERE 子句的 DELETE 查询的基本语法如下:
```
DELETE FROM table_name
WHERE [condition];
```
### 實例
假設COPANY表有以下記錄:
```
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
```
下面是一個實例,它會刪除ID為7的客戶:
`sqlite> DELETE FROM COMPANY WHERE ID = 7;`
現在,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
```
如果您想要從COMPANY表中刪除所有記錄,則不需要使用WHERE子句,DELETE查詢如下:
sqlite> DELETE FROM COMPANY;``
現在,COMPANY表中沒有任何的記錄,因為所有的記錄已經通過DELETE語句刪除。