MySQL - DDL操作(庫/表操作)
MySQL自帶的資料庫
先來看MySQL中自帶的庫有哪些:
各庫解釋如下:
-
information_schema
,虛擬庫,不佔用磁碟空間,儲存的是資料庫啟動後的一些引數,如使用者表資訊、列資訊、許可權資訊、字元資訊等。 -
performance_schema
, MySQL 5.5開始新增一個數據庫,主要用於收集資料庫伺服器效能引數,記錄處理查詢請求時發生的各種事件、鎖等現象 。 -
mysql
,授權庫,主要儲存系統使用者的許可權資訊。 -
sys
庫所有的資料來源來自performance_schema
,目標是把performance_schema
的把複雜度降低,讓DBA能更好的閱讀這個庫裡的內容。讓DBA更快的瞭解資料庫的執行情況。 -
test
,MySQL資料庫系統自動建立的測試資料庫。test庫在MySQL中特殊存在,一般部署完mysql後應當刪除該庫,並規定不能建立以test
和test_
字元開頭的資料庫。因為在MySQL中,test庫對任意使用者都有管理員許可權,因此,線上資料庫不要用test。如果已有test,新增使用者時想要禁止對test庫的許可權,可以在mysql.db表中新增這個新使用者,禁止所有許可權,或者刪除該表中user為空的記錄,並重新整理許可權select * from mysql.db where db='test' \G ;
建立資料庫
建立資料庫語法
一般的,在MySQL中,關鍵字等資訊推薦大寫.......
資料庫的命名規範
- 可以由字母、數字、下劃線、@、#、$組成。
- 區分大小寫,庫名不能大寫,也不建議以大寫字母開頭。
- 首字母不能是數字。
- 資料庫名具有唯一性,也就是不能重名。
- 應該避開關鍵字,如select等。
- 不能單獨使用數字。
- 最長不超過128位。
- 一般庫名應該和業務相關。
- 也不要建立以
test
火test_
開頭的資料庫,原因在前面說過了。
關於字符集
在MySQL中,資料庫預設的字符集是拉丁語:
但我們用的更多的是utf8
或者是utf8mb4
,所以我們一般在建立資料庫庫的時候還需要指定字符集:
關於utf8和utf8mb4的區別
CREATE DATABASE creates a database with the given name. To use this statement, you need the CREATE privilege for the database. CREATE SCHEMA is a synonym for CREATE DATABASE.
MySQL在 5.5.3 之後增加了 utf8mb4
字元編碼,mb4即 most bytes 4。簡單說 utf8mb4 是 utf8 的超集並完全相容utf8,能夠用四個位元組儲存更多的字元。
但拋開資料庫,標準的 UTF-8 字符集編碼是可以用 1~4 個位元組去編碼21位字元,這幾乎包含了是世界上所有能看見的語言了。然而在MySQL裡實現的utf8最長使用3個位元組,也就是隻支援到了 Unicode 中的 (U 0000至U FFFF),包含了控制符、拉丁文,中、日、韓等絕大多數國際字元,但並不是所有,最常見的就算現在手機端常用的表情字元 emoji和一些不常用的漢字,如 “墅” ,這些需要四個位元組才能編碼出來。
注:QQ裡面的內建的表情不算,它是通過特殊對映到的一個gif圖片。一般輸入法自帶的就是。
也就是當你的資料庫裡要求能夠存入這些表情或寬字元時,可以把欄位定義為 utf8mb4,同時要注意連線字符集也要設定為utf8mb4,否則在 下會出現 Incorrect string value: /xF0/xA1/x8B/xBE/xE5/xA2… for column 'name'
這樣的錯誤,非嚴格模式下此後的資料會被截斷。
create database & create schema
你在一些地方,可能會看到如下建庫語句:
不要迷惑,關於create database
和create schema
語句,在MySQL中是等價的;下面摘自的解釋:
CREATE DATABASE creates a database with the given name. To use this statement, you need the CREATE privilege for the database. CREATE SCHEMA is a synonym for CREATE DATABASE.
刪除
生產中禁止刪庫~
修改
注意,修改字符集時,修改後的字符集一定是原字符集的嚴格超集。
檢視資料庫
表操作
MySQL中的表你可以理解為是一個有嚴格規範的excel表格:
表中的id
、name
、age
、gender
是欄位,其餘每一行稱為記錄。
建立表
基本語法:
注意:
- 在同一張表中,欄位名是不能相同。
- 寬度和約束條件可選。
- 欄位名和型別是必須的。
示例:
USE
語句相當於進入一個目錄,然後CREATE TABLE
語句相當於建立一個excel表格,然後再這個表格中,針對每個欄位有不同的規定和註釋,最後再指定這個表格的檔案系統(儲存引擎)和字元編碼。
注意,最後一個欄位後無需跟逗號。
USE
語句相當於進入一個目錄,然後CREATE TABLE
語句相當於建立一個excel表格,然後再這個表格中,針對每個欄位有不同的規定和註釋,最後再指定這個表格的檔案系統(儲存引擎)和字元編碼。
注意,最後一個欄位後無需跟逗號。
建表規範
- 表名小寫
- 不能是數字開頭
- 注意字符集和儲存引擎
- 表名和業務有關
- 選擇合適的資料型別
- 每個列都要有註釋
- 每個列設定為非空,無法保證非空,用0來填充
查看錶結構
首先,我們應該進入某個資料庫中use database_name;
刪除
注意,生產中禁止使用
修改
不知道好過知道
複製表
最後,再來看看複製表相關的操作:
- 複製一份一摸一樣的表:
- 建立一個表,複製另一張表的指定欄位和記錄。
- 建立一個表,複製另一張表的指定欄位和記錄,但是建立的表字段又想不跟被複製表欄位不一致:
記錄操作(DML)
現在,就要對錶中的記錄進行增刪改這些操作了。
還是那張表:
insert
update
首先來說一個不要輕易使用的命令,即對指定欄位進行全表更新:
經過set之後,全表的sname都會變成李四,如果資料量較大,非常影響效能。
根據條件更新:
條件選擇一般選擇具有唯一性的,如果條件不唯一,則所有符合條件的記錄都將受影響,如:
注意,update必須要加where條件,而且操作要慎重。
delete
危險命令!
注意,delete命令刪除是邏輯刪除,不會釋放磁碟空間!
現在我們再說另一條命令:
truncate
命令清空表後會釋放磁碟空間。
小結:
delete
命令(DML操作)只是在邏輯層面刪除了記錄,但是佔用的磁碟空間並沒有釋放;另外該表的建表結構還在。truncate
命令(DDL操作)清空表的資料頁,保留表的建表結構。drop
刪表操作就是邏輯和磁碟上都會刪除。
為了解決delete的缺點,我們採用偽刪除來解決,即使用update來代替delete,思路是為表新增一個狀態欄位,如果有需要刪除的,就改下狀態,後續的查詢也根據狀態來檢視: