MYSQL必知必會學習筆記
第1章 瞭解SQL
資料庫(database)儲存有組織的資料的容器
表(table)某種特定型別資料的結構化清單
模式(schema)關於資料庫和表的佈局及特性的資訊
列(column)表中的一個欄位,多有表都是有一個或多個列組成
資料型別(datatype)所容許的資料型別。每個表列都用相應的資料型別,它限制(或容許)該列中儲存的資料
行(row)表中的一個記錄
主鍵(primary key)一列(或一組列),其值能夠唯一區分表中的每個行
表中的任何列都可以作為主鍵,只要滿足以下條件
每個行都必須具有一個主鍵值(不允許NULL值)且任意兩行都不具有相同的主鍵值
SQL(Structured Query Language)結構化查詢語言。
第2章 MySQL簡介
MySQL是一種DBMS(資料庫管理系統),即它是一種資料庫軟體
第3章 使用MySQL
選擇資料庫
use 資料庫名;
檢視資料庫列表
show databases;
檢視資料庫內的表的列表
show tables;
查看錶中的每個欄位,包括欄位名、資料型別、是否允許NULL、鍵資訊、預設值等
show columns from 表名;
自動增量是表列需要的胃一直值。例如,訂單編號、僱員ID或顧客ID等。
show status;用於顯示管飯的伺服器狀態資訊
show create database; 和 show create table;分別用來顯示穿件特定資料庫或表的MySQL語句
show grants;用來顯示授予使用者的安全許可權
show errors; 和 show warnings; ,用來顯示伺服器錯誤或警告資訊
第4章 檢索資料;
1、檢索單個列
select 列名 from 表名;
2、檢索多個列
select 列名, 列名, 列名 from 表名;
3、檢索所有列
select * from 表名;
4、檢索不同的行,即找出一列中的不同值
select distinct 列名 from 表名;
第5章 排序檢索資料
1、排序資料
select 列名 from 表名;
通過order by子句,預設升序排序
select 列名 from 表名 order by 列名;
2、按多個列排序
select 列名, 列名, 列名 from 表名 order by 列名, 列名;
3、指定排序方向,按照降序排序
select 列名, 列名, 列名 from 表名 order by 列名 desc;
4、找出一列中的最高或最低值
select 列名 from 表名 order by 列名 desc limie 1;
第6章 過濾資料
1、使用where子句。只檢索所需資料需要指定搜尋條件,利用where子句,如下所示
select 列名, 列名 from 表名 where 列名 = xxx;(where跟某一條件)
order by要在where子句之後
2、where子句操作符
(1)、檢測單個值,同上
(2)、檢測小於10美元的所有產品
select prod_name, prod_price from products where prod_price < 10;
或者等於10美元
select prod_name, prod_price from products where prod_price <= 10;
(3)、不匹配檢查
找出不是由供應商1003製造的所有產品
select vend_id, prod_name from products where vend_id <> 1003;
select vend_id, prod_name from products where vend_id != 1003;
(4)、範圍值檢查
檢索價格在5美元和10美元之間所有的產品
select prod_name, prod_price from products where prod_price between 5 and 10;
(5)、空值檢查
檢查某位顧客的電子郵件沒有地址
select cust_id from customers where cust_email is null;
第7章 資料過濾
1、組合where子句
(1)and操作符
檢索由供應商1003製造且價格小於等於10美元的所有產品的名稱和價格
select prod_id, prod_price, prod_name form products where vend_id = 1003 and prod_price <= 10;
用and語句可以新增多個過濾條件,每新增一個條件就使用一個and
(2)or操作符
檢索由1002和1003中任一個指定供應商製造的所有產品的產品和價格
select prod_name, prod_price from products where vend_id = 1002 or vend_id = 1003;
(3)計算次序
where可包含任意數目的and和or操作符,允許兩者結合以進行復雜和高階的過濾,但是誰的優先順序比較高
需要列出價格為10美元(含)以上且由1002和1003製造的所有產品
select prod_name, prod_price from products where vend_id = 1002 or vend_id = 1003 and prod_price >= 10
這樣表達室友問題的,因為and的優先順序比or高,所以正確的表達如下
select prod_name, prod_price from products where (vend_id = 1002 or vend_id = 1003) and prod_price >= 10
2、IN操作符
IN操作符用來指定條件範圍,範圍中的每個條件都可以進行匹配,其實等同於OR
select prod_name, prod_price from products where vend_id in (1002,1003) order by prod_name;
select prod_name, prod_price from products where vend_id = 1002 or vend_id = 1003 order by prod_name;
3、NOT操作符
列出除1002和1003之外的所有供應商製造的產品
select prod_name, prod_price from products where vend_id not in (1002,1003) order by prod_name;
在複雜的子句中,not非常有用,在與IN操作符聯合使用時,not找出不匹配資訊非常簡單
用萬用字元進行過濾
1、LIKE操作符
萬用字元是用來匹配值的一部分的特殊字元
搜尋模式由字面值、萬用字元或兩者組合構成的搜尋條件
(1)百分號(%)萬用字元
在搜尋中,%表示任何字元出現任意次數。例如,為了找出所有以詞jet起頭的產品,可使用以下select語句
select prod_id, prod_name from products where prod_name like 'jet%';
%是接受jet之後的任意字元,不管它有多少字元
萬用字元可以在搜尋模式中任意位置使用,可以使用多個萬用字元
select prod_id, prod_name from products where prod_name like '%anvil%';
找出所有以s起頭以e結尾的所有產品
select prod_id, prod_name from products where prod_name like 's%e';
如果要搜尋的資料,最後有一個尾空格,會影響萬用字元的使用,解決辦法就是在末尾加一個%
%萬用字元可以匹配任何東西,但是不匹配NULL
(2)下劃線(_)萬用字元
與%用途一樣,但是下劃線匹配單個字元而不是多個字元
顯示“ ton anvil”中只存在一個字元的欄位
select prod_id, prod_name from products where prod_name like '_ ton anvil';
2、使用萬用字元的技巧
(1)不要過度使用萬用字元,能不用就不用
(2)把萬用字元置於搜尋模式開始處,搜尋起來最慢
(3)要注意萬用字元位置,放錯地方,可能不會返回預期效果
第9章 用正則表示式進行搜尋
1、使用MySQL正則表示式
(1)基本字元匹配
檢索列prod_name包含文字1000的所有行
select prod_name from products where prod_name regexp '1000' order by prod_name;
關鍵字regexp後所跟的東西作為正則表示式,與文字正文1000匹配的一個正則表示式處理
使用正則表示式.000 . 是正則表示式語言中搞一個特殊的字元。表示匹配任意一個字元,因此1000和2000都返回
select prod_name from products where prod_name regexp '.000' order by prod_name;
LIKE和REGEXP之間有一個重要差別
select prod_name from products where prod_name like '1000' order by prod_name;
此處不返回資料,like匹配整個列。如果匹配的文字僅是在列中出現(就是不完全相同),like不會找到它
select prod_name from products where prod_name regexp '1000' order by prod_name;
而regexp實在列值內進行匹配,如果被匹配的文字在列值中出現,regexp會找到它,相應行會被返回。
用regexp也可以用來匹配整個列(從而和like相同),使用^和$定位符即可
在MySQL中的正則表示式匹配不區分大小寫,為區分大小寫,可使用binary關鍵字,如下
select prod_name from products where prod_name regexp binary 'JetPack .000';
(2)進行OR匹配
為搜尋兩個串之一,使用|,如下所示
select prod_name from products where prod_name regexp '1000|2000' order by prod_name;
兩個以上or條件,例如‘1000|2000|3000’,將匹配1000或2000或3000
(3)匹配幾個字元之一
如何匹配特定字元,用 [ 和 ] 括起來的字元完成,如下所示
select prod_name from products where prod_name regexp ‘[123] Ton’ order by prod_name;
使用正則表示式[123],定義了一組字元,意思是匹配1或2或3
(4)匹配範圍
集合可以用定義要匹配的一個或多個字元,如[0123456789]會匹配數字0到9,為了簡化,可以寫成[0-9]
select prod_name from products where prod_name regexp ‘[1-5] Ton’ order by prod_name;
(5)匹配特殊字元
為了匹配特殊字元,必須用 \\ 為前導,\\- 表示 -,\\. 表示.
select prod_name from vendors where vend_name regexp ‘\\.’ order by vend_name;
(6)匹配字元類
(7)匹配多個例項
select prod_name from products where prod_name regexp ‘\\([0-9) sticks?\\)’ order by prod_name;
正則表示式\\([0-9) sticks?\\),[0-9]匹配任意字元,sticks?匹配stick和sticks(s後的?使s可選)
select prod_name from products where prod_name regexp ‘[[:digit:]]{4}’ order by prod_name;
如前所述, [:digit:]匹配任意數字, 因而它為數字的 個集合。 {4}確切地要求它前面的字元(任意數字) 出現4次, 所以[[:digit:]]
{4}匹配連在 起的任意4位數字。
(8)定位符
select prod_name from products where prod_name regexp ‘A[0-9\\.]’ order by prod_name;
^匹配串的開始。因此,"[0-9\\.]只在.或任意數字為串中第一個字元時才匹配它們。沒有^,則還要多檢索出4個別的行(那些中間有數字的行)。
第10章 建立計算欄位
1、計算欄位
儲存在資料庫表中的資料一般不是應用程式所需要的格式。下面舉幾個例子。
如果想在一個欄位中既顯示公司名, 又顯示公司的地址, 但這兩個資訊一般包含在不同的表列中。
城市、州和郵政編碼儲存在不同的列中(應該這樣),但郵件標籤列印程式卻需要把它們作為一個恰當格式的欄位檢索出來。
列資料是大小寫混合的, 但報表程式需要把所有資料按大寫表示出來。
物品訂單表儲存物品的價格和數量,但不需要儲存每個物品的總價格(用價格乘以數量即可)為打印發票,需要物品的總價格。
需要根據表資料進行總數、平均數計算或其他計算。
2、拼接欄位
拼接(concatenate)將值聯結到一起構成單個值
select conact(vend_name, '(', vend_country, ')') from vendors order by vend_name;
Trim函式可以刪去冗餘的空格,RTrim()刪去右邊所有空格,LTrim()刪去左邊冗餘空格
select conact(RTrim(vend_name), '(', vend_country, ')') from vendors order by vend_name;
3、使用別名
別名是一個欄位或替換名,別名用as關鍵字賦予
select conact(RTrim(vend_name), '(', vend_country, ')')as vend_title from vendors order by vend_name;
4、執行算術計算
select prod_id, quantity, item_price, quantity*item_price as expanded price from orderitems where order_num = 20005;
第11章 使用資料處理函式
1、函式
函式一般是在資料上執行的,它給資料的轉換和處理提供了方便
2、使用函式
(1)文字處理函式
Upper()將文字轉換為大寫,因此本例子中每個供應商都應出現兩次,一次未大寫前,一次是大寫很後
select vend_name, Upper(vend_name) as vend_name_upcase from vendors order by vend_name;
還有其它常用的文字處理函式
Soundex()函式將任何文字轉換為描述其語音表示的字母數字模式的演算法,如下
select cust_name, cust_contact from customers where Soudex(cust_contact) = Soudex( 'Y.Lie');
(2)日期和時間處理函式
日期必須為yyyy-mm-dd格式
檢索訂單記錄的order_date是2005-09-01的記錄
select cust_id, order_num from orders where order_date = '2005-09-01';
如果儲存的資料型別為datetime,其中也包含了時間值,儲存的order_date值為2005-09-01 11:30:05,上述檢索就會失敗
為此,必須使用Date()函式
select cust_id, order_num from orders where Date(order_date) = '2005-09-01';
如果要的是日期,請使用Date()
檢索出2005-09-01和2005-09-30的日期範圍
select cust_id, order_num from orders where Date(order_date) between '2005-09-01' and '2005-09-30';
還有另一種辦法(無需操心每個月有多少天或不需要操心閏年2月的方法)
檢索出年份為2005和月份為9的日期
select cust_id, order_num from orders where Year(order_date) = 2005 and Month(order_date) = 9;
(3)數值處理函式
第12章 彙總資料
1、聚集函式
(1)AVG()函式
返回products表中所有產品的平均價格
select AVG(prod_price) as avg_price from products;
如果用來返回特定的行或列的平均值,如下
select AVG(prod_proce) as avg_price from products where vend_id = 1003;
AVG()函式或略列值為NULL的行
(2)COUNT()函式
返回customers表中客戶的總數
select COUNT(*) as num_cust from customers;
(3)MAX() 函式
返回products表中最貴的物品的價格
select MAX(prod_price) as max_price from products;
(4) MIN()函式
與上面相反,返回最便宜的價格
select MIN(prod_price) as max_price from products;
(5) SUM函式
檢索所訂購物品的總數(所有quantity值之和)
select SUM(quantity) as items_ordered from orderitems where order_num = 20005;
2、聚集不同值
利用DISTINCT聚集不同值,找出其中不同的值,再計算平均價格
select AVG(DISTINCT prod_price) as avg_price from products where vend_id = 1003;
不允許使用COUNT(DISTINCT),否則會產生錯誤,類似,DISTINCT必須使用列名,不能用於計算或表示式
3、組合聚集函式
select COUNT(*) as num_items, MIN(prod_price) as price_min, MAX(prod_price) as price_max, AVG(prod_price) as price_avg from products;
第13章 分組資料
1、資料分組
分組允許吧資料分為多個邏輯組,以便能對每個組進行聚集計算
2、建立分組
select vend_id, COUNT(*) as num_prods from products group by vend_id;
group by子句可以包含任意數目的列
如果在group by子句中嵌套了分組,資料將在最後規定的分組上進行彙總
group by子句列出每個列都必須是檢索列或有效表示式(不能是聚集函式)
如果有null,null作為一個分組返回
group by子句必須出現在where子句之後,order by子句之前
第14章 使用子查詢
1、子查詢
即巢狀在其他查詢中的查詢
2、利用子查詢進行過濾
列出訂購物品TNT2的所有客戶;
檢索包含物品的TNT2的所有訂單的編號
檢索具有前一步驟列出的訂單編號的所有客戶的ID
檢索前一步驟返回的所有客戶ID 的客戶資訊
select cust_name, cust_contact from customers where cust_id in(
select cust_id from orders where order_num in(
select order_num from orderitems where prod_id = 'TNT2'));
3、作為計算欄位使用子查詢
假如需要顯示customers表中的每個客戶的訂單總數。訂單與相應的客戶ID儲存在orders表中
從customers表中檢索客戶列表
對於檢索出的每個客戶,統計其中orders表中的訂單數目
select cust_name, cust_state, (select count(*) from orders where orders.id = customers.cust_id) as orders from customers order by cust_name;
第15章 聯結表
1、聯結
聯結表就是能在資料檢索查詢的執行中聯結表
(1)關係表
外來鍵:外來鍵為某個表中的一列,它包含了另一個表的主鍵值,定義了兩個表之間的關係
products表只儲存產品資訊,它除了儲存供應商ID(vendors表的主鍵)外不儲存其他供應商資訊。vendors表的主鍵又焦作products的外來鍵,它將vendors表與products表關聯,利用供應商ID能從vendors表中找出相應供應商的詳細資訊
2、建立聯結
select vend_name, prod_name, prod_price from vendors, products where vendors.vend_id = products.vend_id
order by vend_name, prod_name;
笛卡爾積:由沒有聯結條件的表關係返回為結果為笛卡爾積。檢索出的行的數目將是第一個表中的行數乘以第二個表中的行數
如 select vend_name, prod_name, prod_price from vendors,products order by vend_name,prod_name;
(2)內部聯結
返回和前面簾子完全相同的資料,用inner join指定
sele
(3)聯結多個表
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 = 20005;
第16章 建立高階聯結
1、使用表別名,縮短SQL語句,允許在單挑select語句中多次使用相同的表
應當注意,表別名只在查詢執行中使用。與列別名不一樣,表別名不返回到客戶機
2、使用不同型別的聯結
(1)自聯結
查詢要求首先找到生產ID為DTNTR的物品的供應商,然後找出這個供應商生產的其它物品
利用子查詢
select prod_id, prod_name from products where vend_id = (select vend_id from products where prod_id = 'DTNTR' );
使用聯結的相同查詢
select p1.prod_id, p1.prod_name from products as p1, products as p2 where p1.vend_id = p2.vend_id and p2.prod_id = 'DTNTR' ;
(2)外部聯結
用來包含沒有關聯行的那些行
select customers.cust_id, orders.order_num from customers left outer join orders on customers.cust_id = orders.cust_id;
3、使用帶聚集函式的聯結
select customers.cust_name, custome.cust_id, count(orders.order_num) as num_ord
from customers inner join orders
on customers.cust_id = orders.cust_id;
group by customers.cust_id;
4、使用聯結和聯結條件
第17章 組合查詢
1、組合查詢
允許執行多個查詢(多條select語句),並將結果作為單個查詢結果集返回,通常稱作並或符合查詢
2、建立組合查詢
select vend_id, prod_id, prod_price from products where prod_price <= 5
union
select vend_id, prod_id, prod_price from products where vend_id in (1001,1002);
UNION會自動包含或取消重複的行,使用UNION ALL就是不取消重複的行
對組合查詢結果排序,用UNION組合查詢時,只能使用一條order by子句
第18章 全文字搜尋
1、使用全文字搜尋
Match()和Against()一起使用以實際執行搜尋
(1)啟用全文字搜尋支援
一般在建立表時啟用全文字搜尋
(2)進行全文字搜尋
select note_text from productnotes where Match(note_text) Against('rabbit');
傳遞給Match()的值必須與FULLTEXT()定義中的相同,而且數量和次序正確,且搜尋不區分大小寫,除非BINARY
與LIKE相比,這種方式有良好程度的排序
select note_text Match(note_text) Against('rabbit') as rank from productnotes;
每行都一個等級值,文字詞靠前的行的等級比靠後的搞
(3)使用查詢擴充套件
select note_text from productnotes where Match(note_text) Against('anvils' with query expansion);
按照等級從高到低依次排序
(4)布林文字搜尋
select note_text from productnotes where Match(note_text) Against('heavy' in boolenan mode);
為匹配包含heavy但不包含任意以rope開始詞的行
select note_text from productnotes where Match(note_text) Against('heavy -rope*' in boolenan mode);
第19章 插入資料
1、插入完整的行
插入一個新客戶到customers表中
insert into customers values(null, 'Pep E. LaPew', '100 Main Street', 'Los Angeles', 'CA', '90046', 'USA', null, null);
完整的insert語句,輸入對應的列名】
insert into customers(cust_name, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
values('Pep E. LaPew', '100 Main Street', 'Los Angeles', 'CA', '90046', 'USA', null, null);
如果列中允許null或者給出預設值,可以省略列
2、插入多個行
insert into customers(cust_name, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
values('Pep E. LaPew', '100 Main Street', 'Los Angeles', 'CA', '90046', 'USA', null, null),
('Pep E. LaPew', '100 Main Street', 'Los Angeles', 'CA', '90046', 'USA', null, null);
3、插入檢索出的資料
insert的另一種形式,利用它將一條select語句的結果插入表中
從custnew中將所有資料匯入customers中去
insert into customers(cust_contact, cust_email, cust_name, cust_adress, cust_city, cust_state, cust_zip, cust_country)
select cust_id, cust_email, cust_name, cust_adress, cust_city, cust_state, cust_zip, cust_country from custnew;
第20章 更新和刪除資料
1、更新資料
更新表中特定行
更新表中所有行
客戶10005現在有了電子郵件地址,需要更新他的記錄
update customers set cust_emailn = '[email protected]' where cust_id = 10005;
更新多個列
update customers set cust_emailn = '[email protected]', cust_name = 'The Fudds'
where cust_id = 10005;
如果要刪除某一列的值,可設定它成為null(表定義允許為null)
2、刪除資料
從表中刪除特定的行
從表中刪除所有行
只刪除客戶10006
delete from customers where cust_id = 10006;
delete語句從表中刪除行,甚至所有行,而不是表本身
更快的刪除可以使用truncate table語句,實際是刪除原來的表並重建建立一個表,而不是逐行刪除表中資料
3、更新和刪除的指導原則
第21章 建立和操縱表
1、建立表
表建立基礎
create table customers
(
cust_id int not null auto_increment,
cust_name char(50) not null,
cust_adress char(50) not null,
cust_city char(50) not null,
cust_state char(5) not null,
cust_zip char(10) not null,
cust_country char(50) not null,
cust_contact char(50) not null,
cust_email char(255) not null,
primary key(cust_id)
)Enging = InnoDB;
使用null值的合理性
使用auto_increment自增長
InnoDB是事物引擎
2、更新表
更改表結構,新增一個列
alter table vendors add vend_phone char(20);
還可以用來定義外來鍵
3、刪除表
drop table customers2;
4、重命名錶
rename table customers2 to customers;
第22章 使用檢視
1、檢視
檢視是虛擬的表。與包含資料的表不一樣,檢視只包含使用時動態檢索資料的查詢
select cust_name, cust_contact from customers, orders, orderitems
where customers.cust_id = orders.cust_id and orderitems.order_num = orders.order_num and prod_id = 'TNT2'
舉個例子,查詢用來檢索訂購了某個特定產品的客戶,任何需要這個資料的人都必須理解相關表的結構,並且知道如何建立查詢和對錶進行聯結。為了檢索其他產品(或多個產品)的相同資料,必須修改最後的where子句。
(1)為什麼使用檢視
(2)檢視的規則和限制
2、使用檢視
(1)利用檢視簡化複雜的聯結
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;
建立一個名為productcustomers的檢視,它聯結三個表,以返回已訂購了任意產品的所有客戶的列表。
檢索訂購了產品TNT2的客戶
select cust_name, cust_contact from productcustomers where prod_id = 'TNT2';
(2)用檢視重新格式化檢索出的資料
檢視的另一種常見用途是重新格式化檢索出的資料
select contact(RTrim(vend_name), '(', RTrim(vend_country), ')') as vend_title from vendors order by vend_name;
假如經常需要這個格式的結構,不必每次需要時執行聯結,建立一個檢視,每次需要時使用它即可。
create view vendorlocations as
select contact(RTrim(vend_name), '(', RTrim(vend_country), ')') as vend_title from vendors order by vend_name;
select * from vendorlocations;
(3)用檢視過濾不想要的資料
過濾沒有電子郵件地址的客戶
create view customeremaillist as
select cust_id, cust_name, cust_email from customers where cust_email is not null;
select * from customeremaillist;
(4)使用檢視與計算欄位
select prod_id, quantity, item_price, quantity*item_price as expanded_price from orderitems where order_num = 20005;
將其轉換為一個檢視,如下進行:
create view orderitemsexpanded as
select order_num prod_id, quantity, item_price, quantity*item_price as expanded_price from orderitems;
select * from orderitemsexpanded where order_num = 20005;
(5)更新檢視
檢視是可以更新的,可以對它們使用insert、update和delete
但是不是所有檢視都可以更新的,如果檢視定義中有以下操作,則不能進行檢視的更新
第23章 使用儲存過程
1、儲存過程
儲存過程簡單來說,就是為以後的使用而儲存的一條或多條MySQL語句的集合,可將其視為批檔案,雖然它們的作用不僅限於批處理
2、為什麼要使用儲存過程
3、使用儲存過程
(1)執行儲存過程
call productpricing(@pricelow, @pricehigh, @priceaverage);
執行名為productpricing的儲存過程,它計算並返回產品的最低、最高和平均價格。
(2)建立儲存過程
一個返回平均價格的儲存過程
create procedure productpricing()
begin
select avg(prod_price) as priceaverage
from products;
end;
使用這個儲存過程
call productpricing();
(3)刪除儲存過程
drop procedure productpricing;
(4)使用引數
create procedure productpricing(
out pl declimal(8,2),
out ph declimal(8,2),
out pa declimal(8,2)
)
begin
select min(prod_price) into pl from products;
select max(prod_price) into ph from products;
select avg(prod_price) into pa from products;
end;
in傳遞給儲存過程、out從儲存過程傳出和inout對儲存過程傳入和傳出
(5)檢查儲存過程
show create procedure ordertotal;
第24章 使用遊標
1、遊標
有時、需要在檢索出來的行中前進或後腿一行或多行,這就需要使用遊標。它是一個儲存在MySQL伺服器上的資料庫查詢,他不是一條selectyuju ,而是被該語句檢索出來的結果集。在儲存了遊標後,應用程式可以根據需要滾動或瀏覽其中的資料。
遊標主要用於互動式應用,其中使用者需要滾動螢幕上的資料,並對資料進行瀏覽或做出更改。
MySQL遊標只能用於儲存過程(和函式)
2、使用遊標
(1)建立遊標
create procedure processorders()
begin
declare ordernumbers cursor
for
select order_num from orders;
end;
存錯過程處理完成後,遊標就消失了(因為它侷限於儲存過程)
(2)開啟和關閉遊標
open ordernumbers;
close ordernumbers;
修改後的版本
create procedure processorders()
begin
declare ordernumbers cursor
for
select order_num from orders;
open ordernumbers;
close ordernumbers;
end;
(3)使用遊標資料
用fetch檢索當前行的order_num列到一個名為o的區域性宣告的變數中。
create procedure processorders()
begin
declare o int;
declare ordernumbers cursor
for
select order_num from orders;
open ordernumbers;
fetch ordernumbers into o;
close ordernumbers;
end;
第25章 使用觸發器
MySQL語句在需要時被執行,儲存過程也是如此。但是,如果想要某條語句在事件發生時自動執行,需要使用觸發器
除了delete insert update 其他MySQL語句不支援觸發器
2、建立觸發器
create trigger newproduct after insert on products for each row select ‘Product added’;