筆記-SQLite補充

基礎知識

數據類型

NULL 值爲NULL的值。
INTEGER 帶符號的整數。
REAL 浮點值。
TEXT 文本字符串。
BLOB 爲blob數據,徹底根據它的輸入存儲。
uniqueidentifier 用於存儲GUID的值。sql

運算符

  • 算數運算符數據庫

    • 加+、 減-、乘*、除/、取模%
  • 比較運算符ide

    • ==、=、!=、<>、>、<、>=、<=、!<、!>
  • 邏輯運算符函數

    • AND 和
    • BETWEEN 用於在給定最小值和最大值範圍內一系列值中搜索
    • EXISTS 存在
    • IN 用於判斷某個值是否在一系列指定列表的值中
    • NOT IN 同上
    • LIKE 用於把某個值與使用通配符運算符的類似值比較
    • GLOB 同上,區別在於它對大小寫敏感
    • NOT 否認運算符
    • OR 用於結合一個SQL語句的where之居中的多個條件
    • IS NULL 與NULL值相比較
    • IS 與=類似
    • IS NOT 與!=類似
    • || 鏈接兩個不容的字符串,獲得一個新的字符串
    • UNIQUE 搜索指定表中的每一行,確保惟一性。
  • 位運算符
    假設變量A=60,變量B=13:
    A = 0011 1100
    B = 0000 1101
    A&B = 0000 1100 A|B = 0011 1101 ~A = 1100 0011性能

    • & (A&B)獲得12,即0000 1100
    • | (A|B)獲得61,即0011 1101
    • ~ (~A)獲得-61,即1100 0011 一個有符號二進制數的補碼形式。
    • << 二進制左移 A<<2 獲得240,即爲1111 0000
    • .>> 二進制右移 A>>2 獲得15,即爲0000 1111

建立表

建立一個TABLE_NAME表,PKKEY爲主鍵測試

CREATE TABLE TABLE_NAME(PKKEY INT PRIMARY KEY NOT NULL, PKUSER UNIQUEIDENTIFIER NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL);搜索引擎

CREATE TABLE IF NOT EXISTS TABLE_NAME(PKKEY UNIQUEIDENTIFIER NOT NULL, PKUSER UNIQUEIDENTIFIER NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL);3d

刪除表

DROP TABLE TABLE_NAME;指針

insert語句

INSERT INTO TABLE_NAME (PKKEY, PKUSER, NAME, AGE, ADDRESS, SALARY) VLAUES (VALUE1, VALUE2, VALUE3, VALUE4, VALUE5, VALUE6);code

INSERT INTO TABLE_NAME VALUES (VALUE1, VALUE2, VALUE3, VALUE4, VALUE5, VALUE6);

INSERT INTO TABLE_NAME (PKKEY, PJUSER, ... SALARY) SELECT colum1, colum2, ... columN FROM TABLE_NAME2 WHERE CONDITION;

select語句

SELECT PKKEY, PKUSER, ... SALARY FROM TABLE_NAME;

SELECT * FROM TABLE_NAME;

update語句

UPDATE TABLE_NAME SET PKKEY=value1, PKUSER=value2, ... WHERE condition;

delete語句

DELETE FROM TABLE_NAME WHERE condition;

like子句

like運算符是用來匹配通配符指定模式的文本值。若是搜索表達式與模式表達式匹配,like運算符將返回真true,也就是1。 與like運算符一塊兒使用的兩個通配符 百分號(%)下劃線(_)

百分號(%) 表明零個、一個或多個數字或字符。
下劃線(_) 表明一個單一的數字或字符。能夠組合使用。

Glob子句

GLOB 運算符是用來匹配通配符指定模式的文本值。若是搜索表達式與模式表達式匹配,GLOB運算符將返回真true,也就是1。
like不一樣的是,GLOB大小寫敏感。 與GLOB一塊兒使用的兩個通配符是星號(*)問號(?)

星號(*) 表明零個、一個或者多個數字或字符。
問號(?) 表明一個單一的數字或字符。

Limit子句

limit子句用於限制由SELECT語句返回的數據數量。

SELECT * FROM TABLE_NAME LIMIT [rows];

SELECT * FROM TABLE_NAME LIMIT [rows] OFFSET [row num];

