SQL 必知必會
在mac終端操作sqlite:
- cd 數(shù)據(jù)庫所在的目錄
- sqlite3 數(shù)據(jù)庫文件名 //帶后綴)(此時已經(jīng)打開數(shù)據(jù)庫)
- .tables //顯示數(shù)據(jù)庫中所有已經(jīng)創(chuàng)建的表
- .schema //顯示所有表的模式
- .headers on //顯示字段名(查詢時才會顯示)
- .mode column/list/line
- 執(zhí)行sql語句必須在末尾加分號
distinct
SELECT DISTINCT name FROM TB_BOOK_TAG;
關(guān)鍵字distinct
皇型,用于去除name列中所有行中重復(fù)元素滤蝠。
limit
SELECT name FROM TB_BOOK_TAG LIMIT 5;
關(guān)鍵字limit
,返回name列指定行數(shù)疫诽。
SELECT name FROM TB_BOOK_TAG LIMIT 5 OFFSET 0;
等同于下面寫法(shortcut)
SELECT name FROM TB_BOOK_TAG LIMIT 0上沐,5;
limit ... offset ...
關(guān)鍵字LIMIT ... OFFSET ...
,limit
后跟的數(shù)字指定顯示多少行奴曙,offset
后跟的數(shù)字表示從什么位置開始奶甘。(0是第一行)
注釋
--this is a comment
關(guān)鍵--加注釋
赛蔫,單行注釋。
/* comments */
關(guān)鍵/**/
勒奇,多行注釋预鬓。
order by
SELECT * FROM TB_BOOK_TAG ORDER BY name;
關(guān)鍵字:order by
+ 字段名巧骚,按該字段所屬列的首字母進(jìn)行排序赊颠。要確保該子句是select
語句中最后一條子句,否則會出現(xiàn)錯誤劈彪。
SELECT publisher,pubdate FROM TB_BOOK_ENTITY ORDER BY publisher,pubdate;
關(guān)鍵字:order by
+ 字段名 + 字段名竣蹦,首先按publisher進(jìn)行排序,然后按照pubdate進(jìn)行排序沧奴。對于第二個字段的排序痘括,當(dāng)且僅當(dāng)具有多個相同的publisher時才會對其按照pubdate進(jìn)行排序,如果publisher列中所有值都是唯一的滔吠,則不會按pubdate進(jìn)行排序纲菌。
desc
SELECT publisher,pubdate FROM TB_BOOK_ENTITY ORDER BY pubdate DESC;
關(guān)鍵字:desc
,order by 默認(rèn)是按升序進(jìn)行排序疮绷,當(dāng)在字段名后加desc
后翰舌,將對該字段進(jìn)行降序排列。
SELECT pubdate,price FROM TB_BOOK_ENTITY ORDER BY pubdate DESC,price;
pubdate
按降序排列冬骚,price
椅贱,仍然按照升序排列(在pubdate相同的行)懂算。所以,如果想在多個列上進(jìn)行降序庇麦,必須對每一列都指定desc
關(guān)鍵字计技。
where
SELECT * FROM TB_BOOK_TAG WHERE count = 1;
關(guān)鍵字:where
,指定搜索條件進(jìn)行過濾山橄。where子句在表名(from子句)之后給出垮媒。在同時使用where
和order by
時,應(yīng)該讓order by
位于where
之后航棱。
操作符 | 說明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
!< | 不小于 |
> | 大于 |
>= | 大于等于 |
!> | 不大于 |
BETWEEN | 在指定的兩個值之間 |
IS NULL | 為NULL值 |
注意:NULL和非匹配
通過過濾選擇不包含(如<>)指定值的所有行時涣澡,你可能希望返回含NULL值的行,但是這做不到丧诺,因為NULL有特殊的含義入桂,數(shù)據(jù)庫不知道它們是否匹配,所以在進(jìn)行匹配過濾或非匹配過濾時驳阎,不會返回這些結(jié)果抗愁。
where...and...
select * from contacts where name = "fff" and mobile = "d";
關(guān)鍵字:and
,組合where子句呵晚。
where...or...
select * from contacts where name = "fff" or mobile = "d";
關(guān)鍵字:or
蜘腌,組合where子句。
注意:在同時使用and和or時要注意求值順序饵隙,and優(yōu)先級大于or撮珠。因此在任何時候使用具有and和or操作符的where子句時芯急,都應(yīng)該使用圓括號明確地分組操作符
where...in...
select * from contacts where mobile in ('12', '444') order by mobile;
關(guān)鍵字:in
,用來指定條件范圍娶耍,范圍中的每個條件都可以進(jìn)行匹配饼酿。in
操作符一般比一組or
操作符執(zhí)行的更快。in
最大的優(yōu)點是可以包含其他select語句故俐,能夠更動態(tài)的建立where子句。
not
select * from contacts where not mobile = '12';
關(guān)鍵字:not
辑舷,where子句中用來否定其后條件的關(guān)鍵字。上面的例子也可以用<>
惩妇。在簡單語句中,not
沒有什么優(yōu)勢歌殃,但是,在更復(fù)雜的子句中氓皱,not
非常有用。例如股淡,在與in
操作符聯(lián)合使用時,not
可以非常簡單的找出與條件列表不匹配的行唯灵。如下例子:
SELECT * FROM CONTACTS WHERE NOT mobile IN ('111111', '3333');
like
通配符(wildcard)用來匹配值的一部分的特殊字符隙轻。
搜索模式(search pattern)由字面值,通配符或兩者組合構(gòu)成的搜索條件玖绿。
通配符搜索只能用于文本字段(字符串),非文本數(shù)據(jù)類型字段不能使用通配符搜索
%通配符
在搜索字符串中呐籽,%表示任何字符出現(xiàn)任意次數(shù)
select * from tb_book_tag where name like '計算機(jī)%';
注意字符串后面所跟的空格:
許多DBMS會用空格來填補(bǔ)字段內(nèi)容。例如蚀瘸,如果某列有50個字符狡蝶,而存儲文本為Fish bean bag toy(17個字符),則為填滿該列會在文本末尾追加33個空格苍姜。如果此時用‘F%y’來檢索牢酵,便檢索不到上述字符串。簡單解決辦法是‘F%y%’衙猪。更好的解決辦法是用函數(shù)去掉空格。
'%' 不會匹配為NULL的行
下劃線_通配符
用途和%一樣布近,但它只匹配單個字符垫释,而不是多個。
select * from tb_book_tag where name like '計算機(jī)__';
使用通配符的技巧
SQL通配符搜索比其他搜索更耗時撑瞧。
1. 不要過度使用通配符棵譬,如果其他操作能達(dá)到目的,使用其他操作预伺。
2. 在確實需要使用的時候订咸,也盡量不要把它用在搜索模式的開始處曼尊。把通配符置于開始處,搜索起來是最慢的脏嚷。
3. 特別要注意通配符的位置不要放錯骆撇。
創(chuàng)建計算字段
計算字段并不實際存在于數(shù)據(jù)庫表中,計算字段是運(yùn)行時在SELECT語句內(nèi)創(chuàng)建的父叙。
select rtrim('~ ') || name from tb_book_tag;
關(guān)鍵字:||
和rtrim()
神郊。 ||
拼接操作符。rtrim()
去除文本右邊的空格趾唱。trim()
去除兩邊的空格涌乳。
as
select name || 'is foolish' as title from contacts;
關(guān)鍵字:as
,全稱alias夕晓。它指示SQL創(chuàng)建一個包含指定計算結(jié)果的名為title的計算字段运授,任何客戶端應(yīng)用可以按名稱引用這個列乔煞,就像一個實際表列一樣逗宜。
執(zhí)行算術(shù)計算
+ - * /
select mobile, (mobile + 1)*2 as count_mobile from contacts;
關(guān)鍵字:+
或-
或*
或/
纺讲;
函數(shù)
一下所用到的是適用于sqlite的函數(shù)熬甚,不一定適用于其他DBMS乡括。
upper()
select name ,upper(name) as name_upper from contacts;
關(guān)鍵字:upper()
轉(zhuǎn)大寫
sqlite中常用于文本處理函數(shù):
函數(shù) | 說明 |
---|---|
length() | 返回字符串的長度 |
lower() | 將字符串轉(zhuǎn)小寫 |
ltrim() | 去掉字符串左邊的空格 |
rtrim() | 去掉字符串右邊的空格 |
upper() | 將字符串轉(zhuǎn)大寫 |
avg()
select avg(mobile) as avg_id from contacts;
關(guān)鍵字:avg()
诲泌,對表中某列所有行或特定行中的數(shù)據(jù)求平均值敷扫。該函數(shù)會忽略值為NULL的行葵第。
count()
select count(*) as num_cust from contacts;
select count(name) as num_name from contacts;
關(guān)鍵字:count()
,使用count(*)
缀台,對表中行的數(shù)目進(jìn)行計數(shù)将硝,不管表列中是否包含NULL值依疼。使用count(column_name)
,對特定列中具有值的行進(jìn)行計數(shù)律罢,忽略NULL值误辑。
sum()
select sum(mobile) as sum_mobile from contacts;
關(guān)鍵字:sum()
, 忽略NULL值
聚集不同值
count(distinct name)
select count(distinct name) from tb_book_tag;
組合聚集函數(shù)
select count(*) as num_items, min(count) as count_min, max(count) as count_max, avg(count) as count_avg from tb_book_tag;
分組數(shù)據(jù)
group by
select name, count(*) as num_names from tb_book_tag group by name order by name;
關(guān)鍵字:group by
巾钉,group by子句必須出現(xiàn)在where子句之后砰苍,order by子句之前赚导。
group by...having...
select name , count(*) as amounts from tb_book_tag group by name having amounts >= 10;
關(guān)鍵字:having
吼旧。對分組進(jìn)行過濾圈暗。而where對分組不起作用厂置,它是針對表中每一行來過濾。
使用子查詢
select cust_id
from orders
where order_num in (select order_num
from orderitems
where prod_id = 'RGAN01');
注意:
作為子查詢的select語句只能查詢單個列野揪。企圖檢索多個列將返回錯誤。
同時要注意性能問題海铆。
使用子查詢作為計算字段
select cust_name,
cust_state,
(select count(*)
from orders
where orders.cust_id = customers.cust_id) as orders from customers
order by cust_name;
聯(lián)結(jié)表
關(guān)系表
為理解關(guān)系表,來看一個例子:
有一個包含產(chǎn)品目錄的數(shù)據(jù)庫表憎茂,其中每類物品占一行竖幔,對于每種物品拳氢,要存儲的信息包括產(chǎn)品描述放接,價格以及生產(chǎn)該產(chǎn)品的供應(yīng)商留特。
現(xiàn)有同一供應(yīng)商生產(chǎn)的多種物品乳乌,那么在何處存儲供應(yīng)商名聯(lián)系方法等信息汉操?將這些數(shù)據(jù)與產(chǎn)品信息分開存儲的理由是:
- 同一供應(yīng)商的每個產(chǎn)品磷瘤,其供應(yīng)商的信息是相同的采缚,對每個產(chǎn)品重復(fù)此信息既浪費(fèi)時間又浪費(fèi)空間扳抽;
- 如果供應(yīng)商信息發(fā)生變化贸呢,只需修改一次即可怔鳖;
- 如果有重復(fù)數(shù)九固蛾,則很難保證每次輸入該數(shù)據(jù)的方式都相同献幔,
相同的數(shù)據(jù)出現(xiàn)多次決不是一件好事斜姥,這是關(guān)系數(shù)據(jù)庫設(shè)計的基礎(chǔ)铸敏。關(guān)系表的設(shè)計就是要把信息分解成多個表杈笔,一類數(shù)據(jù)一個表糕非。各表通過某些共同的值相互關(guān)聯(lián)(所以才叫關(guān)系數(shù)據(jù)庫)朽肥。
如果數(shù)據(jù)存儲在多個表中篱昔,怎樣用一條select語句就檢索出數(shù)據(jù)州刽?
答案是使用聯(lián)結(jié)穗椅,聯(lián)結(jié)是一種機(jī)制门坷,用來在一條select語句中關(guān)聯(lián)表
select vend_name, prod_name, prod_price
from products, vendors
where vendors.vend_id = products.vend_id;
等同于下面的寫法:
select vend_name, prod_name, prod_price
from vendors inner join products
on vendors.vend_id = products.vend_id;
在聯(lián)結(jié)兩個表時拜鹤,實際要做的是將第一個表中的每一行與第二個表中的每一行配對。where
子句作為過濾條件宣虾,只包含那些匹配給定條件的行绣硝。沒有where
子句鹉胖,第一個表中的每一行將與第二個表中的每一行配對,而不管他們邏輯上是否能匹配在一起冕屯。這種聯(lián)結(jié)稱為等值聯(lián)結(jié)(equijoin)痰洒,也稱為內(nèi)聯(lián)結(jié)(inner join)丘喻。
笛卡爾積(cartesian product):
由于沒有聯(lián)結(jié)條件的表關(guān)系返回的結(jié)果為笛卡爾積泉粉。檢索出的行的數(shù)目將是第一個表中的行數(shù)乘以第二個表中的行數(shù)搀继。
返回笛卡爾積的聯(lián)結(jié)也叫叉聯(lián)結(jié)(cross join)叽躯。
SQL不限制一條select
語句可以聯(lián)結(jié)的表的數(shù)目酣难。如下:
select prod_name, vend_name, prod_price, quantity
from orderitems, products, vendors
where products.vend_id = vendors.vend_id
and orderitems.prod_id = products.prod_id
and order_num = 20007;
注意:性能考慮
DBMS在運(yùn)行時關(guān)聯(lián)指定的每個表憨募,以處理聯(lián)結(jié)。這種處理可能非常耗資源尾膊,因此應(yīng)該注意不要聯(lián)結(jié)不必要的表冈敛。
創(chuàng)建高級聯(lián)結(jié)
使用表別名
select cust_name, cust_contact
from customers as c, orders as o, orderitems as oi
where c.cust_id = o.cust_id
and oi.order_num = o.order_num
and prod_id = 'RGAN01';
使用表別名的兩個主要理由:
- 縮短SQL語句
- 允許在一條select語句中多次使用相同的表
自聯(lián)結(jié)
select cust_id, cust_name, cust_contact
from customers
where cust_name = (select cust_name
from customers
where cust_contact = 'Jim Jones');
以上子查詢效果等同于自聯(lián)結(jié):
select c1.cust_id, c1.cust_name, c1.cust_contact
from customers as c1, customers as c2
where c1.cust_name = c2.cust_name
and c2.cust_contact = 'Jim Jones';
通常情況下,許多DBMS處理聯(lián)結(jié)遠(yuǎn)比處理子查詢快得多
外聯(lián)結(jié)
select customers.cust_id, orders.order_num
from customers
left outer join orders
on customers.cust_id = orders.cust_id;
檢索包括沒有訂單顧客在內(nèi)的所有顧客癌压。
SQLite支持left outer join,但不支持right outer join.
組合查詢
主要有兩種情況需要使用組合查詢:
- 在一個查詢中從不同的表返回結(jié)構(gòu)數(shù)據(jù)
- 對一個表執(zhí)行多個查詢,按一個查詢返回數(shù)據(jù)
union
select cust_name, cust_contact, cust_email
from customers
where cust_state in ('IL', 'IN', 'MI')
union
select cust_name, cust_contact, cust_email
from customers
where cust_name = 'Fun4All';
union規(guī)則
- union必須由兩條或兩條以上的select語句組成丐吓,語句之間用關(guān)鍵字union分隔。
- union中的每個查詢必須包含相同的列趟据,表達(dá)式或聚集函數(shù)(不過券犁,各個列不需要以相同的次序列出)。
- 列數(shù)據(jù)類型必須兼容:類型不必完全相同汹碱,但必須是DBMS可以隱含轉(zhuǎn)換的類型粘衬。
union all
DBMS不取消重復(fù)行。
對組合查詢結(jié)果排序
select cust_name, cust_contact, cust_email
from customers
where cust_state in ('IL', 'IN', 'MI')
union
select cust_name, cust_contact, cust_email
from customers
where cust_name = 'Fun4All'
order by cust_name, cust_contact;
在用union組合查詢時咳促,只能使用一條order by
子句稚新,它必須位于最后一條select語句之后,DBMS用它來排序所有的select語句返回的所有結(jié)果。
插入數(shù)據(jù)
插入完整的行
insert into... values
insert into customers
values ('1000000006', 'Chenzhen', 'Hennansheng', 'henan', 'China', '476300', 'China', 'John jdge', 'chen@gaiml.com');
這種寫法簡單,但不安全钦无,高度依賴表中列定義的次序苍凛,還依賴于其容易獲得的次序信息悠栓。編寫依賴列次序的SQL語句是很不安全的癞志,這樣做遲早會出問題戒突。
更安全的方法:
insert into customers(cust_id,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country,
cust_contact,
cust_email)
values('1000000007',
'Chenzhen',
'Hennansheng',
'henan',
'shangqiu',
'476300',
'China',
'John jdge',
'chen@gaiml.com');
插入行時韵丑,DBMS將用values列表中的相應(yīng)值填入列表中的對應(yīng)項。其優(yōu)點是,即使表的結(jié)構(gòu)改變,這條insert語句仍然可以正常工作咳秉。
insert into... select...from...
insert into customers(cust_id,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country,
cust_contact,
cust_email)
select cust_id,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country,
cust_contact,
cust_email
from CustNew;
select語句從CustNew檢索出要插入的值何之,而不是列出他們蒜危。DBMS不關(guān)心select返回的列名,它使用的是列的位置窄绒,因此select的第一列(不管列名如何)將用來填充表列中指定的第一列山析,如此等等仅讽。
insert select 語句可以包含where子句处渣。
從一個表復(fù)制到另一個表
create table custcopy as select * from customers;
要想只復(fù)制部分列位仁,可以明確給出列名。
更新和刪除數(shù)據(jù)
update...set... where...
update customers
set cust_email = 'chenzhen@gmainl.com'
where cust_id = '1000000008';
更新多個列時揽趾,只需使用一條set命令:
update customers
set cust_email = 'lala@qq.com',
cust_contact = 'sam'
where cust_id = '1000000008';
沒有where子句俐筋,DBMS將會更新表中所有行劣坊。
delete
delete不需要列名或通配符沫勿,因為它刪除的是整行而不是刪除列,要刪除指定列,使用update
delete from custcopy
where cust_id = '1000000008';
如果省略where子句陕壹,它將刪除表中的每個顧客九昧。如果想從表中刪除所有行教馆,不要使用delete涣狗,可使用truncate table語句,它的速度更快,因為不記錄數(shù)據(jù)的變動。
創(chuàng)建和操縱表
create
create table Super
(
prod_id char(10) not null,
vend_id char(10) not null,
prod_name char(254) not null,
prod_price decimal(8,2) not null, default 10.2
prod_desc varchar(1000) null
);
not null
,可以阻止插入沒有值的列。默認(rèn)是null
嚎于。
SQLite獲得系統(tǒng)時間的函數(shù)date('now')
更新表
alert table
使用alert table
更改表的結(jié)構(gòu)掘而,必須給出下面的信息:
- 在
alter table
之后給出要更改的表名。 - 列出要做出哪些更改于购。
alter table Vendors
add vend_phone char(20);
SQLite對使用alter table執(zhí)行的操作有所限制袍睡。最重要的一個限制是,它不支持使用alter table定義主鍵和外鍵肋僧。
使用alter table要極為小心斑胜,應(yīng)該在進(jìn)行改動錢做完整的備份(表結(jié)構(gòu)和數(shù)據(jù)的備份)。數(shù)據(jù)庫表的更改不能撤銷嫌吠,如果增加了不需要的列止潘,也許無法刪除他們。
刪除表 drop table
drop table Super;
使用視圖
視圖是虛擬的表辫诅。與包含數(shù)據(jù)的表不一樣凭戴,視圖只包含使用時動態(tài)檢索數(shù)據(jù)的查詢。
視圖(View)只不過是通過相關(guān)的名稱存儲在數(shù)據(jù)庫中的一個 SQLite 語句炕矮。視圖(View)實際上是一個以預(yù)定義的 SQLite 查詢形式存在的表的組合么夫。
SQLite僅支持只讀視圖,所以視圖可以創(chuàng)建肤视,可以讀档痪,但其內(nèi)容不能更改。
刪除視圖 drop view
drop view customeremaillist;
創(chuàng)建視圖create view
create view ProductCustomers as
select cust_name, cust_contact, prod_id
from Customers, Orders, OrderItems
where Customers.cust_id = Orders.cust_id
and OrderItems.order_num = Orders.order_num;
where子句與where子句
從視圖檢索數(shù)據(jù)時如果使用了一條where子句邢滑,則兩組子句(一組子在視圖中腐螟,另一組,另一組是傳遞給視圖的)將自動組合。
視圖為虛擬的表遭垛。它們包含的不是數(shù)據(jù)尼桶,而是根據(jù)需要檢索數(shù)據(jù)的查詢。視圖提供了一種封裝select語句的層次锯仪,可用來簡化數(shù)據(jù)處理泵督,重新格式化或保護(hù)基礎(chǔ)數(shù)據(jù)。
管理事務(wù)處理
使用事務(wù)處理(transaction processing)庶喜,通過確保成批的SQL操作要么完全執(zhí)行小腊,要么完全不執(zhí)行,來維護(hù)數(shù)據(jù)庫的完整性久窟。
關(guān)于事務(wù)處理的一些術(shù)語:
- 事務(wù)(transaction)指一組SQL語句秩冈;
- 回退(rollback)指撤銷指定SQL語句的過程;
- 提交(commit)指將未存儲的SQL語句結(jié)果寫入數(shù)據(jù)庫表斥扛;
- 保留點(savepoint)指事務(wù)處理中設(shè)置的臨時占位符入问,可以對它發(fā)布回退(與回退整個事務(wù)處理不同)。
可以回退哪些語句:
insert,update,delete
管理事務(wù)的關(guān)鍵在于將SQL語句分解為邏輯塊稀颁,并明確規(guī)定數(shù)據(jù)何時應(yīng)該回退芬失,何時不應(yīng)該回退。
begin;
delete from orders where order_num = 20009;
delete from orderitems where order_num = 20009;
commit;
高級SQL特性
約束匾灶,索引棱烂,觸發(fā)器。
約束(constraint)
主鍵
create table Orders
(
order_num integer not null primary key,
cust_id char(10) not null references Customers(cust_id)
);
表中任意列只要滿足以下條件阶女,都可以用于主鍵颊糜。
- 任意兩行主鍵值都不相同。
- 每行都具有一個主鍵值(既列中不允許NULL)秃踩。
- 包含主鍵的列從不修改或更新衬鱼。
- 主鍵值不能重用。
外鍵
外鍵是表中的一列憔杨,其值必須列在另一表的主鍵中馁启。
外鍵有助防止意外刪除。
在定義外鍵后芍秆,DBMS不允許刪除在另一個表中具有關(guān)聯(lián)行的行。例如不能刪除關(guān)聯(lián)訂單的顧客翠勉,刪除改顧客的唯一方法是首先刪除相關(guān)的訂單妖啥。
唯一約束 unique
唯一約束用來保證一列中的數(shù)據(jù)是唯一的。與主鍵的區(qū)別如下:
- 表可包含多個唯一約束对碌,但每個表只允許一個主鍵荆虱。
- 唯一約束列可包含NULL值。
- 唯一約束列可修改或更新。
- 唯一約束列的值可重復(fù)使用怀读。
- 與主鍵不一樣诉位,唯一約束不能用來定義外鍵。
檢查約束 check
create table OrderItems
(
...
quantity integer not null check (quantity > 0),
...
)
索引 create index
索引用來排序數(shù)據(jù)以加快搜索和排序操作的速度菜枷。想象一本書后的索引苍糠。
在開始創(chuàng)建索引前,應(yīng)該記住以下內(nèi)容:
- 索引改善檢索操作的性能啤誊,但降低了數(shù)據(jù)插入岳瞭,修改,和刪除的性能蚊锹。在執(zhí)行這些操作時瞳筏,DBMS必須動態(tài)的更新索引。
- 索引數(shù)據(jù)可能要占用大量的存儲空間牡昆。
- 并非所有數(shù)據(jù)都適合做索引姚炕。
- 索引用于數(shù)據(jù)過濾和數(shù)據(jù)排序。
- 可以在索引中定義多個列(例如丢烘,州加上城市)柱宦。這樣的索引僅在以州加城市的順序排序時有用。如果想按城市排序铅协,則這種索引沒有用處捷沸。
CREATE INDEX index_name
ON table_name (column_name);
刪除索引 drop index
DROP INDEX index_name;
觸發(fā)器 Trigger
觸發(fā)器是特殊的存儲過程,它在特定的數(shù)據(jù)庫活動發(fā)生時自動執(zhí)行狐史。
CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name
ON table_name
BEGIN
-- Trigger logic goes here....
END;
示例:
CREATE TRIGGER audit_log AFTER INSERT
ON COMPANY
BEGIN
INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, datetime('now'));
END;
列出觸發(fā)器
SELECT name FROM sqlite_master
WHERE type = 'trigger';