零散的MySQL基礎老是記不住?看這一篇就夠了!

前言

在平常開發中,一些不經常使用且又比較基礎的知識,過了一段時間以後,老是容易忘記或者變得有點模棱兩可。本篇主要記錄一些關於MySQL數據庫比較基礎的知識,以便往後快速查看。mysql

SQL命令

SQL命令分能夠分爲四組:DDL、DML、DCL和TCL。四組中包含的命令分別以下
img
(圖片來源見水印)sql

DDL

DDL是數據定義語言(Data Definition Language)的簡稱,它處理數據庫schemas和描述數據應如何駐留在數據庫中。數據庫

  • CREATE:建立數據庫及其對象(如表,索引,視圖,存儲過程,函數和觸發器)
  • ALTER:改變現有數據庫的結構
  • DROP:從數據庫中刪除對象
  • TRUNCATE:從表中刪除全部記錄,包括爲記錄分配的全部空間都將被刪除
  • COMMENT:添加註釋
  • RENAME:重命名對象

經常使用命令以下:數據庫設計

# 建表CREATE TABLE sicimike  (  id int(4) primary key auto_increment COMMENT '主鍵ID',  name varchar(10) unique,  age int(3) default 0,  identity_card varchar(18)  # PRIMARY KEY (id) // 也能夠經過這種方式設置主鍵  # UNIQUE KEY (name) // 也能夠經過這種方式設置惟一鍵  # key/index (identity_card, col1...) // 也能夠經過這種方式建立索引) ENGINE = InnoDB;# 設置主鍵alter table sicimike add primary key(id);# 刪除主鍵alter table sicimike drop primary key;# 設置惟一鍵alter table sicimike add unique key(column_name);# 刪除惟一鍵alter table sicimike drop index column_name;# 建立索引alter table sicimike add [unique/fulltext/spatial] index/key index_name (identity_card[(len)] [asc/desc])[using btree/hash]create [unique/fulltext/spatial] index index_name on sicimike(identity_card[(len)] [asc/desc])[using btree/hash]example: alter table sicimike add index idx_na(name, age);# 刪除索引alter table sicimike drop key/index identity_card;drop index index_name on sicimike;# 查看索引show index from sicimike;# 查看列desc sicimike;# 新增列alter table sicimike add column column_name varchar(30);# 刪除列alter table sicimike drop column column_name;# 修改列名alter table sicimike change column_name new_name varchar(30);# 修改列屬性alter table sicimike modify column_name varchar(22);# 查看建表信息show create table sicimike;# 添加表註釋alter table sicimike comment '表註釋';# 添加字段註釋alter table sicimike modify column column_name varchar(10) comment '姓名';

DML

DML是數據操縱語言(Data Manipulation Language)的簡稱,包括最多見的SQL語句,例如SELECTINSERTUPDATEDELETE等,它用於存儲,修改,檢索和刪除數據庫中的數據。ide

分頁函數

-- 查詢從第11條數據開始的連續5條數據select * from sicimike limit 10, 5
group by

默認狀況下,MySQL中的分組(group by)語句,不要求select返回的列,必須是分組的列或者是一個聚合函數。工具

若是select查詢的列不是分組的列,也不是聚合函數,則會返回該分組中第一條記錄的數據。對比下面兩條SQL語句,第二條SQL語句中,cname既不是分組的列,也不是以聚合函數的形式出現。因此在liming這個分組中,cname取的是第一條數據。性能

mysql> select * from c;+-----+-------+----------+| CNO | CNAME | CTEACHER |+-----+-------+----------+|   1 | 數學  | liming   ||   2 | 語文  | liming   ||   3 | 歷史  | xueyou   ||   4 | 物理  | guorong  ||   5 | 化學  | liming   |+-----+-------+----------+5 rows in set (0.00 sec)mysql> select cteacher, count(cteacher), cname from c group by cteacher;+----------+-----------------+-------+| cteacher | count(cteacher) | cname |+----------+-----------------+-------+| guorong  |               1 | 物理  || liming   |               3 | 數學  || xueyou   |               1 | 歷史  |+----------+-----------------+-------+3 rows in set (0.00 sec)
having

having關鍵字用於對分組後的數據進行篩選,功能至關於分組以前的where,不過要求更嚴格。過濾條件要麼是一個聚合函數( ... having count(x) > 1),要麼是出如今select後面的列(select col1, col2 ... group by x having col1 > 1)spa

多表更新設計

update tableA a inner join tableB b on a.xxx = b.xxx set a.col1 = xxx, b.col1 = xxx where ...

多表刪除

delete a, b from tableA a inner join tableB b on a.xxx = b.xxx where a.col1 = xxx and b.col1 = xxx

DCL

DCL是數據控制語言(Data Control Language)的簡稱,它包含諸如GRANT之類的命令,而且主要涉及數據庫系統的權限,權限和其餘控件。

  • GRANT :容許用戶訪問數據庫的權限
  • REVOKE:撤消用戶使用GRANT命令賦予的訪問權限

TCL

TCL是事務控制語言(Transaction Control Language)的簡稱,用於處理數據庫中的事務

  • COMMIT:提交事務
  • ROLLBACK:在發生任何錯誤的狀況下回滾事務

範式

數據庫規範化,又稱正規化、標準化,是數據庫設計的一系列原理和技術,以減小數據庫中數據冗餘,增進數據的一致性。關係模型的發明者埃德加·科德最先提出這一律念,並於1970年代初定義了第一範式、第二範式和第三範式的概念,還與Raymond F. Boyce於1974年共同定義了第三範式的改進範式——BC範式。
除外還包括針對多值依賴的第四範式,鏈接依賴的第五範式、DK範式和第六範式。

如今數據庫設計最多知足3NF,廣泛認爲範式太高,雖然具備對數據關係更好的約束性,但也致使數據關係表增長而令數據庫IO更易繁忙,原來交由數據庫處理的關係約束現更多在數據庫使用程序中完成。

第一範式

定義:數據庫中的全部字段(列)都是單一屬性,不可再分的。這個單一屬性由基本的數據類型所構成,如整型、浮點型、字符串等。

第一範式是爲了保證列的原子性。

img

上表不知足第一範式,其中的地址列是能夠再拆分的,能夠拆分紅省、市、區等

img

第二範式

定義:數據庫中的表不存在非關鍵字段對任一關鍵字字段的部分函數依賴

部分函數依賴是指存在着組合關鍵字中的某一關鍵字決定非關鍵字的狀況

第二範式在知足了第一範式的基礎上,消除非主鍵列對聯合主鍵的部分依賴

img

上面這張表中想要設置主鍵,只能是商品名稱和供應商名稱一塊兒組成聯合主鍵。可是價格和分類只依賴於商品名稱,供應商電話只依賴於供應商名稱,因此上面的表不知足第二範式,能夠改爲以下形式:

商品信息表

img

供應商信息表

img

商品-供應商關聯表

img

第三範式

定義:全部非主鍵屬性都只和候選鍵有相關性,也就是說非主鍵屬性之間應該是獨立無關的。

第三範式是在知足了第二範式的基礎上,消除列與列之間的傳遞依賴。

img

在上面的表中,商品的分類描述依賴分類,而分類依賴商品名稱,而不是分類描述直接依賴商品名稱。這樣就造成了傳遞依賴,因此不符合第三範式。能夠改爲以下形式

商品表

img

商品分類表

img

數據庫設計時,遵循範式和反範式一直以來是一個頗受爭議的問題。遵循範式對數據關係更好的約束性,而且減小數據冗餘,能夠更好地保證數據一致性。而反範式則是爲了得到更好地性能。因此範式仍是反範式並無明確的標準,適合本身業務場景的纔是最好的。

反範式設計時,須要考慮如下幾個問題,分別是插入異常、更新異常和刪除異常。

  • 插入異常:若是某個實體隨着另外一個實體的存在而存在,即缺乏某個實體是沒法表示這個實體,那麼這個表就存在插入異常。
  • 更新異常:若是更改表所對應的某個實體實例的單獨屬性時,須要將多行更新,那麼就說明這個表存在更新異常
  • 刪除異常:若是刪除表的某一行來表示某實體實例失效時,致使另外一個不一樣實體實例信息丟失,那麼這個表就存在刪除異常

以違反第二範式的表爲例

img

若是可樂第二製造廠這個供應商還沒有開始供貨,表中就不存在第二條記錄,也就沒法記錄供應商的電話,這樣就存在插入異常;若是須要把可樂的價格提升,須要更新表中的多條記錄,這樣就存在更新異常;若是刪除可樂第二製造廠的供貨信息,那麼該供應商的電話也就丟失了,這樣就存在刪除異常。

通常存在插入異常的表,都會存在更新異常和刪除異常。

橫表縱表

SQL腳本

# 橫表CREATE TABLE `table_h2z` (`name` varchar(32) DEFAULT NULL,`chinese` int(11) DEFAULT NULL,`math` int(11) DEFAULT NULL,`english` int(11) DEFAULT NULL) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;/*Data for the table `table_h2z` */insert  into `table_h2z`(`name`,`chinese`,`math`,`english`) values ('mike',45,43,87),('lily',53,64,88),('lucy',57,75,75);# 縱表CREATE TABLE `table_z2h` (  `name` varchar(32) DEFAULT NULL,  `subject` varchar(8) NOT NULL DEFAULT '',  `score` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;/*Data for the table `table_z2h` */insert  into `table_z2h`(`name`,`subject`,`score`) values ('mike','chinese',45),('lily','chinese',53),('lucy','chinese',57),('mike','math',43),('lily','math',64),('lucy','math',75),('mike','english',87),('lily','english',88),('lucy','english',75);

橫錶轉縱表

SELECT NAME, 'chinese' AS `subject`,  chinese AS `score` FROM table_h2zUNION ALLSELECT NAME, 'math' AS `subject`,  math AS `score` FROM table_h2zUNION ALLSELECT NAME, 'english' AS `subject`, english AS `score` FROM table_h2z

執行結果

+------+---------+-------+| name | subject | score |+------+---------+-------+| mike | chinese |    45 || lily | chinese |    53 || lucy | chinese |    57 || mike | math    |    43 || lily | math    |    64 || lucy | math    |    75 || mike | english |    87 || lily | english |    88 || lucy | english |    75 |+------+---------+-------+9 rows in set (0.00 sec)

縱錶轉橫表

SELECT NAME, SUM(CASE `subject` WHEN 'chinese' THEN score ELSE 0 END) AS chinese, SUM(CASE `subject` WHEN 'math' THEN score ELSE 0 END) AS math, SUM(CASE `subject` WHEN 'english' THEN score ELSE 0 END) AS englishFROM table_z2hGROUP BY NAME

執行結果

+------+---------+------+---------+| name | chinese | math | english |+------+---------+------+---------+| lily |      53 |   64 |      88 || lucy |      57 |   75 |      75 || mike |      45 |   43 |      87 |+------+---------+------+---------+3 rows in set (0.00 sec)
本文由博客羣發一文多發等運營工具平臺 OpenWrite 發佈
相關文章
相關標籤/搜索