Sqlite3知識總結二(高級用法)

現有兩張表用於下面的演示:company、department.
在這裏插入圖片描述

多表查詢

SQLite 的 Join 子句用於結合兩個或多個數據庫中表的記錄。JOIN 是一種通過共同值來結合兩個表中字段的手段。
SQL 定義了三種主要類型的連接:交叉連接 - CROSS JOIN、內連接 - INNER JOIN、外連接 - OUTER JOIN。
1、交叉連接(CROSS JOIN)把第一個表的每一行與第二個表的每一行進行匹配。如果兩個輸入表分別有 x 和 y 行,則結果表有 x*y 行。

select emp_id,dept,name from company cross join department;

在這裏插入圖片描述
2、內連接(INNER JOIN)根據連接謂詞結合兩個表(table1 和 table2)的列值來創建一個新的結果表。是最常見的連接類型,是默認的連接類型。INNER 關鍵字是可選的。
基本用法:

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

如果匹配條件有多個列,也可以使用using表達式

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

如查詢company.id和department.emp_id相等的記錄:

select emp_id,dept,name from company inner join department on company.id = department.emp_id;

在這裏插入圖片描述
3、 外連接(OUTER JOIN)是內連接(INNER JOIN)的擴展。雖然 SQL 標準定義了三種類型的外連接:LEFT、RIGHT、FULL,但 SQLite 只支持 左外連接(LEFT OUTER JOIN)。外連接(OUTER JOIN)聲明條件的方法與內連接(INNER JOIN)是相同的,一旦主連接計算完成,外連接(OUTER JOIN)將從一個或兩個表中任何未連接的行合併進來,外連接的列使用 NULL 值,將它們附加到結果表中。
在這裏插入圖片描述

別名

您可以暫時把表或列重命名爲另一個名字,這被稱爲別名。
表別名用法:

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

列別名用法:

SELECT column_name AS alias_name
FROM table_name
WHERE [condition];

在這裏插入圖片描述

觸發器

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

以下是關於 SQLite 的觸發器(Trigger)的要點:

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

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

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

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

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

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

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

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

基本語法:

CREATE  TRIGGER trigger_name [BEFORE|AFTER] event_name 
ON table_name
BEGIN
 -- 觸發器邏輯....
END;

event_name 可以是在所提到的表 table_name 上的 INSERT、DELETE 和 UPDATE 數據庫操作
如我們要記錄修改薪資的日誌,首先創建一個日誌表:

create table log (emp_id int not null, date text not null);

然後創建觸發器:

create trigger update_log after update of salary on company
begin 
insert into log values(new.id,datetime('now'));
end;

最後修改company的某個薪資,查詢結果:
在這裏插入圖片描述
如果要查詢某張表上有什麼觸發器,如下查詢company表上的觸發器,如果不加company條件,則查詢數據庫所有的觸發器:

select name from sqlite_master where type='trigger' and tbl_name = 'company';

在這裏插入圖片描述
刪除觸發器

drop trigger update_log; 

在這裏插入圖片描述
未完待續~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章