MySQL學(xué)習(xí)小結(jié)

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

使用Mysql

創(chuàng)建數(shù)據(jù)庫

create database mysql_test;

展示所有數(shù)據(jù)庫

show databases;

選擇要使用的數(shù)據(jù)庫

use Typeidea_db

獲得表tables

show tables;

顯示服務(wù)器狀信息

show status;

更多show命令查詢

help show

檢索數(shù)據(jù)

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

SELECT prod_name FROM products;

檢索多個多個列

select prod_name, prod_id, prod_price from products;

檢索所有列

select * from products;

檢索不同的行

  • DISTINCT關(guān)鍵字 “不同”
  • 告訴MySQL只返回不同的vend_id行

selcet DISTINCT vend_id from products;

檢索限制結(jié)果

  • limit
  • limit 5,5:第一個5開始位置,第二個5要檢索的行數(shù);
  • limit 4 OFFSET 3 :從行3開始取4行
  • 返回不多于5行

select prod_name from products LIMIT 5;

select prod_name from products LIMIT 5,5;

排序檢索數(shù)據(jù)

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

select prod_name from products ORDER BY prod_name;

按多個列排序

select prod_name, prod_id, prod_price from products ORDER BY prod_price, prod_name;

image

指定排序方向

  • DESC 降序排序
  • Z-A
  • 對產(chǎn)品價格進行排序

select prod_id, prod_price, prod_name from products ORDER BY prod_price DESC;

  • 降序排序產(chǎn)品價格,再對產(chǎn)品名字排序

select prod_id, prod_price, prod_name from products ORDER BY prod_price DESC, prod_name;

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

  • 去掉DESC就是最低值
  • limit 1 :僅返回一行
  • 使用order by 和limit子句時,limit子句必須在order by 子句之后

select prod_price from products ORDER BY prod_price DESC LIMIT 1;

過濾數(shù)據(jù)

where子句

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

select prod_name, prod_price from products WHERE prod_price = 2.50;

檢查單個值

where字句操作符

  • =
  • <
  • !=
  • <=
  • =

  • BETWEEN :在指定的兩個值之間

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

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

select prod_name, prod_price from products WHERE prod_name = 'fuses';

列出小于等于10美金的所有產(chǎn)品

select prod_price, prod_name from products WHERE prod_price <= 10;

不匹配檢查

列出不是由供應(yīng)商1003制造的所有產(chǎn)品

select vend_id, prod_name from products WHERE vend_id != 1003;

范圍值檢查

查詢價格在5美金至10美金之間的所有產(chǎn)品

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

select prod_name, prod_price from products WHERE prod_price BETWEEN 5 AND 10;

空值檢查
NULL:空值

select prod_name from products WHERE prod_price IS NULL;

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

select cust_id from customers WHERE cust_email IS NULL;

組合WHERE子句
AND操作符
檢索供應(yīng)商1003制造且價格小于等于10美金的所有產(chǎn)品的價格名稱、價格、ID

select prod_id, prod_price, prod_name from products WHERE vend_id = 1003 AND prod_price <=10;

OR操作符

  • 指示MySQL檢索匹配任一條件的行
  • 檢索任一個指定供應(yīng)商制造的所有產(chǎn)品的名稱和價格

select prod_name, prod_price from products WHERE vend_id = 1002 OR vend_id = 1003;

計算次序
例子:
檢索出10美金以上且由1002或者1003制造的所有產(chǎn)品

select prod_name, prod_price from products WHERE vend_id = 1003 OR vend_id = 1002 AND prod_price >= 10;

image
  • sql語句理解為:檢索1003供應(yīng)商制造的所有產(chǎn)品或者1002供應(yīng)商制造的大于10美金的所有產(chǎn)品
  • and 在計算次序中優(yōu)先級更高
  • 這里應(yīng)該使用圓括號

select prod_name, prod_price from products WHERE(vend_id = 1002 or vend_id = 1003) AND prod_price >= 10;

IN 操作符
IN - 用來指定范圍

檢索由1002或1003供應(yīng)商提供的所有產(chǎn)品的名稱和價格,名稱以升序排序

select prod_name, prod_price from products WHERE vend_id IN (1002, 1003) ORDER BY prod_name;

