MySQL學(xué)習(xí)day-34:子查詢與分頁

一、子查詢

可以將子查詢放在許多的 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ì)可以違反第三范式,增加冗余提高性能;

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

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