1. 程式人生 > 資料庫 >MySQL - DDL操作(庫/表操作)

MySQL - DDL操作(庫/表操作)

MySQL自帶的資料庫

先來看MySQL中自帶的庫有哪些:

 

 

 各庫解釋如下:

  • information_schema,虛擬庫,不佔用磁碟空間,儲存的是資料庫啟動後的一些引數,如使用者表資訊、列資訊、許可權資訊、字元資訊等。

  • performance_schema, MySQL 5.5開始新增一個數據庫,主要用於收集資料庫伺服器效能引數,記錄處理查詢請求時發生的各種事件、鎖等現象 。

  • mysql,授權庫,主要儲存系統使用者的許可權資訊。

  • sys庫所有的資料來源來自performance_schema,目標是把performance_schema的把複雜度降低,讓DBA能更好的閱讀這個庫裡的內容。讓DBA更快的瞭解資料庫的執行情況。

  • test,MySQL資料庫系統自動建立的測試資料庫。test庫在MySQL中特殊存在,一般部署完mysql後應當刪除該庫,並規定不能建立以testtest_字元開頭的資料庫。因為在MySQL中,test庫對任意使用者都有管理員許可權,因此,線上資料庫不要用test。如果已有test,新增使用者時想要禁止對test庫的許可權,可以在mysql.db表中新增這個新使用者,禁止所有許可權,或者刪除該表中user為空的記錄,並重新整理許可權

    select * from mysql.db where db='test' \G ;

建立資料庫

建立資料庫語法

 

 

一般的,在MySQL中,關鍵字等資訊推薦大寫.......

資料庫的命名規範

  • 可以由字母、數字、下劃線、@、#、$組成。
  • 區分大小寫,庫名不能大寫,也不建議以大寫字母開頭。
  • 首字母不能是數字。
  • 資料庫名具有唯一性,也就是不能重名。
  • 應該避開關鍵字,如select等。
  • 不能單獨使用數字。
  • 最長不超過128位。
  • 一般庫名應該和業務相關。
  • 也不要建立以testtest_開頭的資料庫,原因在前面說過了。

關於字符集

在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 databasecreate 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表格:

 

 

 表中的idnameagegender是欄位,其餘每一行稱為記錄。

建立表

基本語法:

注意:

  1. 在同一張表中,欄位名是不能相同。
  2. 寬度和約束條件可選。
  3. 欄位名和型別是必須的。

示例:

USE語句相當於進入一個目錄,然後CREATE TABLE語句相當於建立一個excel表格,然後再這個表格中,針對每個欄位有不同的規定和註釋,最後再指定這個表格的檔案系統(儲存引擎)和字元編碼。

注意,最後一個欄位後無需跟逗號。

USE語句相當於進入一個目錄,然後CREATE TABLE語句相當於建立一個excel表格,然後再這個表格中,針對每個欄位有不同的規定和註釋,最後再指定這個表格的檔案系統(儲存引擎)和字元編碼。

注意,最後一個欄位後無需跟逗號。

建表規範

  1. 表名小寫
  2. 不能是數字開頭
  3. 注意字符集和儲存引擎
  4. 表名和業務有關
  5. 選擇合適的資料型別
  6. 每個列都要有註釋
  7. 每個列設定為非空,無法保證非空,用0來填充

查看錶結構

首先,我們應該進入某個資料庫中use database_name;

刪除

 

 

 注意,生產中禁止使用

修改

不知道好過知道

複製表

最後,再來看看複製表相關的操作:

  1. 複製一份一摸一樣的表:

  1. 建立一個表,複製另一張表的指定欄位和記錄。

 

 

  1. 建立一個表,複製另一張表的指定欄位和記錄,但是建立的表字段又想不跟被複製表欄位不一致:

記錄操作(DML)

現在,就要對錶中的記錄進行增刪改這些操作了。

還是那張表:

insert

update

首先來說一個不要輕易使用的命令,即對指定欄位進行全表更新:

經過set之後,全表的sname都會變成李四,如果資料量較大,非常影響效能。

根據條件更新:

 

 條件選擇一般選擇具有唯一性的,如果條件不唯一,則所有符合條件的記錄都將受影響,如:

 

 注意,update必須要加where條件,而且操作要慎重。

delete

危險命令!

注意,delete命令刪除是邏輯刪除,不會釋放磁碟空間!

現在我們再說另一條命令:

 

 truncate命令清空表後會釋放磁碟空間。

小結:

  • delete命令(DML操作)只是在邏輯層面刪除了記錄,但是佔用的磁碟空間並沒有釋放;另外該表的建表結構還在。
  • truncate命令(DDL操作)清空表的資料頁,保留表的建表結構。
  • drop刪表操作就是邏輯和磁碟上都會刪除。

為了解決delete的缺點,我們採用偽刪除來解決,即使用update來代替delete,思路是為表新增一個狀態欄位,如果有需要刪除的,就改下狀態,後續的查詢也根據狀態來檢視: