MySQL基礎知識和常用命令總結

justisme發表於2020-04-28

說明:以下內容是閱讀書籍<<MySQL必知必會>>的摘要和總結

  1. 檢索資料
  2. 排序檢索資料
  3. 過濾資料
  4. 使用萬用字元過濾
  5. 使用正規表示式進行搜尋
  6. 建立計算欄位
  7. 使用資料處理函式
  8. 彙總資料
  9. 分組資料
  10. 使用子查詢
  11. 聯結表
  12. 建立高階聯結
  13. 組合查詢
  14. 全文字搜尋
  15. 插入資料
  16. 更新和刪除資料
  17. 建立和操縱表
  18. 使用檢視
  19. 使用儲存過程
  20. 使用遊標
  21. 使用觸發器
  22. 管理事務處理
  23. 全球化和本地化
  24. 安全管理
  25. 資料庫維護
  26. 改善效能.

模式可以用來描述資料庫中特定的表以及整個資料庫,和其中表的關係
行(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響應以下語句(DELETEINSERTUPDATE)而自動執行的一條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語句;

  1. 回退(rollback)指撤銷指定SQL語句的過程;
  2. 提交(commit)指將未儲存的SQL語句結果寫入資料庫表
  3. 保留點(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 BYGROUP BYHAVING、聚集函式、別名等。

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。

如果數值是計算(求和、平均等)中使用的數值,則應該儲存在數值資料型別列中。如果作為字串(可能只包含數字)使用,則應該儲存在串資料型別列中
不使用引號 與串不一樣,數值不應該括在引號內。

相關文章