標籤:

MySQL學習小結


這一篇最主要是記錄下命令,方便以後查找

使用Mysql

創建資料庫

create database mysql_test;

展示所有資料庫

show databases;

選擇要使用的資料庫

use Typeidea_db

獲得表tables

show tables;

顯示伺服器狀信息

show status;

更多show命令查詢

help show

檢索數據

  • select + 列名 from + 表
  • selcet、from 都為關鍵字
  • 使用select語句從products表中檢索一個名為prod_name的列

SELECT prod_name FROM products;

檢索多個多個列

select prodname, prodid, prod_price from products;

檢索所有列

select * from products;

檢索不同的行

- DISTINCT關鍵字 「不同」

- 告訴MySQL只返回不同的vend_id行

selcet DISTINCT vend_id from products;

檢索限制結果

- limit

- limit 5,5:第一個5開始位置,第二個5要檢索的行數;

- limit 4 OFFSET 3 :從行3開始取4行

- 返回不多於5行

select prod_name from products LIMIT 5;

select prod_name from products LIMIT 5,5;

排序檢索數據

  • order by :排序
  • 以字母順序排序數據(A-Z)

    > select prodname from products ORDER BY prodname;

按多個列排序

select prodname, prodid, prodprice from products ORDER BY prodprice, prod_name;

指定排序方向

  • DESC 降序排序
  • Z-A
  • 對產品價格進行排序

select prodid, prodprice, prodname from products ORDER BY prodprice DESC;

  • 降序排序產品價格,再對產品名字排序

    > select prodid, prodprice, prodname from products ORDER BY prodprice DESC, prod_name;

使用order by 和limit 找出列中最高或最低的值

- 去掉DESC就是最低值

- limit 1 :僅返回一行

- 使用order by 和limit子句時,limit子句必須在order by 子句之後

select prodprice from products ORDER BY prodprice DESC LIMIT 1;

過濾數據

where子句

  • 從products表中檢索兩個列, 過濾(只返回prod_price = 2.5的行)
  • 使用order by 和 where子句時,order by 必須在where之後

    > select prodname, prodprice from products WHERE prod_price = 2.50;

檢查單個值

where字句操作符

  • =
  • <
  • >
  • !=
  • <=
  • >=
  • BETWEEN :在指定的兩個值之間

檢查where prodname = fuses,返回prodname 的值為fuses的一行

  • 值為字元串時需要使用單引號

select prodname, prodprice from products WHERE prod_name = fuses;

列出小於等於10美金的所有產品

select prodprice, prodname from products WHERE prod_price <= 10;

不匹配檢查

列出不是由供應商1003製造的所有產品

select vendid, prodname from products WHERE vend_id != 1003;

範圍值檢查

查詢價格在5美金至10美金之間的所有產品

- ADN :兩個值之間必須要使用AND來連接

- BETWEEN

select prodname, prodprice from products WHERE prod_price BETWEEN 5 AND 10;

空值檢查

NULL:空值

select prodname from products WHERE prodprice IS NULL;

文件中沒有某位顧客的電子郵件

select custid from customers WHERE custemail IS NULL;

組合WHERE子句

AND操作符

檢索供應商1003製造且價格小於等於10美金的所有產品的價格名稱、價格、ID

select prodid, prodprice, prodname from products WHERE vendid = 1003 AND prod_price <=10;

OR操作符

- 指示MySQL檢索匹配任一條件的行

- 檢索任一個指定供應商製造的所有產品的名稱和價格

select prodname, prodprice from products WHERE vendid = 1002 OR vendid = 1003;

計算次序

例子:

檢索出10美金以上且由1002或者1003製造的所有產品

select prodname, prodprice from products WHERE vendid = 1003 OR vendid = 1002 AND prod_price >= 10;

  • sql語句理解為:檢索1003供應商製造的所有產品或者1002供應商製造的大於10美金的所有產品
  • and 在計算次序中優先順序更高
  • 這裡應該使用圓括弧

select prodname, prodprice from products WHERE(vendid = 1002 or vendid = 1003) AND prod_price >= 10;

IN 操作符

IN - 用來指定範圍

