Android SQLite (五 ) 全面詳解(三)


SQLite約束

約束是在表的數據列上強制執行的規則。這些是用來限制可以插入到表中的數據類型。這確保了數據庫中數據的准確性和可靠性。約束可以是列級或表級。列級約束僅適用於列,表級約束被應用到整個表。

以下是在SQLite中常用的約束:

  • NOT NULL約束:確保某列不能有NULL值。
  • DEFAULT約束:當某列沒有指定值時,為該列提供默認值。
  • UNIQUE約束:確保某列中的所有值是不同的。
  • PRIMARY Key約束:唯一標識數據庫表中的各行/記錄。
  • CHECK約束:CHECK約束確保某列中的所有值滿足一定條件。

NOT NULL約束

默認情況下,列可以保存NULL值。如果您不想某列有NULL值,那么需要在該列上定義此約束,指定在該列上不允許NULL值。NULL與沒有數據是不一樣的,它代表着未知的數據。

示例語法:

CREATE TABLE AndroidTeam( id INT PRIMARY KEY NOT NULL, name TEXT NOT NULL, age INT NOT NULL, address CHAR(50), money REAL );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

DEFAULT約束

DEFAULT約束在INSERT INTO語句沒有提供一個特定的值時,為列提供一個默認值。

示例語法:

CREATE TABLE AndroidTeam( id INT PRIMARY KEY NOT NULL, name TEXT NOT NULL, age INT NOT NULL, address CHAR(50), money REAL DEFAULT 4500.0 );

 

UNIQUE約束

UNIQUE約束防止在一個特定的列存在兩個記錄具有相同的值。

示例語法:

CREATE TABLE AndroidTeam( id INT PRIMARY KEY NOT NULL, name TEXT NOT NULL, age INT NOT NULL UNIQUE, address CHAR(50), money REAL DEFAULT 4500.0 );

 

PRIMARY KEY約束

PRIMARY KEY約束唯一標識數據庫表中的每個記錄。在一個表中可以有多個UNIQUE列,但只能有一個主鍵。在設計數據庫表時,主鍵是很重要的。主鍵是唯一的 ID。我們使用主鍵來引用表中的行。可通過把主鍵設置為其他表的外鍵,來創建表之間的關系。主鍵是表中的一個字段,唯一標識數據庫表中的各行/記錄。主鍵 必須包含唯一值。主鍵列不能有NULL值。一個表只能有一個主鍵,它可以由一個或多個字段組成。當多個字段作為主鍵,它們被稱為復合鍵。如果一個表在任何 字段上定義了一個主鍵,那么在這些字段上不能有兩個記錄具有相同的值。

示例語法:

CREATE TABLE AndroidTeam( id INT PRIMARY KEY NOT NULL, name TEXT NOT NULL, age INT NOT NULL, address CHAR(50), money REAL );

 

CHECK約束

CHECK約束啟用輸入一條記錄要檢查值的條件。如果條件值為false,則記錄違反了約束,且不能輸入到表。

示例語法:

CREATE TABLE AndroidTeam( id INT PRIMARY KEY NOT NULL, name TEXT NOT NULL, age INT NOT NULL, address CHAR(50), money REAL CHECK(money > 0) );

 

  • 7

刪除約束

SQLite支持ALTER TABLE的有限子集。在SQLite中,ALTER TABLE命令允許用戶重命名表,或向現有表添加一個新的列。重命名列,刪除一列,或從一個表中添加或刪除約束都是不可能的。

SQLite Joins關鍵字

SQLite的Joins子句用於結合兩個或多個數據庫中表的記錄。JOIN是一種通過共同值來結合兩個表中字段的手段。

SQL定義了三種主要類型的連接:

  • 交叉連接(CROSS JOIN)
  • 內連接(INNER JOIN)
  • 外連接(OUTER JOIN)

交叉連接CROSS JOIN