NOT操作符

  • 用來否定它之后的所跟的任何條件
  • 匹配除開1002和1003外所有的供應(yīng)商的產(chǎn)品名字和價格,排序以名稱升序排序

select prod_name, prod_price from products WHERE vend_id NOT IN (1002, 1003) ORDER BY prod_name;

用通配符進行過濾

  • LIKE操作符: 匹配未知值
  • %通配符:表示任何字符出現(xiàn)任意次數(shù)
  • 通配符無法匹配以null值作為產(chǎn)品名的行

查找以'jet'開頭的產(chǎn)品

select prod_id, prod_name from products WHERE prod_name LIKE 'jet%';

搜索模式‘%anvil%’表示匹配任何位置包含文本anvil的值,無論它之前或之后出現(xiàn)什么字符

找到以s起頭e結(jié)尾的所有產(chǎn)品

select prod_name from products WHERE prod_name LIKE 's%e';

下劃線(_)通配符

  • 至匹配單個字符
  • 下劃線后有個空格
  • .5 ton anvil沒有被匹配,因為搜索模式要求匹配兩個匹配符而不是一個”.一個“ ”5一個“

select prod_id, prod_name from products WHERE prod_name LIKE '_ ton anvil';

image

用正則表達(dá)式進行搜索

  • REGEXP
  • LIKE :如果匹配值在列中被找到將不會返回數(shù)據(jù),like匹配未知值

檢索prod_name文本1000的所有行

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

匹配所有.000

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

OR匹配

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

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

匹配幾個字符之一

[123] Ton

  • [123]定義一組字符,匹配1或2或3

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

或者這樣寫

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

匹配范圍

  • 用 - 來匹配
  • [1-5]
  • [a-z]

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

匹配特殊字符

  • 必須使用’\‘ \- \. 轉(zhuǎn)義

select vend_name from vendors WHERE vend_name REGEXP '\.' ORDER BY vend_name;

匹配多個實例

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

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

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

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

定位符

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

創(chuàng)建計算字段

拼接字段

  • concate()函數(shù)來實現(xiàn)拼接

名字和地址拼接起來

select Concat(vend_name, '(', vend_country, ')') from vendors ORDER BY vend_name;

image
  • 刪除右側(cè)多余空格
  • Concat()
  • RTrim()函數(shù)

select Concat(RTrim(vend_name), '(', RTrim(vend_country), ')') from vendors ORDER BY vend_name;

使用別名

  • alias 別名 AS

select Concat(RTrim(vend_name), '(', RTrim(vend_country), ')') AS vend_title from vendors ORDER BY vend_name;

執(zhí)行算術(shù)計算

select prod_id, quantity, item_price from orderitems WHERE order_num = 2005;

使用數(shù)據(jù)處理函數(shù)

文本處理函數(shù)

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

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

select cust_name, cust_contact from customers WHERE Soundex(cust_contact) = Soundex('Y Lie');

  • Soundex 檢索所有發(fā)音類似‘Y Lie’的聯(lián)系名(cust_contact)

日期和時間處理函數(shù)

select cust_id, order_num from orders WHERE order_date = '2005-09-01';

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

select cust_id, order_num from orders WHERE Date(order_date) = '2005-09-01';

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

select cust_id, order_num from orders WHERE Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30';

select cust_id, order_num from orders WHERE Year(order_date) = 2005 AND Month(order_date) = 9;

匯總數(shù)據(jù)

AVG()函數(shù)

  • AVG()函數(shù):返回某列的平均值
  • AVG()函數(shù)忽略列值為NULL的行
  • AVG()函數(shù)只能確定特定數(shù)值列的平均值

使用AVG函數(shù)f返回products表中所有產(chǎn)品的平均價格

select AVG(prod_price) AS avg_price from products;

返回特定供應(yīng)商所提供產(chǎn)品的平均價格

  • 使用where來過濾出vend_id = 1003的產(chǎn)品
  • AS 給prod_price取別名

select AVG(prod_price) AS avg_price from products WHERE vend_id = 1003;

COUNT()函數(shù)

  • COUNT(*)對表中數(shù)目進行計數(shù),不管表列中包含的是空值還是非空值
  • COUNT(column)對特定列中具有值的行進行計數(shù),忽略NULL值