檢索由1002或1003供應商提供的所有產品的名稱和價格,名稱以升序排序

select prodname, prodprice from products WHERE vendid IN (1002, 1003) ORDER BY prodname;

NOT操作符

  • 用來否定它之後的所跟的任何條件
  • 匹配除開1002和1003外所有的供應商的產品名字和價格,排序以名稱升序排序

select prodname, prodprice from products WHERE vendid NOT IN (1002, 1003) ORDER BY prodname;

用通配符進行過濾

  • LIKE操作符: 匹配未知值
  • %通配符:表示任何字元出現任意次數
  • 通配符無法匹配以null值作為產品名的行

查找以jet開頭的產品

select prodid, prodname from products WHERE prod_name LIKE jet%;

搜索模式『%anvil%』表示匹配任何位置包含文本anvil的值,無論它之前或之後出現什麼字元

找到以s起頭e結尾的所有產品

select prodname from products WHERE prodname LIKE s%e;

下劃線(_)通配符

- 至匹配單個字元

- 下劃線後有個空格

- .5 ton anvil沒有被匹配,因為搜索模式要求匹配兩個匹配符而不是一個」.一個「 」5一個「

select prodid, prodname from products WHERE prodname LIKE ton anvil;

### 用正則表達式進行搜索

- REGEXP

- LIKE :如果匹配值在列中被找到將不會返回數據,like匹配未知值

檢索prod_name文本1000的所有行

select prodname from products WHERE prodname REGEXP 1000 ORDER BY prod_name;

匹配所有.000

select prodname from products WHERE prodname REGEXP .000 ORDER BY prod_name;

OR匹配

  • 使用 | :為正則表達式中的OR操作,表示匹配其中之一

    > select prodname from products WHERE prodname REGEXP 1000|2000 ORDER BY prod_name;

匹配幾個字元之一

[123] Ton

- [123]定義一組字元,匹配1或2或3

select prodname from products WHERE prodname REGEXP [123] Ton ORDER BY prod_name;

或者這樣寫

select prodname from products WHERE prodname REGEXP [1|2|3] Ton ORDER BY prod_name;

匹配範圍

- 用 - 來匹配

- [1-5]

- [a-z]

select prodname from products WHERE prodname REGEXP [1-5] Ton ORDER BY prod_name;

匹配特殊字元

  • 必須使用』『 - . 轉義

    > select vendname from vendors WHERE vendname REGEXP . ORDER BY vend_name;

匹配多個實例

select prodname from products WHERE prodname REGEXP ([0-9]) sticks?) ORDER BY prod_name;

  • ()
  • [0-9];匹配任意數字

select prodname from products WHERE prodname REGEXP [[:digit:]]{4} ORDER BY prod_name;

  • [:digit:];任意數字集合
  • {4}:任意4位數

定位符

  • 在集合中[^.....]表示否定該集合或者指定字元的開始處

創建計算欄位

拼接欄位

  • concate()函數來實現拼接

名字和地址拼接起來

select Concat(vendname, (, vendcountry, )) from vendors ORDER BY vend_name;

  • 刪除右側多餘空格
  • Concat()
  • RTrim()函數

select Concat(RTrim(vendname), (, RTrim(vendcountry), )) from vendors ORDER BY vend_name;

使用別名

- alias 別名 AS

select Concat(RTrim(vendname), (, RTrim(vendcountry), )) AS vendtitle from vendors ORDER BY vendname;

執行算術計算

select prodid, quantity, itemprice from orderitems WHERE order_num = 2005;

使用數據處理函數

文本處理函數

select vendname, Upper(vendname) AS vendnameupcase from vendors ORDER BY vend_name;

  • AS(alias) 使用別名
  • Upper()函數:將文本轉換為大寫

select custname, custcontact from customers WHERE Soundex(cust_contact) = Soundex(Y Lie);

  • Soundex 檢索所有發音類似『Y Lie』的聯繫名(cust_contact)

日期和時間處理函數

select custid, ordernum from orders WHERE order_date = 2005-09-01;

如果要的是日期,就使用Date()

select custid, ordernum from orders WHERE Date(order_date) = 2005-09-01;