交叉連接(CROSS JOIN)把第一個表的每一行與第二個表的每一行進行匹配。如果兩個輸入表分別有 x 和 y 列,則結果表有 x+y 列。由於交叉連接(CROSS JOIN)有可能產生非常大的表,使用時必須謹慎,只在適當的時候使用它們。

語法:

SELECT ... FROM table1 CROSS JOIN table2 ...;

 

如下展示示例:
這里寫圖片描述

內連接INNER JOIN

內連接(INNER JOIN)根據連接謂詞結合兩個表(table1和table2)的列值來創建一個新的結果表。查詢會把table1中的每一行與table2中的每一行 進行比較,找到所有滿足連接謂詞的行的匹配對。當滿足連接謂詞時,A和B行的每個匹配對的列值會合並成一個結果行。

內連接(INNER JOIN)是最常見的連接類型,是默認的連接類型。INNER 關鍵字是可選的。

語法:

SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...;

為了避免冗余,並保持較短的措辭,可以使用USING表達式聲明內連接(INNER JOIN)條件。這個表達式指定一個或多個列的列表:

SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...;

自然連接(NATURAL JOIN)類似於JOIN…USING,只是它會自動測試存在兩個表中的每一列的值之間相等值:

SELECT ... FROM table1 NATURAL JOIN table2...;

如下展示示例:
這里寫圖片描述

外連接OUTER JOIN

外連接(OUTER JOIN)是內連接(INNER JOIN)的擴展。雖然 SQL標准定義了三種類型的外連接:LEFT、RIGHT、FULL,但SQLite只支持左外連接(LEFT OUTER JOIN)。外連接(OUTER JOIN)聲明條件的方法與內連接(INNER JOIN)是相同的,使用 ON、USING或NATURAL關鍵字來表達。最初的結果表以相同的方式進行計算。一旦主連接計算完成,外連接(OUTER JOIN)將從一個或兩個表中任何未連接的行合並進來,外連接的列使用NULL值,將它們附加到結果表中。

左外連接(LEFT OUTER JOIN)的語法:

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...;

為了避免冗余,並保持較短的措辭,可以使用USING表達式聲明外連接(OUTER JOIN)條件。這個表達式指定一個或多個列的列表:

SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...;

如下展示示例:
這里寫圖片描述

SQLite Unions子句

SQLite的UNION子句/運算符用於合並兩個或多個SELECT語句的結果,不返回任何重復的行。為了使用UNION,每個SELECT被選擇的列數必須是相同的,相同數目的列表達式,相同的數據類型,並確保它們有相同的順序,但它們不必具有相同的長度。

語法:

SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition] UNION SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition]

如下展示示例:
這里寫圖片描述

UNION ALL子句

UNION ALL運算符用於結合兩個SELECT語句的結果,包括重復行。適用於UNION的規則同樣適用於UNION ALL運算符。

語法:

SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition] UNION ALL SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition];

這里給定的條件根據需要可以是任何表達式。

如下展示示例:
這里寫圖片描述

SQLite NULL值

SQLite的NULL是用來表示一個缺失值的項。表中的一個NULL值是在字段中顯示為空白的一個值。帶有NULL值的字段是一個不帶有值的字段。NULL值與零值或包含空格的字段是不同的,理解這點是非常重要的。

語法示例:

CREATE TABLE AndroidTeam ( id INT PRIMARY KEY NOT NULL, name TEXT NOT NULL, age INT NOT NULL, address CHAR(50), money REAL );

 

這里NOT NULL表示列總是接受給定數據類型的顯式值。這里有兩個列我們沒有使用NOT NULL,這意味着這兩個列可能為NULL。帶有NULL值的字段在記錄創建的時候可以保留為空。NULL值在選擇數據時會引起問題,因為當把一個未知的 值與另一個值進行比較時,結果總是未知的,且不會包含在最后的結果中。

如下展示示例:
這里寫圖片描述

SQLite as別名