統(tǒng)計customers表中所有的行,不管各列有什么值

select COUNT(*) AS num_cust from customers;

只對具有電子郵箱地址的客戶計數(shù)

select COUNT(cust_email) AS num_cust from customers;

MAX函數(shù)

  • 返回指定列中的最大值
  • 要求指定列名

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

select MAX(prod_price) AS max_price from products;

MIN函數(shù)

  • 返回指定列的最小值

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

select MIN(prod_price) AS min_price from products;

SUM函數(shù)

  • 返回指定列值的和

檢索所訂購物品的總數(shù)

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

select SUM(quantity) AS items_ordered from orderitems WHERE order_num = 20005;

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

  • SUM(item_price*quantity)

select SUM(item_price*quantity) AS total_price from orderitems WHERE order_num = 20005;

DISTINCT

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

select AVG(DISTINCT prod_price) AS avg_price from products WHERE vend_id = 1003;

組合聚集函數(shù)
返回4個值

  • 物品的所有數(shù)目
  • 最低價格
  • 最高價格
  • 平均價格

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;

分組數(shù)據(jù)

  • GROUP BY 子句
  • HAVING 子句

創(chuàng)建分組

  • vend_id;包含供應(yīng)商的ID
  • AS 使用別名
  • GROUP BY vend-id 對vend_id進行分組

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

image

ROLLUP

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

select vend_id, COUNT(*) AS num_prods from products GROUP BY vend_id WITH ROLLUP;

image

過濾分組

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

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

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

同時使用WHERE和HAVING子句

  • 價格大于等于10
  • vend_id分組
  • 過濾COUNT(*)>=2分組

select vend_id, COUNT() AS num_prods from products WHERE prod_price >= 10 GROUP BY vend_id HAVING COUNT() >= 2;

分組和排序

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

SELECT order_num, SUM(quantityitem_price) AS ordertotal FROM orderitems GROUP BY order_num HAVING SUM(quantityitem_price) >= 50;

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

SELECT order_num, SUM(quantityitem_price) AS ordertotal FROM orderitems GROUP BY order_num HAVING SUM(quantityitem_price) >= 50 ORDER BY ordertotal;

image

使用子查詢

需要列出訂購物品TNT2的所有客戶,應(yīng)該怎樣檢索?
1. 檢索包含物品TNT的所有訂單的編號
2. 檢索具有前一步聚列出的訂單編號的所有客戶的ID
3. 檢索前一步聚返回的所有客戶ID的客戶信息

對于prod_id 為TNT2的所有訂單物品,從orderitems表中檢索其order_num列

SELECT order_num FROM orderitems WHERE prod_id = 'TNT2';

image

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

  • IN 范圍設(shè)定

SELECT cust_id FROM orders WHERE order_num IN (20005, 20007);

把第一步的查詢變?yōu)?strong>子查詢,組合兩個查詢
mysql實際執(zhí)行了兩個操作

  • 執(zhí)行查詢:SELECT order_num FROM orderitems WHERE prod_id = 'TNT2'; 返回20005和20007兩個訂單號
  • IN操作,外部查詢變成;SELECT cust_id FROM orders WHERE order_num IN (20005, 20007);

SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id = 'TNT2');

檢索客戶ID信息

SELECT cust_name, cust_contact FROM customers WHERE cust_id IN (10001, 10004);

轉(zhuǎn)換為子查詢

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'));

作為計算字段使用子查詢

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

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é)表

  • 這里有兩張表, vendors和products,這就是聯(lián)結(jié)的兩個表的名字
  • 用WHERE子句正確聯(lián)結(jié),過濾條件
  • WHERE子句指示MYSQL匹配vendors表中的vend_id和products表中的vend_id

SELECT vend_name, prod_name, prod_price
-> FROM vendors, products
-> WHERE vendors.vend_id = products.vend_id
-> ORDER BY vend_name, prod_name;

笛卡兒積

  • 由沒有聯(lián)結(jié)條件的表關(guān)系返回的結(jié)果為笛卡兒積
  • 檢索出的行的數(shù)目將是第一個表中的行數(shù)乘以第二個表中的行數(shù)