檢索2005年9月份下的所有訂單

1.

select custid, ordernum from orders WHERE Date(order_date) BETWEEN 2005-09-01 AND 2005-09-30;

  1. > select custid, ordernum from orders WHERE Year(orderdate) = 2005 AND Month(orderdate) = 9;

匯總數據

AVG()函數

- AVG()函數:返回某列的平均值

- AVG()函數忽略列值為NULL的行

- AVG()函數只能確定特定數值列的平均值

使用AVG函數f返回products表中所有產品的平均價格

select AVG(prodprice) AS avgprice from products;

返回特定供應商所提供產品的平均價格

  • 使用where來過濾出vend_id = 1003的產品
  • AS 給prodprice取別名

    > select AVG(prod
    price) AS avgprice from products WHERE vendid = 1003;

COUNT()函數

- COUNT(*)對表中數目進行計數,不管表列中包含的是空值還是非空值

- COUNT(column)對特定列中具有值的行進行計數,忽略NULL值

統計customers表中所有的行,不管各列有什麼值

select COUNT(*) AS num_cust from customers;

只對具有電子郵箱地址的客戶計數

select COUNT(custemail) AS numcust from customers;

MAX函數

- 返回指定列中的最大值

- 要求指定列名

檢索products表中最貴物品的價格

select MAX(prodprice) AS maxprice from products;

MIN函數

  • 返回指定列的最小值

檢索products表中最便宜i物品的價格

select MIN(prodprice) AS minprice from products;

SUM函數

  • 返回指定列值的和

檢索所訂購物品的總數

  • SUM(quantity):返回訂單中所有物品數量之和
  • WHERE子句保證只統計某個物品訂單中的物品

select SUM(quantity) AS itemsordered from orderitems WHERE ordernum = 20005;

檢索20005訂單中所有物品價格之和

- SUM(item_price*quantity)

select SUM(itemprice*quantity) AS totalprice from orderitems WHERE order_num = 20005;

DISTINCT

使用distinct後,平均值值考慮各個不同的價格

select AVG(DISTINCT prodprice) AS avgprice from products WHERE vend_id = 1003;

組合聚集函數

返回4個值

- 物品的所有數目

- 最低價格

- 最高價格

- 平均價格

select COUNT(*) AS numitems,

-> MIN(prodprice) AS pricemin,

-> MAX(prod
price) AS pricemax,

-> AVG(prod
price) AS price_avg from products;

分組數據

  • GROUP BY 子句
  • HAVING 子句

創建分組

- vendid;包含供應商的ID

- AS 使用別名

- GROUP BY vend-id 對vend
id進行分組

select vendid, COUNT(*) AS numprods from products GROUP BY vend_id;

ROLLUP

  • 可以得到每個分組以及每個分組匯總級別(針對每個分組)的值
  • null 值 也算了進去

    > select vendid, COUNT(*) AS numprods from products GROUP BY vend_id WITH ROLLUP;

過濾分組

  • having :過濾分組
  • where :過濾行

過濾那些COUNT()2的那些分組

select custid, COUNT(*) AS orders from orders GROUP BY custid HAVING COUNT(*) >=2;

同時使用WHERE和HAVING子句

- 價格大於等於10

- vend_id分組

- 過濾COUNT(*)>=2分組

select vendid, COUNT(*) AS numprods from products WHERE prodprice >= 10 GROUP BY vendid HAVING COUNT(*) >= 2;

分組和排序

檢索訂總計訂單價格大於等於50的訂單的訂單號和總計訂單的價格

SELECT ordernum, SUM(quantity*itemprice) AS ordertotal FROM orderitems GROUP BY ordernum HAVING SUM(quantity*itemprice) >= 50;

按總計訂單價格排序輸出,需要添加ORDER BY子句

SELECT ordernum, SUM(quantity*itemprice) AS ordertotal FROM orderitems GROUP BY ordernum HAVING SUM(quantity*itemprice) >= 50 ORDER BY ordertotal;

使用子查詢

需要列出訂購物品TNT2的所有客戶,應該怎樣檢索?

1. 檢索包含物品TNT的所有訂單的編號

2. 檢索具有前一步聚列出的訂單編號的所有客戶的ID

3. 檢索前一步聚返回的所有客戶ID的客戶信息

對於prodid 為TNT2的所有訂單物品,從orderitems表中檢索其ordernum列

SELECT ordernum FROM orderitems WHERE prodid = TNT2;

查詢具有訂單20005和20007的客戶ID

  • IN 範圍設定

SELECT custid FROM orders WHERE ordernum IN (20005, 20007);

把第一步的查詢變為子查詢,組合兩個查詢

mysql實際執行了兩個操作

- 執行查詢:SELECT ordernum FROM orderitems WHERE prodid = TNT2; 返回20005和20007兩個訂單號

- IN操作,外部查詢變成;SELECT custid FROM orders WHERE ordernum IN (20005, 20007);

SELECT custid FROM orders WHERE ordernum IN (SELECT ordernum FROM orderitems WHERE prodid = TNT2);

檢索客戶ID信息

SELECT custname, custcontact FROM customers WHERE cust_id IN (10001, 10004);

轉換為子查詢

SELECT custname, custcontact FROM customers WHERE custid IN (SELECT custid FROM orders WHERE ordernum IN (SELECT ordernum FROM orderitems WHERE prod_id = TNT2));

作為計算欄位使用子查詢

對每個客戶執行COUNT()計算,應該將COUNT()作為一個子查詢

SELECT custname, custstate, (SELECT COUNT(*) FROM orders WHERE orders.custid = customers.custid) AS orders FROM customers ORDER BY cust_name;

聯結表

  • 這裡有兩張表, vendors和products,這就是聯結的兩個表的名字
  • 用WHERE子句正確聯結,過濾條件
  • WHERE子句指示MYSQL匹配vendors表中的vendid和products表中的vendid

SELECT vendname, prodname, prodprice

-> FROM vendors, products

-> WHERE vendors.vend
id = products.vendid

-> ORDER BY vend
name, prod_name;

笛卡兒積

- 由沒有聯結條件的表關係返回的結果為笛卡兒積

- 檢索出的行的數目將是第一個表中的行數乘以第二個表中的行數

內部聯結

- from子句的的組成由INNER JOIN指定

- 聯結條件使用ON,而不是WHERE

SELECT vendname, prodname, prodprice

-> FROM vendors INNER JOIN products

-> ON vendors.vend
id = products.vend_id;

聯結多個表

顯示編號為20005訂單中的物品

SELECT prodname, vendname, prodprice, quantity

-> FROM orderitems, products, vendors

-> WHERE products.vend
id = vendors.vendid

-> AND orderitems.prod
id = products.prodid

-> AND order
num = 20005;

創建高級聯結

使用表別名

- concat :拼接欄位

- RTrim :刪除右側多餘空格

- AS使用別名

SELECT Concat(RTrim(vendname), (, RTrim(vendcountry), )) AS

-> vendtitle

-> FROM vendors

-> ORDER BY vend
name;

使用不同類型的聯結

- 自聯結

- 自然聯結

- 外部聯結

自聯結

- 兩張相同的表products

- 使用別名p1,p2

- 聯結表

- 按p2過濾數據

SELECT p1.prodid, p1.prodname

-> FROM products AS p1, products AS p2

-> WHERE p1.vendid = p2.vendid

-> AND p2.prod_id = DTNTR;

自然聯結

SELECT c.*, o.ordernum, o.orderdate, oi.prodid, oi.quantity, oi.itemprice

-> FROM customers AS c, orders AS o, orderitems AS oi

-> WHERE c.custid = o.custid

-> AND oi.ordernum = o.ordernum

-> AND prod_id = FB;

外部聯結

聯結包含了那些在相關表中沒有關聯行的行

- OUTER JOIN: 指定聯結類型

- 必須使用RIGHT或者LEFT關鍵字指定包括其所有行的表

- RIGHT :OUTER JOIN右邊的表

- LEFT:OUTER JOIN左邊的表

- 從from子句的左邊表(customers)中選擇所有行

SELECT customers.custid, orders.ordernum

-> FROM customers LEFT OUTER JOIN orders

-> ON customers.custid = orders.custid;

使用帶聚集函數的聯結

檢索所有客戶及每個客戶所下的訂單數,使用COUNT()函數

  • INNER JOIN將customers和orders兩張表關聯起來
  • GROUP BY 按客戶分組數據
  • COUNT(orders.order_num)對每個客戶的訂單技術

SELECT customers.custname, customers.custid,

-> COUNT(orders.ordernum) AS numord

-> FROM customers INNER JOIN orders

-> ON customers.custid = orders.custid

-> GROUP BY customers.cust_id;

組合查詢

創建組合查詢

需要價格小於等於5的所有物品的一個列表,而且包括供應商1002和1001生產的所有物品

  • union 操作符

SELECT vendid, prodid, prodprice FROM products WHERE prodprice <= 5

-> UNION

-> SELECT vendid, prodid, prodprice FROM products WHERE vendid IN (1001, 1002);

包含或取消重複的行

使用union all不取消重複行

SELECT vendid, prodid, prodprice

-> FROM products

-> WHERE prod
price <= 5

-> UNION ALL

-> SELECT vendid, prodid, prodprice

-> FROM products

-> WHERE vend
id IN (1001, 1002);

對組合查詢結果排序

  • ORDER BY 不允許使用多條子句
  • 組合查詢中,雖然ORDER BY放在最後一條語句中,但實際上它可以排序所有SELECT語句

SELECT vendid, prodid, prodprice

-> FROM products

-> WHERE prod
price <= 5

-> UNION

-> SELECT vendid, prodid, prodprice

-> FROM products

-> WHERE vend
id IN (1001, 1002)

-> ORDER BY vendid, prodprice;

全文本搜索

Match()指定被搜索的列

Against()指定要使用的搜索表達式

  • Match(notetext): 對notetext列進行搜索
  • Against(rabbit): 指定詞rabbit作為搜索文本

SELECT notetext

-> FROM productnotes

-> WHERE Match(note
text) Against(rabbit);

實用查詢擴展

- with query expansion

SELECT notetext

-> FROM productnotes

-> WHERE Match(note
text) Against(anvils WITH QUERY EXPANSION);

布爾文本搜索

  • IN BOOLEAN MODE

SELECT notetext FROM productnotes WHERE Match(notetext) Against(heavy IN BOOLEAN MODE);

匹配包含heavy但不包含以rope開始的行

  • -排除一個詞
  • *截斷操作符

SELECT notetext FROM productnotes WHERE Match(notetext) Against(heavy -rope* IN BOOLEAN MODE);

插入數據

插入完整的行

- 存儲到每個列表中的值在VALUES

INSERT INTO customers

-> VALUES(

-> NULL,

-> Pep E. LaPew,

-> 100 Main Street,

-> Los Angeles,

-> CA,

-> 90046,

-> USA,

-> NULL,

-> NULL);

Query OK, 1 row affected (0.01 sec)

編寫更加安全的INSERT語句

  • 插入行時,用VALUES列表中的相應值填入列表中的對應項

    > INSERT INTO customers(custname,

    -> cust
    address,

    -> custcity,

    -> cust
    state.

    -> custzip,

    -> cust
    country,

    -> custcontact,

    -> cust
    email)

    -> VALUES(Pep E. La Pew,

    -> 100 Main Street,

    -> Los Angeles,

    -> CA,

    -> 90046,

    -> USA,

    -> NULL,

    -> NULL);

插入多個行

- 列名相同的情況下

INSERT INTO CUSTOMERS(custname,

-> custaddress,

-> custcity,

-> cust
state,

-> custzip,

-> cust
country)

-> VALUES(

-> treehl,

-> baoshan,

-> shanghai,

-> sh,

-> 0000,

-> cn

-> ),

-> (

-> yang,

-> baoshan,

-> shanghai,

-> sh,

-> 1111,

-> cn

-> );

插入檢索出的數據

INSERT SELECT

INSERT INTO customers (custid,

..............

)

SELECT cust
id,

...............

FROM ...;

更新和刪除數據

更新數據

UODATE

- 更新表中所有行

- 更新表中特定行

更新表customers

set命令用來將新值賦給被更新的列,set子句設置cust_email為指定的列