您可以暫時把表或列重命名為另一個名字,這被稱為別名。使用表別名是指在一個特定的SQLite語句中重命名表。重命名是臨時的改變,在數據庫中實際的表的名稱不會改變。列別名用來為某個特定的SQLite語句重命名表中的列。

表別名語法:

SELECT column1, column2... FROM table_name AS alias_name WHERE [condition];

列別名語法:

SELECT column_name AS alias_name FROM table_name WHERE [condition];

 

如下實例語句:

SELECT a.id, a.name, a.age, b.position FROM teamTable AS a, monkeyTable AS b WHERE a.id = b.tid;

SELECT a.id AS aid, a.name AS aname, a.age, b.position FROM teamTable AS a, monkeyTable AS b WHERE a.id = b.tid;

SQLite觸發器(Trigger)

SQLite的觸發器是數據庫的回調函數,它在自動執行/指定的數據庫事件發生時調用。以下是關於SQLite的觸發器的要點:

  • SQLite的觸發器(Trigger)可以指定在特定的數據庫表發生DELETE、INSERT或UPDATE時觸發,或在一個或多個指定表的列發生更新時觸發。

  • SQLite只支持FOR EACH ROW觸發器(Trigger),沒有FOR EACH STATEMENT觸發器(Trigger)。因此,明確指定FOR EACH ROW是可選的。

  • WHEN子句和觸發器(Trigger)動作可能訪問使用表單NEW.column-name和OLD.column-name的引用插入、刪除或更新的行元素,其中column-name是從與觸發器關聯的表的列的名稱。

  • 如果提供WHEN子句,則只針對WHEN子句為真的指定行執行SQL語句。如果沒有提供WHEN子句,則針對所有行執行SQL語句。

  • BEFORE或AFTER關鍵字決定何時執行觸發器動作,決定是在關聯行的插入、修改或刪除之前或者之后執行觸發器動作。

  • 當觸發器相關聯的表刪除時,自動刪除觸發器(Trigger)。

  • 要修改的表必須存在於同一數據庫中,作為觸發器被附加的表或視圖,且必須只使用tablename,而不是database.tablename。

  • 一個特殊的SQL函數RAISE()可用於觸發器程序內拋出異常。

創建觸發器(Trigger)語法:

CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name ON table_name BEGIN -- Trigger logic goes here.... END;

在這里,event_name 可以是在所提到的表 table_name上的INSERT、DELETE和UPDATE數據庫操作。您可以在表名后選擇指定FOR EACH ROW。

以下是在UPDATE操作上在表的一個或多個指定列上創建觸發器(Trigger)的語法:

CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name ON table_name BEGIN -- Trigger logic goes here.... END;

如下實例語句:
這里寫圖片描述

列出觸發器(TRIGGERS)

您可以從sqlite_master表中列出所有觸發器,如下所示:

SELECT name FROM sqlite_master WHERE type = 'trigger';

 

上面的 SQLite 語句只會列出一個條目,如下:

name
---------- audit_log

如果您想要列出特定表上的觸發器,則使用AND子句連接表名,如下所示:

SELECT name FROM sqlite_master WHERE type = 'trigger' AND tbl_name = 'teamTable';

上面的 SQLite 語句只會列出一個條目,如下:

name
---------- audit_log

刪除觸發器(TRIGGERS)

下面是DROP命令,可用於刪除已有的觸發器:

DROP TRIGGER trigger_name;

SQLite索引(Index)

索引(Index)是一種特殊的查找表,數據庫搜索引擎用來加快數據檢索。簡單地說,索引是一個指向表中數據的指針。一個數據庫中的索引與一本書后 邊的索引是非常相似的。例如,如果您想在一本討論某個話題的書中引用所有頁面,您首先需要指向索引,索引按字母順序列出了所有主題,然后指向一個或多個特 定的頁碼。

