1. SQL語法關鍵字
關鍵字 |
描述 |
Create Table |
創建數據表 |
Alter Table |
修改數據表 |
Drop Table |
刪除數據表 |
Create Index |
創建索引 |
Drop Index |
刪除索引 |
Create Trigger |
創建觸發器 |
Drop Trigger |
刪除觸發器 |
Create View |
創建視圖 |
Drop View |
刪除視圖 |
Insert |
插入數據 |
Delete |
刪除數據 |
Update |
更新數據 |
Select |
查詢數據 |
Begin |
啟動事務 |
Commit |
提交事務 |
Rollback |
回滾事務 |
2. SQL數據類型
2.1. 本地類型--5種基本類型
數據名稱 |
說明 |
INTEGER |
整數值是全數字(包括正和負)。整數可以是1, 2, 3, 4, 6或 8字節。整數的最大范圍(8 bytes)是{-9223372036854775808, 0, +9223372036854775807}。SQLite根據數字的值自動控制整數所占的字節數。 空注:參可變長整數的概念。 |
REAL |
實數是10進制的數值。SQLite使用8字節的符點數來存儲實數。 |
TEXT |
文本(TEXT)是字符數據。SQLite支持幾種字符編碼,包括UTF-8和UTF-16。字符串的大小沒有限制。 |
BLOB |
二進制大對象(BLOB)是任意類型的數據。BLOB的大小沒有限制。 |
NULL |
NULL表示沒有值。SQLite具有對NULL的完全支持。 |
SQLite通過值的表示法來判斷其類型,下面就是SQLite的推理方法:
l SQL語句中用單引號或雙引號括起來的文字被指派為TEXT。
l 如果文字是未用引號括起來的數據,並且沒有小數點和指數,被指派為INTEGER。
l 如果文字是未用引號括起來的數據,並且帶有小數點或指數,被指派為REAL。
l 用NULL說明的值被指派為NULL存儲類。
l 如果一個值的格式為X'ABCD',其中ABCD為16進制數字,則該值被指派為BLOB。X前綴大小寫皆可。
2.2. 兼容的SQL92類型
數據類型 |
類型描述 |
對應類型 |
integer(size) int(size) smallint(size) tinyint(size) |
僅容納整數。在括號內規定數字的最大位數。 |
INTEGER |
decimal(size,d) numeric(size,d) |
容納帶有小數的數字。 "size" 規定數字的最大位數。"d" 規定小數點右側的最多位數。 |
REAL |
char(size) |
容納固定長度的字符串(可容納字母、數字以及特殊字符)。 在括號中規定字符串的長度。 |
TEXT |
varchar(size) |
容納可變長度的字符串(可容納字母、數字以及特殊的字符)。 在括號中規定字符串的最大長度。 |
TEXT |
date(yyyymmdd) |
容納日期。 |
TEXT |
3. 表-Table
3.1. Create Table
3.1.1. 語法格式
CREATE TABLE [數據庫名.]表名( 字段名稱1 字段類型 字段約束, 字段名稱2 字段類型 字段約束, 字段名稱3 字段類型 字段約束, 字段名稱4 字段類型 字段約束, … … 分組約束1, 分組約束2, … … ); |
3.1.2. 字段約束
約束名稱 |
約束說明 |
NOT NULL |
非空,約束強制列不接受 NULL 值,約束強制字段始終包含值。這意味着,如果不向字段添加值,就無法插入新紀錄或者更新記錄。 |
PRIMARY KEY |
主鍵,約束唯一標識數據庫表中的每條記錄。 主鍵必須包含唯一的值。 主鍵列不能包含 NULL 值。 每個表應該都一個主鍵,並且每個表只能有一個主鍵。 |
FOREIGN KEY |
外鍵,約束本字段的值必須存在於另一個表中主鍵字段, 當使用外鍵約束時,如果外鍵在其所依賴的表中不存在,則記錄插入失敗。 |
UNIQUE |
唯一性,約束唯一標識數據庫表中的每條記錄,即插入的字段值不可重復,唯一性約束可以包含NULL值,但每張表也只能有一個記錄為NULL值。 |
DEFAULT |
默認值,約束字段的默認值,如果插入數據時沒有提供該字段的數值,則會使用默認值進行填充。 |
3.1.3. 數據字典
表名:tbl_goods_category
描述:商品類別
字段名稱 |
字段類型 |
字段長度 |
字段描述 |
category_code |
CHAR |
8 |
類別編碼 |
category_name |
VARCHAR |
128 |
類別名稱 |
category_desc |
VARCHAR |
255 |
類別描述 |
表名:tbl_goods_info
描述:商品信息
字段名稱 |
字段類型 |
字段長度 |
字段描述 |
category_code |
CHAR |
8 |
類別編碼 |
goods_id |
CHAR |
16 |
商品編碼 |
goods_name |
VARCHAR |
128 |
商品名稱 |
goods_unit |
VARCHAR |
8 |
商品單位 |
prime_cost |
NUMBER |
(6,2) |
進貨價格 |
sale_price |
NUMBER |
(6,2) |
零售價格 |
vip_price |
NUMBER |
(6,2) |
會員價格 |
remark |
VARCHAR |
255 |
備注信息 |
表名:tbl_stock_bill
描述:商品入庫單
字段名稱 |
字段類型 |
字段長度 |
字段描述 |
goods_id |
CHAR |
16 |
商品編碼 |
bill_id |
CHAR |
20 |
進貨單單號 |
stock_time |
DateTime |
入庫時間 |
|
stock_amount |
NUMBER |
(6,2) |
入庫數量 |
prime_cost |
NUMBER |
(6,2) |
進貨價格 |
3.1.4. 腳本示例
Ø 創建商品類別表tbl_goods_category
--創建商品類別表 --類別編碼為主鍵 --類別名稱必須具有唯一性 create table tbl_goods_category( category_code CHAR(8) primary key, --類別編碼 category_name VARCHAR(128) UNIQUE, --類別名稱 category_desc VARCHAR(255)); --類別描述 |
Ø 創建商品信息表tbl_goods_info
--創建商品信息表 --商品編碼為主鍵 --商品名稱必須具有唯一性 create table tbl_goods_info( category_code CHAR(8) , --類別編碼 goods_id CHAR(16) primary key, --商品編碼 goods_name VARCHAR(128) UNIQUE, --商品名稱 goods_unit VARCHAR(8), --商品單位 prime_cost NUMBER(6,2), --進貨價格 sale_price NUMBER(6,2), --零售價格 vip_price NUMBER(6,2), --會員價格 remark VARCHAR(255), FOREIGN KEY (category_code) REFERENCES tbl_goods_category(category_code)); --備注信息 |
Ø 創建商品入庫單tbl_stock_bill
--創建商品入庫單 --商品編碼和入庫時間為組合主鍵 create table tbl_stock_bill( goods_id CHAR(16), --商品編碼 stock_time DateTime, --入庫時間 stock_amount NUMBER(6,2), --入庫數量 prime_cost NUMBER(6,2), --進貨價格 primary key(goods_id, stock_time), FOREIGN KEY (goods_id) REFERENCES tbl_goods_info(goods_id)); |
3.2. Alter Table
3.2.1. 語法格式
表重命名
ALTER TABLE [數據庫名.]表名 RENAME TO 新表名 |
添加字段
ALTER TABLE [數據庫名.]表名 ADD 字段名稱 字段類型 字段約束 |
3.2.2. 腳本示例
Ø 創建一個學生信息表tbl_student
create table tbl_student( std_id char(20) primary key, std_name varchar(16), std_age integer); |
Ø 修改學生信息表名為tbl_student_info
alter table tbl_student rename tbl_student_info |
Ø 為學生信息表添加班級字段
alter table tbl_student_info add class char(8) |
3.3. Drop Table
3.3.1. 語法格式
DROP TABLE [數據庫名.]表名 |
3.3.2. 腳本示例
刪除一個名為tbl_student_info的數據表
DROP TABLE tbl_student_info |
4. 索引-Index
4.1. Create Index
4.1.1. 語法格式
CREATE INDEX [數據庫名.]索引名稱 ON 表名( 字段名稱1 [ASC/DESC], 字段名稱1 [ASC/DESC], … …);//在相應的表的列字段或多個列字段上建立相應的索引 |
4.1.2. 腳本示例
創建一個名為tbl_student的學生信息表,並為該學生信息表創建索引
create table tbl_student( std_id char(20) primary key, std_name varchar(16), std_age integer);
--為學號創建升序索引 create index idx_std_id ON tbl_student(std_id ASC);
--為姓名和年齡創建姓名為升序,年齡為降序的索引 create index idx_name_age ON tbl_student(std_name ASC, std_age DESC); |
4.2. Drop Index
4.2.1. 語法格式
DROP INDEX [數據庫名.]索引名 |
4.2.2. 腳本示例
刪除一個名為idx_name_age的索引
DROP INDEX idx_name_age |
5. 觸發器-Trigger
5.1. Create Trigger
5.1.1. 語法格式
CREATE TRIGGER 觸發器名稱 [BEFORE|AFTER] 數據庫事件 ON [數據庫名稱].表名 [FOR EACH ROW][ WHEN expression] BEGIN 觸發器執行動作 END |
數據庫事件:
DELETE INSERT
UPDATE
UPDATE OF 字段列表
5.1.2. 腳本示例
假設"customers"表存儲了客戶信息,"orders"表存儲了訂單信息,下面的觸發器確保當用戶改變地址時所有的 關聯訂單地址均進行相應改變:
CREATE TRIGGER trg_on_update_customer_address AFTER UPDATE OF address ON customers BEGIN UPDATE orders SET address = new.address WHERE customer_name = old.name; (DML語句) END; |
5.2. Drop Trigger
5.2.1. 語法格式
DROP TRIGGER觸發器名稱 |
5.2.2. 腳本示例
刪除一個名為trg_on_update_customer_address的觸發器
DROP TRIGGER trg_on_update_customer_address |
6. 視圖-View
在 SQL 中,視圖是基於SQL 語句的結果集的可視化的表。
視圖包含行和列,就像一個真實的表。視圖中的字段就是來自一個或多個數據庫中的真實的表中的字段。我們可以向視圖添加SQL 函數、WHERE 以及 JOIN 語句,我們也可以提交數據,就像這些來自於某個單一的表。
6.1. Create View
6.1.1. 語法格式
CREATE VIEW [數據庫名稱].視圖名稱 AS Select查詢語句 |
注釋:視圖總是顯示最近的數據。每當用戶查詢視圖時,數據庫引擎通過使用 SQL 語句來重建數據。
6.1.2. 腳本示例
假設有一個學生數據庫,其中有班級表,還有學生信息表
以學生信息表為基本,創建一個班級編號WF1103班的學生信息視圖
CREATE VIEW view_student_wf1103 as select * from student where class = ‘WF1103’ |
6.2. Drop View
6.2.1. 語法格式
DROP VIEW [數據庫名稱].視圖名稱 |
6.2.2. 腳本示例
刪除一個名為view_student_wf1103的學生信息表
DROP VIEW view_student_wf1103 |
7. 數據操作-Insert,Update,Delete
7.1. Insert
7.1.1. 語法格式
INSERT INTO [數據庫名稱].表名 VALUES(記錄內容)//對應表的順序進行添加和加入值 INSERT INTO [數據庫名稱].表名(字段列表) VALUES(對應字段內容)//按字段列表添加值 |
7.1.2. 腳本示例
create table tbl_student( std_id char(20) primary key, std_name varchar(16), std_age integer);
INSERT INTO tbl_student VALUES(‘WF110301’,’張三’,23); INSERT INTO tbl_student(std_id,std_name,std_age) VALUES(‘WF110301’,’張三’,23); |
7.2. Update
7.2.1. 語法格式
UPDATE [數據庫名稱].表名 SET 字段1=字段1值,字段2=字段2值… where 條件表達式 |
7.2.2. 腳本示例
UPDATE tbl_student SET std_age=24 where std_id=‘WF110301’ |
7.3. Delete
7.3.1. 語法格式
DELETE FROM [數據庫名稱].表名 where 條件表達式 |
7.3.2. 腳本示例
DELETE FROM tbl_student where std_id=‘WF110301’ |
8. 數據查詢-Select
create table tbl_class( class_id varchar(8) primary key, class_name varchar(64), class_desc varchar(128));
create table tbl_student( class_id varchar(8), std_id varchar(16) primary key, std_name varchar(8), std_age integer, std_phone varchar(16), std_school varchar(40)); |
8.1. 基本查詢
8.1.1. 語法格式
SELECT [DISTINCT] [*|字段列表] FROM [數據庫名稱].表名 |
8.1.2. 腳本示例
--查詢學生信息表中的所有信息 Select * from tbl_student
--查詢學生信息表中所學生的姓名及年齡的信息 Select std_name, std_age from tbl_student |
8.2. Where子句
Where子句通過條件表達式篩選滿足條件的記錄,條件表達式可以使用SQLite中的各種邏輯運算符號對字段進行篩選。
Where的操作符
操作符 |
描述 |
= |
等於 |
<> |
不等於 |
> |
大於 |
< |
小於 |
>= |
大於等於 |
<= |
小於等於 |
BETWEEN |
在某個范圍內 |
LIKE |
搜索某種模式 |
8.2.1. 語法格式
SELECT [DISTINCT] [*|字段列表] FROM [數據庫名稱].表名 WHERE 條件表達式 |
8.2.2. 腳本示例
--查詢學生信息表中學號等於WF110301的學號 Select * from tbl_student where std_id = ‘WF110301’
--查詢學生信息表中所年齡大於23的學生 Select * from tbl_student where std_age > 23
--查詢學生信息表中所有名字中姓‘劉’的學生或着名字最后一個字為‘剛’的學生 Select * from tbl_student where std_name like '劉%' or std_name like '%剛'
--查詢學生信息表中農林大學,並且手機號碼中帶有6的學生 Select * from tbl_student where std_school = '農林大學' and std_phone like '%6%' |
8.3. Group by子句
GROUP BY子句可以在查詢將指定的字段表數值相同的記錄合並成一條輸出, 它與count(*)函數相結合,可以統計在列表中指字段表數值相同的記錄的條數。
8.3.1. 語法格式
SELECT [DISTINCT] [*|字段列表] FROM [數據庫名稱].表名 GROUP BY 字段1,字段2,… …
SELECT [*|字段列表] [,count(*) as 新的字段名] FROM [數據庫名稱].表名 GROUP BY 字段1,字段2,… … |
8.3.2. 腳本示例
--統計各個學校的學生數 Select std_school, count(*) as std_count from tbl_student group by std_school, std_age |
8.4. Order By子句
ORDER BY子句對所得結果根據表達式排序。
8.4.1. 語法格式
SELECT [DISTINCT] [*|字段列表] FROM [數據庫名稱].表名 ORDER BY 字段名1 [ASC/DESC],字段名2 [ASC/DESC],… … |
8.4.2. 腳本示例
--查詢學生信息,並按年齡遞減,學號遞增的排序方式顯示 Select * from tbl_student order by std_age DESC,std_id ASC |
8.5. Limit Offset子句
LIMIT子句限定行數的最大值。負的LIMIT表示無上限。后跟可選的OFFSET說明跳過結果集中的前多少行,Limit Offset在分頁顯示中十分有用。
8.5.1. 語法格式
SELECT [DISTINCT] [*|字段列表] FROM [數據庫名稱].表名 Limit 單次最多讀取行數 offset 跳過前面行數
SELECT [DISTINCT] [*|字段列表] FROM [數據庫名稱].表名 Limit跳過前面行數,單次最多讀取行數 |
8.5.2. 腳本示例
--查詢學生信息,跳過前面10行,獲取5 條記錄 Select * from tbl_student Limit 5 offset 10 或 跳過前面10行,獲取5 條記錄 Select * from tbl_student Limit 10,5 |
8.6. 多表聯合查詢
8.6.1. 語法格式
SELECT [DISTINCT] [*|字段列表] FROM [數據庫名稱].表名1, [數據庫名稱].表名2 … WHERE 條件表達式 一般的連接 |
8.6.2. 腳本示例
--查詢學生信息表中所有班級為WF1103的學生信息,並在結果中輸出班級名稱和學員姓名 Select tbl_class.class_name,tbl_student.std_name from tbl_student, tbl_class where tbl_student.class_id = tbl_class.class_id |
8.7. Join子句
JOIN用於根據兩個或多個表中的列之間的關系,從這些表中查詢數據,JOIN會將兩個表的數據合並起來,輸出具有兩個表有字段的記錄。
JOIN對於兩個表格來說是相乘的關系,(inner join 與join就是普通的連接)
8.7.1. 語法格式
--在兩個表中存在至少都存在一個能夠滿足條件表達式的匹配時 --INNER JOIN 關鍵字返回行。INNER JOIN 與 JOIN 是相同的。
SELECT [DISTINCT] [*|字段列表] FROM [數據庫名稱].左表名… INNER JOIN [數據庫名稱].右表名 ON 條件表達式
SELECT [DISTINCT] [*|字段列表] FROM [數據庫名稱].左表名… JOIN [數據庫名稱].右表名 ON 條件表達式
--以左表為主,當左表有存在滿足條件的記錄時,就會從左表返回所有的行 --即使右表都沒有滿足條件。 SELECT [DISTINCT] [*|字段列表] FROM [數據庫名稱].左表名… LEFT JOIN [數據庫名稱].右表名 ON 條件表達式 |
8.7.2. 腳本示例
例如,學生信息管理系統中有學生信息和課程兩張表,它們的格式和內容分別如下:
Tbl_student
Tbl_course
Ø INNER JOIN示例,查詢班級表中的每一位學生需要學習的課程內容:
Select Tbl_student.class_id, Tbl_student.std_id, Tbl_student.std_name, Tbl_course.course, TBL_course.teacher from Tbl_student INNER JOIN Tbl_course ON Tbl_student.class_id = Tbl_course.class_id |
注:由於課程表中沒有WF1104班的課程,學生信息表中沒有WF1105班的學生,所以使用INNER JOIN時,只會返回兩個表同時存在的WF1103班中的學生信息
Ø LEFT JOIN示例,查詢班級表中的每一位學生需要學習的課程內容:
Select Tbl_student.class_id, Tbl_student.std_id, Tbl_student.std_name, Tbl_course.course, TBL_course.teacher from Tbl_student LEFT JOIN Tbl_course ON Tbl_student.class_id = Tbl_course.class_id |
注:采用LEFT JOIN無論如何都會返回左表的所有記錄,即使右表中沒有滿足條件的記錄,所以,即使課程表中沒有WF1104班的課程,在左表中的WF1104班的學生信息 仍然會被返回。
8.8. Union子句
UNION 操作符用於合並兩個或多個 SELECT 語句的結果集。
請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。(個數和類型相同)
8.8.1. 語法格式
SELECT [*|字段列表] FROM [數據庫名稱].表名1 UNION SELECT [*|字段列表] FROM [數據庫名稱].表名2
SELECT [*|字段列表] FROM [數據庫名稱].表名1 UNION ALL SELECT [*|字段列表] FROM [數據庫名稱].表名2 |
8.8.2. 腳本示例
9. 事務和鎖-Transaction and Lock
9.1. Begin(事務啟動)
9.2. Commit(提交)
9.3. Rollback(回滾)
9.4. Sqlite old.db.dump | sqlite3 new.db(這樣可以3<-->2.8)
9.5. 運算符號
操作符 |
類型 |
作用 |
|| |
String |
Concatenation |
* |
Arithmetic |
Multiply |
/ |
Arithmetic |
Divide |
% |
Arithmetic |
Modulus |
+ |
Arithmetic |
Add |
– |
Arithmetic |
Subtract |
<< |
Bitwise |
Right shift |
>> |
Bitwise |
Left shift |
& |
Logical |
And |
| |
Logical |
Or |
< |
Relational |
Less than |
<= |
Relational |
Less than or equal to |
> |
Relational |
Greater than |
>= |
Relational |
Greater than or equal to |
= |
Relational |
Equal to |
== |
Relational |
Equal to |
<> |
Relational |
Not equal to |
!= |
Relational |
Not equal to |
IN |
Logical |
In |
AND |
Logical |
And |
OR |
Logical |
Or |
LIKE |
Relational |
String matching |
GLOB |
Relational |
Filename matching |
10. 內建函數
SQLite內建函數表 算術函數 abs(X) 返回給定數字表達式的絕對值。 max(X,Y[,...]) 返回表達式的最大值。 min(X,Y[,...]) 返回表達式的最小值。 random(*) 返回隨機數。 round(X[,Y]) 返回數字表達式並四舍五入為指定的長度或精度。 字符處理函數 length(X) 返回給定字符串表達式的字符個數。 lower(X) 將大寫字符數據轉換為小寫字符數據后返回字符表達式。 upper(X) 返回將小寫字符數據轉換為大寫的字符表達式。 substr(X,Y,Z) 返回表達式的一部分。 randstr() quote(A) like(A,B) 確定給定的字符串是否與指定的模式匹配。 glob(A,B) 條件判斷函數 coalesce(X,Y[,...])
ifnull(X,Y)
nullif(X,Y) 集合函數 avg(X) 返回組中值的平均值。 count(X) 返回組中項目的數量。 max(X) 返回組中值的最大值。 min(X) 返回組中值的最小值。 sum(X) 返回表達式中所有值的和。 其他函數 typeof(X) 返回數據的類型。 last_insert_rowid() 返回最后插入的數據的ID。 sqlite_version(*) 返回SQLite的版本。 change_count() 返回受上一語句影響的行數。 last_statement_change_count()