WHERE子句:告訴MySQL更新哪一行

UPDATE customers

-> SET custemail = elmer@fudd.com

-> WHERE cust
id = 10005;

使用NULL來刪除某個列的值

UPDATE customers SET custemail = NULL WHERE custid = 10005;

刪除數據

DELETE

- 從表中刪除特定的行

- 從表中刪除所有行

- 不需要列名或通配符

- 刪除整行而不是刪除列

DELETE FROM - 指定從哪個表刪除

WHERE- 子句過濾要刪除的行

從customers表中只刪除id為10006的

DELETE FROM customers WHERE cust_id = 10006;

創建和操作表

表創建基礎

NOT NULL - 阻止插入沒有值的列

CREATE TABLE customers

-> (

-> custid int NOT NULL AUTOINCREMENT,

-> custname char(50)NOT NULL,

-> cust
address char(50)NOT NULL,

-> custcity char(50)NULL,

-> cust
state char(5) NULL,

-> custzip char(10)NULL,

-> cust
country char(50)NULL,

-> custcontact char(50)NULL,

-> cust
email char(255)NULL,

-> PRIMARY KEY (cust_id)

-> )ENGINE=InnoDB

使用NULL值

主鍵

定義主鍵例子

PRIMARY KEY(vend_id)

由多個列組成的主鍵

CREATE TABLE orderitems

-> (

-> ordernum int NOT NULL,

-> order
item int NOT NULL,

-> prodid char(10) NOT NULL,

-> quantity int NOT NULL,

-> item
price decimal(8, 2) NOT NULL,

-> PRIMARY KEY (ordernum, orderitem)

-> )ENGINE=InnoDB;

AUTOINCREMENT

autoincrement- 自動增量

- auto_increment告訴MySQL,本列每當增加一行時自動增量,執行一個INSERT操作,自動對該列增量

- 每個表只允許一個AUTO_INCREMENT

custid int NOT NULL AUTOINCREMENT

指定默認值

- default ;表示在沒有給出數據時,默認就是1

CREATE TABLE orderitems

-> (

-> ordernum int NOT NULL,

-> order
item int NOT NULL,

-> prodid char(10) NOT NULL,

-> quantity int NOT NULL DEFAULT 1,

-> item
price decimal(8, 2) NOT NULL,

-> PRIMARY KEY (ordernum, orderitem)

-> )ENGINE=InnoDB;

引擎類型

- InnoDB 一個可靠的事務處理引擎,它不支持全文本搜索

- MyISAM 一個性能極高的引擎,它支持全文本搜索,但不支持事務處理

- MEMORY 功能等同於MyISAM,但由於數據存儲在內存中,速度很快(適合臨時表)

ENGINE=InnoDB

更新表

  • ALTER TABLE + 表名

給vendors表增加vend_phone列,必須明確其數據char(20)

ALTER TABLE vendors ADD vend_phone CHAR(20);

刪除剛剛添加的列

  • DROP COLUMN

ALTER TABLE vendors DROP COLUMN vend_phone;

刪除表

假設有這個表

DROP TABLE customers2;

重命名表

RENAME TABLE customers2 TO customers;

重命名多個表

RENAME TABLE backupcustomers TO customers,

-> backupvendors TO vendors,

-> backup_products TO products;

使用視圖

  • 用CREATE VIEW來創建
  • 使用SHOW CREATE VIEW viewname 來查看創建視圖的語句
  • 用DROP刪除視圖

使用視圖簡化複雜的聯結

創建了一個名為productcustomers的視圖,它聯結三個表

CREATE VIEW productcustomers AS

-> SELECT custname, custcontact, prodid

-> FROM customers, orders, orderitems

-> WHERE customers.cust
id = orders.custid

-> AND orderitems.order
num = orders.order_num;

檢索訂購了產品TNT2的客戶

- 它將指定的WHERE子句添加到試圖查詢中的已有的WHERE子句中,以便正確過濾數據

SELECT custname, custcontact FROM productcustomers WHERE prod_id = TNT2;

用視圖重新格式化檢索出的數據

創建視圖

CREATE VIEW vendorlocations AS

-> SELECT Concat(RTrim(vendname), (, RTrim(vendcountry), )) AS vendtitle

-> FROM vendors

-> ORDER BY vend
name;

檢索出以創建所有郵件標籤的數據

SELECT * FROM vendorlocations;

用視圖過濾不想要的數據

定義customeremaillist視圖,過濾沒有郵箱的客戶

CREATE VIEW customeremaillist AS

-> SELECT custid, custname, custemail

-> FROM customers

-> WHERE cust
email IS NOT NULL;

檢索由郵箱的客戶

SELECT * FROM customeremaillist;

使用試圖與計算欄位

檢索某個特定訂單中的物品,計算每種物品的總價格

CREATE VIEW orderitemsexpanded AS

-> SELECT ordernum, prodid, quantity, itemprice, quantity*itemprice AS expanded_orice

-> FROM orderitems;

檢索訂單20005的詳細內容

SELECT * FROM orderitemsexpanded WHERE order_num = 20005;

使用存儲過程

執行存儲過程

執行名為productpricing的存儲過程,它計算並返回產品的最低、最高和平均價格

CALL productpricing(@pricelow,

@pricehigh,

@priceaverage);

創建存儲過程

  • 存儲過程名為productpricing()
  • BEGIN END用來限定過程存儲體
  • 這裡SELECT語句結束後用分號有可能會報錯
  • DELIMITER // 分隔符

DELIMITER //

mysql> CREATE PROCEDURE productpricing()

-> BEGIN

-> SELECT Avg(prod_price) AS priceaverage

-> FROM products;

-> END //

Query OK, 0 rows affected (0.00 sec)

使用存儲過程

