MySQL8.0筆記
CONTENT
MySQL
1. MySQL 8的安裝,升級和新特性()
2. 資料庫操作
2.1 操作資料庫
##顯示當前已經存在的資料庫
SHOW DATABASES;
##建立名為database_name的資料庫
CREATE DATABASE database_name;
##選擇資料庫
USE database_name;
##刪除資料庫
DROP DATABASE database_name;
2.2 什麼是儲存引擎
##首先確定資料庫管理系統所支援的儲存引擎
SHOW ENGINES;
##也可以通過下列語句進行查詢
SHOW ENGINES \G;
##或者
SHOW VARIABLES LIKE 'have%';
##建立表時,若沒有指定儲存引擎,表的儲存引擎為預設的儲存引擎
##檢視預設儲存引擎
SHOW VARIABLES LIKE 'default_storage_engine';
##修改預設儲存引擎(以修改為NyISAM為例,修改後通過查詢語句驗證)
SET DEFAULT_STORAGE_ENGINE=MyISAM;
查詢資料庫管理系統所支援的儲存引擎得到各引數意義:
- Engine引數表示儲存引擎名稱
- Suppor引數表示MySQL資料庫管理系統是否支援該儲存引擎
- DEFAULT表示系統預設支援的儲存引擎
- Comment引數表示對儲存引擎的評論
- Transactions引數表示儲存引擎是否支援事務
- XA引數表示儲存引擎所支援的分散式是否符合XA規範
- Savepoints引數表示儲存引擎是否指出事務處理的儲存點
檢視預設儲存引擎得到的各引數的意義
- Variable_name引數表示儲存引擎的名字
- Value引數表示MySQL資料庫管理系統是否支援儲存引擎,YES:支援,NO:不支援,DISABLE:支援但還未開始
2.3 選擇儲存引擎
特性 | InnoDB | MyISAM | MENMORY |
---|---|---|---|
事務安全 | 支援 | 無 | 無 |
儲存顯示 | 64TB | 有 | 有 |
空間使用 | 高 | 低 | 低 |
記憶體使用 | 高 | 低 | 高 |
插入資料的速度 | 低 | 高 | 高 |
鎖機制 | 行鎖 | 表鎖 | 表鎖 |
對外來鍵的支援 | 支援 | 無 | 無 |
資料可壓縮 | 無 | 支援 | 無 |
批量插入速度 | 低 | 高 | 高 |
在同一個資料庫中,不同的表可以使用不同的儲存引擎:如果一個表要求較高的事務處理,可以選擇InnoDB;如果一個表會被頻繁查詢,可以選擇MyISAM儲存引擎;如果時一個用於查詢的臨時表,那麼可以選擇MEMORY儲存引擎。
3. 資料表操作
3.1 資料表的設計理念
表中資料庫物件:
- 列(Column):屬性列,建立時必須指定列的名字和資料型別。
- 索引(Index):根據資料庫表列建立起來的順序,提供了快速訪問資料的途徑且可監督表的資料,使其索引指向的列中的資料不重複。
- 觸發器(Trigger):使用者定義的事務的集合,當對一個表中的資料進行插入,更新或者刪除時,這組命令就會自動執行,累哦用來確保資料的完整性和安全性。
- 標準化和規範化:
- 第一正規化(1NF),確保每列保持原子性。
- 第二正規化(2NF),確保每列都和主鍵相關。
- 第三正規化(3NF),確保每列都和主鍵直接相關,而不是間接相關。
-
資料驅動
-
考慮各種變化
-
表和表的關係
資料庫裡表的關係有三種:一對一,一對多,多對多。
3.2 資料庫中的資料型別()
3.2.1 整數型別
整數型別 | 位元組數 | 無符號數的取值範圍 | 有符號數的取值範圍 |
---|---|---|---|
TINYINT | 1 | 0~225 | -128~127 |
SMALLINT | 2 | 0~65535 | -32768~32767 |
MEDIUMINT | 3 | 0~16777215 | -8388608~8388607 |
INT | 4 | 0~4294967295 | -2147483648~2147483647 |
INTEGER | 4 | 0~4294967295 | -2147483648~2147483647 |
BIGINT | 8 | 0~18446744073709551615 | -9223372036854775808~9223372036854775807 |
##使用命令HELP INT可以檢視INT的資料範圍
HELP INT;
如果資料插入超出了規定的範圍,就會插入失敗。
3.2.2 浮點數型別和定點數型別
型別 | 位元組數 | 負數的取值範圍 | 非負數的取值範圍 |
---|---|---|---|
FLOAT | 4 | -3.402823466E+38~-1.175494351E-38 | 0和1.175494351E-38~3.402823466E+38 |
DOUBLE | 8 | -1.7976931348623157E+308~-2.2250738585072014E-308 | 0和2.2250738585072014E-308~1.7976931348623157E+308 |
DECIMAL(M,D)或DEC(M,D) | M+2 | 同DOUBLE型別 | 同DOUBLE型別 |
3.2.3 日期與時間
型別 | 位元組數 | 取值範圍 | 零值 |
---|---|---|---|
YEAR | 1 | 1901~2155 | 0000 |
DATE | 4 | 1000-01~9999-12-31 | 0000:00:00 |
TIME | 3 | -838:59:59~838:59:59 | 00-00-00 |
DATETIME | 8 | 1000-01 00:00:00~9999-12-31 23:59:59 | 0000-00-00 00:00:00 |
TIMESTAMP | 4 | 197000101080001~2308011911407 | 00000000000000 |
通過函式NOW()可獲取系統當前時間(DATATIME或TIMESTAMP型別)
3.2.4 字串型別
3.2.5 二進位制型別
3.2.6 JSON型別以及MySQL 8 JSON增強
3.3 MySQL 8新特性:字符集與排序規則
3.4 建立表
建立表的語法形式
CREATE TABLE tablename(
屬性名 資料型別 [完整性約束條件],
屬性名 資料型別 [完整性約束條件],
......
屬性名 資料型別 [完整性約束條件]);
注意對資料庫操作前需要通過USE語句選擇資料庫。
建立帶JSON型別的表
3.5 查看錶結構
##DESCRIBE語句查看錶定義(table_name為所要檢視物件定義資訊的名字,DESCRIBE可縮寫為DESC)
DESCRIBE table_name;
##SHOW CREATE TABLE語句查看錶詳細定義
SHOW CREATE TABLE table_name;
3.6 刪除表
##可使用DROP TABLE語句刪除沒有被其他關聯的普通表
DROP TABLE table_name;
##刪除後可通過DESCRIBE語句驗證是否被刪除
3.7 修改表
3.7.1 修改表名
##修改表名通過ALTER TABLE語句實現
ALTER TABLE oldTablename [TO] newTablename;
##修改完成後同樣可以通過DESCRIBE語句進行驗證
3.7.2 增加欄位
##MySQL資料庫管理系統中通過下列SQL語句來實現新增欄位
##tablename為所要修改表的名稱,propName表示所要增加欄位的名稱,propType表示索要增加欄位儲存資料的資料類##型,pNameNew表示新增的欄位名,pNameOld表示已經存在的欄位名
##新增在所有欄位最後一個位置
ALTER TABLE tablename ADD propName propType;
##新增在表中第一個位置
ALTER TABLE tablename ADD propName propType FIRST;
##新增在pNameOld之後
ALTER TABLE tablename ADD pNameNew propType AFTER pNameOld;
##增加後可通過DESCRIBE語句驗證是否被刪除
3.7.3 刪除欄位
##刪除欄位通過SQL語句ALTER TABLE來實現
ALTER TABLE tablename DROP propName;
##刪除後可通過DESCRIBE語句驗證是否被刪除
3.7.4 修改欄位
##在MySQL中,ALTER TABLE語句可以實現修改欄位的操作
##修改欄位型別
ALTER TABLE tablename MODIFY porpName propType;
##修改欄位的名稱
ALTER TABLE tablename CHANGE pNameOld pNameNew pTypeOld;
##同時修改欄位名稱和型別
ALTER TABLE tablename CHANGE pNameOld pNameNew pTypeNew;
##修改欄位的順序(FIRST表示講欄位調整至表的的第一個位置,AFTER pName2表示將欄位調整至pName2欄位位置之後)
ALTER TABLE tablename MODIFY pName propName1 propType FIRST|AFTER pName2;
##修改後可以通過DESCRIBE語句進行驗證
3.8 操作表的約束
完整性約束是對欄位進行限制,要求使用者對該屬性進行的操作符合特定的要求,否則講不執行使用者的操作。
完整性約束條件
約束條件 | 說明 |
---|---|
PRIMARY KEY | 標識該屬性為該表的主鍵,可以唯一標識對應的元組 |
FOREIGN KEY | 標識該屬性為該表的外來鍵,是與之聯絡的某表的主鍵 |
NOT NULL | 標識該屬性不能為空 |
UNIQUE | 標識該屬性的值是唯一的 |
AUTO_INCREMENT | 標識該屬性的值自動增加,這是MySQL語句的特色 |
DEFAULT | 為該屬性設定預設值 |
3.8.1設定表字段的非空約束(NOT NULL,NK)
CREATE TABLE tablename(
propName propType NOT NULL,
...);
3.8.2設定表字段的預設值(DAFAULT)
##defaultValue為預設值,如果使用者插入的新記錄中該欄位為空值,那麼資料庫管理系統將會自動插入該預設值
CREATE TABLE tablename(
propName propType DEFAULT defaultValue,
...);
3.8.3 設定表字段唯一約束(UNIQUE,UK)
##設定UK約束後,若使用者插入的記錄在該欄位上的值與其他記錄在該欄位上的值重複,那麼資料庫管理系統將報錯
CREATE TABLE tablename(
propName propType UNIQUE,
...);
3.8.4 設定表字段的主鍵約束(PRIMARY,PK)
主鍵是表的以一個特殊欄位,能唯一標識該表中的每條資訊。主鍵用來標識每個記錄,每個記錄的主鍵值都不同。
主鍵的主要目的是幫助資料庫管理系統以最快的速度查詢到表的某一條資訊。主鍵必須滿足的條件就是主鍵必須是唯一的,表中任意兩條記錄的主鍵欄位的值笨呢個相同,並且是非空值。
主鍵可以是單一的欄位,也可以是多個欄位的組合。
- 單欄位主鍵
CREATE TABLE tablename(
propName propType PRIMARY KEY,
...);
##若想給某欄位的PK約束設定一個名字,可執行SQL語句CONSTRAINT(pk_name為設定的名字)
CREATE TABLE tablename(
propName propType,
...
CONSTRAINT pk_name PRIMARY KEY(propName));
- 多欄位主鍵
##主鍵由多個屬性組合而成,在屬性定義完之後統一設定主鍵
CREATE TABLE tablename(
propName1 propType1,
propName2 propType2,
...
[CONSTARINT pk_name] PRIMARY KEY(propName1,propName2));
3.8.5 設定表字段值自動增加(AUTO_INCREMENT)
AUTO_INCREMENT是MySQL唯一擴充套件的完整性約束,當向資料庫表中插入新記錄時,欄位上的值會自動生成唯一的ID,在設定該約束時,一個數據庫表中只能有一個欄位使用該約束且其資料型別必須是整數型別,由於生成的ID唯一,因此該欄位也經常會同時設定成PK主鍵。
CREATE TABLE tablename(
propName propType AUTO_INCREMENT,
...);
3.8.6 設定表字段的外來鍵約束(FOREIGN KEY,FK)
外來鍵是表的一個特殊欄位,外來鍵約束是為了保證多個表(通常為兩個表)之間的參照完整性,即構建兩個表的欄位之間的參照關係。
設定外來鍵的兩個表之間具有父子關係,即子表中某個欄位的值的取值範圍由父表決定,在具體設定FK約束時,設定FK約束的欄位必須依賴於資料庫中已經存在的父表的主鍵,同時外來鍵可以為空(NULL)。
##tablename_1是要設定外來鍵的表名,propName1_1是要設定外來鍵的欄位
##tablename_2是父表的名稱,propName2_1是父表中設定主鍵約束的欄位名
##FK_prop為設定的FK約束的名稱
CREATE TABLE tablename(
propName1_1 propType1_1,
propName1_2 propType1_2,
...
[CONSTRAINT FK_prop] FOREIGN KEY(propName1_1)
REFERENCES tablename_2(propName2_1));
4. 資料操作
4.1 插入資料記錄
##插入完整資料記錄
INSERT INTO tablename(field1,field2,field3,...,fieldn)
VALUES(value1,value2,value3,...,valuen);
##插入部分資料記錄,語句與上述相同,只需要將需要插入的fieldn列出並且valuen與之一一對應即可
##插入多條完整資料記錄
INSERT INTO tablename(field1,field2,field3,...,fieldn)
VALUES(value11,value12,value13,...,value1n),
VALUES(value21,value22,value23,...,value2n),
...
VALUES(valuem1,valuem2,valuem3,...,valuemn);
##另一種語法
INSERT INTO tablename
VALUES(value11,value12,value13,...,value1n),
(value21,value22,value23,...,value2n),
...
(valuem1,valuem2,valuem3,...,valuemn);
##插入多條部分資料記錄,結合插入多條完整記錄和插入部分資料記錄語法即可
##插入JSON結構的資料記錄
INSERT INTO tablename(jsonfield)
VALUES(jsonObjectValue);
##插入完成後可通過SELECT語句檢視是否插入
SELECT * FROM tablename;
4.2 更新資料記錄
##更新特定資料記錄(引數CONDITION指定更新滿足條件的特定資料記錄)
UPDATE tablename
SET field1=value1,field2=value2,field3=value3
WHERE CONDITION;
##更新所有資料記錄(引數CONDITION表示滿足表tablename中的所有資料記錄,或不使用關鍵字WHERE語句)
UPDATE tablename
SET field1=value1,field2=value2,field3=value3
WHERE CONDITION;
##更新JSON結構的資料記錄(colname為JSON型別的欄位,path為路徑,通常為美元符號加key的形式“$.key”,val為要新增的##新值,WHERE為條件語句)
UPDATE tablename
SET colname = JSON_REPLACE(colname,path,val)
WHERE CONDITION;
##更新完成後可通過SELECT語句檢視是否插入
SELECT * FROM tablename;
4.3 刪除資料記錄
##刪除特定資料記錄
DELETE FROM tablename
WHERE CONDITION;
##刪除所有資料記錄(引數CONDITION表示滿足表tablename中的所有資料記錄,或不使用關鍵字WHERE語句)
DELETE FROM tablename WHERE CONDITION;
##更新完成後可通過SELECT語句檢視是否插入
SELECT * FROM tablename;
5. 資料查詢
5.1 簡單查詢
SELECT語句的基本語法
##field1~fieldn引數表示需要查詢的欄位名;tablename引數表示表的名稱;CONDITION1表示查詢條件;
##fieldm引數表示按該欄位中的資料進行分組;CONDITION2引數表示滿足該表示式的資料才能輸出;
##fieldn引數指按該欄位中資料進行排序,排序方式由ASC(升序,預設引數)或DESC(降序)兩個引數指出。
SELECT field1 field2 ... fieldn
FROM tablename
[WHERE CONDITION1]
[GROUP BY fieldm [HAVING CONDITION2]]
[ORDER BY fieldn [ASC|DESC]]
5.1.1 查詢所有欄位資料
##列出表的所有列
SELECT field1,field2,...,fieldn FROM tablename;
##使用“*”,該方法同樣可以查詢查詢所有欄位資料
##“*”可以替代表中所有符號,但不夠靈活,只能按照表中欄位的給固定順序顯示,不能隨便改變欄位的順序
SELECT * FROM tablename;
5.1.2 查詢指定欄位資料
##語法與查詢所有欄位資料類似,但是隻需列出需要查詢的欄位名即可
SELECT field1,field2,...,fieldn FROM tablename;
5.1.3 DISTINCT查詢
##DISTINCT可以去掉查詢結果中重複的資料,實現查詢不重複資料
SELECT DISTINCT field1 field2 field3 ... fieldn
FROM tablename;
5.1.4 IN查詢
##IN用來實現判斷欄位的數值是否在指集合的條件查詢,若fieldm的值存在集合中,則該記錄會被查詢出來
##若需要查詢fieldm的值不在集合中的記錄,則在IN前面加上NOT即可
SELECT field1,field2,...,fieldn
FROM tablename WHERE fieldm IN(value1,value2,value3,...,valuen);
- 使用關鍵字IN時,若集合中存在NULL,則不會影響查詢結果,使用關鍵字NOT IN,若集合中存在NULL,則不會由任何結果。
5.1.5 BETWEEN AND查詢
##BETWEEN AND用於實現判斷欄位的數值是否在指定範圍內的條件查詢
##若需要查詢不符合範圍的資料記錄,在BETWEEN前加上NOT即可
SELECT field1,field2,...,fieldn
FROM tablename WHERE fildm BETWEEN minvalue AND maxvalue;
5.1.6 LIKE模糊查詢
##fieldn表示表中的欄位名字,通過關鍵字LIKE來判斷欄位field的值是否與value字串匹配,字串必須加上''或""
##若需要查詢不匹配的資料記錄,在LIKE前加上NOT即可
SELECT field1,field2,...,fieldn
FROM tablename WHERE fieldm LIKE value;
由於關鍵字LIKE可以實現模糊查詢,因此該關鍵字後面的字串引數除了可以使用完整的字串外,還可以包含萬用字元
符號 | 功能描述 |
---|---|
_ | 該萬用字元能匹配單個字元 |
% | 該萬用字元可以匹配任意長度的字串,既可以是0個字元,1個字元,也可以是很多字元 |
進行模糊查詢時將需要模糊查詢的部分放入字串中即可,如"…_…","…%…"。
##使用LIKE關鍵字查詢其他型別資料,如:查詢帶有數字9的所有記錄
SELECT name,English FROM score WHERE English LIKE '%9%';
##若匹配"%%",就表示查詢所有資料記錄
5.1.7 對查詢結果排序
##引數fieldm表示按照該欄位進行排序,ASC表示按升序進行排序(預設),DESC表示按照降序進行排序
SELECT field1,field2,field3,...,fieldn
FROM tablename ORDER BY fieldm [ASC|DESC];
##也可指定多個欄位進行排序
SELECT field1,field2,field3,...,fieldn
FROM tablename ORDER BY fieldm1 [ASC|DESC],fieldm2 [ASC|DESC];
5.1.8 簡單分組查詢
##MySQL提供了5個統計函式幫助使用者統計資料,具體使用時,先根據指定特定條件分組或針對表中所有記錄數,後統計計算。
##GROUP BY單獨使用時,預設查詢出每個分組中隨機的一條記錄
SELECT function()
FROM tablename WHERE CONDITION GROUP BY field;
##只進行簡單分組查詢
SELECT * FROM tablename WHERE CONDITION GROUP BY field;
5.1.9 統計分組查詢
##GROUP_CONCAT()可以實現顯示每個分組中的指定欄位,COUNT()可以顯示每個分組中資訊的個數
SELECT GROUP_CONCAT(field)
FROM tablename
WHERE CONDITION GROUP BY field;
5.2 聯合查詢
5.2.1 內連線查詢
##連線查詢實現方式一種是在FROM子句中利用逗號區分多個表,在WHERE子句中通過邏輯表示式來實現匹配條件從而實現表的連線
##另一種是ANSI連線語法形式,在FROM子句中使用"JOIN...ON"關鍵字,而連線條件寫在關鍵字ON子句中。(推薦)
##fieldn表示要查詢的欄位名源於tablename1和tablename2,INNER JOIN表示進行內連線,CONDITION表示進行匹配的條件
SELECT field1,field2,...,fieldn FROM tablename1
INNER JOIN tablename2 [INNER JOIN tablenamen] ON CONDITION;
##表名過長時可採用取表別名的方法方便操作
##tablenamen為表原來的名字,othertablename為新表名
SELECT field1,field2,...,fieldn [AS] otherfieldn
FROM tablename1 [AS] othertablename1,
...
tabelenamen [AS] othertablenamen;
內連線查詢可分為自連線,等值連線和不等連線
##自連線就是指表與其自身進行連線
##等值連線就是在關鍵字ON後的匹配條件中通過等於關係運算符(=)來實現等值條件
##不等連線就是在關鍵字ON後的匹配條件中通過除了等於關係運算符來實現不等條件外,還可以使用關係運算符,包含 “>”, ##“>=”,“<”,“<=”和“!=”等運算子號
5.2.2 外連線查詢()
5.2.3 合併查詢資料記錄()
5.2.4 子查詢()
6.索引
6.1 什麼是索引
索引是由資料庫表中的一列或多列組合而成,其作用是提高對錶中資料的查詢速度。
含義和特點
不同的存出引擎定義了每個表的最大索引數和最大索引長度。所有儲存引擎對每個表至少支援16個儲存引擎,總索引長度至少為256位元組。
索引有兩種儲存型別,包括B型數(BTREE)索引和雜湊(HASH)索引。InnoDB和MyISAM儲存引擎支援BTREE索引,MEMORY儲存引擎支援HASH索引和BTREE索引,預設為前者。
- 索引的優點是可以提高檢索資料的速度,對於有依賴關係的子表和父表聯合查詢時,可以提高查詢速度;使用分組和排序子句進行資料查詢時,同樣可以顯著節省查詢中分組和排序的時間。
- 索引的缺點是建立和維護索引需要耗費時間;索引需要佔用物理空間
- 索引可以提高查詢的速度,但是會影響插入記錄的速度,因為向有索引的表中插入記錄時,資料庫系統會按照索引進行排序而降低插入記錄速度,插入大量記錄時的速度影響更加明顯,這種情況下最好的辦法就是先刪除表中的索引,然後插入資料,插入完成後再建立索引。
分類
- 普通索引
- 唯一性索引
- 全文索引
- 單列索引
- 多列索引
- 空間索引
設計原則
- 選擇唯一性索引
- 為經常需要排序、分組和聯合操作的欄位建立索引
- 為經常作為查詢條件的欄位建立索引
- 限制索引的數目
- 儘量使用資料量少的索引
- 儘量使用字首來索引
- 刪除不再使用或者很少使用的索引