索引有助於加快SELECT查詢和WHERE子句,但它會減慢使用UPDATE和INSERT語句時的數據輸入。索引可以創建或刪除,但不會影響數 據。使用CREATE INDEX語句創建索引,它允許命名索引,指定表及要索引的一列或多列,並指示索引是升序排列還是降序排列。索引也可以是唯一的,與UNIQUE約束類 似,在列上或列組合上防止重復條目。

CREATE INDEX命令:

CREATE INDEX基本語法:

CREATE INDEX index_name ON table_name;

單列索引

單列索引是一個只基於表的一個列上創建的索引。基本語法:

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);

是否要創建一個單列索引還是組合索引,要考慮到您在作為查詢過濾條件的WHERE子句中使用頻繁的列。如果值使用到一個列,則選擇使用單列索引。如果在作為過濾的WHERE子句中有兩個或多個列經常使用,則選擇使用組合索引。

隱式索引

隱式索引是在創建對象時,由數據庫服務器自動創建的索引。索引自動創建為主鍵約束和唯一約束。

如下實例演示:

CREATE INDEX money_index ON teamTable (money); 查看索引: .indices teamTable 結果: salary_index sqlite_autoindex_COMPANY_1 //創建表時創建的隱式索引 列出數據庫范圍的所有索引: SELECT * FROM sqlite_master WHERE type = 'index';

DROP INDEX命令:

一個索引可以使用SQLite的DROP命令刪除。當刪除索引時應特別注意,因為性能可能會下降或提高。

基本語法:

DROP INDEX index_name;

什么情況下避免使用索引

索引的目的在於提高數據庫的性能,但這里有幾個情況需要避免使用索引。使用索引時,應重新考慮下列准則:

  • 索引不應該使用在較小的表上。
  • 索引不應該使用在有頻繁的大批量的更新或插入操作的表上。
  • 索引不應該使用在含有大量的NULL值的列上。
  • 索引不應該使用在頻繁操作的列上。

SQLite Indexed By關鍵字

“INDEXED BY index-name”子句規定必須需要命名的索引來查找前面表中值。如果索引名index-name不存在或不能用於查詢,然后SQLite語句的准備 失敗。”NOT INDEXED” 子句規定當訪問前面的表(包括由UNIQUE和PRIMARY KEY約束創建的隱式索引)時,沒有使用索引。然而,即使指定了 “NOT INDEXED”,INTEGER PRIMARY KEY 仍然可以被用於查找條目。

下面是INDEXED BY子句的語法,它可以與DELETE、UPDATE 或 SELECT 語句一起使用:

SELECT|DELETE|UPDATE column1, column2... INDEXED BY (index_name) table_name WHERE (CONDITION);

如下實例:

假設有表teamTable表,我們將創建一個索引,並用它進行INDEXED BY操作:

CREATE INDEX money_index ON teamTable(money); 現在使用INDEXED BY子句從表teamTable中選擇數據: SELECT * FROM teamTable INDEXED BY money_index WHERE money > 5000;

SQLite Alter命令

SQLite的ALTER TABLE命令不通過執行一個完整的轉儲和數據的重載來修改已有的表。您可以使用ALTER TABLE語句重命名表,使用ALTER TABLE語句還可以在已有的表中添加額外的列。在SQLite中,除了重命名表和在已有的表中添加列,ALTER TABLE命令不支持其他操作。

用來重命名已有的表的ALTER TABLE語法:

ALTER TABLE database_name.table_name RENAME TO new_table_name;

用來在已有的表中添加一個新的列的ALTER TABLE語法:

ALTER TABLE database_name.table_name ADD COLUMN column_def...;

如下展示示例:

ALTER TABLE teamTable RENAME TO androidTeamTable; ALTER TABLE androidTeamTable ADD COLUMN sex char(1); 新添加的列是以NULL值來填充的

SQLite Truncate Table關鍵字

