一、子查詢
可以將子查詢放在許多的 SQL 子句中,包括:WHERE 子句; HAVING 子句;FROM 子句。
使用子查詢的原則:
1)子查詢放在圓括號(hào)中。?
2)將子查詢放在比較條件的右邊。
3)在單行子查詢中用單行運(yùn)算符,在多行子查詢中用多行運(yùn)算符。
1.單行子查詢:
語法:select? 列名...? from 表名? where? 列名 運(yùn)算符(select查詢語句)
2.多行子查詢:
3.MySQL 中的正則表達(dá)式:
1)MySQL 中允許使用正則表達(dá)式定義字符串的搜索條件,性能要高于 like。
2)MySQL 中的正則表達(dá)式可以對整數(shù)類型或者字符類型檢索。
3)使用 REGEXP 關(guān)鍵字表示正則匹配。?
4)默認(rèn)忽略大小寫,如果要區(qū)分大小寫,使用 BINARY關(guān)鍵字。
(1)正則表達(dá)式的模式及其含義:
1)”^”:字符串的開始;
2)$:字符串的結(jié)尾;
3)’.’:任何一個(gè)字符;
4)[…]:在方括號(hào)內(nèi)的任何字符列表;
5)[^...]:非列在方括號(hào)內(nèi)的任何字符;
6)p1|p2|p3:交替匹配任何模式p1,p2或p3;
7)*:零個(gè)或多個(gè)前面的元素;
8)+:前面元素的一個(gè)或多個(gè)實(shí)例;
9){+}:前面的元素的n個(gè)實(shí)例;
10){m,n}:m到n個(gè)實(shí)例前面的元素。
二、索引
索引可以大大提高 MySQL 的檢索速度。
1.MySQL索引的類型:
普通索引;唯一索引;主鍵索引;組合索引;全文索引。
2.普通索引:
是最基本的索引,它沒有任何限制。創(chuàng)建索引時(shí),可以指定索引長度。length 為可選參數(shù),表示索引的長度,只有字符串 類型的字段才能指定索引長度,如果是 BLOB 和 TEXT 類型,必須指定 length。?
創(chuàng)建索引時(shí)需要注意: 如果指定單列索引長度,length 必須小于這個(gè)字段所允許的最大字符個(gè)數(shù)。
查詢索引:show index from? 表名;
(1)直接創(chuàng)建索引:create index 索引名 on 表名(列名(長度));
(2)修改表添加索引:alter table 表名 add index 索引名(列名(長度));
(3)創(chuàng)建表時(shí)指定索引列:index index_name(列名(長度)));
(4)刪除索引:drop index 索引名 on 表名;
3.唯一索引:
唯一索引與普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。
(1)創(chuàng)建唯一索引:create unique index 索引名 on 表名(列名(length));
(2)修改表添加唯一索引:alter table 表名 add unique 索引名(列名(length));
(3)創(chuàng)建表時(shí)指定索引列:unique index? 索引名(列名(length);
4.主鍵索引:
主鍵索引是一種特殊的唯一索引,一個(gè)表只能有一個(gè)主鍵,不允許有空值。一般是在建 表的時(shí)候同時(shí)創(chuàng)建主鍵索引。
(1)修改表添加的主鍵索引:alter table 表名 add primary key(列名);
(2)創(chuàng)建表時(shí)指定索引:primary key(列名);
5.組合索引:
組合索引是指使用多個(gè)字段創(chuàng)建的索引,只有在查詢條件中使用了創(chuàng)建索引時(shí)的第一個(gè) 字段,索引才會(huì)被使用(最左前綴原則)。
(1)修改添加組合索引:
alter table 表名 add index 索引名(列名(length),列名2(length));
(2) 創(chuàng)建表時(shí)創(chuàng)建組合索引:index 索引名(列名(length),列名(length));
6. 全文索引:
全文索引(FULLTEXTINDEX)主要用來查找文本中的關(guān)鍵字,而不是直接與索引中的值 相比較。 FULLTEXT 索引跟其它索引大不相同,它更像是一個(gè)搜索引擎,而不是簡單的 where 語句的參數(shù)匹配。FULLTEXT 索引配合 match against 操作使用,而不是一般的 where 語句 加 like。
(1)創(chuàng)建全文索引:
1)修改添加全文索引:alter table 表名 add fulltext 索引名(content);
2)創(chuàng)建表時(shí)創(chuàng)建全文索引:FULLTEXTindex_name (column);
(2)刪除全文索引:
drop 索引名 on 表名|alter table 表名 drop 索引名;
(3)使用全文索引:
全 文 索 引 的 使 用 與 其 他 索 引 不 同 。 在 查 詢 語 句 中 需 要 使 用 match(column) against(‘content’) 來檢索數(shù)據(jù)。
語法:SELECT 投影列 FROM 表名 WHEREMATCH(全文索引列名)AGAINST(‘搜索內(nèi)容’);
三、用戶管理:
MySQL 是一個(gè)多用戶的數(shù)據(jù)庫系統(tǒng),按權(quán)限,用戶可以分為兩種:root 用戶,超級(jí)管 理員,和由 root 用戶創(chuàng)建的普通用戶。
1.MySQL創(chuàng)建用戶:
CREATE USER 用戶名? IDENTIFIED? BY '密碼';
(1)查看用戶:
SELECT USER,NOST FROM? 用戶名(該表位于 mysql 庫中);
(2)刪除用戶:
DROPUSERusername@localhost;
2.分配權(quán)限:
新用戶創(chuàng)建完后是無法登陸的,需要分配權(quán)限。
GRANT 權(quán)限 ON 數(shù)據(jù)庫.表 TO 用戶名@登錄主機(jī) IDENTIFIEDBY"密碼";
(1)權(quán)限列表:
1)ALTER: 修改表和索引。?
2)CREATE: 創(chuàng)建數(shù)據(jù)庫和表。?
3)DELETE: 刪除表中已有的記錄。?
4)DROP: 刪除數(shù)據(jù)庫和表。?
5)INDEX: 創(chuàng)建或刪除索引。?
6)INSERT: 向表中插入新行。?
7)SELECT: 檢索表中的記錄。?
8)UPDATE: 修改現(xiàn)存表記錄。
9)ALL: 所有權(quán)限,ALLPRIVILEGES 同義詞。
3.通過 Navicat 工具管理用戶:
(1)創(chuàng)建用戶:
(2)分配權(quán)限:
(3)連接數(shù)據(jù)庫:
四、MySQL 分頁查詢:
MySQL 分頁查詢原則:
1)在 MySQL 數(shù)據(jù)庫中使用 LIMIT 子句進(jìn)行分頁查詢。
2)MySQL 分頁中開始位置為 0。
3)分頁子句在查詢語句的最后側(cè)。
1.limit子句:
語法格式:
SELECT 投影列 FROM 表名 WHERE 條件 ORDER BY LIMIT 開始位置,查詢數(shù)量。
五、 MySQL 數(shù)據(jù)庫存儲(chǔ)引擎介紹
1.查看數(shù)據(jù)庫引擎:
SHOW ENGINES;
2. MySQL 數(shù)據(jù)庫引擎介紹:
(1)ISAM(IndexedSequentialAccessMethod):
ISAM 是一個(gè)定義明確且歷經(jīng)時(shí)間考驗(yàn)的數(shù)據(jù)表格管理方法,它在設(shè)計(jì)之時(shí)就考慮到數(shù) 據(jù)庫被查詢的次數(shù)要遠(yuǎn)大于更新的次數(shù)。因此,ISAM 執(zhí)行讀取操作的速度很快,而且不占 用大量的內(nèi)存和存儲(chǔ)資源。ISAM 的兩個(gè)主要不足之處在于,它不支持事務(wù)處理,也不能夠 容錯(cuò)。如果你的硬盤崩潰了,那么數(shù)據(jù)文件就無法恢復(fù)了。如果你正在把 ISAM 用在關(guān)鍵任 務(wù)應(yīng)用程序里,那就必須經(jīng)常備份你所有的實(shí)時(shí)數(shù)據(jù),通過其復(fù)制特性,MYSQL 能夠支持 這樣的備份應(yīng)用程序。
(2)MyISAM:
MyISAM 是 MySQL 的 ISAM 擴(kuò)展格式和缺省的數(shù)據(jù)庫引擎。除了提供 ISAM 里所沒有 的索引和字段管理的大量功能,MyISAM 還使用一種表格鎖定的機(jī)制,來優(yōu)化多個(gè)并發(fā)的 讀寫操作,其代價(jià)是你需要經(jīng)常運(yùn)行 OPTIMIZETABLE 命令,來恢復(fù)被更新機(jī)制所浪費(fèi)的 空間。MyISAM 還有一些有用的擴(kuò)展,例如用來修復(fù)數(shù)據(jù)庫文件的 MyISAMCHK 工具和用 來恢復(fù)浪費(fèi)空間的 MyISAMPACK 工具。MYISAM 強(qiáng)調(diào)了快速讀取操作,這可能就是為什 么 MySQL 受到了 WEB 開發(fā)如此青睞的主要原因:在 WEB 開發(fā)中你所進(jìn)行的大量數(shù)據(jù)操 作都是讀取操作。所以,大多數(shù)虛擬主機(jī)提供商和 INTERNET 平臺(tái)提供商只允許使用 MYISAM 格式。MyISAM 格式的一個(gè)重要缺陷就是不能在表損壞后恢復(fù)數(shù)據(jù)。 注意:MyISAM 引擎使用時(shí)必須經(jīng)常使用 OptimizeTable 命令清理空間;必須經(jīng)常備份 所有實(shí)時(shí)數(shù)據(jù)。工具有用來修復(fù)數(shù)據(jù)庫文件的 MyISAMCHK 工具和用來恢復(fù)浪費(fèi)空間的 MyISAMPACK 工具。
如果使用該數(shù)據(jù)庫引擎,會(huì)生成三個(gè)文件:
1) .frm:表結(jié)構(gòu)信息 ;
2).MYD:數(shù)據(jù)文件 ;
3).MYI:表的索引信息;
(3)InnoDB:
InnoDB 數(shù)據(jù)庫引擎都是造就MySQL 靈活性的技術(shù)的直接產(chǎn)品, 這項(xiàng)技術(shù)就是 MYSQL++ API。在使用 MYSQL 的時(shí)候,你所面對的每一個(gè)挑戰(zhàn)幾乎都源于 ISAM 和 MyISAM 數(shù)據(jù)庫 引擎不支持事務(wù)處理(transactionprocess)也不支持外鍵。盡管要比 ISAM 和 MyISAM 引擎 慢很多,但是 InnoDB 包括了對事務(wù)處理和外來鍵的支持,這兩點(diǎn)都是前兩個(gè)引擎所沒有的。 如前所述,如果你的設(shè)計(jì)需要這些特性中的一者或者兩者,那你就要被迫使用后兩個(gè)引擎中 的一個(gè)了。
MySQL 官方對 InnoDB 是這樣解釋的:InnoDB 給 MySQL 提供了具有提交、回滾和崩潰 恢復(fù)能力的事務(wù)安全(ACID 兼容)存儲(chǔ)引擎。
(4)innodb 與 myisam 區(qū)別:
1)InnoDB 支持事務(wù),MyISAM 不支持,對于 InnoDB 每一條 SQL 語言都默認(rèn)封裝成事 務(wù),自動(dòng)提交,這樣會(huì)影響速度,所以最好把多條 SQL 語言放在 begin 和 commit 之間,組 成一個(gè)事務(wù);?
2)InnoDB 支持外鍵,而 MyISAM 不支持。對一個(gè)包含外鍵的 InnoDB 表轉(zhuǎn)為 MYISAM 會(huì)失敗;?
3)InnoDB 是聚集索引,數(shù)據(jù)文件是和索引綁在一起的,必須要有主鍵,通過主鍵索引 效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然后再通過主鍵查詢到數(shù)據(jù)。因此, 主鍵不應(yīng)該過大,因?yàn)橹麈I太大,其他索引也都會(huì)很大。而 MyISAM 是非聚集索引,數(shù)據(jù) 文件是分離的,索引保存的是數(shù)據(jù)文件的指針。主鍵索引和輔助索引是獨(dú)立的。?
4)InnoDB 不保存表的具體行數(shù),執(zhí)行 select count(*) from table 時(shí)需要全表掃描。而 MyISAM 用一個(gè)變量保存了整個(gè)表的行數(shù),執(zhí)行上述語句時(shí)只需要讀出該變量即可,速度 很快; 5.Innodb 不支持全文索引,而 MyISAM 支持全文索引,查詢效率上 MyISAM 要高; (在 MySQL5.7 版本中已經(jīng)支持全文索引)。
如何選擇:
1)是否要支持事務(wù),如果要請選擇 innodb,如果不需要可以考慮 MyISAM
?2)如果表中絕大多數(shù)都只是讀查詢,可以考慮 MyISAM,如果既有讀寫也挺頻繁,請 使用 InnoDB。?
3)系統(tǒng)奔潰后,MyISAM 恢復(fù)起來更困難,能否接受;?
4)MySQL5.5 版本開始 Innodb 已經(jīng)成為 Mysql 的默認(rèn)引擎(之前是 MyISAM),說明其優(yōu) 勢是有目共睹的,如果你不知道用什么,那就用 InnoDB,至少不會(huì)差。
六、三大范式
1.引入三大范式:
(1) 必須保證數(shù)據(jù)庫設(shè)計(jì)的合理性?
1)數(shù)據(jù)庫設(shè)計(jì)關(guān)系整個(gè)系統(tǒng)的架構(gòu),關(guān)系到后續(xù)的開發(fā)效率和運(yùn)行效率;
2)數(shù)據(jù)庫的設(shè)計(jì)主要包含了設(shè)計(jì)表結(jié)構(gòu)和表之間的聯(lián)系。
(2)如何是合理數(shù)據(jù)庫?
1)結(jié)構(gòu)合理;
2)冗余較??;
3)盡量避免插入刪除修改異常;
(3)如何才能保證數(shù)據(jù)庫設(shè)計(jì)水平?
1)遵循一定的規(guī)則;
2)在關(guān)系型數(shù)據(jù)庫中這種規(guī)則就稱為范式;
(4)什么是范式(NF=?NormalForm)?
1)范式是符合某一種設(shè)計(jì)要求的總結(jié)。
2)要想設(shè)計(jì)一個(gè)結(jié)構(gòu)合理的關(guān)系型數(shù)據(jù)庫,必須滿足一定的范式 。
(5)范式的分類:
1)第一范式;第二范式;第三范式;Boyce?Codd范式=NCNF;由Boyce和Codd提出的; 比3NF又進(jìn)了一步;通常認(rèn)為是修正的第三范式.;第四范式;第五范式
2)各個(gè)范式是依次嵌套包含的;
3)范式越高,設(shè)計(jì)質(zhì)量越高,在現(xiàn)實(shí)設(shè)計(jì)中也越難實(shí)現(xiàn);
4)一般數(shù)據(jù)庫設(shè)計(jì),只要達(dá)到第三范式,即可避免異常的出現(xiàn);
2.第一范式:
最基本的范式;
1)數(shù)據(jù)庫表每一列都是不可分割的基本數(shù)據(jù)項(xiàng),同一列中不能有多個(gè)值;
2)簡單說就是要確保每列保持原子性;
3)第一范式的合理遵循需要根據(jù)系統(tǒng)的實(shí)際需求來定;
示例:
1)用戶表(用戶名,家庭地址);
2)用戶表(用戶名,省,城市,詳細(xì)地址);
3.第二范式:
1) 第二范式需要確保數(shù)據(jù)庫表中的每一列都和主鍵相關(guān),而不能只與主鍵的某一部分相關(guān)(主要針對聯(lián)合主鍵而言)。
2)即在一個(gè)數(shù)據(jù)庫表中只能保存一種數(shù)據(jù),不可以把多種數(shù)據(jù)保存在同一張數(shù)據(jù)庫表中。
示例:
學(xué)號(hào)和課程編號(hào)作為聯(lián)合主鍵;課程名稱只依賴于課程編號(hào),而和學(xué)號(hào)沒有關(guān)系。
4.第三范式:
1)確保數(shù)據(jù)表中的每一列數(shù)據(jù)都和主鍵直接相關(guān),而不能間接相關(guān);
2)屬性不依賴于其他非主屬性。
5.范式的優(yōu)缺點(diǎn):
(1)優(yōu)點(diǎn):
1)結(jié)構(gòu)合理;
2)冗余較?。?/p>
3)盡量避免插入刪除修改異常;
(2)缺點(diǎn):
1)性能降低;
2)多表查詢比單表查詢速度慢;
(3)數(shù)據(jù)庫表之間的關(guān)系:
1)一對一:學(xué)生和學(xué)生證;
2)一對多:學(xué)生和班級(jí);
3)多對多:學(xué)生和課程;
(4)總結(jié):
1)使用范式可以減少冗余,但是會(huì)降低性能;
2)特定表的的設(shè)計(jì)可以違反第三范式,增加冗余提高性能;