- 使用分隔符(DELIMITER // 後需要再輸入 DELIMITER ;)

CALL productpricing();

刪除存儲過程

DROP PROCEDURE productpricing;

使用參數

  • decimal 十進位
  • pl 存儲最低價
  • ph 存儲最高價
  • pa 存儲產品平均價
  • OUT 指出相應的參數用來從存儲過程傳出一個值
  • 存儲過程的代碼位於BEGIN和END之間
  • 指定INTO保存到相應的變數

DELIMITER //

mysql> CREATE PROCEDURE productpricing(

-> OUT pl DECIMAL(8,2),

-> OUT ph DECIMAL(8,2),

-> OUT pa DECIMAL(8,2)

-> )

-> BEGIN

-> SELECT Min(prodprice)

-> INTO pl

-> FROM products;

-> SELECT Max(prod
price)

-> INTO ph

-> FROM products;

-> SELECT Avg(prod_price)

-> INTO pa

-> FROM products;

-> END //

為調用此修改過的存儲過程,必須指定三個變數名

  • 所有MySQL變數名都必須以@開始

CALL productpricing(@pricelow,

-> @pricehigh,

-> @priceaverage);

檢索出產品的平均價格

SELECT @priceaverage;

檢索平均價格,最高價格,最低價格

SELECT @pricehigh, @pricelow, @priceaverage;

IN 和OUT參數

- onumber定義為IN

- ototal定義為OUT

- where子句使用onumber選擇正確的行

- INTO使用ototal存儲計算出來的合計

ordertotal接受訂單並返回該訂單的合計

  • onumber定義為IN
  • ototal定義為OUT
  • where子句使用onumber選擇正確的行
  • INTO使用ototal存儲計算出來的合計

CREATE PROCEDURE ordertotal(

-> IN onumber INT,

-> OUT ototal DECIMAL(8,2)

-> )

-> BEGIN

-> SELECT Sum(itemprice*quantity)

-> FROM orderitems

-> WHERE order
num = onumber

-> INTO ototal;

-> END //

調用新存儲過程

- 第一個參數為訂單號

- 第二個參數為包含計算出來的合計的變數名

CALL ordertotal(20005, @total);

顯示合計

SELECT @total;

建立智能存儲過程

檢查存儲過程

  • 獲得何時、由誰創建等詳細信息的存儲過程列表

SHOW CREATE PROCEDURE ordertotal;

使用游標

游標(cursor):是一個存儲在MySQL伺服器上的資料庫查詢

創建游標

定義了ordernumbers的游標

  • DECLARE語句定義和命名游標ordernumbers
  • 存儲過程處理完成後,游標就消失(因為它僅限於存儲過程)

CREATE PROCEDURE processorders()

-> BEGIN

-> DECLARE ordernumbers CURSOR

-> FOR

-> SELECT order_num FROM orders;

-> END //

打開或關閉游標

OPEN ordernumbers;

CLOSE ordernumbers;

使用游標數據

  • FETCH語句分別訪問它的每一行

從游標中檢索單個行

CREATE PROCEDURE

使用觸發器

創建觸發器

CREATE TRIGGER - 建立觸發

CREATE TRIGGER newproduct AFTER INSERT ON products

-> FOR EACH ROW SELECT Product added;

刪除觸發器

DROP TRIGGER newproduct;

管理事務處理

  • InnoDB引擎支持事務處理管理
    • transaction 事務處理 指一種SQL語句
    • rollback 回退 指撤銷指定SQL語句的過程
    • commit 提交 指將未存儲的SQL語句結果寫入資料庫表
    • savepoint 保留點 指事務處理中設置的臨時佔位符
    • START TRANSACTION 標識事務的開始

使用ROLLBACK

SELECT * FROM ordertotals;

START TRANSACTION;

DELETE FROM ordertotals;

SELECT * FROM ordertotals;

ROLLBACK;

SELECT * FROM ordertotals;

  1. 執行一條select語句顯示該表不為空
  2. 開始食物處理
  3. 刪除表中所有的行
  4. select 驗證表確實為空
  5. 回退到START TRANSACTION之後的所有語句
  6. 最後一條select顯示該表不為空

使用COMMIT

使用保留點

SAVEPOINT delete1;

更改默認的提交行為

- autocommit 標誌決定是否自動提交更改

SET autocommit=0;

全球化和本地化

使用字符集和校對順序

SHOW CHARACTER SET;

查看所支持校對的完整列表

SHOW COLLATION

給表指定字符集和校對

  • 創建一個包含兩個列的表
  • 指定一個字符集
  • 制定一個校對順序

CREATE TABLE mytable

-> (

-> column1 INT,

-> column2 VARCHAR(10)

-> ) DEFAULT CHARACTER SET hebrew

-> COLLATE hebrewgeneralci;

安全管理

獲得所有用戶賬號的列表

USE mysql

SELECT user FROM user;

創建用戶賬號

  • identified 確定

CREATE USER treehl IDENTIFIED BY 密碼;

重新命名一個帳戶

RENAME USER treehl TO treehl1;

刪除用戶賬號

DROP USER treehl1;

設置訪問許可權

查詢用戶許可權

SHOW GRANTS FOR treehl;

USAGE表示沒有許可權

用GRANT設置許可權

GRANT SELECT ON MySQL_test.* TO treehl;

顯示更改後的許可權

show grants for treehl;

撤銷許可權

REVOKE SELECT ON MySQL_test.* FROM treehl;

GRANT和REVOKE可在幾個層次上控制訪問許可權

  1. 整個伺服器,GRANT ALL REVOKE ALL
  2. 整個資料庫 使用ON databases.*
  3. 特定的表 使用ON database.table

更改口令

SET PASSWORD FOR treehl = Password(密碼);

資料庫維護

刷新數據

FLUSH TABLES;

進行資料庫維護

analyze table - 分析表

ANALYZE TABLE orders;

check table - 檢查表

CHECK TABLE ORDERS, ORDERITEMS;

爭端啟動問題

mysqld

改善性能

查看所有活動進程

SHOW PROCESSLIST;

查看當前設置

SHOW VARIABLES;

SHOW STATUS;

GitHub

歡迎訪問博客Treehl的博客


推薦閱讀:

高性能mysql優化一之配置篇
MySQL時間序列存儲引擎的設計與實現
利用主鍵快速聚合單表數千萬MySQL的非索引欄位
InnoDB存儲引擎MVCC實現原理
每次登錄mysql都報:無能通過 &#x27;/var/lib/mysql/mysql.sock&#x27; 登錄

TAG:MySQL | MySQL入門 |