在SQLite中,並沒有TRUNCATE TABLE命令,但可以使用SQLite的DELETE命令從已有的表中刪除全部的數據,但建議使用DROP TABLE命令刪除整個表,然后再重新創建一遍。

DELETE命令的基本語法:

DELETE FROM table_name;

DROP TABLE的基本語法:

DROP TABLE table_name;

如果您使用DELETE TABLE命令刪除所有記錄,建議使用VACUUM命令清除未使用的空間。

如下實例:

DELETE FROM androidTeamTable; VACUUM;

SQLite視圖(View)

視圖(View)只不過是通過相關的名稱存儲在數據庫中的一個SQLite語句。視圖(View)實際上是一個以預定義的SQLite查詢形式存在 的表的組合。視圖(View)可以包含一個表的所有行或從一個或多個表選定行。視圖(View)可以從一個或多個表創建,這取決於要創建視圖的 SQLite查詢。視圖(View)是一種虛表,允許用戶實現以下幾點:

  • 用戶或用戶組查找結構數據的方式更自然或直觀。
  • 限制數據訪問,用戶只能看到有限的數據,而不是完整的表。
  • 匯總各種表中的數據,用於生成報告。

SQLite視圖是只讀的,因此可能無法在視圖上執行DELETE、INSERT或UPDATE語句。但是可以在視圖上創建一個觸發器,當嘗試DELETE、INSERT或UPDATE視圖時觸發,需要做的動作在觸發器內容中定義。

創建視圖

SQLite的視圖是使用CREATE VIEW語句創建的。SQLite視圖可以從一個單一的表、多個表或其他視圖創建。

CREATE VIEW基本語法:

CREATE [TEMP | TEMPORARY] VIEW view_name AS SELECT column1, column2..... FROM table_name WHERE [condition];

您可以在SELECT語句中包含多個表,這與在正常的SQL SELECT查詢中的方式非常相似。如果使用了可選的TEMP或TEMPORARY關鍵字,則將在臨時數據庫中創建視圖。

如下實例展示:

CREATE VIEW test_view AS SELECT id, name, age FROM androidTeamTable; SELECT * FROM test_view;

刪除視圖

要刪除視圖,只需使用帶有view_name的DROP VIEW語句。DROP VIEW的基本語法如下:

DROP VIEW view_name;

 

SQLite事務(Transaction)

事務(Transaction)是一個對數據庫執行工作單元。事務(Transaction)是以邏輯順序完成的工作單位或序列,可以是由用戶手動 操作完成,也可以是由某種數據庫程序自動完成。事務(Transaction)是指一個或多個更改數據庫的擴展。例如,如果您正在創建一個記錄或者更新一 個記錄或者從表中刪除一個記錄,那么您正在該表上執行事務。重要的是要控制事務以確保數據的完整性和處理數據庫錯誤。實際上,您可以把許多的SQLite 查詢聯合成一組,把所有這些放在一起作為事務的一部分進行執行。

事務的屬性

事務(Transaction)具有以下四個標准屬性,通常根據首字母縮寫為ACID:

  • 原子性(Atomicity):確保工作單位內的所有操作都成功完成,否則,事務會在出現故障時終止,之前的操作也會回滾到以前的狀態。
  • 一致性(Consistency):確保數據庫在成功提交的事務上正確地改變狀態。
  • 隔離性(Isolation):使事務操作相互獨立和透明。
  • 持久性(Durability):確保已提交事務的結果或效果在系統發生故障的情況下仍然存在。

事務控制

使用下面的命令來控制事務:

BEGIN TRANSACTION;

開始事務處理。

COMMIT:保存更改,或者可以使用END TRANSACTION命令。
ROLLBACK:回滾所做的更改。

事務控制命令只與DML命令 INSERT、UPDATE和DELETE一起使用。他們不能在創建表或刪除表時使用,因為這些操作在數據庫中是自動提交的。

BEGIN TRANSACTION命令

