日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

《Mysql》必知必会读书笔记

發(fā)布時(shí)間:2023/12/20 数据库 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Mysql》必知必会读书笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Mysql知識匯總

1.基本操作知識:

  • 用root用戶登錄:mysql -u root -p;
  • 創(chuàng)建數(shù)據(jù)庫:create database bank(庫名);
  • 退出:quit;
  • 創(chuàng)建用戶gp,并賦予bank數(shù)據(jù)庫權(quán)限:grant all privileges on bank.* to ‘gp’@‘localhost’ identified by ‘xyz’;(xyz為密碼)
  • 查詢當(dāng)前日期:select now();
  • 查看服務(wù)器所支持的字符集:show character set;

2.操作與修改表:

  • 創(chuàng)建表:create table 表名(變量名 數(shù)據(jù)類型 【其他設(shè)定】);
  • 查看表:desc 表名;
  • 插入數(shù)據(jù):insert into 表名 (變量名) values (對應(yīng)的值);
  • 查看表的數(shù)據(jù):select *(變量名)from 表名 條件;
  • 還可以加上如:select distinct 變量名 from 表名(distinct表示返回不同的值);
  • 限制結(jié)果:select 變量名 from 表名 limit 行數(shù) (限制輸出不超過5行) (limit 3,4 表示從行4開始的4行數(shù)據(jù));
  • 完全限定列名或表名:select products.prod_name from cashcourse.products;(完全限定了數(shù)據(jù)庫cashcourse中的products表);
  • 排序檢索數(shù)據(jù):
  • 使用order by 子句進(jìn)行排序:select 變量名(可多個(gè),用 , 隔開) from 表名 order by 變量名(當(dāng)為數(shù)字時(shí)默認(rèn)進(jìn)行升序排序);
  • 指定排序方向:order by 變量名 DESC(降序排序)(對于多列變量需要每一個(gè)都加上DESC或ASC升序等等);
  • 過濾數(shù)據(jù):(where語句)

  • 使用between檢測時(shí),注意:select * from account where price between 5 and 10;
  • 使用空值時(shí),注意:select * from account where price is null;
  • and操作符和or操作符連接where (例如:select * from account where price = 5 and account_id = 10;);同時(shí)注意and操作符的優(yōu)先級更高;
  • in操作符,說明:select * from account where price in (5, 10);作用與or相同。
  • not 操作符,例如和in聯(lián)合使用:select * from account where price not in (5,10);
  • 通配符過濾數(shù)據(jù):

    ? 1. like 操作符:%表示任何字符出現(xiàn)的任意次數(shù)(例子:select id from test where id like ‘1%’; 此例表示搜索任何以1開頭的詞);

  • '%ansjhdi%'則表示匹配任何包含ansjhdi的值;
  • 下劃線 _ 通配符:用途和%一樣,不過 _ 表示的是只匹配單個(gè)字符;
  • 用正則表達(dá)式進(jìn)行搜索:
  • REGEXP字符匹配:select id from test where id REGEXP ‘.000’; ’ . '表示匹配任何一個(gè)字符,與文字正文1000或2000等匹配的正則表達(dá)式;
  • OR進(jìn)行匹配:| 為正則表達(dá)式的OR操作符;select id from test where id EXGEXP ‘1000 | 2000’;
  • 另一種or語句,匹配一組字符:用 [ ] 將想要包含的字符括起來;select id from test where id EXGEXP ‘[ 123 ]’ ;表示匹配1或2或3;[^123]則表示匹配除了123以外的任何東西;
  • 匹配范圍:[1-9]表示匹配數(shù)字1到9;
  • 匹配特殊字符,必須用 \ \ 為前導(dǎo),例如 \ \ -表示查找 - ,\ \ . 表示查找 . 。

  • 匹配字符類:

    8. 匹配多個(gè)實(shí)例:

    例子:[ [ : digit ] ] { 4 } 匹配連在一起的任意4個(gè)數(shù)字;又如:\ \ ([0 - 9 ] sticks ?\ \ ) 其中的 \ \ (匹配 )[ 0 - 9 ] 匹配任意數(shù)字,sticks?匹配stick和sticks;
  • 定位符:
  • 3.創(chuàng)建計(jì)算字段:

    3.1概念

    ? 計(jì)算字段不是從數(shù)據(jù)庫中直接提取出來的數(shù)據(jù),而是將從數(shù)據(jù)庫中檢索出來的數(shù)據(jù)進(jìn)行轉(zhuǎn)換,計(jì)算或者格式化而形成的數(shù)據(jù)。

    3.2拼接字段

    ? 在Mysql的select語句中,可使用Concat()函數(shù)進(jìn)行拼接兩個(gè)列。例如:select Concat( RTrim(vend_name), ’ (’ , RTrim(vend_country), ‘)’ ) 其中的RTrim()函數(shù)去掉右邊的所有空格,還有LTrim(),Trim。

    ? 上面的例子表示的是將vend_name所包含的數(shù)據(jù)與用()連接的vend_country進(jìn)行拼接;

    3.3使用別名

    ? 使用AS關(guān)鍵字,例如:select pcp as name from 表,則將查找出來的pcp數(shù)據(jù)以name作為標(biāo)題顯示出來;

    3.4執(zhí)行算術(shù)計(jì)算

    ? 支持 + ,- , * , / 四則運(yùn)算。例如:select pid , price , price * pid as Allprice from 表名;

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

    4.1文本處理函數(shù)

    ? Upper()將文本轉(zhuǎn)換為大寫,例如:select name , Upper(usernaem) as LBJ from 表名;

    ?

    ? SOUNDEX是一個(gè)將任何文本串轉(zhuǎn)換為描述其語音表示的字母數(shù)字模式的算法(例子:select cust_name from customers where Soundex(cust_contact) = Soundex(‘Y Lie’);

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

    ?

    4.3 數(shù)值處理函數(shù)

    ?

    5.匯總數(shù)據(jù):

    5.1聚集函數(shù)

    • ? AVG()函數(shù):select AVG(prod_price) AS avg_price from products;求出包含在products中的所有產(chǎn)品的平均價(jià)格;
    • ? COUNT()函數(shù):select COUNT(*) AS num_cust from customers;表示從customers表中取出num_cust的所有列的總和,無論是否為NULL;
    • ? 使用COUNT(參數(shù))則會將值為NULL的省略掉不加;
    • ? MAX(),MIN()以及SUM()這三個(gè)函數(shù)的用法和前面就基本一樣;
    5.2聚集不同值

    ? 可以使用DISTINCT于COUNT()上,但不可用于COUNT(*),使用DISTINCT時(shí)后面必須帶參數(shù);

    5.3組合聚集函數(shù)

    ? select語句中可以使用多個(gè)聚集函數(shù);

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

    6.1 創(chuàng)建分組

    ? 分組是在SELECT語句的GROUP BY字句中建立的。

    ? select pid , COUNT(*) AS num_prods from products GROUP BY vend_id; 該語句指示了按vend_id為計(jì)算字段,對不同的vend_id分別進(jìn)行計(jì)算,實(shí)現(xiàn)多組分行;

    ? 注意:GROUP BY字句必須出現(xiàn)在WHERE字句后面,ORDER BY字句之前;

    6.2 過濾分組

    ? 使用HAVING字句對組的數(shù)據(jù)進(jìn)行過濾;WHERE用于過濾行;

    ? 例子:select cust_id , COUNT() AS orders FROM orders GROUP BY cust_id HAVING COUNT( * ) >= 2;

    ? 該例子過濾掉了COUNT(* )>=2 的那些分組;

    6.3 分組和排序

    ? ORDER BY 排序產(chǎn)生的輸出,GROUP BY分組行,輸出可能不是分組的順序(不排序,僅分組);

    ? 例子:SELECT order_num , SUM(quality * price) AS ordertotal from orderitems GROUP BY order_num HAVING SUM(quality * price)>= 50 ORDER BY ordertotal;

    ? 該例子中,GROUP BY字句按照訂單號分組數(shù)據(jù),以便SUM(*)函數(shù)算出總計(jì)訂單價(jià)格,HAVING字句過濾數(shù)據(jù),使得只返回總訂單價(jià)格大于等于50的訂單,最后用ORDER BY字句排序出來。

    7.使用子查詢:

    7.1利用子查詢進(jìn)行過濾

    ? 例子:SELECT cust_id FROM  orders  WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id = ’TNT');

    ? 首先執(zhí)行括號里面的SELECT語句,即為子查詢語句,查詢完后將值代入IN()函數(shù)中進(jìn)行另一個(gè)查詢;

    7.2作為計(jì)算字段使用子查詢

    ? 例子:SELECT cust_name, cust_state, (SELECT COUNT(*)FROM orders WHERE orders.cust_id = customers.cust_id) AS orders FROM customers ORDER BY cust_name;

    ? 注意到WHERE子句中使用了完全限定的方法,將子查詢放在了外部,成為相關(guān)子查詢。

    8.聯(lián)結(jié)表:

    8.1 關(guān)系表

    ? 相同的數(shù)據(jù)出現(xiàn)多次并不好,關(guān)系表的設(shè)計(jì)就是保證把信息分解成多個(gè)表,一類數(shù)據(jù)一個(gè)表,各表通過某些常用的值互相聯(lián)系;

    ? 外鍵:為某一個(gè)表中的一列,它包含另一個(gè)表的主鍵值。1表的主鍵即使2表的外鍵。

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

    ? 例子:SELECT vend_name,prod_name,prod_price FROM vendors,products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name,prod_name;

    ? vend_name屬于其中一張表,而prod_name,prod_price屬于另一張表,所以在使用WHERE過濾語句時(shí)需要使用完全限定的方法。 即通過WHERE字句進(jìn)行創(chuàng)建聯(lián)結(jié);

    8.3 內(nèi)部聯(lián)結(jié)
    之前的聯(lián)結(jié)都為等值聯(lián)結(jié),它基于兩個(gè)表間的相等測試,這種聯(lián)結(jié)也稱為內(nèi)部聯(lián)結(jié),可以使用下面的方法實(shí)現(xiàn)和之前一樣的作用:

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

    ? 此處用INNER JOIN,則后面需要用ON進(jìn)行聯(lián)結(jié),不能用WHERE。

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

    ? 例子:SELECT prod_name , vend_name,prod_price,quantity FROM orderitems,products,vendors WHERE products.vend_id = vendors.vend_id AND orderitems.prof_id = products.prod_id AND order_num = 20005;

    ? 使用多表聯(lián)動(dòng)查詢比多個(gè)子查詢的結(jié)合效率要高。

    9.創(chuàng)建高級聯(lián)動(dòng):

    9.1使用表別名

    ? 可以為表起別名,方便使用,例如:SELECT cust_contact,cust_name FROM customers AS c,orders AS o,orderitems AS oi WHERE c.cust_id = o.cust_id AND…;

    9.2 使用不同類型的聯(lián)動(dòng)
    9.2.1 自聯(lián)動(dòng)

    ? 例子:SELECT p1.prod_id , p1.prod_name FROM products AS p1, products AS p2 WHERE p1.prod_id = p2.prod_id AND p2.prod_id = ‘DTNTR’;

    9.2.2 自然聯(lián)動(dòng)(返回所有的數(shù)據(jù),甚至相同多次出現(xiàn)的數(shù)據(jù),用自然聯(lián)結(jié)可排除多次出現(xiàn))

    ? 例子:SELECT c.* ,order_num FROM customers AS c, orders AS o WHERE c.cust_id = o.cust_id…;

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

    ? 例子:SELECT customer.cust_id,orders.order_num FROM customers LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;

    ? 在使用OUTER JOIN語法時(shí),必須使用RIGHT或LEFT關(guān)鍵字指定包括其所有行的表(RIGHT指出的是OUTER JOIN右邊的表,LEFT則為左邊的表);

    9.3 使用帶聚集函數(shù)的聯(lián)動(dòng)

    ? 例子:SELECT customers.cust_name ,COUNT(orders.order_num) AS num_ord FROM customers LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id…;

    10.組合查詢

    10.1創(chuàng)建組合查詢

    ? 使用UNION可給出多條SELECT語句;例子:SELECT vend_id , prod_price FROM products WHERE prod_price <= 5 UNION SELECT vend_id , prod_price FROM products WHERE vend_id IN (1001,1002);

    ? 給出每條SELECT語句,然后用UNION進(jìn)行組合連接,并把結(jié)果輸出組合成單個(gè)查詢結(jié)果集;

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

    ? UNION從查詢結(jié)果中自動(dòng)去除了重復(fù)的行,這是UNION的默認(rèn)屬性,如需要改變,可以使用UNION ALL返回所有匹配行;

    10.3 對組合查詢結(jié)果進(jìn)行排序

    ? UNION組合查詢是,只使用一條ORDER BY字句,其必須出現(xiàn)在SELECT語句的最后面,不允許使用多條ORDER BY字句;

    ? 例如:SELECT id, price from products WHERE price <= 5 UNION SELECT prod_id from products WHERE vend_id IN (1001,1002) order BY vend_id,price;

    11.全文本搜索

    11.1 概念

    ? 在使用全文本搜索時(shí),Mysql不需要分別查詢每個(gè)行,不需要分析和處理每個(gè)詞,Mysql創(chuàng)建指定列中的各詞的一個(gè)索引,搜索可以針對這些詞進(jìn)行。

    11.2使用全文本搜索

    ? 在索引后,SELECT 可與Match()和Against()一起使用以實(shí)際執(zhí)行搜索

    11.2.1 啟用全文本搜索支持

    ? 一般在創(chuàng)建表時(shí)啟用全文本搜索。CREATE TABLE 語句接受FULLTEXT字句;

    ? 例子:CREATE TABLE products

    ? (note_id int NOT NULL ,

    ? prod_id char(10) NOT NULL,

    ? FULLTEXT(note_id)

    ? )ENGINE=MyISAM;

    ? Mysql對note_id進(jìn)行索引創(chuàng)建,在增加,更新或刪除行時(shí),索引會隨之自動(dòng)更新;

    11.2.2 進(jìn)行全文本搜索

    ? 索引后,使用Match()和Against()執(zhí)行全文本搜索,其中Match()指定被搜索的咧,Against()指定要使用的搜索表達(dá)式;

    ? 例子:SELECT note_text FROM productnotes WHERE Match(note_text) Against(‘rabbit’);

    ? 搜索指定的note_text這一列,然后指定詞rabit作為搜索文本。全文本搜索還對結(jié)果進(jìn)行了一個(gè)排序的作用;具有較高等級的行先返回。

    11.2.3 查詢拓展搜索

    ? 例子:SELECT note FROM product WHERE Match(note_text)Against(‘a(chǎn)nvils’ WHITH QUERY EXPANSION)

    ? 不僅返回含有’anvils‘的行,還會返回其他有相關(guān)性詞的行等;

    11.2.4 布爾文本搜索

    ? 沒有FULLTEXT索引也可以使用,不過操作緩慢;

    ? 例子:ELECT note FROM product WHERE Match(note_text)Against(‘a(chǎn)nvils’ IN BOOLEAN MODE);

    ? 該語句沒有指定布爾操作符,所以結(jié)果和不使用的一樣;

    ?

    ?

    ? 例子:SELECT note_text FROM productnote WHERE Match(note_text) Against(’+rabbit+bait’ IN BOOLEAN MODE);

    ? 該語句匹配包含詞rabbit,bait的行;

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

    12.1 插入完整的行

    ? INSERT INTO Customers VALUES (NULL,‘Pepper’…);

    ? 也可以指定列名進(jìn)行插入,例如:INSERT INTO customers(cust_name, cust_email)VALUES (‘PEP’,‘USA’);

    ·

    12.2 插入多個(gè)行

    ? 例子:INSERT INTO customers(cust_name, cust_email)VALUES (‘PEP’,‘USA’),(‘KCP’,‘CHINA’);

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

    ? 例子:INSERT INTO customers(cust_name, cust_email)SELECT 變量名 from 表名;

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

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

    ? UPDATE可以更新表中的行或列的數(shù)據(jù);

    ? 例子:UPDATE 表名 SET 變量名 = 值 ,變量名 = 值 WHERE…;

    ? IGNORE關(guān)鍵字:更新時(shí)發(fā)生錯(cuò)誤,也繼續(xù)更新,例子:UPDATE IGNORE 表名…;

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

    ? 例子:DELETE FROM 表名 WHERE 變量名 = 值;

    ? 使用TRUNCATE TABLE語句刪除整個(gè)表的數(shù)據(jù),其原理是刪除整個(gè)表并重新建立一個(gè)新的表;

    14.創(chuàng)建和操作表

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

    ? 例子:CREATE TABLE 表名(變量 類型 其他指令,變量… , PRIMARY KEY(變量名))ENGINE = InnoDB;

    ? PRIMARY KEY(變量名)創(chuàng)建了該表的主鍵(指定列的唯一性);可以有多個(gè)主鍵;

    ? NOT NULL將會阻止插入沒有值得列;

    ? AUTO_INCREMENT 可以使得 每當(dāng)增加一行時(shí)自動(dòng)增量,可以用于主鍵值,每個(gè)表只允許一個(gè)AUTO_INCREMENT列,而且必須被索引(通過它成為主鍵);

    ? SELECT last_insert_id()函數(shù)可以獲得AUTO_INCREMENT列的最后一個(gè)值;

    ? 指定默認(rèn)值:插入行時(shí)沒喲給有給出指定值,使用DEFAULT關(guān)鍵詞(例如:變量 類型 DEFAULT 值);

    14.2 引擎類型

    ? 例子:ENGINE = InnoDB;

    ? InnoDB是一個(gè)可靠的事務(wù)處理引擎,不支持全文本搜索;

    ? MEMORY數(shù)據(jù)存儲在內(nèi)存,而不是磁盤,速度快(適合臨時(shí)表);

    ? MyISAM支持全文本搜索,不支持事務(wù)處理;(默認(rèn)引擎)

    14.3 更改表

    ? ALTER TABLE 表名 ADD 變量名 類型;(增加表列)

    ? ALTER TABLE 表名 DROP COLUMN 變量名;(刪除表列)

    ? ALTER TABLE 定義外鍵,例子:ALTER TABLE 表名 ADD CONSTRAINT 變量名 FOREIGN KEY (變量名1)REFERENCES 表名(變量名1);

    14.4 刪除表

    ? DROP TABLE 表名;

    14.5 重命名表

    ? 例子:RENAME TABLE 新表名 TO 原表名;

    15.視圖

    15.1概念

    ? 視圖是虛擬的表,只包含使用時(shí)動(dòng)態(tài)檢索數(shù)據(jù)的查詢,用來查詢存儲在別處的數(shù)據(jù);

    15.2 視圖基本操作

    ? CREATE VIEW(創(chuàng)建視圖);

    ? SHOW CREATE VIEW 視圖名;(查看試圖)

    ? DROP VIEW 視圖名(刪除視圖);

    ? CREATE OR REPLACE VIEW(更新試圖);

    ? 例子:CREATE VIEW 視圖名 AS SELECT 變量名,變量名… FROM 表名,表名…WHERE 條件;

    ? 視圖同表一樣,可以過濾數(shù)據(jù)等等;

    16.使用存儲過程

    16.1使用存儲過程

    ? CALL productpricing(@變量名,@變量名… );(使用存儲過程)

    ? CREATE PROCEDURE 存儲過程名(

    ? OUT 變量名 數(shù)據(jù)類型(OUT表示從存儲過程傳出),

    ? IN 變量名 數(shù)據(jù)類型 (IN 傳遞給存儲過程),

    ? INOUT 變量名 數(shù)據(jù)類型 (傳入和傳出),

    ? )

    ? BEGIN

    ? SELECT Avg(price) AS priceaverage

    ? FROM products;

    ? END;(創(chuàng)建存儲過程)

    ? DROP PROCEDURE 存儲過程名(刪除存儲過程);

    ? 檢索出存儲的數(shù)據(jù)。使用SELECT @變量名;

    16.2 檢查存儲過程

    ? SHOW CREATE PROCEDURE ordertotal;獲取存儲過程列表的詳細(xì)信息;

    17.游標(biāo)

    17.1創(chuàng)建游標(biāo)

    ? 例子:CREATE PROCEDURE processorders()

    ? BEGIN

    ? DECLARE ordernumbers CURSOR

    ? FOR

    ? SELECT order_num FROM orders;

    ? END;

    ? 其中的DECLARE語句用于定義和命名游標(biāo);、

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

    ? OPEN CURSOR 打開游標(biāo);例子:OPEN ordernumber;

    ? 關(guān)閉游標(biāo):CLOSE ordernumber;

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

    ? 例子:CREATE PROCEDURE processorders()

    ? BEGIN

    ? DECLARE o INT;

    ? DECLARE ordernumbers CURSOR

    ? FOR

    ? SELECT order_num FROM orders;

    ? OPEN ordernumbers;

    ? FETCH ordernumber INTO o;

    ? CLOSE ordernumbers;

    ? END;

    18.使用觸發(fā)器

    ? 只有DELETE,INSERT,UPDATE這三個(gè)語句才能使用觸發(fā)器;

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

    ? 例子:CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH SELECT 'Product added ';

    ? CREATE TRIGGER 表示創(chuàng)建觸發(fā)器,AFTER INSERT 表示此觸發(fā)器將在INSERT語句執(zhí)行成功后再執(zhí)行,FOR EACH ROW 對每一插入行執(zhí)行;

    18.2 刪除觸發(fā)器

    ? DROP TRIGGER 觸發(fā)器名;

    18.3 使用觸發(fā)器
    18.3.1 INSERT觸發(fā)器

    ? AFTER(BEFORE) TRIGGER;

    ? 可以使用一個(gè)名為NEW的虛擬表訪問被插入的行;

    18.3.2 DELETE觸發(fā)器

    ? 可以使用一個(gè)名為OLD 的虛擬表訪問被刪除的行;

    19.管理事務(wù)處理

    控制事務(wù)處理

    ? 使用ROLLBACK來回退(撤銷)sql語句(可用來管理INSERT,UPDATE和DELETE語句);

    ? 提交使用COMMIT;語句;

    ? 回退部分事務(wù)處理:可以使用占用符(保留點(diǎn)),可以使用SAVEPOINT語句來創(chuàng)建占位符;

    ? 例SAVEPOINT delete;

    ? ROLLBACK TO delete;(使用一條ROLLBACK后自動(dòng)釋放保留點(diǎn),COMMIT也可以);

    ? set autocommit = 0表示不自動(dòng)提交,可以進(jìn)行更改以實(shí)現(xiàn)自動(dòng)提交;

    20.全球化與本地化

    使用字符集和校對順序

    ? 查看字符集完整列表:SHOW CHARACTER SET;

    ? 查看所支持校對的完整列表:SHOW COLLATION;

    ? 給表指定字符集和校對:例子:CREATE TABLE table(column INT )DEFAULT CHARACTER SET Hebrew COLLATE hebrew_general_ci;

    ? 如果既不指定CHARACTER SET,也不指定COLLATE,則使用數(shù)據(jù)庫默認(rèn)。還可指定每個(gè)列設(shè)置他們(name varchar(10)CHARACTER SET Latin1 COLLATE Latin1_general_ci;

    21.安全管理

    21.1 創(chuàng)建用戶賬號

    ? CREATE USER ben IDENTIFIED BY password 使用后面的口令對該賬號進(jìn)行加密;

    21.2 刪除用戶賬號

    ? DROP USER username;

    21.3設(shè)置訪問權(quán)限

    ? 使用SHOW GRANT FOR用戶名 (可以查看用戶權(quán)限);

    ? USAGE 表示沒有任何權(quán)限;

    ? GRANT SELECT ON crashcourse . * TO 用戶名;(crashcourse表示數(shù)據(jù)庫上的所有表)有使用SELECT的權(quán)限;

    ? REVOKE SELECT ON crashcourse . * FROM 用戶名;(撤銷特定權(quán)限);

    21.4 更改口令

    ? set PASSWORD for 用戶名 = PASSWORD(‘密碼’);此句用于更換密碼。

    ? SET PASSWORD = Password(‘密碼’)用于更新當(dāng)前登陸用戶的口令;

    22.數(shù)據(jù)庫維護(hù)

    22.1進(jìn)行維護(hù)

    ? ANALYZE TABLE 數(shù)據(jù)庫名;用于檢查表鍵是否正確;

    ![在這里插入圖片描述](https://img-blog.csdnimg.cn/20190711215304755.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FkZGl0aW9uR1A=,size_16,color_FFFFFF,t_70)

    ? 若訪問產(chǎn)生不正確和不一致的結(jié)果,需要使用REPAIR TABLE 來修復(fù)相應(yīng)的表;

    ? 如果需要從一個(gè)表中刪除大量數(shù)據(jù),應(yīng)該使用OPTIMIZE TABLE來收回所用的空間,從而優(yōu)化表的性能;

    22.2 查看日志文件

    ? 使用FLUSH LOGS語句來刷新和重新開始所有的日志文件;

    23.改善性能

    ? 使用SHOW PROCESSLIST顯示所有進(jìn)程,用KILL終結(jié)某個(gè)特定的進(jìn)程;

    24.數(shù)據(jù)庫索引(重點(diǎn))

    24.1概念

    ? 索引是尋找資源中特定項(xiàng)目的一種機(jī)制(作用就是便捷化檢索表中行和列的子集,而不需要檢查表中的每行數(shù)據(jù))

    24.2創(chuàng)建索引

    ? 在數(shù)據(jù)庫中添加索引:ALTER TABLE department ADD INDEX dept_name_idx(name);

    ? 索引所在列的數(shù)據(jù)具有唯一性;

    24.3 索引類型
    1.聚簇索引:

    ? 也叫簇類索引,是一種對磁盤上的數(shù)據(jù)重新組織以按指定的一個(gè)或多個(gè)列的值排序,聚簇索引的索引頁面指針指向數(shù)據(jù)頁面,所以速度快。同時(shí)每張表只能建立一個(gè)聚簇索引,所需的空間大;

    ? 1.1.特點(diǎn):聚簇索引也稱為聚集索引,聚類索引,簇集索引,聚簇索引確定表中數(shù)據(jù)的物理順序。聚簇索引類似于電話簿,后者按姓氏排列數(shù)據(jù)。由于聚簇索引規(guī)定數(shù)據(jù)在表中的物理存儲順序,因此一個(gè)表只能包含一個(gè)聚簇索引。但該索引可以包含多個(gè)列(組合索引),就像電話簿按姓氏和名字進(jìn)行組織一樣。漢語字典也是聚簇索引的典型應(yīng)用,在漢語字典里,索引項(xiàng)是字母+聲調(diào),字典正文也是按照先字母再聲調(diào)的順序排列。

    ? 聚簇索引對于那些經(jīng)常要搜索范圍值的列特別有效。使用聚簇索引找到包含第一個(gè)值的行后,便可以確保包含后續(xù)索引值的行在物理相鄰。例如,如果應(yīng)用程序執(zhí)行的一個(gè)查詢經(jīng)常檢索某一日期范圍內(nèi)的記錄,則使用聚集索引可以迅速找到包含開始日期的行,然后檢索表中所有相鄰的行,直到到達(dá)結(jié)束日期。這樣有助于提高此類查詢的性能。同樣,如果對從表中檢索的數(shù)據(jù)進(jìn)行排序時(shí)經(jīng)常要用到某一列,則可以將該表在該列上聚簇(物理排序),避免每次查詢該列時(shí)都進(jìn)行排序,從而節(jié)省成本。

    ? 優(yōu)點(diǎn):

    • 聚簇索引的可以把相關(guān)的數(shù)據(jù)保存在一起;
    • 使得數(shù)據(jù)訪問更快;

    ? 缺點(diǎn):

    • 雖然最大限度地提高了I/O密集型應(yīng)用的性能,但如果數(shù)據(jù)全部都放在內(nèi)存中,則訪問的順序就沒那么重要了,此時(shí)聚簇索引也就沒什么優(yōu)勢;
    • 更新聚簇索引列的代價(jià)很高,因?yàn)闀?qiáng)制InnoDB將每個(gè)被更新的行移動(dòng)到新的位置;
    • 聚簇索引可能導(dǎo)致全表掃描變慢,尤其是行比較稀疏,或者由于頁分裂導(dǎo)致數(shù)據(jù)存儲不連續(xù)的時(shí)候;

    ?

    ? 1.2.注意點(diǎn):在一個(gè)頻繁發(fā)生插入操作的表上建立聚簇索引時(shí),不要建在具有單調(diào)上升值的列(如IDENTITY)上,否則會經(jīng)常引起封鎖沖突;

    ? 使用AUTO_INCREMENT自增列,這樣可以保證數(shù)據(jù)行是按順序?qū)懭?#xff0c;對于根據(jù)主鍵做關(guān)聯(lián)操作的性能也會更好;

    ? 1.3. mysql中,不同的存儲引擎對索引的實(shí)現(xiàn)方式不同,InnoDB引擎采用的便是聚簇索引;

    ? InnoDB 的數(shù)據(jù)文件本身就是索引文件,B+Tree的葉子節(jié)點(diǎn)上的data就是數(shù)據(jù)本身,key為主鍵,這是聚簇索引。

    2. 二級索引:

    ? 也稱為非聚簇索引(輔助索引),葉子節(jié)點(diǎn)上的data是主鍵 (所以聚簇索引的key,不能過長)。為什么存放的主鍵,而不是記錄所在地址呢,因?yàn)橛涗浰诘刂凡⒉荒鼙WC一定不會變,但主鍵可以保證。

    ``Mysql中的MyISAM引擎便是采用該索引,MyISAM的B+Tree的葉子節(jié)點(diǎn)上的data,并不是數(shù)據(jù)本身,而是數(shù)據(jù)存放的地址。在MyISAM引擎中的主索引和輔助索引沒有什么大區(qū)別,只是主索引中的key一定得是唯一的。這里的索引都是非聚簇索引。

    MyISAM還采用壓縮機(jī)制存儲索引,比如,第一個(gè)索引為“her”,第二個(gè)索引為“here”,那么第二個(gè)索引會被存儲為“3,e”,這樣的缺點(diǎn)是同一個(gè)節(jié)點(diǎn)中的索引只能采用順序查找。

    3.聯(lián)合索引:(最左前綴原理)

    ? 又稱復(fù)合索引,Mysql從左到右的使用索引中的字段,一個(gè)查詢可以只使用索引中的一部份,但只能是最左側(cè)部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3種組合進(jìn)行查找,但不支持 b,c進(jìn)行查找 .當(dāng)最左側(cè)字段是常量引用時(shí),索引就十分有效

    ? 聯(lián)合索引(復(fù)合索引)

    ? 聯(lián)合索引相對于一般索引只有一個(gè)字段,聯(lián)合索引可以為多個(gè)字段創(chuàng)建一個(gè)索引。它的原理也很簡單,比如,我們在(a,b,c)字段上創(chuàng)建一個(gè)聯(lián)合索引,則索引記錄會首先按照A字段排序,然后再按照B字段排序然后再是C字段,因此,聯(lián)合索引的特點(diǎn):

    • 第一個(gè)字段一定是有序的

    • 當(dāng)?shù)谝粋€(gè)字段值相等的時(shí)候,第二個(gè)字段又是有序的,比如下表中當(dāng)A=2時(shí)所有B的值是有序排列的,依次類推,當(dāng)同一個(gè)B值得所有C字段是有序排列的

      | A | B | C |
      | 1 | 2 | 3 |
      | 1 | 4 | 2 |
      | 1 | 1 | 4 |
      | 2 | 3 | 5 |
      | 2 | 4 | 4 |
      | 2 | 4 | 6 |
      | 2 | 5 | 5 |

      其實(shí)聯(lián)合索引的查找就跟查字典是一樣的,先根據(jù)第一個(gè)字母查,然后再根據(jù)第二個(gè)字母查,或者只根據(jù)第一個(gè)字母查,但是不能跳過第一個(gè)字母從第二個(gè)字母開始查。這就是所謂的最左前綴原理。

    4.哈希索引
    哈希索引(hash index)基于哈希表實(shí)現(xiàn),只有精確匹配索引所有列的查詢才有效。對于每一行數(shù)據(jù),存儲引擎都會對所有的索引列計(jì)算一個(gè)哈希碼(hash code),哈希碼是一個(gè)較小的值,并且不同鍵值的行計(jì)算出來的哈希碼也不一樣。哈希索引將所有的哈希碼存儲在索引中,同時(shí)在哈希表中保存指向每個(gè)數(shù)據(jù)行的指 針。哈希索引的限制:1.哈希索引只支持等值比較,包括=,<>,IN()。不支持任何范圍的查詢;2.哈希索引并不是按照索引值順序存儲的,所以也就無法用于排序;3。哈希索引只包含哈希值和行指針,而不存儲字段,所以不能使用索引的值來避免讀取行
    24.4 各索引的應(yīng)用

    除復(fù)合索引外,什么情況下索引被使用,什么情況下不會被使用

    • 建立索引的目的就是幫助查詢,如果查尋用不到則索引就沒有必要建立。
    • 如果表是經(jīng)常需要更新的也不適合做索引 。頻繁更新會導(dǎo)致索引也會頻繁更新,降低寫的效率。
    • 唯一性差的字段不適合創(chuàng)建索引。
    • 當(dāng)給一個(gè)字段創(chuàng)建了索引的話,而這個(gè)字段要進(jìn)行l(wèi)ike模糊查詢的話,那么這個(gè)值左邊不可以有%,因?yàn)樗饕樵兪且獜淖蟮接业?#xff0c;你如果給它加上%后,左邊的值不是確定的話,它會找不到這個(gè)索引。所以在使用like模糊查詢的時(shí)候,值得左邊不可以有%。
    • order by 不可以使用在索引當(dāng)中;
    • or 當(dāng)前后2個(gè)字段都有索引時(shí)才可以索引出來 否則不可以。
    • 如果數(shù)據(jù)表過大(5w以上)則有些字段(字符型長度超過(40))不適合作為索引。查詢大量數(shù)據(jù)時(shí),索引有效,但是慢

    場景:

    • 當(dāng)數(shù)據(jù)多而字段值有相同的值的時(shí)候建議使用非聚簇索引;
    • 當(dāng)數(shù)據(jù)多而字段值沒有重復(fù)的值的時(shí)候建議使用聚簇索引;
    • 當(dāng)有多個(gè)字段名都經(jīng)常被查詢的話建議使用復(fù)合索引;
    • 普通索引不支持空值,唯一索引支持空值;
    • 若是一張表的增刪改查較多而且查詢較少的話,則推薦不要?jiǎng)?chuàng)建引擎;
    • 不會出現(xiàn)在where條件中的字段不該建立索引;
    24.5 聚簇索引和非聚簇索引的區(qū)別:

    ?

    ? 注:聚簇索引中的每個(gè)葉子節(jié)點(diǎn)包含主鍵值、事務(wù)ID、回滾指針(rollback pointer用于事務(wù)和MVCC)和余下的列(如col2)。

    ? InnoDB的的二級索引的葉子節(jié)點(diǎn)存放的是KEY字段加主鍵值。因此,通過二級索引查詢首先查到是主鍵值,然后InnoDB再根據(jù)查到的主鍵值通過主鍵索引找到相應(yīng)的數(shù)據(jù)塊。

    24.6高效的索引策略
    • 查詢的列如果不是獨(dú)立的,那么Mysql不會使用索引。“獨(dú)立的列”指的是索引列不能是表達(dá)式的一部分,也不能是函數(shù)的參數(shù)。(例如:WHERE 后面的表達(dá)式不能有像prod + 1 = 5 這樣的表達(dá)式,必須獨(dú)立);
    • 選擇索引的列順序的法則:將選擇性最高的列放在索引最前列;
    24.7 案例分析

    ? 我們選擇將SEX以及COUNTRY作為索引,雖然這兩個(gè)變量的選擇性不高,但是可能很多查詢會用到,還有,即使用戶查詢沒有使用SEX列,也可以通過

    ? 在查詢條件中新增AND SEX IN(‘m’,‘f’)來讓Mysql選擇該索引。這樣寫并不會過濾掉任何行;然后再考慮其他常見的WHERE條件的組合,像(SEX,

    ? country,age)上的索引,可能還需要(SEX,country,region, age)等這樣的組合索引,而如果想減少這樣的組合索引,可以使用前面的IN()的

    ? 技巧來避免同時(shí)需要像(SEX,country,region, age)和(SEX,country,age)這樣的索引;對于那些生僻的搜索條件,則可以忽略它們,讓Mysql

    ? 多掃描一些額外的行即可

    25 數(shù)據(jù)庫設(shè)計(jì)的三大范式及ER圖四個(gè)成分

    25.1 概念
    • 設(shè)計(jì)關(guān)系數(shù)據(jù)庫時(shí),遵從不同的規(guī)范要求,設(shè)計(jì)出合理的關(guān)系型數(shù)據(jù)庫,這些不同的規(guī)范要求被稱為不同的范式,各種范式呈遞次規(guī)范,越高的范式數(shù)據(jù)庫冗余越小。
    • 數(shù)據(jù)庫的實(shí)體屬性和關(guān)系:實(shí)體(表),屬性(表中的數(shù)據(jù)),關(guān)系(各個(gè)表之間的關(guān)系);
    • 第一范式:當(dāng)關(guān)系模式R的所有屬性不能再被分解成更基本的數(shù)據(jù)單位(原子性)時(shí),則稱R滿足第一范式(1NF);
    • 第二范式:如果關(guān)系模式R滿足第一范式,并且R的所有非主屬性都完全依賴于R的每一個(gè)候選關(guān)鍵屬性,稱R滿足第二范式,簡記為2NF;
    • 第三范式:設(shè)R是一個(gè)滿足第一范式條件的關(guān)系模式,X是R的任意屬性集,如果X非傳遞依賴于R的任意一個(gè)候選關(guān)鍵字,稱R滿足第三范式,簡記為3NF;
    25.2 第一范式

    ? 1.每一列的屬性都是不可再分的屬性值,確保每一列的原子性(例如:聯(lián)系人的電話,郵箱等等都是不可再分的屬性);

    ? 2.對兩列相近的屬性,盡量進(jìn)行合并,(例如:可以將聯(lián)系人的所在省份,城市等合并成地址);

    25.3 第二范式

    ? 1.滿足1NF后,要求表的所有列都必須依賴于主鍵,而不能有任何一列與主鍵無關(guān),及一張表描述一件事;

    ? 2.例如:訂單只描述訂單的信息,所有的字段都與訂單的id有關(guān),就不能出現(xiàn)像產(chǎn)品信息這樣的與訂單無關(guān)的數(shù)據(jù);

    ? 3.還有像一個(gè)人提交了多份訂單,則在訂單中就會出現(xiàn)該聯(lián)系人信息過多重復(fù)的情況,此時(shí)可以將該聯(lián)系人的編號提出來,和該聯(lián)系人的具體信息分開在 兩張表上,才不會造成數(shù)據(jù)冗雜;

    25.4 第三范式

    ? 1.第三范式需要確保數(shù)據(jù)表中的每一列數(shù)據(jù)都和主鍵存在直接相關(guān),而不能是間接相關(guān);

    ? 2.比如說:Student表(學(xué)號,姓名,年齡,性別,所在院校,院校地址,院校電話)這樣一個(gè)表結(jié)構(gòu),就存在上述關(guān)系。 學(xué)號–> 所在院校 --> (院校地 址,院校電話) 這樣的表結(jié)構(gòu),我們應(yīng)該拆開來,如下,(學(xué)號,姓名,年齡,性別,所在院校)–(所在院校,院校地址,院校電話);

    ? 3.再比如說:對于一份訂單而言,我們需要知道的是訂單號,訂單數(shù)目,賣家等,而不需要將客戶的信息添加上去,至少需要一個(gè)客戶的訂單號即可直接 與客戶信息進(jìn)行連接;

    ?

    25.5 ER圖的四個(gè)成分

    ? 在ER圖中有如下四個(gè)成分:

    ? 矩形框:表示實(shí)體,在框中記入實(shí)體名。(譬如:公司,廠商等)

    ? 菱形框:表示聯(lián)系,在框中記入聯(lián)系名。(譬如:屬于,擁有等)

    ? 橢圓形框:表示實(shí)體或聯(lián)系的屬性,將屬性名記入框中。對于主屬性名,則在其名稱下劃一下劃線。(譬如:廠家地址,公司代碼等)

    ? 連線:實(shí)體與屬性之間;實(shí)體與聯(lián)系之間;聯(lián)系與屬性之間用直線相連,并在直線上標(biāo)注聯(lián)系的類型。(對于一對一聯(lián)系,要在兩個(gè)實(shí)體連線方向各寫 1; 對于一對多聯(lián)系,要在一的一方寫1,多的一方寫N;對于多對多關(guān)系,則要在兩個(gè)實(shí)體連線方向各寫N,M。)

    總結(jié)

    以上是生活随笔為你收集整理的《Mysql》必知必会读书笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。