內(nèi)部聯(lián)結(jié)

  • from子句的的組成由INNER JOIN指定
  • 聯(lián)結(jié)條件使用ON,而不是WHERE

SELECT vend_name, prod_name, prod_price
-> FROM vendors INNER JOIN products
-> ON vendors.vend_id = products.vend_id;

聯(lián)結(jié)多個表

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

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;

創(chuàng)建高級聯(lián)結(jié)

使用表別名

  • concat :拼接字段
  • RTrim :刪除右側(cè)多余空格
  • AS使用別名

SELECT Concat(RTrim(vend_name), '(', RTrim(vend_country), ')') AS
-> vend_title
-> FROM vendors
-> ORDER BY vend_name;

使用不同類型的聯(lián)結(jié)

  • 自聯(lián)結(jié)
  • 自然聯(lián)結(jié)
  • 外部聯(lián)結(jié)

自聯(lián)結(jié)

  • 兩張相同的表products
  • 使用別名p1,p2
  • 聯(lián)結(jié)表
  • 按p2過濾數(shù)據(jù)

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';

自然聯(lián)結(jié)

SELECT c.*, o.order_num, o.order_date, oi.prod_id, oi.quantity, oi.item_price
-> 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 = 'FB';

外部聯(lián)結(jié)

聯(lián)結(jié)包含了那些在相關(guān)表中沒有關(guān)聯(lián)行的行

  • OUTER JOIN: 指定聯(lián)結(jié)類型
  • 必須使用RIGHT或者LEFT關(guān)鍵字指定包括其所有行的表
  • RIGHT :OUTER JOIN右邊的表
  • LEFT:OUTER JOIN左邊的表
  • 從from子句的左邊表(customers)中選擇所有行

SELECT customers.cust_id, orders.order_num
-> FROM customers LEFT OUTER JOIN orders
-> ON customers.cust_id = orders.cust_id;

使用帶聚集函數(shù)的聯(lián)結(jié)

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

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

SELECT customers.cust_name, customers.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;

組合查詢

創(chuàng)建組合查詢

需要價格小于等于5的所有物品的一個列表,而且包括供應(yīng)商1002和1001生產(chǎn)的所有物品

  • union 操作符

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);

包含或取消重復(fù)的行

使用union all不取消重復(fù)行

SELECT vend_id, prod_id, prod_price
-> FROM products
-> WHERE prod_price <= 5
-> UNION ALL
-> SELECT vend_id, prod_id, prod_price
-> FROM products
-> WHERE vend_id IN (1001, 1002);

對組合查詢結(jié)果排序

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

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)
-> ORDER BY vend_id, prod_price;

全文本搜索

Match()指定被搜索的列
Against()指定要使用的搜索表達(dá)式

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

SELECT note_text
-> FROM productnotes
-> WHERE Match(note_text) Against('rabbit');

實用查詢擴展

  • with query expansion

SELECT note_text
-> FROM productnotes
-> WHERE Match(note_text) Against('anvils' WITH QUERY EXPANSION);

布爾文本搜索

  • IN BOOLEAN MODE

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

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

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

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

插入數(shù)據(jù)

插入完整的行

  • 存儲到每個列表中的值在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列表中的相應(yīng)值填入列表中的對應(yīng)項

INSERT INTO customers(cust_name,
-> cust_address,
-> cust_city,
-> cust_state.
-> cust_zip,
-> cust_country,
-> cust_contact,
-> cust_email)
-> VALUES('Pep E. La Pew',
-> '100 Main Street',
-> 'Los Angeles',
-> 'CA',

-> '90046',
-> 'USA',
-> NULL,
-> NULL);

插入多個行

  • 列名相同的情況下

INSERT INTO CUSTOMERS(cust_name,
-> cust_address,
-> cust_city,
-> cust_state,
-> cust_zip,
-> cust_country)
-> VALUES(
-> 'treehl',
-> 'baoshan',
-> 'shanghai',
-> 'sh',
-> '0000',
-> 'cn'
-> ),
-> (
-> 'yang',
-> 'baoshan',
-> 'shanghai',
-> 'sh',
-> '1111',
-> 'cn'
-> );

插入檢索出的數(shù)據(jù)