事務(Transaction)可以使用BEGIN TRANSACTION命令或簡單的BEGIN命令來啟動。此類事務通常會持續執行下去,直到遇到下一個COMMIT或ROLLBACK命令。不過在數據 庫關閉或發生錯誤時,事務處理也會回滾。以下是啟動一個事務的簡單語法:

BEGIN; 或者 BEGIN TRANSACTION;

COMMIT命令

COMMIT命令是用於把事務調用的更改保存到數據庫中的事務命令。COMMIT命令把自上次COMMIT或ROLLBACK命令以來的所有事務保存到數據庫。

語法:

COMMIT; 或者 END TRANSACTION;

ROLLBACK命令

ROLLBACK命令是用於撤消尚未保存到數據庫的事務的事務命令。ROLLBACK命令只能用於撤銷自上次發出COMMIT或ROLLBACK命令以來的事務。

語法:

ROLLBACK;

示例就不演示了,比較easy!!

SQLite子查詢

子查詢或內部查詢或嵌套查詢是在另一個SQLite查詢內嵌入在WHERE子句中的查詢。使用子查詢返回的數據將被用在主查詢中作為條件,以進一步 限制要檢索的數據。子查詢可以與SELECT、INSERT、UPDATE和DELETE語句一起使用,可伴隨着使用運算符如 =、<、>、>=、<=、IN、BETWEEN等。

以下是子查詢必須遵循的幾個規則:

  • 子查詢必須用括號括起來。
  • 子查詢在SELECT子句中只能有一個列,除非在主查詢中有多列與子查詢的所選列進行比較。
  • ORDER BY不能用在子查詢中,雖然主查詢可以使用ORDER BY。
  • 子查詢返回多於一行,只能與多值運算符一起使用,如IN運算符。
  • BETWEEN運算符不能與子查詢一起使用,但是BETWEEN可在子查詢內使用。

* SELECT語句中的子查詢使用*

子查詢通常與SELECT語句一起使用。基本語法如下:

SELECT column_name [, column_name ] FROM table1 [, table2 ] WHERE column_name OPERATOR (SELECT column_name [, column_name ] FROM table1 [, table2 ] [WHERE]);

如下示例:

SELECT * FROM teamTable WHERE id IN (SELECT id FROM teamTable WHERE money > 45000);

INSERT語句中的子查詢使用

子查詢也可以與INSERT語句一起使用。INSERT語句使用子查詢返回的數據插入到另一個表中。在子查詢中所選擇的數據可以用任何字符、日期或數字函數修改。

基本語法如下:

