Linux下MySQL基礎及操作語法


什么是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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM