說明:以下內容是閱讀書籍<<MySQL必知必會>>的摘要和總結
- 檢索資料
- 排序檢索資料
- 過濾資料
- 使用萬用字元過濾
- 使用正規表示式進行搜尋
- 建立計算欄位
- 使用資料處理函式
- 彙總資料
- 分組資料
- 使用子查詢
- 聯結表
- 建立高階聯結
- 組合查詢
- 全文字搜尋
- 插入資料
- 更新和刪除資料
- 建立和操縱表
- 使用檢視
- 使用儲存過程
- 使用遊標
- 使用觸發器
- 管理事務處理
- 全球化和本地化
- 安全管理
- 資料庫維護
- 改善效能.
模式可以用來描述資料庫中特定的表以及整個資料庫,和其中表的關係
行(row) 表中的一個記錄
必須先使用use命令開啟資料庫,才能讀取其中的資料。
mysql> show columns from user;//DESCRIBE
help show;
> select distinct prod_id prod_name,prod_price from products;//返回不同的行!DISTINCT,限制返回結果。LIMIT
SELECT prod_name,FROM products LIMIT 3,3(start,rows)
help 命令
如果使用DISTINCT關鍵字,它必須直接放在所有列的前面,完全限定符:表名.列名
子句(clause) SQL語句由子句構成,有些子句是必需的,而有的是可選的。
不同行distinct,排序order by XXX DESC
SELECT DISTINCT FOROM prod_name FROM products ORDER BY prod_name LIMIT 2,4;
結構體排序。先,,然後。。指定多列,用逗號隔開,DESC關鍵字只應用到直接位於其前面的列名,多列降序排列,則每個列都需要指定DESC關鍵字。
子句次序 SELECT xx FROM XXX WHERE xxxx ORDER BY xx DESC LIMIT 1
單引號用來限定字串。如果將值與串型別的列進行比較,則需要限定引號。用來與數值列進行比較的值不用引號。範圍運算子between
SELECT prod_name,prod_price FROM prodects WHERE prod_price BETWEEN 4 AND 5;
SELECT prod_id ,prod_prices FROM produts WHERE prod_id=1002 AND prod_price<=10;
SELECT prod_id ,prod_prices FROM produts WHERE prod_id NOT IN(1002,1004)AND prod_price<=10;
SELECT prod_name FROM prodects WHERE prod_name LIKE jar%;
SELECT prod_name FROM prodects WHERE prod_name LIKE j_r%;
//WHERE prod_price is null
MySQL允許給出多個WHERE子句。這些子句可以兩種方式使用:以AND子句的方式或OR子句的方式使用,AND在計算次序中優先順序更高,使用括號改變優先順序,OR的泛化-- -- IN
IN的最大優點是可以包含其他SELECT語句,使得能夠更動態地建立WHERE子句
WHERE子句中的NOT操作符有且只有一個功能,那就是否定它之後所跟的任何條件。
為在搜尋子句中使用萬用字元,必須使用LIKE操作符,%表示任何字元出現任意次數
,下劃線只匹配單個字元
,萬用字元不要放在開始。正規表示式
SELECT prod_name FROM products
WHERE prod_name REGEXP '1000'
ORDER BY prod_name ;//替代了LIKE
LIKE匹配整個列,而REGEXP在列值內進行匹配。使用^(開始)和$(結束)定位符(anchor)即可,為了匹配特殊字元,必須用\ \為前導。
區分萬用字元和正規表示式(匹配範圍、匹配幾個字元之一,或者)
可以使用預定義的字符集,稱為字元類(character class)
儲存在表中的資料都不是應用程式所需要的。需要轉換-- -計算欄位,例如,拼接。沒有列名,需要用AS來指定。計算欄位的另一常見用途是對檢索出的資料進行算術計算.
SELECT Concat(RTrim(vend_name),' (',vend_country,')') AS vend_title
FROM vendors ORDER BY vend_name;
SELECT 2*4 XXX;//算術運算子
使用處理函式,字串,數字,日期,DBMS資訊
日期和時間函式在MySQL語言中具有重要的作用。
DateDiff() 計算兩個日期之差
無論你什麼時候指定一個日期,不管是插入或更新表值還是用WHERE子句進行過濾,日期必須為
格式yyyy-mm-dd。
datatime與date型別比較,擷取相同部分比較Date(xxx)
彙總資料aggregate function
針對物件,列:avg,max(單列、忽略null),min ,sum,count()返回某列的行數
AVG()只用於單個列
COUNT()函式進行計數。可利用COUNT()確定表中行的數目或符合特定條件的行的數目
- COUNT(*):對錶中行的數目進行計數,不管表列中包含的是空值(NULL)還是非空值。
- COUNT(column):對特定列中具有值的行進行計數,忽略NULL值。
SELECT SUM(item*quantity) AS total_price
FROM orderitems
WHERE order_num=23000;
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM products
WHERE vend_id=2003;
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
這些函式是高效設計的
資料分組與過濾,而不是整個表
分組允許把資料分為多個邏輯組,以便能對每個組進行聚集計算。
聚集物件預設是表
SELECT vend_id,COUNT(*) AS num_prods
FROM products
GROUP BY vend_id.//按照商家分組
這導致對每個vend_id,而不是整個表計算num_prods一次
GROUP BY子句中列出的每個列都必須是檢索列或有效的表示式(但不能是聚集函式)。如果在SELECT中使用表示式,則必須在GROUP BY子句中指定相同的表示式。不能使用別名。除聚集計算語句外,SELECT語句中的每個列都必須在GROUP BY子句中給.
where-- >groub by -- >order by desc limit
WHERE過濾指定的是行而不是分組,分組過濾用having
目前為止所學過的所有型別的WHERE子句都可以用HAVING來替代。唯一的差別是WHERE過濾行,而HAVING過濾分組。HAVING支援所有WHERE操作符。語義相同,但針對物件不同。這裡有另一種理解方法,WHERE在資料分組前進行過濾,HAVING在資料分組後進行過濾。
SELECT cust_id,COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*)>2;
//它保留COUNT(*) >=2(兩個以上的訂單)的那些分組
同時使用where和group by
SELECT vend_id,COUNT(*) AS num_prods
FROM products
WHERE prod_price >=10;//對所的行過濾,不管你是哪個組!體會,where是分組前的操作
GROUP BY vend_id
HAVING COUNT(*) >=3;
GROUP BY 和ORDER by的區別
ORDER BY | GROUP BY |
---|---|
排序產生的輸出 | 分組行。但輸出可能不是分組的順序 |
任意列都可以使用(甚至 非選擇的列也可以使用) |
只可能使用選擇列或表示式列,SELECT中出現的,而且必須使用每個選擇列表示式 |
不一定需要 | 如果與聚集函式一起使用列(或表示式),則必須使用, |
千萬不要僅依賴GROUP BY排序資料。SELE
SELECT order_num ,SUM(quantity*item_prices) AS order_total
FROM orderitems
GROUP BY order_num//需要和select中的列相同,除了聚集函式
HAVING SUM(quantity*item_price)>=50
ORDER BY order_total;
select語句只有select子句是必須的,且select後面跟的是表示式
利用子查詢進行過濾,select的結果可用於另一條SELECT語句的WHERE子句。內層的SELECT語句的列和外層的WHERE列相同
SELECT order_num FROM orderitems WHERE prod_id='INIT2';//20002,20004
SELECT cust_id FROM orders WHERE order_num IN(20002,20004)
合併
SELECT cust_id
FROM orders
WHERE order_num IN(SELECT order_num
FROM orderitems
WHERE prod_id='INT2');//執行流程:從內向外。
//查詢ID的資訊。
SELECT cust_name,cust_contact
FROM customers
WHERE cust_id IN(SELECT cust_id//返回客戶ID
FROM orders
WHERE order_num IN(SELECT order_num//返回訂單號列表
FROM orderitems
WHERE prod_id='INT2'));
作為計算欄位使用子查詢,子查詢:過濾或者使用計算欄位
--每個客戶的總訂單數
思路:先求單個客戶的,然後使用子查詢
SELECT COUNT(*) AS orders
FROM orders
WHERE cust_id=10001;
//為了對每個可以執行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;
子查詢構造過程:從內到外,逐漸進行。
測試時外層迴圈用硬編碼,eg:where cust_id=23223;
子查詢最常見的使用是在WHERE子句的IN操作符中,以及用來填充計算列
一類資料一個表。各表通過某些常用的值(即關係設計中的關係(relational))互相關聯。
外來鍵(foreign key) 外來鍵為某個表中的一列,它包含另一個表的主鍵值,定義了兩個表之間的關係。
連線:要連線的所有表和連線方式
SELECT vend_name,prod_name,prod_price
FROM vendors AS v,products AS p--所有表
WHERE v.vend_id=p.vend_id-- 連線方式:equijoin,等值連線,又稱內部聯結
ORDER BY vend_name,prod_name;
完全限定列名消除二義性!!
SELECT vend_name,prod_name,prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id=products.vend_id;
//多個表。列出所有,然後關聯!!
其實,對於這種聯結(等值連線、內部連線)可以使用稍微不同的語法來明確指定聯結的型別。FROM A,B WHERE A.col1=B.col2
可以簡寫為:inner join。聯結是SQL中最重要最強大的特性
使用哪種語法? ANSI SQL規範首選INNER JOIN語法,連線條件。
別名除了用於列名和計算欄位外,SQL還允許給表名起別名。
-
縮短SQL語句;
-
允許在單條SELECT語句中多次使用相同的表。自連線
--物品有問題,該供應商的其他商品是否也有問題
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' --級聯操作和過濾資料。
聯結包含了那些在相關表中沒有關聯行的行。這種型別的聯結稱為外部聯結,需要與left或者right來指明
在使用OUTER JOIN語法時,必須使用RIGHT或LEFT關鍵字指定包括其所有行的表(RIGHT指出的是OUTER JOIN右邊的表,而LEFT指出的是OUTER JOIN左邊的表)
SELECT customers.cust_id,COUNT(orders.order_num) AS num_ord
FROM customers RIGHT OUTER JION orders
ON orders.cust_id=customers.cust_id
應該總是提供聯結條件,否則會得出笛卡兒積。
多條SQL 的組合查詢 UNION
MySQL也允許執行多個查詢(多條SELECT語句),並將結果作為單個查詢結果集返回,union
或者複合查詢(compound query),組合查詢和多個WHERE條件
所需做的只是給出每條SELECT語句,在各條語句之間放上關鍵字UNION。UNION中的每個查詢必須包含相同的列、表示式或聚集函式,因為返回的結果合為一個表
--UNION從查詢結果集中自動去除了重複的行
SELECT vend_id,prod_id,prod_price
FROM products
WHERE prod_price<=5
UNION ALL--保留重複
SELECT vend_id,prod_id,prod_price
FROM proucts
WHERE vend_id IN(1001,1002)
ORDER BY vend_id,prod_price;--能使用一條ORDER BY子句,它必須出現在最後一條SELECT語句之後
----等價於多個where條件
SELECT vend_id ,prod_id,prod_price
FROM products
WHERE prod_price<=5
OR vend_id IN (1001,1002)
UNION幾乎總是完成與多個WHERE條件相同的工作。UNION ALL為UNION的一種形式,它完成WHERE子句完成不了的工作。如果確實需要每個條件的匹配行全部出現(包括重複行),則必須使用UNION ALL而不是WHERE。
在用UNION組合查詢時,只能使用一條ORDER BY子句,它必須出現在最後一條SELECT語句之後
全文索引
CREATE TABLE product_notes(
note_id int NOT NULL AUTO_INCREMENT,
prod_id char(10) NOT NULL,
note_date datetime NOT NULL,
note_text text NULL,
PRIMARY KEY(note_id),
FULLTEXT(note_text)
)ENGINE=MyISAM;
MyISAM支援全文字搜尋(對結果排序,較高優先順序的行先返回,自帶停用詞列表(stopword)),而InnoDB不支援
子句FULLTEXT(列名稱)
的指示對它進行索引,先匯入,後定義索引,在索引之後,使用兩個函式Match()和Against()執行全文字搜尋,其中Match()指定被搜尋的列,Against()指定要使用的搜尋表示式。
SELECT note_text
FROM product_notes
WHERE Math(note_text) Against('rabbit') AS rank;
-- 效果上等價於LIKE ‘%rabbit%’,但效率不同。
SELECT note_text
FROM product_notes
WHERE note_text LIKE '%rabbit%';
插入完整的行 insert into tables values()
INSERT INT Customers(可以指定列名順序)
VALUES(a),VALUES(b);-- 插入多個行
總是使用列的列表。插入時提高整體效能,可以使用INSERT LOW_PRIORITY INTO
插入檢索出的資料 insert select,列的位置。
INSERT INTO customers(cust_id,cust_contact,cust_email,cust_name) SELECT
cust_id,cust_contact,cust_email,cust_name
FROM custnew;
更新資料(update,以where結束)和刪除資料(delete)
UPDATE (IGNORE) customers-- 表名
SET cust_email='xxx@ffdd.com',cust_name='ddd'
WHERE cust_id=10004;
不要省略WHERE子句(對update和delete都有效),UPDATE語句總是以要更新的表的名字開始.
DELETE FROM要求指定從中刪除資料的表名。WHERE子句過濾要刪除的行。
DELETE FROM customers
WHERE cust_id=10004;
DELETE不需要列名或萬用字元。DELETE刪除整行而不是刪除列。為了刪除指定的列,請使用UPDATE語句。
更快的刪除:truncate:TRUNCATE實際是刪除原來的表並重新建立一個表,而不是逐行刪除表中的資料在對UPDATE或DELETE語句使用WHERE子句前,應該先用SELECT進行測試,保證它過濾的是正確的記錄,以防編寫的WHERE子句不正確。應該使用引用完整性。使用預設值而不是NULL值
建立表:表名+列名
CREATE TABLE orders(
order_num int NOT NULL AUTO_INCREMENT,
cust_id int NOT NULL DEFAULT 1,-- 預設值
PRIMARY KEY(order_num)
)ENGINE=InnoDB;
NULL為預設設定.使用的最簡單的編號是下一個編號.AUTO_INCREMENT;
每個表只允許一個AUTO_INCREMENT列,而且它必須被索引(如,通過使它成為主鍵)。通過last_insert_id()函式
獲得最後一個AUTO_INCREMENT.儲存引擎負責建立表等操作。
在表的設計過程中需要花費大量時間來考慮,以便後期不對該表進行大的改動。
更新表 alter table
ALTER TABLE vendors
ADD vend_phone CHAR(20);-- 增加列。
ALTER TABLE vendors
DROP COLUMN vend_phone;
ALTER TABLE的一種常見用途是定義外來鍵
ALTER TABLE order_items
ADD CONSTRAINT fk_item_orders
FOREIGN KEY(order_num) REFERECES orders(order_num);
使用ALTER TABLE要極為小心,應該在進行改動前做一個完整的備份,沒有撤回操作。
刪除表:DROP TABLE 表名
重新命名錶:RENAME TABLE 原來的表名 TO 新的表名
RENAME TABLE backup_a TO a,
backup_b TO b;
檢視
檢視是虛擬的表。與包含資料的表不一樣,檢視只包含使用時動態檢索資料的查詢。
檢視作用:
- 重用SQL。
- 簡化複雜的SQL操作。
檢視本身不包含資料,因此它們返回的資料是從其他表中檢索出來的。在新增或更改這些表中的資料時,檢視將返回改變過的資料。
檢視用CREATE VIEW語句來建立。
SHOW CREATE VIEW viewname
其語法為DROP VIEW viewname;
檢視更新:先drop後create或者:CREATE OR REPLACE VIEW
檢視的最常見的應用之一是隱藏複雜的SQL;檢視的另一常見用途是重新格式化檢索出的資料。檢視對於簡化計算欄位的使用特別有用。
CREATE VIEW product_customers AS
SELECT cust_name,cust_contact,prod_id
FROM customers,orders,order_items
WHERE customers.cust_id=orders.cust_id
AND order_items.order_num=orders.order_num;-- 連線條件
-- 體會,這兒就是將連線之後的邏輯的表作為檢視
-- 應用
SELECT * FROM product_customers;
SELECT cust_name,cust_contact
FROM product_customers
WHERE prod_id='TNT2';
-- 利用檢視,可一次性編寫基礎的SQL,然後根據需要多次使用。作用類似於函式
CREATE VIEW location AS
SELECT Concat(RTrim(vend_name),' (',RTrim(vend_country),' )') AS title
FROM vendors
ORDER BY vend_name;
SELECT * FROM location;-- 應用檢視
-- 用檢視過濾不想要的資料
CREATE VIEW list AS
SELECT cust_id,cust_name,cust_email
FROM customers
WHERE cust_eamil IS NOT NULL;
-- SELECT * FROM list;-- WHERE子句與WHERE子句將自動合併。
CREATE VIEW infomation AS
SELECT order_num,prod_id,quantity,item_price,quentity*item_prices AS total_price
FROM order_items;
-- 應用
SLECT * FROM infomation
WHERE order_num=20005;
基本上可以說,如果MySQL不能正確地確定被更新的基資料,則不允許更新圖(包括插入和刪除視)。這實際上意味著,如果檢視定義中有以下操作,則不能進行檢視的更新:GROUP BY 、JOIN、UNION、聚集函式(MIN(),COUNT(),SUM(),DISTINCT)
使用儲存過程
儲存過程簡單來說,就是為以後的使用而儲存的一條或多條MySQL語句的集合。可將其視為批檔案,雖然它們的作用不僅限於批處理。
MySQL稱儲存過程的執行為呼叫,CALL
CALL product_pricing(
@pricelow,
@pricehigh,
@price_average);-- 呼叫。
-- -- -- MYSQL 呼叫時需要修改結束分割符號。
DELEMITER //
CREATE PROCEDURE prices()
BEGIN
SELECT Avg(prod_price) AS price_avg
FROM products;
END//
DELEMITER ;
-- 應用
CALL prices();
-- 刪除
DROP PROCEDURE IF EXISTS prices;
帶引數的存過程
-- 宣告變數
;DECLARE price_low DECIMAL(8,2);
DELEMITER //
CREATE PROCEDURE prices(
OUT p1 DECIMAL(8,2),
OUT ph DECIMAL(8,2))
BEGIN
SELECT MIN(prod_price) INTO p1 FROM products;
SELECT MAX(prod_price) INTO ph FROM products;
END //
DELEMITER ;
CALL prices(@price_low,@proce_high);所有MySQL變數都必須以@開始。
-- 以上呼叫不顯示任何的資料,它返回變數;
應用
SELECT @price_low;
-- COMMENT關鍵字
SHOW CREATE PROCEDURE
遊標cursor:逐行處理結果集
需要在檢索出來的行中前進或後退一行或多行。這就是使用遊標的原因。遊標(cursor)是一個儲存在MySQL伺服器上的資料庫查詢,它不是一條SELECT語句,而是被該語句檢索出來的結果集。MySQL遊標只能用於儲存過程(和函式)。使用FETCH來讀取所需資料
BEGIN
DECLARE o INT;
DECLARE done BOOLEAN DEFAULT 0;
DECLARE order_nums CURSOR FOR -- 宣告遊標 ,是一種型別。
SELECT order_num FROM orders;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
--使用
OPEN order_nums;
--迴圈
REPEAT
FETCH order_nums INTO o;
UNTIL done
END REPEAT;
--關閉
CLOSE order_nums;
END;
-- SQLSTATE'02000'是一個未找到條件
觸發器:SQL語句與事件關聯
應用場景:
- insert時檢查電話號格式。
- delete時儲存副本等。
觸發器是MySQL響應以下語句(DELETE
、INSERT
、UPDATE
)而自動執行的一條MySQL語句(或位於BEGIN和END語句之間的一組語句).
CREATE TRIGGER new_product AFTER INSERT ON products
FOR EACH ROW SELECT 'product added';
-- 刪除,觸發器不支援更新
DROP TRIGGER new_product;
只有表才支援觸發器,檢視不支援(臨時表也不支援)。每個表最多支援6個觸發器(每條INSERT、UPDATE和DELETE的之前和之後)
CREATE TRIGGER new_order AFTER INSERT ON orders
FOR EACH ROW SELECT NEW.order_num;-- FOR EACH ROW 跟具體的SQL語句。
-- 應用
INSERT INTO orders(order_date,cust_id)
VALUES(Now(),10001); -- 返回值就是觸發器定義的內容。
-- DELETE 觸發器
CREATE TRIGGER delete_order BEFORE DELETE ON orders
FOR EACH ROW
BEGIN
INSERT INTO archive_orders
VALUES(OLD.order_num,OLD.order_date,OLD.cust_id);
END
-- 引用一個名為OLD的虛擬表
-- UPDATE 觸發器的應用,資料驗證
CREATE TRIGGER update_vendor BEFORE UPDATE ON vendors
FOR EACH ROW SET NEW.vend_state=Upper(NEW.vend_state)
觸發器的一種非常有意義的使用是建立審計跟蹤。使用觸發器,把更改(如果需要,甚至還有之前和之後的狀態)記錄到另一個表非常容易.
事務處理
事務(transaction)指一組SQL語句;
- 回退(rollback)指撤銷指定SQL語句的過程;
- 提交(commit)指將未儲存的SQL語句結果寫入資料庫表;
- 保留點(savepoint)指事務處理中設定的臨時佔位符(placeholder),你可以對它釋出回退(與回退整個事務處理不同)。
事務處理用來管理INSERT、UPDATE和DELETE語句,不能回退SELECT、CREATE、DROP。
SELECT * FROM order_totals;
START TRANSACTION;
DELETE FROM order_totals;
SELECT * FROM order_totals;
ROLLBACK;-- 回退到START TRANSACTION
DELETE FROM order_items WHERE order_num=20001;
DELETE FROM orders WHERE order_num=23334;
SELECT * FROM order_totals;
-- 提交。
COMMIT;
隱含提交(implicit commit),即提交(寫或儲存)操作是自動進行的。在事務處理時,提交不會隱含地進行.
為了支援回退部分事務處理,必須能在事務處理塊中合適的位置放置佔位符。這樣,如果需要回退,可以回退到某個佔位符。這些佔位符稱為保留點SAVEPOINT
SAVEPOINT delete1;
ROLLBACK TO delete1;-- 保留點越多越好。RELEASE SAVEPOINT
更改預設的提交行為(連線專用):SET autocommit=0;
全球化和本地化:字符集
- [ ] 字符集為字母和符號的集合;
- [ ] 編碼為某個字符集成員的內部表示;
- [ ] 校對
COLLATE
:規定字元如何比較的指令。
SHOW CHARACTER SET;
SHOW COLLATION;
SHOW VARIABLES LIKE 'character%'
-- 建立表時指定字符集和校對。
-- 當不指定COLLATE,則使用資料庫預設。
CREATE TABLE mytable(
column1 INT,
columns2 VARCHAR(10)
)DEFAULT CHARACTER SET hebrew
COLLATE hebrew_general_ci;
校對在對用ORDER BY子句 檢索出來的資料排序時起重要的作用。
COLLATE可用於ORDER BY
、GROUP BY
、HAVING
、聚集函式、別名等。
SELECT * FROM customers
ORDER BY lastname,firstname COLLATE latin1_general_cs;
安 全 管 理
訪問控制:設定許可權,使用GRANT語句
MySQL使用者賬號和資訊儲存在名為mysql
的庫中.
USE mysql;
SELECT user FROM user;
MySQL的許可權用使用者名稱和主機名結合定義,不指定採用預設值
CREATE USER 'yyq' identified by '密碼' ;-- 可以不指定密碼,指定時需要用identified by
RENAME USER yyq TO 'new_name';
GRANT
:許可權名稱-資料庫或者表-使用者名稱。回收許可權:revoke
GRANT SELECT on test.* TO yyq;
REVOKE SELECT ON test.* TO yyq;
GRANT和REVOKE可在幾個層次上控制訪問許可權:
整個伺服器,使用GRANT ALL和REVOKE ALL;
整個資料庫,使用ON database.*;
特定的表,使用ON database.table;
特定的列;
特定的儲存過程。
簡化多次授權:GRANT SELECT,INSERT ON test.* TO yyq
更改口令
SET PASSWORD FOR yyq=Password('ddd');
資料庫維護:備份mysqldump
mysqlhotcopy,BACKUP TABLE
analyze table user;
check table user;
檢視日誌:1.錯誤日誌·hostname.err
;2.查詢日誌hostname.log
;3.二進位制日誌(更新):hostname-bin
;4.慢查詢日誌hostname-slow.log
改善效能
SHOW VARIABLES;SHOW STATUS;SHOW PROCESSLIST
。
總是有不止一種方法編寫同一條SELECT語句。應該試驗聯結、並、子查詢等,找出最佳的方法
使用EXPLAIN
命令檢查SQL執行過程。
- [x] 應該總是使用正確的資料型別。串型別、數值型別、日期和時間、二進位制型別Blob(Binary long Object)
- [ ] 複雜的OR條件用多條SQL語句+UNION代替。
- [ ] LIKE很慢。一般來說,最好是使用FULLTEXT而不是LIKE。
如果數值是計算(求和、平均等)中使用的數值,則應該儲存在數值資料型別列中。如果作為字串(可能只包含數字)使用,則應該儲存在串資料型別列中。
不使用引號 與串不一樣,數值不應該括在引號內。