SQL 必知必會

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子句)之后給出垮媒。在同時使用whereorder 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)品信息分開存儲的理由是:

  1. 同一供應(yīng)商的每個產(chǎn)品磷瘤,其供應(yīng)商的信息是相同的采缚,對每個產(chǎn)品重復(fù)此信息既浪費(fèi)時間又浪費(fèi)空間扳抽;
  2. 如果供應(yīng)商信息發(fā)生變化贸呢,只需修改一次即可怔鳖;
  3. 如果有重復(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';
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痒给,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子骏全,更是在濱河造成了極大的恐慌苍柏,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姜贡,死亡現(xiàn)場離奇詭異试吁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)楼咳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門熄捍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人母怜,你說我怎么就攤上這事余耽。” “怎么了苹熏?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵碟贾,是天一觀的道長币喧。 經(jīng)常有香客問我,道長袱耽,這世上最難降的妖魔是什么杀餐? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮朱巨,結(jié)果婚禮上史翘,老公的妹妹穿的比我還像新娘。我一直安慰自己蔬崩,他們只是感情好恶座,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沥阳,像睡著了一般跨琳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桐罕,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天脉让,我揣著相機(jī)與錄音,去河邊找鬼功炮。 笑死狡门,一個胖子當(dāng)著我的面吹牛嘀粱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼咖耘,長吁一口氣:“原來是場噩夢啊……” “哼丢习!你這毒婦竟也來了锅铅?” 一聲冷哼從身側(cè)響起梗夸,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎塘淑,沒想到半個月后萝招,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡存捺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年槐沼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捌治。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡岗钩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肖油,到底是詐尸還是另有隱情凹嘲,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布构韵,位于F島的核電站周蹭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疲恢。R本人自食惡果不足惜凶朗,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望显拳。 院中可真熱鬧棚愤,春花似錦、人聲如沸杂数。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揍移。三九已至次和,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間那伐,已是汗流浹背踏施。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留罕邀,地道東北人畅形。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像诉探,于是被迫代替她去往敵國和親日熬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容