Order By子句

Order by子句是用來基於一個或多個列按升序或降序順序排列的數據。

SELECT * FROM TABLE_NAME WHERE condition ORDER BY NAME [ASC | DESC];

Group By子句

Group By子句用於與SELECT語句一塊兒使用,來對該列下的相同的數據進行分組。

SELECT語句中,GROUP BY子句放在WHERE子句以後,放在ORDER BY子句以前。

SELECT NAME, SUM(SALARY) FROM TABLE_NAME WHERE condition GROUP BY NAME ORDER BY SUM(SALARY) DESC;

Having 子句

HAVING 子句容許指定條件來過濾將出如今最終結果中的分組結果。

WHERE子句在所選列上設置條件,而HAVING子句則在有GROUP BY子句建立的分組上設置條件。

SELECT NAME, SUM(SALARY) FROM TABLE_NAME WHERE condition GROUP BY NAME HAVING count(NAME) < 2 ORDER BY SUM(SALARY);

Distinct關鍵字

distinct關鍵字與SELECT語句一塊兒使用,來消除全部重複的記錄,並只獲取惟一一次記錄。

SELECT DISTINCT NAME FROM TABLE_NAME WHERE condition;

高級知識

約束

約束是在表的數據列上強制執行的規則。這些是用來限制能夠插入到表中的數據類型。約束能夠是列級或者表級。列級約束僅適用於列,表級約束被應用到整個表。

  • NOT NULL 約束:確保某列不能有NULL
  • DEFAULT 約束:當某列沒有指定值時,爲該列提供默認值
  • UNIQUE 約束:確保某列中的全部值是不一樣的
  • PRIMARY KEY 約束: 惟一標識數據庫表中的各行/記錄
  • CHECK 約束:確保某列中的全部值知足必定條件

默認狀況下,列能夠保存NULL值,但若是不想某列有NUll值,只要在該列上定義NOT NULL約束。DEFAULT約束在INSERT INTO 語句沒有提供一個特定的值時,爲列提供一個默認值。UNIQUE約束防止在一個特定列存在兩個記錄具備相同的值。PRIMARY KEY約束惟一標識數據庫表中的每一個記錄。在一個表中能夠有多個UNIQUE列,但只能有一個主鍵。

CREATE TABLE TABLE_NAME(ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL UNIQUE, SALARY REAL DEFAULT 50000.00);

Join子句

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

  • 交叉鏈接 CROSS JOIN
  • 內鏈接 INNER JOIN
  • 外鏈接 OUTER JOIN

交叉鏈接: 把第一個表的每一行與第二個表的每一行進行匹配。若是兩個輸入表分別有x和y行,則結果表有x * y行。因爲交叉鏈接可能產生很是大的表,使用須謹慎。

SELECT Acolum1, Acolum2, Bcolum2 FROM TABLEA CROSS JOIN TABLEB;

內鏈接: 根據鏈接謂詞結合兩個表的列值來建立一個新的結果表。查詢會把表1中的每一行與表2中的每一行進行比較,找到全部知足鏈接謂詞的行的匹配對。當知足鏈接謂詞時,A和B行的每一個匹配對的列值會合併成一個結果行。內鏈接是默認的鏈接類型。INNER關鍵字是可選的。

SELECT Acolum1, Acolum2, Bcolum2 FROM TABLEA [INNER] JOIN TABLEB ON condition;

爲了不冗餘,可使用USING表達式聲明內鏈接。這個表達式指定一個或多個列的列表:

SELECT ... FROM TABLEA JOIN TABLEB USING (colum1, ...) ...

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

SELECT ... FROM TABLEA NATURAL JOIN TABLEB ...

外鏈接: 是內鏈接的擴展,雖然SQL標準定義了三種類型的外鏈接: LEFT, RIGHT, FULL,SQLite只支持左外鏈接(LEFT OUTER JOIN)。

外鏈接(OUTER JOIN)聲明條件的方法與內鏈接是相同的,使用ON, USINGNATURAL關鍵字來表達。最初的結果表以相同的方式進行計算。一旦主鏈接計算完成,外鏈接將一個或兩個表中任何未鏈接的行,合併進來,外鏈接的列使用NULL值,將他們附加到結果表中。