INSERT SELECT

INSERT INTO customers (cust_id,
..............
)
SELECT cust_id,
...............
FROM ...;

更新和刪除數(shù)據(jù)

更新數(shù)據(jù)

UODATE

  • 更新表中所有行
  • 更新表中特定行

更新表customers
set命令用來將新值賦給被更新的列,set子句設(shè)置cust_email為指定的列
WHERE子句:告訴MySQL更新哪一行

UPDATE customers
-> SET cust_email = 'elmer@fudd.com'
-> WHERE cust_id = 10005;

使用NULL來刪除某個列的值

UPDATE customers SET cust_email = NULL WHERE cust_id = 10005;

刪除數(shù)據(jù)

DELETE

  • 從表中刪除特定的行
  • 從表中刪除所有行
  • 不需要列名或通配符
  • 刪除整行而不是刪除列

DELETE FROM - 指定從哪個表刪除
WHERE- 子句過濾要刪除的行

從customers表中只刪除id為10006的

DELETE FROM customers WHERE cust_id = 10006;

創(chuàng)建和操作表

表創(chuàng)建基礎(chǔ)

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

CREATE TABLE customers
-> (
-> cust_id int NOT NULL AUTO_INCREMENT,
-> cust_name char(50)NOT NULL,
-> cust_address char(50)NOT NULL,
-> cust_city char(50)NULL,
-> cust_state char(5) NULL,
-> cust_zip char(10)NULL,
-> cust_country char(50)NULL,
-> cust_contact char(50)NULL,
-> cust_email char(255)NULL,
-> PRIMARY KEY (cust_id)
-> )ENGINE=InnoDB

使用NULL值

主鍵

定義主鍵例子

PRIMARY KEY(vend_id)

由多個列組成的主鍵

CREATE TABLE orderitems
-> (
-> order_num int NOT NULL,
-> order_item int NOT NULL,
-> prod_id char(10) NOT NULL,
-> quantity int NOT NULL,
-> item_price decimal(8, 2) NOT NULL,
-> PRIMARY KEY (order_num, order_item)
-> )ENGINE=InnoDB;

AUTO_INCREMENT
auto_increment- 自動增量

  • auto_increment告訴MySQL,本列每當(dāng)增加一行時自動增量,執(zhí)行一個INSERT操作,自動對該列增量
  • 每個表只允許一個AUTO_INCREMENT

cust_id int NOT NULL AUTO_INCREMENT

指定默認(rèn)值

  • default ;表示在沒有給出數(shù)據(jù)時,默認(rèn)就是1

CREATE TABLE orderitems
-> (
-> order_num int NOT NULL,
-> order_item int NOT NULL,
-> prod_id char(10) NOT NULL,
-> quantity int NOT NULL DEFAULT 1,
-> item_price decimal(8, 2) NOT NULL,
-> PRIMARY KEY (order_num, order_item)
-> )ENGINE=InnoDB;

引擎類型

  • InnoDB 一個可靠的事務(wù)處理引擎,它不支持全文本搜索
  • MyISAM 一個性能極高的引擎,它支持全文本搜索,但不支持事務(wù)處理
  • MEMORY 功能等同于MyISAM,但由于數(shù)據(jù)存儲在內(nèi)存中,速度很快(適合臨時表)

ENGINE=InnoDB

更新表

  • ALTER TABLE + 表名

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

ALTER TABLE vendors ADD vend_phone CHAR(20);

刪除剛剛添加的列

  • DROP COLUMN

ALTER TABLE vendors DROP COLUMN vend_phone;

刪除表
假設(shè)有這個表

DROP TABLE customers2;

重命名表

RENAME TABLE customers2 TO customers;

重命名多個表

RENAME TABLE backup_customers TO customers,
-> backup_vendors TO vendors,
-> backup_products TO products;

使用視圖

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

使用視圖簡化復(fù)雜的聯(lián)結(jié)

創(chuàng)建了一個名為productcustomers的視圖,它聯(lián)結(jié)三個表

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;

檢索訂購了產(chǎn)品TNT2的客戶

  • 它將指定的WHERE子句添加到試圖查詢中的已有的WHERE子句中,以便正確過濾數(shù)據(jù)

SELECT cust_name, cust_contact FROM productcustomers WHERE prod_id = 'TNT2';

用視圖重新格式化檢索出的數(shù)據(jù)

創(chuàng)建視圖

CREATE VIEW vendorlocations AS
-> SELECT Concat(RTrim(vend_name), '(', RTrim(vend_country), ')') AS vend_title
-> FROM vendors
-> ORDER BY vend_name;

檢索出以創(chuàng)建所有郵件標(biāo)簽的數(shù)據(jù)

SELECT * FROM vendorlocations;

用視圖過濾不想要的數(shù)據(jù)

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

CREATE VIEW customeremaillist AS
-> SELECT cust_id, cust_name, cust_email
-> FROM customers
-> WHERE cust_email IS NOT NULL;

檢索由郵箱的客戶

SELECT * FROM customeremaillist;

使用試圖與計算字段

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

CREATE VIEW orderitemsexpanded AS
-> SELECT order_num, prod_id, quantity, item_price, quantity*item_price AS expanded_orice
-> FROM orderitems;

檢索訂單20005的詳細(xì)內(nèi)容

SELECT * FROM orderitemsexpanded WHERE order_num = 20005;

使用存儲過程

執(zhí)行存儲過程
執(zhí)行名為productpricing的存儲過程,它計算并返回產(chǎn)品的最低、最高和平均價格

CALL productpricing(@pricelow,
@pricehigh,
@priceaverage);

創(chuàng)建存儲過程

  • 存儲過程名為productpricing()
  • BEGIN END用來限定過程存儲體
  • 這里SELECT語句結(jié)束后用分號有可能會報錯
  • 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;

使用參數(shù)

  • decimal 十進制
  • pl 存儲最低價
  • ph 存儲最高價
  • pa 存儲產(chǎn)品平均價
  • OUT 指出相應(yīng)的參數(shù)用來從存儲過程傳出一個值
  • 存儲過程的代碼位于BEGIN和END之間
  • 指定INTO保存到相應(yīng)的變量

DELIMITER //
mysql> CREATE PROCEDURE productpricing(
-> OUT pl DECIMAL(8,2),
-> OUT ph DECIMAL(8,2),
-> OUT pa DECIMAL(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 //

為調(diào)用此修改過的存儲過程,必須指定三個變量名

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

CALL productpricing(@pricelow,
-> @pricehigh,
-> @priceaverage);

檢索出產(chǎn)品的平均價格

SELECT @priceaverage;

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

SELECT @pricehigh, @pricelow, @priceaverage;

IN 和OUT參數(shù)

  • 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(item_price*quantity)
->     FROM orderitems
->     WHERE order_num = onumber
->     INTO ototal;
-> END //

調(diào)用新存儲過程

  • 第一個參數(shù)為訂單號
  • 第二個參數(shù)為包含計算出來的合計的變量名

CALL ordertotal(20005, @total);

顯示合計

SELECT @total;

建立智能存儲過程

檢查存儲過程

  • 獲得何時、由誰創(chuàng)建等詳細(xì)信息的存儲過程列表

SHOW CREATE PROCEDURE ordertotal;

使用游標(biāo)

游標(biāo)(cursor):是一個存儲在MySQL服務(wù)器上的數(shù)據(jù)庫查詢

創(chuàng)建游標(biāo)
定義了ordernumbers的游標(biāo)

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

CREATE PROCEDURE processorders()
-> BEGIN
-> DECLARE ordernumbers CURSOR
-> FOR
-> SELECT order_num FROM orders;
-> END //

打開或關(guān)閉游標(biāo)

OPEN ordernumbers;

CLOSE ordernumbers;

使用游標(biāo)數(shù)據(jù)

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

從游標(biāo)中檢索單個行

CREATE PROCEDURE

使用觸發(fā)器

創(chuàng)建觸發(fā)器

CREATE TRIGGER - 建立觸發(fā)

CREATE TRIGGER newproduct AFTER INSERT ON products
-> FOR EACH ROW SELECT 'Product added';

刪除觸發(fā)器

DROP TRIGGER newproduct;

管理事務(wù)處理

  • InnoDB引擎支持事務(wù)處理管理

  • transaction 事務(wù)處理 指一種SQL語句

  • rollback 回退 指撤銷指定SQL語句的過程

  • commit 提交 指將未存儲的SQL語句結(jié)果寫入數(shù)據(jù)庫表

  • savepoint 保留點 指事務(wù)處理中設(shè)置的臨時占位符

  • START TRANSACTION 標(biāo)識事務(wù)的開始

使用ROLLBACK

SELECT * FROM ordertotals;
START TRANSACTION;
DELETE FROM ordertotals;
SELECT * FROM ordertotals;
ROLLBACK;
SELECT * FROM ordertotals;

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

使用COMMIT

使用保留點

SAVEPOINT delete1;

更改默認(rèn)的提交行為

  • autocommit 標(biāo)志決定是否自動提交更改

SET autocommit=0;

全球化和本地化

使用字符集和校對順序

SHOW CHARACTER SET;

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

SHOW COLLATION

給表指定字符集和校對

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

CREATE TABLE mytable
-> (
-> column1 INT,
-> column2 VARCHAR(10)
-> ) DEFAULT CHARACTER SET hebrew
-> COLLATE hebrew_general_ci;

安全管理

獲得所有用戶賬號的列表

USE mysql

SELECT user FROM user;

創(chuàng)建用戶賬號

  • identified 確定

CREATE USER treehl IDENTIFIED BY '密碼';

重新命名一個帳戶

RENAME USER treehl TO treehl1;

刪除用戶賬號

DROP USER treehl1;

設(shè)置訪問權(quán)限
查詢用戶權(quán)限

SHOW GRANTS FOR treehl;

image

USAGE表示沒有權(quán)限

用GRANT設(shè)置權(quán)限

GRANT SELECT ON MySQL_test.* TO treehl;

顯示更改后的權(quán)限

show grants for treehl;

撤銷權(quán)限

REVOKE SELECT ON MySQL_test.* FROM treehl;

GRANT和REVOKE可在幾個層次上控制訪問權(quán)限

  1. 整個服務(wù)器,GRANT ALL REVOKE ALL
  2. 整個數(shù)據(jù)庫 使用ON databases.*
  3. 特定的表 使用ON database.table

更改口令

SET PASSWORD FOR treehl = Password('密碼');

數(shù)據(jù)庫維護

刷新數(shù)據(jù)

FLUSH TABLES;

進行數(shù)據(jù)庫維護

analyze table - 分析表

ANALYZE TABLE orders;

check table - 檢查表

CHECK TABLE ORDERS, ORDERITEMS;

爭端啟動問題

mysqld

改善性能

查看所有活動進程

SHOW PROCESSLIST;

查看當(dāng)前設(shè)置

SHOW VARIABLES;
SHOW STATUS;

GitHub
歡迎訪問博客Treehl的博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,327評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,996評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,316評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,406評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,128評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,524評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,576評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,759評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,310評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,065評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,249評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,821評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,479評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,909評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,140評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,984評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,228評論 2 375

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

  • (一)幾個數(shù)據(jù)庫相關(guān)的概念 1.數(shù)據(jù)庫 數(shù)據(jù)庫: 保存有組織數(shù)據(jù)的容器。 數(shù)據(jù)的所有存儲、檢索、管理和處理實際上是...
    快樂的小飛熊閱讀 536評論 0 1
  • Mysql 必知必會 查詢 檢索多個列SELECT prod_id, prod_name, prod_pri...
    yoomaz閱讀 662評論 0 1
  • 1.表中的任何列都可以作為主鍵, 只要它滿足以下條件:任意兩行都不具有相同的主鍵值;每一行都必須具有一個主鍵值( ...
    Cherryjs閱讀 683評論 0 0
  • 于是又到了梧桐絮飄滿校園的四月,又到了梧桐色相簿的季節(jié),我們迎來了實習(xí)生招聘。 “范老濕從不寫代碼”,“范老濕從不...
    Lance_Van閱讀 748評論 0 1
  • 1.簡介 mysql是一個快速的、多線程的、多用戶的、支持健壯SQL的數(shù)據(jù)庫管理系統(tǒng)(DBMS)。mysql可以應(yīng)...
    at小宇閱讀 933評論 0 2