Linux下MySQL基礎及操作語法

上古南城發表於2021-08-09

什麼是MySQL?

  • MySQL是一種開源關聯式資料庫管理系統(RDBMS),它使用最常用的資料庫管理語言-結構化查詢語言(SQL)進行資料庫管理。MySQL是開源的,因此任何人都可以根據通用公共許可證下載並根據個人需要對其進行修改。它的速度,可靠性和適應性引起了人們的廣泛關注。大多數人認為,當不需要事務處理時,MySQL是管理內容的最佳選擇。MySQL是一個關聯式資料庫管理系統。關聯式資料庫將資料儲存在不同的表中,而不是將所有資料都放在一個大型倉庫中,這提高了速度和靈活性。
  • MySQL使用的SQL語言是用於訪問資料庫的最常用的標準化語言。MySQL軟體採用雙重授權策略,分為社群版本和商業版本。由於其體積小,速度快,總擁有成本低,尤其是開放原始碼的特性,通常中小型網站開發都選擇MySQL作為網站資料庫。
  • MySQL是一個開源資料庫:MySQL是一個開源資料庫,任何人都可以獲取該資料庫的原始碼。這樣,任何人都可以修復MySQL的缺陷,並且任何人都可以將資料庫用於任何目的。MySQL是可免費使用的資料庫。
  • MySQL的跨平臺:MySQL不僅可以在Windows作業系統上執行,而且可以在UNIX,Linux和Mac OS等作業系統上執行。由於許多網站選擇UNIX和Linux作為其網站伺服器,因此MySQL的跨平臺性質保證了它在Web應用程式中的優勢。儘管Microsoft的SQL Server資料庫是出色的商業資料庫,但它只能在Windows作業系統上執行。因此,MySQL資料庫的跨平臺性質是一個很大的優勢。
  • 價格優勢:MySQL資料庫是一個免費軟體。任何人都可以從MySQL的官方網站下載該軟體。這些MySQL的社群版本可免費試用。即使需要支付額外的功能,價格也非常便宜。與昂貴的商業軟體(例如Oracle,DB2和SQL Server)相比,MySQL具有絕對的價格優勢。
  • 功能強大且易於使用:MySQL是真正的多使用者,多執行緒SQL資料庫伺服器。它可以快速,有效和安全地處理大量資料。與Oracle之類的資料庫相比,MySQL的使用非常簡單。MySQL的主要目標是快速,健壯和易於使用。

 與常用的主流資料庫Oracle和SQL Server相比,MySQL的主要特點是它是免費的,可以在任何平臺上使用,佔用相對較小的空間。但是,MySQL也有一些缺點。例如,對於大型專案,MySQL的容量和安全性略遜於Oracle資料庫。

資料庫事務的特性(ACID):

  • A, atomacity 原子性 事務必須是原子工作單元;對於其資料修改,要麼全都執行,要麼全都不執行。通常,與某個事務關聯的操作具有共同的目標,並且是相互依賴的。如果系統只執行這些操作的一個子集,則可能會破壞事務的總體目標。原子性消除了系統處理操作子集的可能性。
  • C, consistency 一致性 事務將資料庫從一種一致狀態轉變為下一種一致狀態。也就是說,事務在完成時,必須使所有的資料都保持一致狀態(各種 constraint 不被破壞)。
  • I, isolation 隔離性 由併發事務所作的修改必須與任何其它併發事務所作的修改隔離。事務檢視資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會檢視中間狀態的資料。換句話說,一個事務的影響在該事務提交前對其他事務都不可見。
  • D, durability 永續性 事務完成之後,它對於系統的影響是永久性的。該修改即使出現致命的系統故障也將一直保持。

事物隔離級別:

  • 讀未提交(Read uncommitted):就是一個事務可以讀取另一個未提交事務的資料。
  • 讀提交(Read committed):就是一個事務要等另一個事務提交後才能讀取資料。
  • 重複讀(Repeatable read):重複讀是 Mysql 的預設隔離級,就是在開始讀取資料(事務開啟)時,不再允許修改操作。
  • Serializable 序列化:最高的事務隔離級別,在該級別下,事務序列化順序執行,可以避免髒讀、不可重複讀與幻讀。但是這種事務隔離級別效率低下,比較耗資料庫效能。

事物隔離的實現:

  • (1) 行級鎖   INNODB引擎
    • 行級鎖是Mysql中鎖定粒度最細的一種鎖,表示只針對當前操作的行進行加鎖。
    • 行級鎖能大大減少資料庫操作的衝突。其加鎖粒度最小,但加鎖的開銷也最大。行級鎖分為共享鎖 和 排他鎖。         
    • 特點:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。
  • (2) 表級鎖   MYISAM引擎
    • 表級鎖是MySQL中鎖定粒度最大的一種鎖,表示對當前操作的整張表加鎖,它實現簡單,資源消耗較少,
    • 被大部分MySQL引擎支援。最常使用的MYISAM與INNODB都支援表級鎖定。表級鎖定分為表共享讀鎖(共享鎖)與表獨佔寫鎖(排他鎖)。     
    • 特點:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發出鎖衝突的概率最高,併發度最低。
  • (3) 頁級鎖   BDB引擎
    • 頁級鎖是MySQL中鎖定粒度介於行級鎖和表級鎖中間的一種鎖。表級鎖速度快,但衝突多,行級衝突少,但速度慢。所以取了折衷的頁級,一次鎖定相鄰的一組記錄。       
    • 特點:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般

RDBMS 術語:

  • 資料庫: 資料庫是一些關聯表的集合。
  • 資料表: 表是資料的矩陣。在一個資料庫中的表看起來像一個簡單的電子表格。
  • 列: 一列(資料元素) 包含了相同型別的資料, 例如郵政編碼的資料。
  • 行:一行(=元組,或記錄)是一組相關的資料,例如一條使用者訂閱的資料。
  • 冗餘:儲存兩倍資料,冗餘降低了效能,但提高了資料的安全性。
  • 主鍵:主鍵是唯一的。一個資料表中只能包含一個主鍵。你可以使用主鍵來查詢資料。
  • 外來鍵:外來鍵用於關聯兩個表。
  • 複合鍵:複合鍵(組合鍵)將多個列作為一個索引鍵,一般用於複合索引。
  • 索引:使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構。類似於書籍的目錄。
  • 參照完整性: 參照的完整性要求關係中不允許引用不存在的實體。與實體完整性是關係模型必須滿足的完整性約束條件,目的是保證資料的一致性。

MySQL 為關係型資料庫(Relational Database Management System), 這種所謂的"關係型"可以理解為"表格"的概念, 一個關係型資料庫由一個或數個表格組成, 如圖所示的一個表格:

  

  • 表頭(header): 每一列的名稱;
  • 列(col): 具有相同資料型別的資料的集合;
  • 行(row): 每一行用來描述某條記錄的具體資訊;
  • 值(value): 行的具體資訊, 每個值必須與該列的資料型別相同;
  • 鍵(key): 鍵的值在當前列中具有唯一性。

SQL語句:對資料庫進行查詢和修改操作的語言叫SQL。在MySQL中輸入相關命令,MySQL軟體可以接受命令,並做出相應的操作。SQL是一種專門用來與資料庫通訊的語言。SQL語句包含以下4個部分

  • (1) 資料定義(DDL):CREATE(建立)、ALTER(修改)、DROP(刪除)。(?後跟命令可獲取幫助);主要用於資料庫元件,例如資料庫、表、索引、檢視、觸發器、事件排程器、儲存過程、儲存函式;
  • (2) 資料操作(DML):INSERT(增)、DELETE(刪)、UPDATE(改)、SELECT(查);CRUD(增刪改查)操作,主要用於操作表中的資料;每一種操作之前都要先查詢;
  • (3) 資料控制(DCL):GRANT(授權)、REVOKE(撤銷);授權使用者,登入主機地址許可權及撤銷許可權;

資料庫操作-思路圖:

MySQL資料型別:

索引的概述和優缺點和種類:
(1) 什麼是索引?

  • 索引是一種特殊的檔案(InnoDB資料表上的索引是表空間的一個組成部分),它們包含著對資料表裡所有記錄的引用指標。
  • 類比理解:資料庫中的索引相當於書籍目錄一樣,能加快資料庫的查詢速度。
  • 沒有索引的情況,資料庫會遍歷全部資料後選擇符合條件的選項。
  • 建立相應的索引,資料庫會直接在索引中查詢符合條件的選項。

(2) 索引的性質分類:

  • 索引分為聚集索引和非聚集索引兩種,聚集索引是索引中鍵值的邏輯順序決定了表中相應行的物理順序,而非聚集索引是不一樣。
  • 聚集索引能提高多行檢索的速度,而非聚集索引對於單行的檢索很快。

(3) 索引的優點:

  • 加快資料檢索速度 (建立索引主要原因)
  • 建立唯一性索引,保證資料庫表中每一行資料的唯一性
  • 加速表和表之間的連線
  • 使用分組和排序子句對資料檢索時,減少檢索時間
  • 使用索引在查詢的過程中,使用優化隱藏器,提高系統的效能

(4) 索引的缺點:

  • 建立索引和維護索引要耗費時間,時間隨著資料量的增加而增加
  • 索引需要佔用物理空間和資料空間
  • 表中的資料操作插入、刪除、修改, 維護資料速度下降

(5) 索引種類

  • 普通索引: 僅加速查詢
  • 唯一索引: 加速查詢 + 列值唯一(可以有null)
  • 主鍵索引: 加速查詢 + 列值唯一(不可以有null)+ 表中只有一個
  • 組合索引: 多列值組成一個索引,專門用於組合搜尋,其效率大於索引合併
  • 全文索引: 對文字的內容進行分詞,進行搜尋 (注意:目前僅有MyISAM引擎支援)

外來鍵約束(foreign key):

  • 外來鍵約束: foreign key 被約束的表叫做副表,外來鍵設定在副表上面,外來鍵引用主鍵欄位所在的表叫做主表. (作用:約束兩張表的資料)
  • 外來鍵定義語法: constraint 外來鍵約束名稱 foreign key(外來鍵欄位) references 主表名稱(引用欄位)

外來鍵資料操作:

  • 當有外來鍵約束之後,新增資料的時候,先新增主表資料,再新增副表資料
  • 當有了外來鍵約束,修改資料的時候,先改副表的資料,在修改主表的資料
  • 當有了外來鍵約束,刪除資料的時候,也是先刪除副表的資料,再刪除主表的資料

外來鍵注意事項:

  • 外來鍵約束只有InnoDB儲存引擎才支援.
  • 實際專案中往往會用到外來鍵的設計思想,但往往不會真正的從語法上進行外來鍵約束. 因為外來鍵約束的級聯操作可能會帶來一些現實的邏輯問題. 另外使用外來鍵會較低mysql的效率.

 語法及示例:

   1 /* 啟動MySQL */
   2 net start mysql
   3 
   4 /* 連線與斷開伺服器 */
   5 mysql -h 地址 -P 埠 -u 使用者名稱 -p 密碼
   6 
   7 /* 跳過許可權驗證登入MySQL */
   8 mysqld --skip-grant-tables
   9 -- 修改root密碼
  10 密碼加密函式password()
  11 update mysql.user set password=password('root');
  12 
  13 SHOW PROCESSLIST -- 顯示哪些執行緒正在執行
  14 SHOW VARIABLES --
  15 
  16 /* 資料庫操作 */ ------------------
  17 -- 檢視當前資料庫
  18     select database();
  19 -- 顯示當前時間、使用者名稱、資料庫版本
  20     select now(), user(), version();
  21 -- 建立庫
  22     create database[ if not exists] 資料庫名 資料庫選項
  23     資料庫選項:
  24         CHARACTER SET charset_name
  25         COLLATE collation_name
  26 -- 檢視已有庫
  27     show databases[ like 'pattern']
  28 -- 檢視當前庫資訊
  29     show create database 資料庫名
  30 -- 修改庫的選項資訊
  31     alter database 庫名 選項資訊
  32 -- 刪除庫
  33     drop database[ if exists] 資料庫名
  34         同時刪除該資料庫相關的目錄及其目錄內容
  35 
  36 /* 表的操作 */ ------------------
  37 -- 建立表
  38     create [temporary] table[ if not exists] [庫名.]表名 ( 表的結構定義 )[ 表選項]
  39         每個欄位必須有資料型別
  40         最後一個欄位後不能有逗號
  41         temporary 臨時表,會話結束時表自動消失
  42         對於欄位的定義:
  43             欄位名 資料型別 [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string']
  44 -- 表選項
  45     -- 字符集
  46         CHARSET = charset_name
  47         如果表沒有設定,則使用資料庫字符集
  48     -- 儲存引擎
  49         ENGINE = engine_name
  50         表在管理資料時採用的不同的資料結構,結構不同會導致處理方式、提供的特性操作等不同
  51         常見的引擎:InnoDB MyISAM Memory/Heap BDB Merge Example CSV MaxDB Archive
  52         不同的引擎在儲存表的結構和資料時採用不同的方式
  53         MyISAM表檔案含義:.frm表定義,.MYD表資料,.MYI表索引
  54         InnoDB表檔案含義:.frm表定義,表空間資料和日誌檔案
  55         SHOW ENGINES -- 顯示儲存引擎的狀態資訊
  56         SHOW ENGINE 引擎名 {LOGS|STATUS} -- 顯示儲存引擎的日誌或狀態資訊
  57     -- 資料檔案目錄
  58         DATA DIRECTORY = '目錄'
  59     -- 索引檔案目錄
  60         INDEX DIRECTORY = '目錄'
  61     -- 表註釋
  62         COMMENT = 'string'
  63     -- 分割槽選項
  64         PARTITION BY ... (詳細見手冊)
  65 -- 檢視所有表
  66     SHOW TABLES[ LIKE 'pattern']
  67     SHOW TABLES FROM 表名
  68 -- 檢視錶機構
  69     SHOW CREATE TABLE 表名    (資訊更詳細)
  70     DESC 表名 / DESCRIBE 表名 / EXPLAIN 表名 / SHOW COLUMNS FROM 表名 [LIKE 'PATTERN']
  71     SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern']
  72 -- 修改表
  73     -- 修改表本身的選項
  74         ALTER TABLE 表名 表的選項
  75         EG:    ALTER TABLE 表名 ENGINE=MYISAM;
  76     -- 對錶進行重新命名
  77         RENAME TABLE 原表名 TO 新表名
  78         RENAME TABLE 原表名 TO 庫名.表名    (可將表移動到另一個資料庫)
  79         -- RENAME可以交換兩個表名
  80     -- 修改表的欄位機構
  81         ALTER TABLE 表名 操作名
  82         -- 操作名
  83             ADD[ COLUMN] 欄位名        -- 增加欄位
  84                 AFTER 欄位名            -- 表示增加在該欄位名後面
  85                 FIRST                -- 表示增加在第一個
  86             ADD PRIMARY KEY(欄位名)    -- 建立主鍵
  87             ADD UNIQUE [索引名] (欄位名)-- 建立唯一索引
  88             ADD INDEX [索引名] (欄位名)    -- 建立普通索引
  89             ADD
  90             DROP[ COLUMN] 欄位名        -- 刪除欄位
  91             MODIFY[ COLUMN] 欄位名 欄位屬性        -- 支援對欄位屬性進行修改,不能修改欄位名(所有原有屬性也需寫上)
  92             CHANGE[ COLUMN] 原欄位名 新欄位名 欄位屬性        -- 支援對欄位名修改
  93             DROP PRIMARY KEY    -- 刪除主鍵(刪除主鍵前需刪除其AUTO_INCREMENT屬性)
  94             DROP INDEX 索引名    -- 刪除索引
  95             DROP FOREIGN KEY 外來鍵    -- 刪除外來鍵
  96 
  97 -- 刪除表
  98     DROP TABLE[ IF EXISTS] 表名 ...
  99 -- 清空表資料
 100     TRUNCATE [TABLE] 表名
 101 -- 複製表結構
 102     CREATE TABLE 表名 LIKE 要複製的表名
 103 -- 複製表結構和資料
 104     CREATE TABLE 表名 [AS] SELECT * FROM 要複製的表名
 105 -- 檢查表是否有錯誤
 106     CHECK TABLE tbl_name [, tbl_name] ... [option] ...
 107 -- 優化表
 108     OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
 109 -- 修復表
 110     REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]
 111 -- 分析表
 112     ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
 113 
 114 
 115 
 116 /* 資料操作 */ ------------------
 117 --
 118     INSERT [INTO] 表名 [(欄位列表)] VALUES (值列表)[, (值列表), ...]
 119         -- 如果要插入的值列表包含所有欄位並且順序一致,則可以省略欄位列表。
 120         -- 可同時插入多條資料記錄!
 121         REPLACEINSERT 完全一樣,可互換。
 122     INSERT [INTO] 表名 SET 欄位名=[, 欄位名=值, ...]
 123 --
 124     SELECT 欄位列表 FROM 表名[ 其他子句]
 125         -- 可來自多個表的多個欄位
 126         -- 其他子句可以不使用
 127         -- 欄位列表可以用*代替,表示所有欄位
 128 --
 129     DELETE FROM 表名[ 刪除條件子句]
 130         沒有條件子句,則會刪除全部
 131 --
 132     UPDATE 表名 SET 欄位名=新值[, 欄位名=新值] [更新條件]
 133 
 134 /* 字符集編碼 */ ------------------
 135 -- MySQL、資料庫、表、欄位均可設定編碼
 136 -- 資料編碼與客戶端編碼不需一致
 137 SHOW VARIABLES LIKE 'character_set_%'    -- 檢視所有字符集編碼項
 138     character_set_client        客戶端向伺服器傳送資料時使用的編碼
 139     character_set_results        伺服器端將結果返回給客戶端所使用的編碼
 140     character_set_connection    連線層編碼
 141 SET 變數名 = 變數值
 142     set character_set_client = gbk;
 143     set character_set_results = gbk;
 144     set character_set_connection = gbk;
 145 SET NAMES GBK;    -- 相當於完成以上三個設定
 146 -- 校對集
 147     校對集用以排序
 148     SHOW CHARACTER SET [LIKE 'pattern']/SHOW CHARSET [LIKE 'pattern']    檢視所有字符集
 149     SHOW COLLATION [LIKE 'pattern']        檢視所有校對集
 150     charset 字符集編碼        設定字符集編碼
 151     collate 校對集編碼        設定校對集編碼
 152 
 153 /* 資料型別(列型別) */ ------------------
 154 1. 數值型別
 155 -- a. 整型 ----------
 156     型別            位元組        範圍(有符號位)
 157     tinyint        1位元組    -128 ~ 127        無符號位:0 ~ 255
 158     smallint    2位元組    -32768 ~ 32767
 159     mediumint    3位元組    -8388608 ~ 8388607
 160     int            4位元組
 161     bigint        8位元組
 162 
 163     int(M)    M表示總位數
 164     - 預設存在符號位,unsigned 屬性修改
 165     - 顯示寬度,如果某個數不夠定義欄位時設定的位數,則前面以0補填,zerofill 屬性修改
 166         例:int(5)    插入一個數'123',補填後為'00123'
 167     - 在滿足要求的情況下,越小越好。
 168     - 1表示bool值真,0表示bool值假。MySQL沒有布林型別,通過整型0和1表示。常用tinyint(1)表示布林型。
 169 
 170 -- b. 浮點型 ----------
 171     型別                位元組        範圍
 172     float(單精度)        4位元組
 173     double(雙精度)    8位元組
 174     浮點型既支援符號位 unsigned 屬性,也支援顯示寬度 zerofill 屬性。
 175         不同於整型,前後均會補填0.
 176     定義浮點型時,需指定總位數和小數位數。
 177         float(M, D)        double(M, D)
 178         M表示總位數,D表示小數位數。
 179         M和D的大小會決定浮點數的範圍。不同於整型的固定範圍。
 180         M既表示總位數(不包括小數點和正負號),也表示顯示寬度(所有顯示符號均包括)。
 181         支援科學計數法表示。
 182         浮點數表示近似值。
 183 
 184 -- c. 定點數 ----------
 185     decimal    -- 可變長度
 186     decimal(M, D)    M也表示總位數,D表示小數位數。
 187     儲存一個精確的數值,不會發生資料的改變,不同於浮點數的四捨五入。
 188     將浮點數轉換為字串來儲存,每9位數字儲存為4個位元組。
 189 
 190 2. 字串型別
 191 -- a. char, varchar ----------
 192     char    定長字串,速度快,但浪費空間
 193     varchar    變長字串,速度慢,但節省空間
 194     M表示能儲存的最大長度,此長度是字元數,非位元組數。
 195     不同的編碼,所佔用的空間不同。
 196     char,最多255個字元,與編碼無關。
 197     varchar,最多65535字元,與編碼有關。
 198     一條有效記錄最大不能超過65535個位元組。
 199         utf8 最大為21844個字元,gbk 最大為32766個字元,latin1 最大為65532個字元
 200     varchar 是變長的,需要利用儲存空間儲存 varchar 的長度,如果資料小於255個位元組,則採用一個位元組來儲存長度,反之需要兩個位元組來儲存。
 201     varchar 的最大有效長度由最大行大小和使用的字符集確定。
 202     最大有效長度是65532位元組,因為在varchar存字串時,第一個位元組是空的,不存在任何資料,然後還需兩個位元組來存放字串的長度,所以有效長度是64432-1-2=65532位元組。
 203     例:若一個表定義為 CREATE TABLE tb(c1 int, c2 char(30), c3 varchar(N)) charset=utf8; 問N的最大值是多少? 答:(65535-1-2-4-30*3)/3
 204 
 205 -- b. blob, text ----------
 206     blob 二進位制字串(位元組字串)
 207         tinyblob, blob, mediumblob, longblob
 208     text 非二進位制字串(字元字串)
 209         tinytext, text, mediumtext, longtext
 210     text 在定義時,不需要定義長度,也不會計算總長度。
 211     text 型別在定義時,不可給default值
 212 
 213 -- c. binary, varbinary ----------
 214     類似於char和varchar,用於儲存二進位制字串,也就是儲存位元組字串而非字元字串。
 215     char, varchar, text 對應 binary, varbinary, blob.
 216 
 217 3. 日期時間型別
 218     一般用整型儲存時間戳,因為PHP可以很方便的將時間戳進行格式化。
 219     datetime    8位元組    日期及時間        1000-01-01 00:00:009999-12-31 23:59:59
 220     date        3位元組    日期            1000-01-019999-12-31
 221     timestamp    4位元組    時間戳        197001010000002038-01-19 03:14:07
 222     time        3位元組    時間            -838:59:59838:59:59
 223     year        1位元組    年份            1901 - 2155
 224 
 225 datetime    “YYYY-MM-DD hh:mm:ss”
 226 timestamp    “YY-MM-DD hh:mm:ss”
 227             “YYYYMMDDhhmmss”
 228             “YYMMDDhhmmss”
 229             YYYYMMDDhhmmss
 230             YYMMDDhhmmss
 231 date        “YYYY-MM-DD”
 232             “YY-MM-DD”
 233             “YYYYMMDD”
 234             “YYMMDD”
 235             YYYYMMDD
 236             YYMMDD
 237 time        “hh:mm:ss”
 238             “hhmmss”
 239             hhmmss
 240 year        “YYYY”
 241             “YY”
 242             YYYY
 243             YY
 244 
 245 4. 列舉和集合
 246 -- 列舉(enum) ----------
 247 enum(val1, val2, val3...)
 248     在已知的值中進行單選。最大數量為65535.
 249     列舉值在儲存時,以2個位元組的整型(smallint)儲存。每個列舉值,按儲存的位置順序,從1開始逐一遞增。
 250     表現為字串型別,儲存卻是整型。
 251     NULL值的索引是NULL。
 252     空字串錯誤值的索引值是0。
 253 
 254 -- 集合(set) ----------
 255 set(val1, val2, val3...)
 256     create table tab ( gender set('', '', '') );
 257     insert into tab values ('男, 女');
 258     最多可以有64個不同的成員。以bigint儲存,共8個位元組。採取位運算的形式。
 259     當建立表時,SET成員值的尾部空格將自動被刪除。
 260 
 261 /* 選擇型別 */
 262 -- PHP角度
 263 1. 功能滿足
 264 2. 儲存空間儘量小,處理效率更高
 265 3. 考慮相容問題
 266 
 267 -- IP儲存 ----------
 268 1. 只需儲存,可用字串
 269 2. 如果需計算,查詢等,可儲存為4個位元組的無符號int,即unsigned
 270     1) PHP函式轉換
 271         ip2long可轉換為整型,但會出現攜帶符號問題。需格式化為無符號的整型。
 272         利用sprintf函式格式化字串
 273         sprintf("%u", ip2long('192.168.3.134'));
 274         然後用long2ip將整型轉回IP字串
 275     2) MySQL函式轉換(無符號整型,UNSIGNED)
 276         INET_ATON('127.0.0.1') 將IP轉為整型
 277         INET_NTOA(2130706433) 將整型轉為IP
 278 
 279 
 280 
 281 
 282 /* 列屬性(列約束) */ ------------------
 283 1. 主鍵
 284     - 能唯一標識記錄的欄位,可以作為主鍵。
 285     - 一個表只能有一個主鍵。
 286     - 主鍵具有唯一性。
 287     - 宣告欄位時,用 primary key 標識。
 288         也可以在欄位列表之後宣告
 289             例:create table tab ( id int, stu varchar(10), primary key (id));
 290     - 主鍵欄位的值不能為null。
 291     - 主鍵可以由多個欄位共同組成。此時需要在欄位列表後宣告的方法。
 292         例:create table tab ( id int, stu varchar(10), age int, primary key (stu, age));
 293 
 294 2. unique 唯一索引(唯一約束)
 295     使得某欄位的值也不能重複。
 296 
 297 3. null 約束
 298     null不是資料型別,是列的一個屬性。
 299     表示當前列是否可以為null,表示什麼都沒有。
 300     null, 允許為空。預設。
 301     not null, 不允許為空。
 302     insert into tab values (null, 'val');
 303         -- 此時表示將第一個欄位的值設為null, 取決於該欄位是否允許為null
 304 
 305 4. default 預設值屬性
 306     當前欄位的預設值。
 307     insert into tab values (default, 'val');    -- 此時表示強制使用預設值。
 308     create table tab ( add_time timestamp default current_timestamp );
 309         -- 表示將當前時間的時間戳設為預設值。
 310         current_date, current_time
 311 
 312 5. auto_increment 自動增長約束
 313     自動增長必須為索引(主鍵或unique)
 314     只能存在一個欄位為自動增長。
 315     預設為1開始自動增長。可以通過表屬性 auto_increment = x進行設定,或 alter table tbl auto_increment = x;
 316 
 317 6. comment 註釋
 318     例:create table tab ( id int ) comment '註釋內容';
 319 
 320 7. foreign key 外來鍵約束
 321     用於限制主表與從表資料完整性。
 322     alter table t1 add constraint `t1_t2_fk` foreign key (t1_id) references t2(id);
 323         -- 將表t1的t1_id外來鍵關聯到表t2的id欄位。
 324         -- 每個外來鍵都有一個名字,可以通過 constraint 指定
 325 
 326     存在外來鍵的表,稱之為從表(子表),外來鍵指向的表,稱之為主表(父表)。
 327 
 328     作用:保持資料一致性,完整性,主要目的是控制儲存在外來鍵表(從表)中的資料。
 329 
 330     MySQL中,可以對InnoDB引擎使用外來鍵約束:
 331     語法:
 332     foreign key (外來鍵欄位) references 主表名 (關聯欄位) [主表記錄刪除時的動作] [主表記錄更新時的動作]
 333     此時需要檢測一個從表的外來鍵需要約束為主表的已存在的值。外來鍵在沒有關聯的情況下,可以設定為null.前提是該外來鍵列,沒有not null 334 
 335     可以不指定主表記錄更改或更新時的動作,那麼此時主表的操作被拒絕。
 336     如果指定了 on updateon delete:在刪除或更新時,有如下幾個操作可以選擇:
 337     1. cascade,級聯操作。主表資料被更新(主鍵值更新),從表也被更新(外來鍵值更新)。主表記錄被刪除,從表相關記錄也被刪除。
 338     2. set null,設定為null。主表資料被更新(主鍵值更新),從表的外來鍵被設定為null。主表記錄被刪除,從表相關記錄外來鍵被設定成null。但注意,要求該外來鍵列,沒有not null屬性約束。
 339     3. restrict,拒絕父表刪除和更新。
 340 
 341     注意,外來鍵只被InnoDB儲存引擎所支援。其他引擎是不支援的。
 342 
 343 
 344 /* 建表規範 */ ------------------
 345     -- Normal Format, NF
 346         - 每個表儲存一個實體資訊
 347         - 每個具有一個ID欄位作為主鍵
 348         - ID主鍵 + 原子表
 349     -- 1NF, 第一正規化
 350         欄位不能再分,就滿足第一正規化。
 351     -- 2NF, 第二正規化
 352         滿足第一正規化的前提下,不能出現部分依賴。
 353         消除符合主鍵就可以避免部分依賴。增加單列關鍵字。
 354     -- 3NF, 第三正規化
 355         滿足第二正規化的前提下,不能出現傳遞依賴。
 356         某個欄位依賴於主鍵,而有其他欄位依賴於該欄位。這就是傳遞依賴。
 357         將一個實體資訊的資料放在一個表內實現。
 358 
 359 
 360 /* select */ ------------------
 361 
 362 select [all|distinct] select_expr from -> where -> group by [合計函式] -> having -> order by -> limit
 363 
 364 a. select_expr
 365     -- 可以用 * 表示所有欄位。
 366         select * from tb;
 367     -- 可以使用表示式(計算公式、函式呼叫、欄位也是個表示式)
 368         select stu, 29+25, now() from tb;
 369     -- 可以為每個列使用別名。適用於簡化列標識,避免多個列識別符號重複。
 370         - 使用 as 關鍵字,也可省略 as.
 371         select stu+10 as add10 from tb;
 372 
 373 b. from 子句
 374     用於標識查詢來源。
 375     -- 可以為表起別名。使用as關鍵字。
 376         select * from tb1 as tt, tb2 as bb;
 377     -- from子句後,可以同時出現多個表。
 378         -- 多個表會橫向疊加到一起,而資料會形成一個笛卡爾積。
 379         select * from tb1, tb2;
 380 
 381 c. where 子句
 382     -- 從from獲得的資料來源中進行篩選。
 383     -- 整型1表示真,0表示假。
 384     -- 表示式由運算子和運算陣列成。
 385         -- 運算數:變數(欄位)、值、函式返回值
 386         -- 運算子:
 387             =, <=>, <>, !=, <=, <, >=, >, !, &&, ||,
 388             in (not) null, (not) like, (not) in, (not) between and, is (not), and, or, not, xor
 389             is/is not 加上ture/false/unknown,檢驗某個值的真假
 390             <=><>功能相同,<=>可用於null比較
 391 
 392 d. group by 子句, 分組子句
 393     group by 欄位/別名 [排序方式]
 394     分組後會進行排序。升序:ASC,降序:DESC
 395 
 396     以下[合計函式]需配合 group by 使用:
 397     count 返回不同的非NULL值數目    count(*)、count(欄位)
 398     sum 求和
 399     max 求最大值
 400     min 求最小值
 401     avg 求平均值
 402     group_concat 返回帶有來自一個組的連線的非NULL值的字串結果。組內字串連線。
 403 
 404 e. having 子句,條件子句
 405where 功能、用法相同,執行時機不同。
 406     where 在開始時執行檢測資料,對原資料進行過濾。
 407     having 對篩選出的結果再次進行過濾。
 408     having 欄位必須是查詢出來的,where 欄位必須是資料表存在的。
 409     where 不可以使用欄位的別名,having 可以。因為執行WHERE程式碼時,可能尚未確定列值。
 410     where 不可以使用合計函式。一般需用合計函式才會用 having
 411     SQL標準要求HAVING必須引用GROUP BY子句中的列或用於合計函式中的列。
 412 
 413 f. order by 子句,排序子句
 414     order by 排序欄位/別名 排序方式 [,排序欄位/別名 排序方式]...
 415     升序:ASC,降序:DESC
 416     支援多個欄位的排序。
 417 
 418 g. limit 子句,限制結果數量子句
 419     僅對處理好的結果進行數量限制。將處理好的結果的看作是一個集合,按照記錄出現的順序,索引從0開始。
 420     limit 起始位置, 獲取條數
 421     省略第一個引數,表示從索引0開始。limit 獲取條數
 422 
 423 h. distinct, all 選項
 424     distinct 去除重複記錄
 425     預設為 all, 全部記錄
 426 
 427 
 428 /* UNION */ ------------------
 429     將多個select查詢的結果組合成一個結果集合。
 430     SELECT ... UNION [ALL|DISTINCT] SELECT ...
 431     預設 DISTINCT 方式,即所有返回的行都是唯一的
 432     建議,對每個SELECT查詢加上小括號包裹。
 433     ORDER BY 排序時,需加上 LIMIT 進行結合。
 434     需要各select查詢的欄位數量一樣。
 435     每個select查詢的欄位列表(數量、型別)應一致,因為結果中的欄位名以第一條select語句為準。
 436 
 437 
 438 /* 子查詢 */ ------------------
 439     - 子查詢需用括號包裹。
 440 -- from型
 441     from後要求是一個表,必須給子查詢結果取個別名。
 442     - 簡化每個查詢內的條件。
 443     - from型需將結果生成一個臨時表格,可用以原表的鎖定的釋放。
 444     - 子查詢返回一個表,表型子查詢。
 445     select * from (select * from tb where id>0) as subfrom where id>1;
 446 -- where型
 447     - 子查詢返回一個值,標量子查詢。
 448     - 不需要給子查詢取別名。
 449     - where子查詢內的表,不能直接用以更新。
 450     select * from tb where money = (select max(money) from tb);
 451     -- 列子查詢
 452         如果子查詢結果返回的是一列。
 453         使用 innot in 完成查詢
 454         existsnot exists 條件
 455             如果子查詢返回資料,則返回1或0。常用於判斷條件。
 456             select column1 from t1 where exists (select * from t2);
 457     -- 行子查詢
 458         查詢條件是一個行。
 459         select * from t1 where (id, gender) in (select id, gender from t2);
 460         行構造符:(col1, col2, ...) 或 ROW(col1, col2, ...)
 461         行構造符通常用於與對能返回兩個或兩個以上列的子查詢進行比較。
 462 
 463     -- 特殊運算子
 464     != all()    相當於 not in
 465     = some()    相當於 inanysome 的別名
 466     != some()    不等同於 not in,不等於其中某一個。
 467     all, some 可以配合其他運算子一起使用。
 468 
 469 
 470 /* 連線查詢(join) */ ------------------
 471     將多個表的欄位進行連線,可以指定連線條件。
 472 -- 內連線(inner join)
 473     - 預設就是內連線,可省略inner。
 474     - 只有資料存在時才能傳送連線。即連線結果不能出現空行。
 475     on 表示連線條件。其條件表示式與where類似。也可以省略條件(表示條件永遠為真)
 476     也可用where表示連線條件。
 477     還有 using, 但需欄位名相同。 using(欄位名)
 478 
 479     -- 交叉連線 cross join
 480         即,沒有條件的內連線。
 481         select * from tb1 cross join tb2;
 482 -- 外連線(outer join)
 483     - 如果資料不存在,也會出現在連線結果中。
 484     -- 左外連線 left join
 485         如果資料不存在,左表記錄會出現,而右表為null填充
 486     -- 右外連線 right join
 487         如果資料不存在,右表記錄會出現,而左表為null填充
 488 -- 自然連線(natural join)
 489     自動判斷連線條件完成連線。
 490     相當於省略了using,會自動查詢相同欄位名。
 491     natural join
 492     natural left join
 493     natural right join
 494 
 495 select info.id, info.name, info.stu_num, extra_info.hobby, extra_info.sex from info, extra_info where info.stu_num = extra_info.stu_id;
 496 
 497 /* 匯入匯出 */ ------------------
 498 select * into outfile 檔案地址 [控制格式] from 表名;    -- 匯出表資料
 499 load data [local] infile 檔案地址 [replace|ignore] into table 表名 [控制格式];    -- 匯入資料
 500     生成的資料預設的分隔符是製表符
 501     local未指定,則資料檔案必須在伺服器上
 502     replace 和 ignore 關鍵詞控制對現有的唯一鍵記錄的重複的處理
 503 -- 控制格式
 504 fields    控制欄位格式
 505 預設:fields terminated by '\t' enclosed by '' escaped by '\\'
 506     terminated by 'string'    -- 終止
 507     enclosed by 'char'        -- 包裹
 508     escaped by 'char'        -- 轉義
 509     -- 示例:
 510         SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'
 511         FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
 512         LINES TERMINATED BY '\n'
 513         FROM test_table;
 514 lines    控制行格式
 515 預設:lines terminated by '\n'
 516     terminated by 'string'    -- 終止
 517 
 518 /* insert */ ------------------
 519 select語句獲得的資料可以用insert插入。
 520 
 521 可以省略對列的指定,要求 values () 括號內,提供給了按照列順序出現的所有欄位的值。
 522     或者使用set語法。
 523     insert into tbl_name set field=value,...;
 524 
 525 可以一次性使用多個值,採用(), (), ();的形式。
 526     insert into tbl_name values (), (), ();
 527 
 528 可以在列值指定時,使用表示式。
 529     insert into tbl_name values (field_value, 10+10, now());
 530 可以使用一個特殊值 default,表示該列使用預設值。
 531     insert into tbl_name values (field_value, default);
 532 
 533 可以通過一個查詢的結果,作為需要插入的值。
 534     insert into tbl_name select ...;
 535 
 536 可以指定在插入的值出現主鍵(或唯一索引)衝突時,更新其他非主鍵列的資訊。
 537     insert into tbl_name values/set/select on duplicate key update 欄位=值, …;
 538 
 539 /* delete */ ------------------
 540 DELETE FROM tbl_name [WHERE where_definition] [ORDER BY ...] [LIMIT row_count]
 541 
 542 按照條件刪除
 543 
 544 指定刪除的最多記錄數。Limit
 545 
 546 可以通過排序條件刪除。order by + limit
 547 
 548 支援多表刪除,使用類似連線語法。
 549 delete from 需要刪除資料多表1,表2 using 表連線操作 條件。
 550 
 551 /* truncate */ ------------------
 552 TRUNCATE [TABLE] tbl_name
 553 清空資料
 554 刪除重建表
 555 
 556 區別:
 557 1truncate 是刪除表再建立,delete 是逐條刪除
 558 2truncate 重置auto_increment的值。而delete不會
 559 3truncate 不知道刪除了幾條,而delete知道。
 560 4,當被用於帶分割槽的表時,truncate 會保留分割槽
 561 
 562 
 563 /* 備份與還原 */ ------------------
 564 備份,將資料的結構與表內資料儲存起來。
 565 利用 mysqldump 指令完成。
 566 
 567 -- 匯出
 568 1. 匯出一張表
 569   mysqldump -u使用者名稱 -p密碼 庫名 表名 > 檔名(D:/a.sql)
 570 2. 匯出多張表
 571   mysqldump -u使用者名稱 -p密碼 庫名 表1 表2 表3 > 檔名(D:/a.sql)
 572 3. 匯出所有表
 573   mysqldump -u使用者名稱 -p密碼 庫名 > 檔名(D:/a.sql)
 574 4. 匯出一個庫
 575   mysqldump -u使用者名稱 -p密碼 -B 庫名 > 檔名(D:/a.sql)
 576 
 577 可以-w攜帶備份條件
 578 
 579 -- 匯入
 580 1. 在登入mysql的情況下:
 581   source  備份檔案
 582 2. 在不登入的情況下
 583   mysql -u使用者名稱 -p密碼 庫名 < 備份檔案
 584 
 585 
 586 /* 檢視 */ ------------------
 587 什麼是檢視:
 588     檢視是一個虛擬表,其內容由查詢定義。同真實的表一樣,檢視包含一系列帶有名稱的列和行資料。但是,檢視並不在資料庫中以儲存的資料值集形式存在。行和列資料來自由定義檢視的查詢所引用的表,並且在引用檢視時動態生成。
 589     檢視具有表結構檔案,但不存在資料檔案。
 590     對其中所引用的基礎表來說,檢視的作用類似於篩選。定義檢視的篩選可以來自當前或其它資料庫的一個或多個表,或者其它檢視。通過檢視進行查詢沒有任何限制,通過它們進行資料修改時的限制也很少。
 591     檢視是儲存在資料庫中的查詢的sql語句,它主要出於兩種原因:安全原因,檢視可以隱藏一些資料,如:社會保險基金錶,可以用檢視只顯示姓名,地址,而不顯示社會保險號和工資數等,另一原因是可使複雜的查詢易於理解和使用。
 592 
 593 -- 建立檢視
 594 CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement
 595     - 檢視名必須唯一,同時不能與表重名。
 596     - 檢視可以使用select語句查詢到的列名,也可以自己指定相應的列名。
 597     - 可以指定檢視執行的演算法,通過ALGORITHM指定。
 598     - column_list如果存在,則數目必須等於SELECT語句檢索的列數
 599 
 600 -- 檢視結構
 601     SHOW CREATE VIEW view_name
 602 
 603 -- 刪除檢視
 604     - 刪除檢視後,資料依然存在。
 605     - 可同時刪除多個檢視。
 606     DROP VIEW [IF EXISTS] view_name ...
 607 
 608 -- 修改檢視結構
 609     - 一般不修改檢視,因為不是所有的更新檢視都會對映到表上。
 610     ALTER VIEW view_name [(column_list)] AS select_statement
 611 
 612 -- 檢視作用
 613     1. 簡化業務邏輯
 614     2. 對客戶端隱藏真實的表結構
 615 
 616 -- 檢視演算法(ALGORITHM)
 617     MERGE        合併
 618         將檢視的查詢語句,與外部查詢需要先合併再執行!
 619     TEMPTABLE    臨時表
 620         將檢視執行完畢後,形成臨時表,再做外層查詢!
 621     UNDEFINED    未定義(預設),指的是MySQL自主去選擇相應的演算法。
 622 
 623 
 624 
 625 /* 事務(transaction) */ ------------------
 626 事務是指邏輯上的一組操作,組成這組操作的各個單元,要不全成功要不全失敗。
 627     - 支援連續SQL的集體成功或集體撤銷。
 628     - 事務是資料庫在資料晚自習方面的一個功能。
 629     - 需要利用 InnoDB 或 BDB 儲存引擎,對自動提交的特性支援完成。
 630     - InnoDB被稱為事務安全型引擎。
 631 
 632 -- 事務開啟
 633     START TRANSACTION; 或者 BEGIN;
 634     開啟事務後,所有被執行的SQL語句均被認作當前事務內的SQL語句。
 635 -- 事務提交
 636     COMMIT;
 637 -- 事務回滾
 638     ROLLBACK;
 639     如果部分操作發生問題,對映到事務開啟前。
 640 
 641 -- 事務的特性
 642     1. 原子性(Atomicity)
 643         事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
 644     2. 一致性(Consistency)
 645         事務前後資料的完整性必須保持一致。
 646         - 事務開始和結束時,外部資料一致
 647         - 在整個事務過程中,操作是連續的
 648     3. 隔離性(Isolation 649         多個使用者併發訪問資料庫時,一個使用者的事務不能被其它使用者的事物所干擾,多個併發事務之間的資料要相互隔離。
 650     4. 永續性(Durability)
 651         一個事務一旦被提交,它對資料庫中的資料改變就是永久性的。
 652 
 653 -- 事務的實現
 654     1. 要求是事務支援的表型別
 655     2. 執行一組相關的操作前開啟事務
 656     3. 整組操作完成後,都成功,則提交;如果存在失敗,選擇回滾,則會回到事務開始的備份點。
 657 
 658 -- 事務的原理
 659     利用InnoDB的自動提交(autocommit)特性完成。
 660     普通的MySQL執行語句後,當前的資料提交操作均可被其他客戶端可見。
 661     而事務是暫時關閉“自動提交”機制,需要commit提交持久化資料操作。
 662 
 663 -- 注意
 664     1. 資料定義語言(DDL)語句不能被回滾,比如建立或取消資料庫的語句,和建立、取消或更改表或儲存的子程式的語句。
 665     2. 事務不能被巢狀
 666 
 667 -- 儲存點
 668     SAVEPOINT 儲存點名稱 -- 設定一個事務儲存點
 669     ROLLBACK TO SAVEPOINT 儲存點名稱 -- 回滾到儲存點
 670     RELEASE SAVEPOINT 儲存點名稱 -- 刪除儲存點
 671 
 672 -- InnoDB自動提交特性設定
 673     SET autocommit = 0|1;    0表示關閉自動提交,1表示開啟自動提交。
 674     - 如果關閉了,那普通操作的結果對其他客戶端也不可見,需要commit提交後才能持久化資料操作。
 675     - 也可以關閉自動提交來開啟事務。但與START TRANSACTION不同的是,
 676         SET autocommit是永久改變伺服器的設定,直到下次再次修改該設定。(針對當前連線)
 677         而START TRANSACTION記錄開啟前的狀態,而一旦事務提交或回滾後就需要再次開啟事務。(針對當前事務)
 678 
 679 
 680 /* 鎖表 */
 681 表鎖定只用於防止其它客戶端進行不正當地讀取和寫入
 682 MyISAM 支援表鎖,InnoDB 支援行鎖
 683 -- 鎖定
 684     LOCK TABLES tbl_name [AS alias]
 685 -- 解鎖
 686     UNLOCK TABLES
 687 
 688 
 689 /* 觸發器 */ ------------------
 690     觸發程式是與表有關的命名資料庫物件,當該表出現特定事件時,將啟用該物件
 691     監聽:記錄的增加、修改、刪除。
 692 
 693 -- 建立觸發器
 694 CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
 695     引數:
 696     trigger_time是觸發程式的動作時間。它可以是 before 或 after,以指明觸發程式是在啟用它的語句之前或之後觸發。
 697     trigger_event指明瞭啟用觸發程式的語句的型別
 698         INSERT:將新行插入表時啟用觸發程式
 699         UPDATE:更改某一行時啟用觸發程式
 700         DELETE:從表中刪除某一行時啟用觸發程式
 701     tbl_name:監聽的表,必須是永久性的表,不能將觸發程式與TEMPORARY表或檢視關聯起來。
 702     trigger_stmt:當觸發程式啟用時執行的語句。執行多個語句,可使用BEGIN...END複合語句結構
 703 
 704 -- 刪除
 705 DROP TRIGGER [schema_name.]trigger_name
 706 
 707 可以使用old和new代替舊的和新的資料
 708     更新操作,更新前是old,更新後是new.
 709     刪除操作,只有old.
 710     增加操作,只有new.
 711 
 712 -- 注意
 713     1. 對於具有相同觸發程式動作時間和事件的給定表,不能有兩個觸發程式。
 714 
 715 
 716 -- 字元連線函式
 717 concat(str1[, str2,...])
 718 
 719 -- 分支語句
 720 if 條件 then
 721     執行語句
 722 elseif 條件 then
 723     執行語句
 724 else
 725     執行語句
 726 end if;
 727 
 728 -- 修改最外層語句結束符
 729 delimiter 自定義結束符號
 730     SQL語句
 731 自定義結束符號
 732 
 733 delimiter ;        -- 修改回原來的分號
 734 
 735 -- 語句塊包裹
 736 begin
 737     語句塊
 738 end
 739 
 740 -- 特殊的執行
 741 1. 只要新增記錄,就會觸發程式。
 742 2. Insert into on duplicate key update 語法會觸發:
 743     如果沒有重複記錄,會觸發 before insert, after insert;
 744     如果有重複記錄並更新,會觸發 before insert, before update, after update;
 745     如果有重複記錄但是沒有發生更新,則觸發 before insert, before update
 746 3. Replace 語法 如果有記錄,則執行 before insert, before delete, after delete, after insert
 747 
 748 
 749 /* SQL程式設計 */ ------------------
 750 
 751 --// 區域性變數 ----------
 752 -- 變數宣告
 753     declare var_name[,...] type [default value]
 754     這個語句被用來宣告區域性變數。要給變數提供一個預設值,請包含一個default子句。值可以被指定為一個表示式,不需要為一個常數。如果沒有default子句,初始值為null。
 755 
 756 -- 賦值
 757     使用 setselect into 語句為變數賦值。
 758 
 759     - 注意:在函式內是可以使用全域性變數(使用者自定義的變數)
 760 
 761 
 762 --// 全域性變數 ----------
 763 -- 定義、賦值
 764 set 語句可以定義併為變數賦值。
 765 set @var = value;
 766 也可以使用select into語句為變數初始化並賦值。這樣要求select語句只能返回一行,但是可以是多個欄位,就意味著同時為多個變數進行賦值,變數的數量需要與查詢的列數一致。
 767 還可以把賦值語句看作一個表示式,通過select執行完成。此時為了避免=被當作關係運算子看待,使用:=代替。(set語句可以使用= 和 :=)。
 768 select @var:=20;
 769 select @v1:=id, @v2=name from t1 limit 1;
 770 select * from tbl_name where @var:=30;
 771 
 772 select into 可以將表中查詢獲得的資料賦給變數。
 773     -| select max(height) into @max_height from tb;
 774 
 775 -- 自定義變數名
 776 為了避免select語句中,使用者自定義的變數與系統識別符號(通常是欄位名)衝突,使用者自定義變數在變數名前使用@作為開始符號 777 @var=10;
 778 
 779     - 變數被定義後,在整個會話週期都有效(登入到退出)
 780 
 781 
 782 --// 控制結構 ----------
 783 -- if語句
 784 if search_condition then
 785     statement_list
 786 [elseif search_condition then
 787     statement_list]
 788 ...
 789 [else
 790     statement_list]
 791 end if;
 792 
 793 -- case語句
 794 CASE value WHEN [compare-value] THEN result
 795 [WHEN [compare-value] THEN result ...]
 796 [ELSE result]
 797 END
 798 
 799 
 800 -- while迴圈
 801 [begin_label:] while search_condition do
 802     statement_list
 803 end while [end_label];
 804 
 805 - 如果需要在迴圈內提前終止 while迴圈,則需要使用標籤;標籤需要成對出現。
 806 
 807     -- 退出迴圈
 808         退出整個迴圈 leave
 809         退出當前迴圈 iterate
 810         通過退出的標籤決定退出哪個迴圈
 811 
 812 
 813 --// 內建函式 ----------
 814 -- 數值函式
 815 abs(x)            -- 絕對值 abs(-10.9) = 10
 816 format(x, d)    -- 格式化千分位數值 format(1234567.456, 2) = 1,234,567.46
 817 ceil(x)            -- 向上取整 ceil(10.1) = 11
 818 floor(x)        -- 向下取整 floor (10.1) = 10
 819 round(x)        -- 四捨五入去整
 820 mod(m, n)        -- m%n m mod n 求餘 10%3=1
 821 pi()            -- 獲得圓周率
 822 pow(m, n)        -- m^n
 823 sqrt(x)            -- 算術平方根
 824 rand()            -- 隨機數
 825 truncate(x, d)    -- 擷取d位小數
 826 
 827 -- 時間日期函式
 828 now(), current_timestamp();     -- 當前日期時間
 829 current_date();                    -- 當前日期
 830 current_time();                    -- 當前時間
 831 date('yyyy-mm-dd hh:ii:ss');    -- 獲取日期部分
 832 time('yyyy-mm-dd hh:ii:ss');    -- 獲取時間部分
 833 date_format('yyyy-mm-dd hh:ii:ss', '%d %y %a %d %m %b %j');    -- 格式化時間
 834 unix_timestamp();                -- 獲得unix時間戳
 835 from_unixtime();                -- 從時間戳獲得時間
 836 
 837 -- 字串函式
 838 length(string)            -- string長度,位元組
 839 char_length(string)        -- string的字元個數
 840 substring(str, position [,length])        -- 從str的position開始,取length個字元
 841 replace(str ,search_str ,replace_str)    -- 在str中用replace_str替換search_str
 842 instr(string ,substring)    -- 返回substring首次在string中出現的位置
 843 concat(string [,...])    -- 連線字串
 844 charset(str)            -- 返回字串字符集
 845 lcase(string)            -- 轉換成小寫
 846 left(string, length)    -- 從string2中的左邊起取length個字元
 847 load_file(file_name)    -- 從檔案讀取內容
 848 locate(substring, string [,start_position])    -- 同instr,但可指定開始位置
 849 lpad(string, length, pad)    -- 重複用pad加在string開頭,直到字串長度為length
 850 ltrim(string)            -- 去除前端空格
 851 repeat(string, count)    -- 重複count次
 852 rpad(string, length, pad)    --在str後用pad補充,直到長度為length
 853 rtrim(string)            -- 去除後端空格
 854 strcmp(string1 ,string2)    -- 逐字元比較兩字串大小
 855 
 856 -- 流程函式
 857 case when [condition] then result [when [condition] then result ...] [else result] end   多分支
 858 if(expr1,expr2,expr3)  雙分支。
 859 
 860 -- 聚合函式
 861 count()
 862 sum();
 863 max();
 864 min();
 865 avg();
 866 group_concat()
 867 
 868 -- 其他常用函式
 869 md5();
 870 default();
 871 
 872 
 873 --// 儲存函式,自定義函式 ----------
 874 -- 新建
 875     CREATE FUNCTION function_name (引數列表) RETURNS 返回值型別
 876         函式體
 877 
 878     - 函式名,應該合法的識別符號,並且不應該與已有的關鍵字衝突。
 879     - 一個函式應該屬於某個資料庫,可以使用db_name.funciton_name的形式執行當前函式所屬資料庫,否則為當前資料庫。
 880     - 引數部分,由"引數名"和"引數型別"組成。多個引數用逗號隔開。
 881     - 函式體由多條可用的mysql語句,流程控制,變數宣告等語句構成。
 882     - 多條語句應該使用 begin...end 語句塊包含。
 883     - 一定要有 return 返回值語句。
 884 
 885 -- 刪除
 886     DROP FUNCTION [IF EXISTS] function_name;
 887 
 888 -- 檢視
 889     SHOW FUNCTION STATUS LIKE 'partten'
 890     SHOW CREATE FUNCTION function_name;
 891 
 892 -- 修改
 893     ALTER FUNCTION function_name 函式選項
 894 
 895 
 896 --// 儲存過程,自定義功能 ----------
 897 -- 定義
 898 儲存儲存過程 是一段程式碼(過程),儲存在資料庫中的sql組成。
 899 一個儲存過程通常用於完成一段業務邏輯,例如報名,交班費,訂單入庫等。
 900 而一個函式通常專注與某個功能,視為其他程式服務的,需要在其他語句中呼叫函式才可以,而儲存過程不能被其他呼叫,是自己執行 通過call執行。
 901 
 902 -- 建立
 903 CREATE PROCEDURE sp_name (引數列表)
 904     過程體
 905 
 906 引數列表:不同於函式的引數列表,需要指明引數型別
 907 IN,表示輸入型
 908 OUT,表示輸出型
 909 INOUT,表示混合型
 910 
 911 注意,沒有返回值。
 912 
 913 
 914 /* 儲存過程 */ ------------------
 915 儲存過程是一段可執行性程式碼的集合。相比函式,更偏向於業務邏輯。
 916 呼叫:CALL 過程名
 917 -- 注意
 918 - 沒有返回值。
 919 - 只能單獨呼叫,不可夾雜在其他語句中
 920 
 921 -- 引數
 922 IN|OUT|INOUT 引數名 資料型別
 923 IN        輸入:在呼叫過程中,將資料輸入到過程體內部的引數
 924 OUT        輸出:在呼叫過程中,將過程體處理完的結果返回到客戶端
 925 INOUT    輸入輸出:既可輸入,也可輸出
 926 
 927 -- 語法
 928 CREATE PROCEDURE 過程名 (引數列表)
 929 BEGIN
 930     過程體
 931 END
 932 
 933 
 934 /* 使用者和許可權管理 */ ------------------
 935 使用者資訊表:mysql.user
 936 -- 重新整理許可權
 937 FLUSH PRIVILEGES
 938 -- 增加使用者
 939 CREATE USER 使用者名稱 IDENTIFIED BY [PASSWORD] 密碼(字串)
 940     - 必須擁有mysql資料庫的全域性CREATE USER許可權,或擁有INSERT許可權。
 941     - 只能建立使用者,不能賦予許可權。
 942     - 使用者名稱,注意引號:如 'user_name'@'192.168.1.1'
 943     - 密碼也需引號,純數字密碼也要加引號
 944     - 要在純文字中指定密碼,需忽略PASSWORD關鍵詞。要把密碼指定為由PASSWORD()函式返回的混編值,需包含關鍵字PASSWORD
 945 -- 重新命名使用者
 946 RENAME USER old_user TO new_user
 947 -- 設定密碼
 948 SET PASSWORD = PASSWORD('密碼')    -- 為當前使用者設定密碼
 949 SET PASSWORD FOR 使用者名稱 = PASSWORD('密碼')    -- 為指定使用者設定密碼
 950 -- 刪除使用者
 951 DROP USER 使用者名稱
 952 -- 分配許可權/新增使用者
 953 GRANT 許可權列表 ON 表名 TO 使用者名稱 [IDENTIFIED BY [PASSWORD] 'password']
 954     - all privileges 表示所有許可權
 955     - *.* 表示所有庫的所有表
 956     - 庫名.表名 表示某庫下面的某表
 957 -- 檢視許可權
 958 SHOW GRANTS FOR 使用者名稱
 959     -- 檢視當前使用者許可權
 960     SHOW GRANTS; 或 SHOW GRANTS FOR CURRENT_USER; 或 SHOW GRANTS FOR CURRENT_USER();
 961 -- 撤消許可權
 962 REVOKE 許可權列表 ON 表名 FROM 使用者名稱
 963 REVOKE ALL PRIVILEGES, GRANT OPTION FROM 使用者名稱    -- 撤銷所有許可權
 964 -- 許可權層級
 965 -- 要使用GRANT或REVOKE,您必須擁有GRANT OPTION許可權,並且您必須用於您正在授予或撤銷的許可權。
 966 全域性層級:全域性許可權適用於一個給定伺服器中的所有資料庫,mysql.user
 967     GRANT ALL ON *.*REVOKE ALL ON *.*只授予和撤銷全域性許可權。
 968 資料庫層級:資料庫許可權適用於一個給定資料庫中的所有目標,mysql.db, mysql.host
 969     GRANT ALL ON db_name.*和REVOKE ALL ON db_name.*只授予和撤銷資料庫許可權。
 970 表層級:表許可權適用於一個給定表中的所有列,mysql.talbes_priv
 971     GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤銷表許可權。
 972 列層級:列許可權適用於一個給定表中的單一列,mysql.columns_priv
 973     當使用REVOKE時,您必須指定與被授權列相同的列。
 974 -- 許可權列表
 975 ALL [PRIVILEGES]    -- 設定除GRANT OPTION之外的所有簡單許可權
 976 ALTER    -- 允許使用ALTER TABLE
 977 ALTER ROUTINE    -- 更改或取消已儲存的子程式
 978 CREATE    -- 允許使用CREATE TABLE
 979 CREATE ROUTINE    -- 建立已儲存的子程式
 980 CREATE TEMPORARY TABLES        -- 允許使用CREATE TEMPORARY TABLE
 981 CREATE USER        -- 允許使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。
 982 CREATE VIEW        -- 允許使用CREATE VIEW
 983 DELETE    -- 允許使用DELETE
 984 DROP    -- 允許使用DROP TABLE
 985 EXECUTE        -- 允許使用者執行已儲存的子程式
 986 FILE    -- 允許使用SELECT...INTO OUTFILE和LOAD DATA INFILE
 987 INDEX     -- 允許使用CREATE INDEX和DROP INDEX
 988 INSERT    -- 允許使用INSERT
 989 LOCK TABLES        -- 允許對您擁有SELECT許可權的表使用LOCK TABLES
 990 PROCESS     -- 允許使用SHOW FULL PROCESSLIST
 991 REFERENCES    -- 未被實施
 992 RELOAD    -- 允許使用FLUSH
 993 REPLICATION CLIENT    -- 允許使用者詢問從屬伺服器或主伺服器的地址
 994 REPLICATION SLAVE    -- 用於複製型從屬伺服器(從主伺服器中讀取二進位制日誌事件)
 995 SELECT    -- 允許使用SELECT
 996 SHOW DATABASES    -- 顯示所有資料庫
 997 SHOW VIEW    -- 允許使用SHOW CREATE VIEW
 998 SHUTDOWN    -- 允許使用mysqladmin shutdown
 999 SUPER    -- 允許使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL語句,mysqladmin debug命令;允許您連線(一次),即使已達到max_connections。
1000 UPDATE    -- 允許使用UPDATE
1001 USAGE    -- “無許可權”的同義詞
1002 GRANT OPTION    -- 允許授予許可權
1003 
1004 
1005 /* 表維護 */
1006 -- 分析和儲存表的關鍵字分佈
1007 ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE 表名 ...
1008 -- 檢查一個或多個表是否有錯誤
1009 CHECK TABLE tbl_name [, tbl_name] ... [option] ...
1010 option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
1011 -- 整理資料檔案的碎片
1012 OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
1013 
1014 
1015 /* 雜項 */ ------------------
1016 1. 可用反引號(`)為識別符號(庫名、表名、欄位名、索引、別名)包裹,以避免與關鍵字重名!中文也可以作為識別符號!
1017 2. 每個庫目錄存在一個儲存當前資料庫的選項檔案db.opt。
1018 3. 註釋:
1019     單行註釋 # 註釋內容
1020     多行註釋 /* 註釋內容 */
1021     單行註釋 -- 註釋內容        (標準SQL註釋風格,要求雙破折號後加一空格符(空格、TAB、換行等))
1022 4. 模式萬用字元:
1023     _    任意單個字元
1024     %    任意多個字元,甚至包括零字元
1025     單引號需要進行轉義 \'
1026 5. CMD命令列內的語句結束符可以為 ";", "\G", "\g",僅影響顯示結果。其他地方還是用分號結束。delimiter 可修改當前對話的語句結束符。
1027 6. SQL對大小寫不敏感
1028 7. 清除已有語句:\c

 

相關文章