SELECT Acolum1, Acolum2, Bcolum1 FROM TABLEA LEFT OUTER JOIN TABLEB ON condition...

SELECT ... FROM TABLEA LEFT OUTER JOIN TABLEB USING (colum1, ...) ...

SELECT ... FROM TABLEA NATURAL LEFT OUTER JOIN TABLEB ...

Unions子句

UNION 子句用於合併兩個或者多個SELECT語句的結果,不返回任何重複的行。
爲了使用UNION,每一個SELECT被選擇的列數必須是相同的,相同數目的列表達式,相同的數據類型,並確保他們有相同的順序,但它們沒必要具備相同的長度。

SELECT colum1, colum2 FROM TABLEA WHERE condition UNION SELECT colum1, colum2 FROM TABLEA WHERE condition;

UNION ALL 子句,用於結合兩個SELECT語句的結果,包括重複行。

SELECT colum1, colum2 FROM TABLEA WHERE condition UNION ALL SELECT colum1, colum2 FROM TABLEA WHERE condition;

別名

暫時把表或列重命名爲另外一個名字,被稱爲別名。使用表別名是指在一個特定的SQLite語句中,重命名錶,重命名是臨時的改變,在數據庫中實際的表的名稱是不會改變的。關鍵字AS能夠被省略。
表的別名:

SELECT colum1, colum2... FROM TABLE_NAME AS TABLEA WHERE condition;

列的別名:

SELECT colum1 AS columA FROM TABLE_NAME WHERE condition;

觸發器

觸發器(Trigger) 是數據庫的回調函數,它會在指定的數據庫事件發生時自動執行/調用。

  • SQLite的觸發器能夠指定在特定的數據庫表發生DELETE、INSERTUPDATE時觸發,或在一個或多個指定表的列發生更新時觸發。
  • SQLite只支持 FOR EACH ROW觸發器,沒有FOR EACH STATEMENT觸發器。所以,明確指定 FOR EACH ROW 是可選的。
  • 若是提供WHEN子句,則只針對WHEN子句爲真的指定行執行SQL語句。若是沒有提供WHEN子句,則針對全部行執行SQL語句。
  • BEFOREAFTER關鍵字決定什麼時候執行觸發器動做,決定是在關聯行的插入、修改或刪除以前或者以後執行觸發器動做。
  • 當觸發器相關聯的表刪除時,自動刪除觸發器。

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

在這裏,event_name能夠是在所提到的表table_name上的INSERT、DELETEUPDATE數據庫操做。亦可在表名後選擇指定 FOR EACH ROW。 下面是在UPDATE操做上在表的一個或多個指定列上建立觸發器的語法:

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

能夠從sqlite_master表中列出全部的觸發器。

SELECT name FROM sqlite_master WHERE type='trigger';

刪除觸發器:

DROP TRIGGER trigger_name;

補充:
FOR EACH ROW 是操做語句每影響到一行的時候就出發一次,也就是說刪除/更新了10行,就觸發了10次。
FOR EACH STATE 一條操做語句就觸發一次,有時沒有被影響的行也執行。
SQLite只實現了FOR EACH ROW的觸發。
when的用法:

CREATE TRIGGER trigger_name AFTER UPDATE OF id ON table1 FOR EACH ROW WHEN new_id>30 BEGIN update table_2 set id = new_id WHERE table_2 id = OLD_ID END;

索引Index

索引(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子句中使用很是頻繁的列。

列出全部索引:

SELECT * FROM sqlite_master WHERE type='index';

刪除索引:

DROP INDEX index_name;

下面狀況下避免使用索引:

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

Alter命令

ALTER TABLE 命令不經過執行一個完整的轉儲和數據的重載來修改已有的表。能夠重命名,還能夠再已有的表中添加額外的列。 在SQLite中,出來重命名錶和在已有的表中添加列,ALTER TABLE命令不支持其餘操做。

重命名錶名:

ALTER TABLE table_name RENAME new_table_name;

添加額外的列:

ALTER TABLE table_name ADD COLUMN column char(50);

測試發現,不支持直接添加帶有unique約束的列:

能夠先直接添加一列數據,而後添加unique索引(惟一索引)。

相關文章
相關標籤/搜索