INSERT INTO table_name [ (column1 [, column2 ]) ] SELECT [ *|column1 [, column2 ] FROM table1 [, table2 ] [ WHERE VALUE OPERATOR ];

如下示例:

把一個表的數據全部插入到另一個bck表中
INSERT INTO teamTable_bak SELECT * FROM teamTable WHERE id IN (SELECT id FROM teamTable);

UPDATE語句中的子查詢使用

子查詢可以與UPDATE語句結合使用。當通過UPDATE語句使用子查詢時,表中單個或多個列被更新。

基本語法如下:

UPDATE table SET column_name = new_value [ WHERE OPERATOR [ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME) [ WHERE) ];

如下示例:

UPDATE teamTable SET money = money * 0.50 WHERE age IN (SELECT age FROM teamTable_bck WHERE age >= 24);

DELETE語句中的子查詢使用

子查詢可以與DELETE語句結合使用,就像上面提到的其他語句一樣。

基本語法如下:

DELETE FROM TABLE_NAME [ WHERE OPERATOR [ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME) [ WHERE) ];

如下示例:

DELETE FROM teamTable WHERE age IN (SELECT age FROM teamTable_bck WHERE age > 24);

SQLite Autoincrement(自動遞增)

SQLite的AUTOINCREMENT是一個關鍵字,用於表中的字段值自動遞增。我們可以在創建表時在特定的列名稱上使用AUTOINCREMENT關鍵字實現該字段值的自動增加。關鍵字AUTOINCREMENT只能用於整型(INTEGER)字段。

設置了AUTOINCREMENT后insert或者update時不需要指定值,自動的,而且是從1開始的。

語法:

CREATE TABLE table_name( column1 INTEGER AUTOINCREMENT, column2 datatype, column3 datatype, ..... columnN datatype, );

示例就算了,太easy!!

SQLite注入

如果您的站點允許用戶通過網頁輸入,並將輸入內容插入到SQLite數據庫中,這個時候您就面臨着一個被稱為SQL注入的安全問題。

注入通常在請求用戶輸入時發生,比如需要用戶輸入姓名,但用戶卻輸入了一個SQLite語句,而這語句就會在不知不覺中在數據庫上運行。

永遠不要相信用戶提供的數據,所以只處理通過驗證的數據,這項規則是通過模式匹配來完成的。

SQLite日期 & 時間

SQLite支持以下五個日期和時間函數:

函數 實例
date(timestring, modifiers…) 以YYYY-MM-DD格式返回日期。
time(timestring, modifiers…) 以 HH:MM:SS 格式返回時間。
datetime(timestring, modifiers…) 以 YYYY-MM-DD HH:MM:SS 格式返回。
julianday(timestring, modifiers…) 這將返回從格林尼治時間的公元前4714年11月24日正午算起的天數。
strftime(timestring, modifiers…) 這將根據第一個參數指定的格式字符串返回格式化的日期。具體格式見下邊講解。


上述五個日期和時間函數把時間字符串作為參數。時間字符串后跟零個或多個modifiers修飾符。strftime() 函數也可以把格式字符串作為其第一個參數。下面將為您詳細講解不同類型的時間字符串和修飾符。

時間字符串

一個時間字符串可以采用下面任何一種格式:

時間字符串 實例
YYYY-MM-DD 2010-12-30
YYYY-MM-DD HH:MM 2010-12-30 12:10
YYYY-MM-DD HH:MM:SS.SSS 2010-12-30 12:10:04.100
MM-DD-YYYY HH:MM 30-12-2010 12:10
HH:MM 12:10
YYYY-MM-DDTHH:MM 2010-12-30 12:10
HH:MM:SS 12:10:01
YYYYMMDD HHMMSS 20101230 121001
now 2013-05-07

您可以使用”T”作為分隔日期和時間的文字字符。

修飾符(Modifiers)

時間字符串后邊可跟着零個或多個的修飾符,這將改變有上述五個函數返回的日期和/或時間。任何上述五大功能返回時間。修飾符應從左到右使用,下面列出了可在SQLite中使用的修飾符:

NNN days

NNN hours

NNN minutes

NNN.NNNN seconds

NNN months

NNN years

start of month

start of year

start of day

weekday N

unixepoch

localtime

utc

格式化

SQLite提供了非常方便的函數strftime() 來格式化任何日期和時間。您可以使用以下的替換來格式化日期和時間:

替換 描述
%d 一月中的第幾天,01-31
%f 帶小數部分的秒,SS.SSS
%H 小時,00-23
%j 一年中的第幾天,001-366
%J 儒略日數,DDDD.DDDD
%m 月,00-12
%M 分,00-59
%s 從 1970-01-01 算起的秒數
%S 秒,00-59
%w 一周中的第幾天,0-6 (0 is Sunday)
%W 一年中的第幾周,01-53
%Y 年,YYYY
%% % symbol

如下展示實例:

計算當前日期:
SELECT date('now'); 2013-05-07 計算當前月份的最后一天: SELECT date('now','start of month','+1 month','-1 day'); 2013-05-31 計算給定UNIX時間戳1092941466的日期和時間: SELECT datetime(1092941466, 'unixepoch'); 2004-08-19 18:51:06 計算給定UNIX時間戳1092941466相對本地時區的日期和時間: SELECT datetime(1092941466, 'unixepoch', 'localtime'); 2004-08-19 11:51:06 計算當前的UNIX時間戳: SELECT datetime(1092941466, 'unixepoch', 'localtime'); 1367926057 計算美國"獨立宣言"簽署以來的天數: SELECT julianday('now') - julianday('1776-07-04'); 86504.4775830326 計算從2004年某一特定時刻以來的秒數: SELECT strftime('%s','now') - strftime('%s','2004-01-01 02:34:56'); 295001572 計算當年10月的第一個星期二的日期: SELECT date('now','start of year','+9 months','weekday 2'); 2013-10-01 計算從UNIX紀元算起的以秒為單位的時間(類似 strftime('%s','now') ,不同的是這里有包括小數部分): SELECT (julianday('now') - 2440587.5)*86400.0; 1367926077.12598 在UTC與本地時間值之間進行轉換,當格式化日期時,使用utc或localtime修飾符,如下所示: SELECT time('12:00', 'localtime'); 05:00:00 SELECT time('12:00', 'utc'); 19:00:00

SQLite常用函數

SQLite有許多內置函數用於處理字符串或數字數據。下面列出了一些有用的SQLite內置函數,且所有函數都是大小寫不敏感,這意味着您可以使用這些函數的小寫形式或大寫形式或混合形式。欲了解更多詳情,請查看SQLite的官方文檔。

函數 描述
SQLite COUNT函數 SQLite COUNT聚集函數是用來計算一個數據庫表中的行數。
SQLite MAX函數 SQLite MAX聚合函數允許我們選擇某列的最大值。
SQLite MIN函數 SQLite MIN聚合函數允許我們選擇某列的最小值。
SQLite AVG函數 SQLite AVG聚合函數計算某列的平均值。
SQLite SUM函數 SQLite SUM聚合函數允許為一個數值列計算總和。
SQLite RANDOM函數 SQLite RANDOM函數返回一個介於-9223372036854775808和+9223372036854775807之間的偽隨機整數。
SQLite ABS函數 SQLite ABS函數返回數值參數的絕對值。
SQLite UPPER函數 SQLite UPPER函數把字符串轉換為大寫字母。
SQLite LOWER函數 SQLite LOWER函數把字符串轉換為小寫字母。
SQLite LENGTH函數 SQLite LENGTH函數返回字符串的長度。
SQLite sqlite_version函數 SQLite sqlite_version函數返回SQLite庫的版本。

SQLite Explain(解釋)

在SQLite語句之前,可以使用”EXPLAIN”關鍵字或 “EXPLAIN QUERY PLAN” 短語,用於描述表的細節。如果省略了EXPLAIN關鍵字或短語,任何的修改都會引起SQLite語句的查詢行為,並返回有關SQLite語句如何操作的 信息。來自EXPLAIN和EXPLAIN QUERY PLAN的輸出只用於交互式分析和排除故障。輸出格式的細節可能會隨着SQLite版本的不同而有所變化。應用程序不應該使用EXPLAIN或 EXPLAIN QUERY PLAN,因為其確切的行為是可變的且只有部分會被記錄。

EXPLAIN的語法如下:

EXPLAIN [SQLite Query]

EXPLAIN QUERY PLAN 的語法如下:

EXPLAIN  QUERY PLAN [SQLite Query]

SQLite PRAGMA

SQLite的PRAGMA命令是一個特殊的命令,可以用在SQLite環境內控制各種環境變量和狀態標志。一個PRAGMA值可以被讀取,也可以根據需求進行設置。

要查詢當前的PRAGMA值,只需要提供該pragma的名字:

PRAGMA pragma_name;

要為PRAGMA設置一個新的值,語法如下:

PRAGMA pragma_name = value;

設置模式,可以是名稱或等值的整數,但返回的值將始終是一個整數。

總結

整個Sqlite基本全面的到此結束!

 

借鑒: http://blog.csdn.net/yanbober/article/details/45581751


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM