歡迎光臨
每天分享高質量文章

一千行 MySQL 學習筆記,值得大家收藏!

昨天DB Engines Ranking 更新了資料庫排行榜,MySQL居然位居第?!

 

檢視文章:2019年4月資料庫流行度排行

非常不錯的總結,強烈建議儲存下來,需要的時候看一看。

基本操作

  1. /* Windows服務 */

  2. -- 啟動MySQL

  3. net start mysql

  4. -- 建立Windows服務

  5. sc create mysql binPath= mysqld_bin_path(註意:等號與值之間有空格)

  6. /* 連線與斷開伺服器 */

  7. mysql -h 地址 -P -u 使用者名稱 -p 密碼

  8. SHOW PROCESSLIST -- 顯示哪些執行緒正在執行

  9. SHOW VARIABLES -- 顯示系統變數資訊

(左右滑動,檢視更多,下同)

資料庫操作

  1. /* 資料庫操作 */ ------------------

  2. -- 檢視當前資料庫

  3. SELECT DATABASE();

  4. -- 顯示當前時間、使用者名稱、資料庫版本

  5. SELECT now(), user(), version();

  6. -- 建立庫

  7. CREATE DATABASE[ IF NOT EXISTS] 資料庫名 資料庫選項

  8. 資料庫選項:

  9. CHARACTER SET charset_name

  10. COLLATE collation_name

  11. -- 檢視已有庫

  12. SHOW DATABASES[ LIKE 'PATTERN']

  13. -- 檢視當前庫資訊

  14. SHOW CREATE DATABASE 資料庫名

  15. -- 修改庫的選項資訊

  16. ALTER DATABASE 庫名 選項資訊

  17. -- 刪除庫

  18. DROP DATABASE[ IF EXISTS] 資料庫名

  19. 同時刪除該資料庫相關的目錄及其目錄內容

表的操作

  1. -- 建立表

  2. CREATE [TEMPORARY] TABLE[ IF NOT EXISTS] [庫名.]表名 ( 表的結構定義 )[ 表選項]

  3. 每個欄位必須有資料型別

  4. 最後一個欄位後不能有逗號

  5. TEMPORARY 臨時表,會話結束時表自動消失

  6. 對於欄位的定義:

  7. 欄位名 資料型別 [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string']

  8. -- 表選項

  9. -- 字符集

  10. CHARSET = charset_name

  11. 如果表沒有設定,則使用資料庫字符集

  12. -- 儲存引擎

  13. ENGINE = engine_name

  14. 表在管理資料時採用的不同的資料結構,結構不同會導致處理方式、提供的特性操作等不同

  15. 常見的引擎:InnoDB MyISAM Memory/Heap BDB Merge Example CSV MaxDB Archive

  16. 不同的引擎在儲存表的結構和資料時採用不同的方式

  17. MyISAM表檔案含義:.frm表定義,.MYD表資料,.MYI表索引

  18. InnoDB表檔案含義:.frm表定義,表空間資料和日誌檔案

  19. SHOW ENGINES -- 顯示儲存引擎的狀態資訊

  20. SHOW ENGINE 引擎名 {LOGS|STATUS} -- 顯示儲存引擎的日誌或狀態資訊

  21. -- 自增起始數

  22. AUTO_INCREMENT = 行數

  23. -- 資料檔案目錄

  24. DATA DIRECTORY = '目錄'

  25. -- 索引檔案目錄

  26. INDEX DIRECTORY = '目錄'

  27. -- 表註釋

  28. COMMENT = 'string'

  29. -- 分割槽選項

  30. PARTITION BY ... (詳細見手冊)

  31. -- 檢視所有表

  32. SHOW TABLES[ LIKE 'pattern']

  33. SHOW TABLES FROM 表名

  34. -- 查看錶機構

  35. SHOW CREATE TABLE 表名 (資訊更詳細)

  36. DESC 表名 / DESCRIBE 表名 / EXPLAIN 表名 / SHOW COLUMNS FROM 表名 [LIKE 'PATTERN']

  37. SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern']

  38. -- 修改表

  39. -- 修改表本身的選項

  40. ALTER TABLE 表名 表的選項

  41. eg: ALTER TABLE 表名 ENGINE=MYISAM;

  42. -- 對錶進行重新命名

  43. RENAME TABLE 原表名 TO 新表名

  44. RENAME TABLE 原表名 TO 庫名.表名 (可將表移動到另一個資料庫)

  45. -- RENAME可以交換兩個表名

  46. -- 修改表的欄位機構(13.1.2. ALTER TABLE語法)

  47. ALTER TABLE 表名 操作名

  48. -- 操作名

  49. ADD[ COLUMN] 欄位定義 -- 增加欄位

  50. AFTER 欄位名 -- 表示增加在該欄位名後面

  51. FIRST -- 表示增加在第一個

  52. ADD PRIMARY KEY(欄位名) -- 建立主鍵

  53. ADD UNIQUE [索引名] (欄位名)-- 建立唯一索引

  54. ADD INDEX [索引名] (欄位名) -- 建立普通索引

  55. DROP[ COLUMN] 欄位名 -- 刪除欄位

  56. MODIFY[ COLUMN] 欄位名 欄位屬性 -- 支援對欄位屬性進行修改,不能修改欄位名(所有原有屬性也需寫上)

  57. CHANGE[ COLUMN] 原欄位名 新欄位名 欄位屬性 -- 支援對欄位名修改

  58. DROP PRIMARY KEY -- 刪除主鍵(刪除主鍵前需刪除其AUTO_INCREMENT屬性)

  59. DROP INDEX 索引名 -- 刪除索引

  60. DROP FOREIGN KEY 外來鍵 -- 刪除外來鍵

  61. -- 刪除表

  62. DROP TABLE[ IF EXISTS] 表名 ...

  63. -- 清空表資料

  64. TRUNCATE [TABLE] 表名

  65. -- 複製表結構

  66. CREATE TABLE 表名 LIKE 要複製的表名

  67. -- 複製表結構和資料

  68. CREATE TABLE 表名 [AS] SELECT * FROM 要複製的表名

  69. -- 檢查表是否有錯誤

  70. CHECK TABLE tbl_name [, tbl_name] ... [option] ...

  71. -- 最佳化表

  72. OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

  73. -- 修複表

  74. REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]

  75. -- 分析表

  76. ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

資料操作

  1. /* 資料操作 */ ------------------

  2. --

  3. INSERT [INTO] 表名 [(欄位串列)] VALUES (值串列)[, (值串列), ...]

  4. -- 如果要插入的值串列包含所有欄位並且順序一致,則可以省略欄位串列。

  5. -- 可同時插入多條資料記錄!

  6. REPLACE INSERT 完全一樣,可互換。

  7. INSERT [INTO] 表名 SET 欄位名=值[, 欄位名=值, ...]

  8. --

  9. SELECT 欄位串列 FROM 表名[ 其他子句]

  10. -- 可來自多個表的多個欄位

  11. -- 其他子句可以不使用

  12. -- 欄位串列可以用*代替,表示所有欄位

  13. --

  14. DELETE FROM 表名[ 刪除條件子句]

  15. 沒有條件子句,則會刪除全部

  16. --

  17. UPDATE 表名 SET 欄位名=新值[, 欄位名=新值] [更新條件]

字符集編碼

  1. /* 字符集編碼 */ ------------------

  2. -- MySQL、資料庫、表、欄位均可設定編碼

  3. -- 資料編碼與客戶端編碼不需一致

  4. SHOW VARIABLES LIKE 'character_set_%' -- 檢視所有字符集編碼項

  5. character_set_client 客戶端向伺服器傳送資料時使用的編碼

  6. character_set_results 伺服器端將結果傳回給客戶端所使用的編碼

  7. character_set_connection 連線層編碼

  8. SET 變數名 = 變數值

  9. SET character_set_client = gbk;

  10. SET character_set_results = gbk;

  11. SET character_set_connection = gbk;

  12. SET NAMES GBK; -- 相當於完成以上三個設定

  13. -- 校對集

  14. 校對集用以排序

  15. SHOW CHARACTER SET [LIKE 'pattern']/SHOW CHARSET [LIKE 'pattern'] 檢視所有字符集

  16. SHOW COLLATION [LIKE 'pattern'] 檢視所有校對集

  17. CHARSET 字符集編碼 設定字符集編碼

  18. COLLATE 校對集編碼 設定校對集編碼

資料型別(列型別)

  1. /* 資料型別(列型別) */ ------------------

  2. 1. 數值型別

  3. -- a. 整型 ----------

  4. 型別 位元組 範圍(有符號位)

  5. tinyint 1位元組 -128 ~ 127 無符號位:0 ~ 255

  6. smallint 2位元組 -32768 ~ 32767

  7. mediumint 3位元組 -8388608 ~ 8388607

  8. int 4位元組

  9. bigint 8位元組

  10. int(M) M表示總位數

  11. - 預設存在符號位,unsigned 屬性修改

  12. - 顯示寬度,如果某個數不夠定義欄位時設定的位數,則前面以0補填,zerofill 屬性修改

  13. 例:int(5) 插入一個數'123',補填後為'00123'

  14. - 在滿足要求的情況下,越小越好。

  15. - 1表示bool值真,0表示bool值假。MySQL沒有布林型別,透過整型01表示。常用tinyint(1)表示布林型。

  16. -- b. 浮點型 ----------

  17. 型別 位元組 範圍

  18. float(單精度) 4位元組

  19. double(雙精度) 8位元組

  20. 浮點型既支援符號位 unsigned 屬性,也支援顯示寬度 zerofill 屬性。

  21. 不同於整型,前後均會補填0.

  22. 定義浮點型時,需指定總位數和小數位數。

  23. float(M, D) double(M, D)

  24. M表示總位數,D表示小數位數。

  25. MD的大小會決定浮點數的範圍。不同於整型的固定範圍。

  26. M既表示總位數(不包括小數點和正負號),也表示顯示寬度(所有顯示符號均包括)。

  27. 支援科學計數法表示。

  28. 浮點數表示近似值。

  29. -- c. 定點數 ----------

  30. decimal -- 可變長度

  31. decimal(M, D) M也表示總位數,D表示小數位數。

  32. 儲存一個精確的數值,不會發生資料的改變,不同於浮點數的四捨五入。

  33. 將浮點數轉換為字串來儲存,每9位數字儲存為4個位元組。

  34. 2. 字串型別

  35. -- a. char, varchar ----------

  36. char 定長字串,速度快,但浪費空間

  37. varchar 變長字串,速度慢,但節省空間

  38. M表示能儲存的最大長度,此長度是字元數,非位元組數。

  39. 不同的編碼,所佔用的空間不同。

  40. char,最多255個字元,與編碼無關。

  41. varchar,最多65535字元,與編碼有關。

  42. 一條有效記錄最大不能超過65535個位元組。

  43. utf8 最大為21844個字元,gbk 最大為32766個字元,latin1 最大為65532個字元

  44. varchar 是變長的,需要利用儲存空間儲存 varchar 的長度,如果資料小於255個位元組,則採用一個位元組來儲存長度,反之需要兩個位元組來儲存。

  45. varchar 的最大有效長度由最大行大小和使用的字符集確定。

  46. 最大有效長度是65532位元組,因為在varchar存字串時,第一個位元組是空的,不存在任何資料,然後還需兩個位元組來存放字串的長度,所以有效長度是64432-1-2=65532位元組。

  47. 例:若一個表定義為 CREATE TABLE tb(c1 int, c2 char(30), c3 varchar(N)) charset=utf8; N的最大值是多少? 答:(65535-1-2-4-30*3)/3

  48. -- b. blob, text ----------

  49. blob 二進位制字串(位元組字串)

  50. tinyblob, blob, mediumblob, longblob

  51. text 非二進位制字串(字元字串)

  52. tinytext, text, mediumtext, longtext

  53. text 在定義時,不需要定義長度,也不會計算總長度。

  54. text 型別在定義時,不可給default

  55. -- c. binary, varbinary ----------

  56. 類似於charvarchar,用於儲存二進位制字串,也就是儲存位元組字串而非字元字串。

  57. char, varchar, text 對應 binary, varbinary, blob.

  58. 3. 日期時間型別

  59. 一般用整型儲存時間戳,因為PHP可以很方便的將時間戳進行格式化。

  60. datetime 8位元組 日期及時間 1000-01-01 00:00:00 9999-12-31 23:59:59

  61. date 3位元組 日期 1000-01-01 9999-12-31

  62. timestamp 4位元組 時間戳 19700101000000 2038-01-19 03:14:07

  63. time 3位元組 時間 -838:59:59 838:59:59

  64. year 1位元組 年份 1901 - 2155

  65. datetime YYYY-MM-DD hh:mm:ss

  66. timestamp YY-MM-DD hh:mm:ss

  67. YYYYMMDDhhmmss

  68. YYMMDDhhmmss

  69. YYYYMMDDhhmmss

  70. YYMMDDhhmmss

  71. date YYYY-MM-DD

  72. YY-MM-DD

  73. YYYYMMDD

  74. YYMMDD

  75. YYYYMMDD

  76. YYMMDD

  77. time hh:mm:ss

  78. hhmmss

  79. hhmmss

  80. year YYYY

  81. YY

  82. YYYY

  83. YY

  84. 4. 列舉和集合

  85. -- 列舉(enum) ----------

  86. enum(val1, val2, val3...)

  87. 在已知的值中進行單選。最大數量為65535.

  88. 列舉值在儲存時,以2個位元組的整型(smallint)儲存。每個列舉值,按儲存的位置順序,從1開始逐一遞增。

  89. 表現為字串型別,儲存卻是整型。

  90. NULL值的索引是NULL

  91. 空字串錯誤值的索引值是0

  92. -- 集合(set ----------

  93. set(val1, val2, val3...)

  94. create table tab ( gender set('男', '女', '無') );

  95. insert into tab values ('男, 女');

  96. 最多可以有64個不同的成員。以bigint儲存,共8個位元組。採取位運算的形式。

  97. 當建立表時,SET成員值的尾部空格將自動被刪除。

列屬性(列約束)

  1. /* 列屬性(列約束) */ ------------------

  2. 1. PRIMARY 主鍵

  3. - 能唯一標識記錄的欄位,可以作為主鍵。

  4. - 一個表只能有一個主鍵。

  5. - 主鍵具有唯一性。

  6. - 宣告欄位時,用 primary key 標識。

  7. 也可以在欄位串列之後宣告

  8. 例:create table tab ( id int, stu varchar(10), primary key (id));

  9. - 主鍵欄位的值不能為null

  10. - 主鍵可以由多個欄位共同組成。此時需要在欄位串列後宣告的方法。

  11. 例:create table tab ( id int, stu varchar(10), age int, primary key (stu, age));

  12. 2. UNIQUE 唯一索引(唯一約束)

  13. 使得某欄位的值也不能重覆。

  14. 3. NULL 約束

  15. null不是資料型別,是列的一個屬性。

  16. 表示當前列是否可以為null,表示什麼都沒有。

  17. null, 允許為空。預設。

  18. not null, 不允許為空。

  19. insert into tab values (null, 'val');

  20. -- 此時表示將第一個欄位的值設為null, 取決於該欄位是否允許為null

  21. 4. DEFAULT 預設值屬性

  22. 當前欄位的預設值。

  23. insert into tab values (default, 'val'); -- 此時表示強制使用預設值。

  24. create table tab ( add_time timestamp default current_timestamp );

  25. -- 表示將當前時間的時間戳設為預設值。

  26. current_date, current_time

  27. 5. AUTO_INCREMENT 自動增長約束

  28. 自動增長必須為索引(主鍵或unique

  29. 只能存在一個欄位為自動增長。

  30. 預設為1開始自動增長。可以透過表屬性 auto_increment = x進行設定,或 alter table tbl auto_increment = x;

  31. 6. COMMENT 註釋

  32. 例:create table tab ( id int ) comment '註釋內容';

  33. 7. FOREIGN KEY 外來鍵約束

  34. 用於限制主表與從表資料完整性。

  35. alter table t1 add constraint `t1_t2_fk` foreign key (t1_id) references t2(id);

  36. -- 將表t1t1_id外來鍵關聯到表t2id欄位。

  37. -- 每個外來鍵都有一個名字,可以透過 constraint 指定

  38. 存在外來鍵的表,稱之為從表(子表),外來鍵指向的表,稱之為主表(父表)。

  39. 作用:保持資料一致性,完整性,主要目的是控制儲存在外來鍵表(從表)中的資料。

  40. MySQL中,可以對InnoDB引擎使用外來鍵約束:

  41. 語法:

  42. foreign key (外來鍵欄位) references 主表名 (關聯欄位) [主表記錄刪除時的動作] [主表記錄更新時的動作]

  43. 此時需要檢測一個從表的外來鍵需要約束為主表的已存在的值。外來鍵在沒有關聯的情況下,可以設定為null.前提是該外來鍵列,沒有not null

  44. 可以不指定主表記錄更改或更新時的動作,那麼此時主表的操作被拒絕。

  45. 如果指定了 on update on delete:在刪除或更新時,有如下幾個操作可以選擇:

  46. 1. cascade,級聯操作。主表資料被更新(主鍵值更新),從表也被更新(外來鍵值更新)。主表記錄被刪除,從表相關記錄也被刪除。

  47. 2. set null,設定為null。主表資料被更新(主鍵值更新),從表的外來鍵被設定為null。主表記錄被刪除,從表相關記錄外來鍵被設定成null。但註意,要求該外來鍵列,沒有not null屬性約束。

  48. 3. restrict,拒絕父表刪除和更新。

  49. 註意,外來鍵只被InnoDB儲存引擎所支援。其他引擎是不支援的。

建表規範

  1. /* 建表規範 */ ------------------

  2. -- Normal Format, NF

  3. - 每個表儲存一個物體資訊

  4. - 每個具有一個ID欄位作為主鍵

  5. - ID主鍵 + 原子表

  6. -- 1NF, 第一正規化

  7. 欄位不能再分,就滿足第一正規化。

  8. -- 2NF, 第二正規化

  9. 滿足第一正規化的前提下,不能出現部分依賴。

  10. 消除符合主鍵就可以避免部分依賴。增加單列關鍵字。

  11. -- 3NF, 第三正規化

  12. 滿足第二正規化的前提下,不能出現傳遞依賴。

  13. 某個欄位依賴於主鍵,而有其他欄位依賴於該欄位。這就是傳遞依賴。

  14. 將一個物體資訊的資料放在一個表內實現。

SELECT

  1. /* SELECT */ ------------------

  2. SELECT [ALL|DISTINCT] select_expr FROM -> WHERE -> GROUP BY [合計函式] -> HAVING -> ORDER BY -> LIMIT

  3. a. select_expr

  4. -- 可以用 * 表示所有欄位。

  5. select * from tb;

  6. -- 可以使用運算式(計算公式、函式呼叫、欄位也是個運算式)

  7. select stu, 29+25, now() from tb;

  8. -- 可以為每個列使用別名。適用於簡化列標識,避免多個列識別符號重覆。

  9. - 使用 as 關鍵字,也可省略 as.

  10. select stu+10 as add10 from tb;

  11. b. FROM 子句

  12. 用於標識查詢來源。

  13. -- 可以為表起別名。使用as關鍵字。

  14. SELECT * FROM tb1 AS tt, tb2 AS bb;

  15. -- from子句後,可以同時出現多個表。

  16. -- 多個表會橫向疊加到一起,而資料會形成一個笛卡爾積。

  17. SELECT * FROM tb1, tb2;

  18. -- 向最佳化符提示如何選擇索引

  19. USE INDEXIGNORE INDEXFORCE INDEX

  20. SELECT * FROM table1 USE INDEX (key1,key2) WHERE key1=1 AND key2=2 AND key3=3;

  21. SELECT * FROM table1 IGNORE INDEX (key3) WHERE key1=1 AND key2=2 AND key3=3;

  22. c. WHERE 子句

  23. -- from獲得的資料源中進行篩選。

  24. -- 整型1表示真,0表示假。

  25. -- 運算式由運運算元和運算元組成。

  26. -- 運算元:變數(欄位)、值、函式傳回值

  27. -- 運運算元:

  28. =, <=>, <>, !=, <=, >=, >, !, &&, ||,

  29. in (not) null, (not) like, (not) in, (not) between and, is (not), and, or, not, xor

  30. is/is not 加上ture/false/unknown,檢驗某個值的真假

  31. <=>與<>功能相同,<=>可用於null比較

  32. d. GROUP BY 子句, 分組子句

  33. GROUP BY 欄位/別名 [排序方式]

  34. 分組後會進行排序。升序:ASC,降序:DESC

  35. 以下[合計函式]需配合 GROUP BY 使用:

  36. count 傳回不同的非NULL值數目 count(*)、count(欄位)

  37. sum 求和

  38. max 求最大值

  39. min 求最小值

  40. avg 求平均值

  41. group_concat 傳回帶有來自一個組的連線的非NULL值的字串結果。組內字串連線。

  42. e. HAVING 子句,條件子句

  43. where 功能、用法相同,執行時機不同。

  44. where 在開始時執行檢測資料,對原資料進行過濾。

  45. having 對篩選出的結果再次進行過濾。

  46. having 欄位必須是查詢出來的,where 欄位必須是資料表存在的。

  47. where 不可以使用欄位的別名,having 可以。因為執行WHERE程式碼時,可能尚未確定列值。

  48. where 不可以使用合計函式。一般需用合計函式才會用 having

  49. SQL標準要求HAVING必須取用GROUP BY子句中的列或用於合計函式中的列。

  50. f. ORDER BY 子句,排序子句

  51. order by 排序欄位/別名 排序方式 [,排序欄位/別名 排序方式]...

  52. 升序:ASC,降序:DESC

  53. 支援多個欄位的排序。

  54. g. LIMIT 子句,限制結果數量子句

  55. 僅對處理好的結果進行數量限制。將處理好的結果的看作是一個集合,按照記錄出現的順序,索引從0開始。

  56. limit 起始位置, 獲取條數

  57. 省略第一個引數,表示從索引0開始。limit 獲取條數

  58. h. DISTINCT, ALL 選項

  59. distinct 去除重覆記錄

  60. 預設為 all, 全部記錄

UNION

  1. /* UNION */ ------------------

  2. 將多個select查詢的結果組合成一個結果集合。

  3. SELECT ... UNION [ALL|DISTINCT] SELECT ...

  4. 預設 DISTINCT 方式,即所有傳回的行都是唯一的

  5. 建議,對每個SELECT查詢加上小括號包裹。

  6. ORDER BY 排序時,需加上 LIMIT 進行結合。

  7. 需要各select查詢的欄位數量一樣。

  8. 每個select查詢的欄位串列(數量、型別)應一致,因為結果中的欄位名以第一條select陳述句為準。

子查詢

  1. /* 子查詢 */ ------------------

  2. - 子查詢需用括號包裹。

  3. -- from

  4. from後要求是一個表,必須給子查詢結果取個別名。

  5. - 簡化每個查詢內的條件。

  6. - from型需將結果生成一個臨時表格,可用以原表的鎖定的釋放。

  7. - 子查詢傳回一個表,表型子查詢。

  8. select * from (select * from tb where id>0) as subfrom where id>1;

  9. -- where

  10. - 子查詢傳回一個值,標量子查詢。

  11. - 不需要給子查詢取別名。

  12. - where子查詢內的表,不能直接用以更新。

  13. select * from tb where money = (select max(money) from tb);

  14. -- 列子查詢

  15. 如果子查詢結果傳回的是一列。

  16. 使用 in not in 完成查詢

  17. exists not exists 條件

  18. 如果子查詢傳回資料,則傳回10。常用於判斷條件。

  19. select column1 from t1 where exists (select * from t2);

  20. -- 行子查詢

  21. 查詢條件是一個行。

  22. select * from t1 where (id, gender) in (select id, gender from t2);

  23. 行構造符:(col1, col2, ...) ROW(col1, col2, ...)

  24. 行構造符通常用於與對能傳回兩個或兩個以上列的子查詢進行比較。

  25. -- 特殊運運算元

  26. != all() 相當於 not in

  27. = some() 相當於 inany some 的別名

  28. != some() 不等同於 not in,不等於其中某一個。

  29. all, some 可以配合其他運運算元一起使用。

連線查詢(join)

  1. /* 連線查詢(join) */ ------------------

  2. 將多個表的欄位進行連線,可以指定連線條件。

  3. -- 內連線(inner join)

  4. - 預設就是內連線,可省略inner

  5. - 只有資料存在時才能傳送連線。即連線結果不能出現空行。

  6. on 表示連線條件。其條件運算式與where類似。也可以省略條件(表示條件永遠為真)

  7. 也可用where表示連線條件。

  8. 還有 using, 但需欄位名相同。 using(欄位名)

  9. -- 交叉連線 cross join

  10. 即,沒有條件的內連線。

  11. select * from tb1 cross join tb2;

  12. -- 外連線(outer join)

  13. - 如果資料不存在,也會出現在連線結果中。

  14. -- 左外連線 left join

  15. 如果資料不存在,左表記錄會出現,而右表為null填充

  16. -- 右外連線 right join

  17. 如果資料不存在,右表記錄會出現,而左表為null填充

  18. -- 自然連線(natural join)

  19. 自動判斷連線條件完成連線。

  20. 相當於省略了using,會自動查詢相同欄位名。

  21. natural join

  22. natural left join

  23. natural right join

  24. 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;

TRUNCATE

  1. /* TRUNCATE */ ------------------

  2. TRUNCATE [TABLE] tbl_name

  3. 清空資料

  4. 刪除重建表

  5. 區別:

  6. 1truncate 是刪除表再建立,delete 是逐條刪除

  7. 2truncate 重置auto_increment的值。而delete不會

  8. 3truncate 不知道刪除了幾條,而delete知道。

  9. 4,當被用於帶分割槽的表時,truncate 會保留分割槽

備份與還原

  1. /* 備份與還原 */ ------------------

  2. 備份,將資料的結構與表內資料儲存起來。

  3. 利用 mysqldump 指令完成。

  4. -- 匯出

  5. mysqldump [options] db_name [tables]

  6. mysqldump [options] ---database DB1 [DB2 DB3...]

  7. mysqldump [options] --all--database

  8. 1. 匯出一張表

  9.   mysqldump -u使用者名稱 -p密碼 庫名 表名 > 檔案名(D:/a.sql)

  10. 2. 匯出多張表

  11.   mysqldump -u使用者名稱 -p密碼 庫名 1 2 3 > 檔案名(D:/a.sql)

  12. 3. 匯出所有表

  13.   mysqldump -u使用者名稱 -p密碼 庫名 > 檔案名(D:/a.sql)

  14. 4. 匯出一個庫

  15.   mysqldump -u使用者名稱 -p密碼 --lock-all-tables --database 庫名 > 檔案名(D:/a.sql)

  16. 可以-w攜帶WHERE條件

  17. -- 匯入

  18. 1. 在登入mysql的情況下:

  19.   source 備份檔案

  20. 2. 在不登入的情況下

  21.   mysql -u使用者名稱 -p密碼 庫名 < 備份檔案

檢視

  1. 什麼是檢視:

  2. 檢視是一個虛擬表,其內容由查詢定義。同真實的表一樣,檢視包含一系列帶有名稱的列和行資料。但是,檢視並不在資料庫中以儲存的資料值集形式存在。行和列資料來自由定義檢視的查詢所取用的表,並且在取用檢視時動態生成。

  3. 檢視具有表結構檔案,但不存在資料檔案。

  4. 對其中所取用的基礎表來說,檢視的作用類似於篩選。定義檢視的篩選可以來自當前或其它資料庫的一個或多個表,或者其它檢視。透過檢視進行查詢沒有任何限制,透過它們進行資料修改時的限制也很少。

  5. 檢視是儲存在資料庫中的查詢的sql陳述句,它主要出於兩種原因:安全原因,檢視可以隱藏一些資料,如:社會保險基金錶,可以用檢視只顯示姓名,地址,而不顯示社會保險號和工資數等,另一原因是可使複雜的查詢易於理解和使用。

  6. -- 建立檢視

  7. CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement

  8. - 檢視名必須唯一,同時不能與表重名。

  9. - 檢視可以使用select陳述句查詢到的列名,也可以自己指定相應的列名。

  10. - 可以指定檢視執行的演演算法,透過ALGORITHM指定。

  11. - column_list如果存在,則數目必須等於SELECT陳述句檢索的列數

  12. -- 檢視結構

  13. SHOW CREATE VIEW view_name

  14. -- 刪除檢視

  15. - 刪除檢視後,資料依然存在。

  16. - 可同時刪除多個檢視。

  17. DROP VIEW [IF EXISTS] view_name ...

  18. -- 修改檢視結構

  19. - 一般不修改檢視,因為不是所有的更新檢視都會對映到表上。

  20. ALTER VIEW view_name [(column_list)] AS select_statement

  21. -- 檢視作用

  22. 1. 簡化業務邏輯

  23. 2. 對客戶端隱藏真實的表結構

  24. -- 檢視演演算法(ALGORITHM)

  25. MERGE 合併

  26. 將檢視的查詢陳述句,與外部查詢需要先合併再執行!

  27. TEMPTABLE 臨時表

  28. 將檢視執行完畢後,形成臨時表,再做外層查詢!

  29. UNDEFINED 未定義(預設),指的是MySQL自主去選擇相應的演演算法。

事務(transaction)

  1. 事務是指邏輯上的一組操作,組成這組操作的各個單元,要不全成功要不全失敗。

  2. - 支援連續SQL的集體成功或集體撤銷。

  3. - 事務是資料庫在資料晚自習方面的一個功能。

  4. - 需要利用 InnoDB BDB 儲存引擎,對自動提交的特性支援完成。

  5. - InnoDB被稱為事務安全型引擎。

  6. -- 事務開啟

  7. START TRANSACTION; 或者 BEGIN;

  8. 開啟事務後,所有被執行的SQL陳述句均被認作當前事務內的SQL陳述句。

  9. -- 事務提交

  10. COMMIT;

  11. -- 事務回滾

  12. ROLLBACK;

  13. 如果部分操作發生問題,對映到事務開啟前。

  14. -- 事務的特性

  15. 1. 原子性(Atomicity

  16. 事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。

  17. 2. 一致性(Consistency

  18. 事務前後資料的完整性必須保持一致。

  19. - 事務開始和結束時,外部資料一致

  20. - 在整個事務過程中,操作是連續的

  21. 3. 隔離性(Isolation

  22. 多個使用者併發訪問資料庫時,一個使用者的事務不能被其它使用者的事物所幹擾,多個併發事務之間的資料要相互隔離。

  23. 4. 永續性(Durability

  24. 一個事務一旦被提交,它對資料庫中的資料改變就是永久性的。

  25. -- 事務的實現

  26. 1. 要求是事務支援的表型別

  27. 2. 執行一組相關的操作前開啟事務

  28. 3. 整組操作完成後,都成功,則提交;如果存在失敗,選擇回滾,則會回到事務開始的備份點。

  29. -- 事務的原理

  30. 利用InnoDB的自動提交(autocommit)特性完成。

  31. 普通的MySQL執行陳述句後,當前的資料提交操作均可被其他客戶端可見。

  32. 而事務是暫時關閉“自動提交”機制,需要commit提交持久化資料操作。

  33. -- 註意

  34. 1. 資料定義語言(DDL)陳述句不能被回滾,比如建立或取消資料庫的陳述句,和建立、取消或更改表或儲存的子程式的陳述句。

  35. 2. 事務不能被巢狀

  36. -- 儲存點

  37. SAVEPOINT 儲存點名稱 -- 設定一個事務儲存點

  38. ROLLBACK TO SAVEPOINT 儲存點名稱 -- 回滾到儲存點

  39. RELEASE SAVEPOINT 儲存點名稱 -- 刪除儲存點

  40. -- InnoDB自動提交特性設定

  41. SET autocommit = 0|1; 0表示關閉自動提交,1表示開啟自動提交。

  42. - 如果關閉了,那普通操作的結果對其他客戶端也不可見,需要commit提交後才能持久化資料操作。

  43. - 也可以關閉自動提交來開啟事務。但與START TRANSACTION不同的是,

  44. SET autocommit是永久改變伺服器的設定,直到下次再次修改該設定。(針對當前連線)

  45. START TRANSACTION記錄開啟前的狀態,而一旦事務提交或回滾後就需要再次開啟事務。(針對當前事務)

鎖表

  1. /* 鎖表 */

  2. 表鎖定只用於防止其它客戶端進行不正當地讀取和寫入

  3. MyISAM 支援表鎖,InnoDB 支援行鎖

  4. -- 鎖定

  5. LOCK TABLES tbl_name [AS alias]

  6. -- 解鎖

  7. UNLOCK TABLES

觸發器

  1. /* 觸發器 */ ------------------

  2. 觸發程式是與表有關的命名資料庫物件,當該表出現特定事件時,將啟用該物件

  3. 監聽:記錄的增加、修改、刪除。

  4. -- 建立觸發器

  5. CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt

  6. 引數:

  7. trigger_time是觸發程式的動作時間。它可以是 before after,以指明觸發程式是在啟用它的陳述句之前或之後觸發。

  8. trigger_event指明瞭啟用觸發程式的陳述句的型別

  9. INSERT:將新行插入表時啟用觸發程式

  10. UPDATE:更改某一行時啟用觸發程式

  11. DELETE:從表中刪除某一行時啟用觸發程式

  12. tbl_name:監聽的表,必須是永久性的表,不能將觸發程式與TEMPORARY表或檢視關聯起來。

  13. trigger_stmt:當觸發程式啟用時執行的陳述句。執行多個陳述句,可使用BEGIN...END複合陳述句結構

  14. -- 刪除

  15. DROP TRIGGER [schema_name.]trigger_name

  16. 可以使用oldnew代替舊的和新的資料

  17. 更新操作,更新前是old,更新後是new.

  18. 刪除操作,只有old.

  19. 增加操作,只有new.

  20. -- 註意

  21. 1. 對於具有相同觸發程式動作時間和事件的給定表,不能有兩個觸發程式。

  22. -- 字元連線函式

  23. concat(str1,str2,...])

  24. concat_ws(separator,str1,str2,...)

  25. -- 分支陳述句

  26. if 條件 then

  27. 執行陳述句

  28. elseif 條件 then

  29. 執行陳述句

  30. else

  31. 執行陳述句

  32. end if;

  33. -- 修改最外層陳述句結束符

  34. delimiter 自定義結束符號

  35. SQL陳述句

  36. 自定義結束符號

  37. delimiter ; -- 修改回原來的分號

  38. -- 陳述句塊包裹

  39. begin

  40. 陳述句塊

  41. end

  42. -- 特殊的執行

  43. 1. 只要新增記錄,就會觸發程式。

  44. 2. Insert into on duplicate key update 語法會觸發:

  45. 如果沒有重覆記錄,會觸發 before insert, after insert;

  46. 如果有重覆記錄並更新,會觸發 before insert, before update, after update;

  47. 如果有重覆記錄但是沒有發生更新,則觸發 before insert, before update

  48. 3. Replace 語法 如果有記錄,則執行 before insert, before delete, after delete, after insert

SQL程式設計

  1. /* SQL程式設計 */ ------------------

  2. --// 區域性變數 ----------

  3. -- 變數宣告

  4. declare var_name[,...] type [default value]

  5. 這個陳述句被用來宣告區域性變數。要給變數提供一個預設值,請包含一個default子句。值可以被指定為一個運算式,不需要為一個常數。如果沒有default子句,初始值為null

  6. -- 賦值

  7. 使用 set select into 陳述句為變數賦值。

  8. - 註意:在函式內是可以使用全域性變數(使用者自定義的變數)

  9. --// 全域性變數 ----------

  10. -- 定義、賦值

  11. set 陳述句可以定義併為變數賦值。

  12. set @var = value;

  13. 也可以使用select into陳述句為變數初始化並賦值。這樣要求select陳述句只能傳回一行,但是可以是多個欄位,就意味著同時為多個變數進行賦值,變數的數量需要與查詢的列數一致。

  14. 還可以把賦值陳述句看作一個運算式,透過select執行完成。此時為了避免=被當作關係運運算元看待,使用:=代替。(set陳述句可以使用= :=)。

  15. select @var:=20;

  16. select @v1:=id, @v2=name from t1 limit 1;

  17. select * from tbl_name where @var:=30;

  18. select into 可以將表中查詢獲得的資料賦給變數。

  19. -| select max(height) into @max_height from tb;

  20. -- 自定義變數名

  21. 為了避免select陳述句中,使用者自定義的變數與系統識別符號(通常是欄位名)衝突,使用者自定義變數在變數名前使用@作為開始符號。

  22. @var=10;

  23. - 變數被定義後,在整個會話週期都有效(登入到退出)

  24. --// 控制結構 ----------

  25. -- if陳述句

  26. if search_condition then

  27. statement_list

  28. [elseif search_condition then

  29. statement_list]

  30. ...

  31. [else

  32. statement_list]

  33. end if;

  34. -- case陳述句

  35. CASE value WHEN [compare-value] THEN result

  36. [WHEN [compare-value] THEN result ...]

  37. [ELSE result]

  38. END

  39. -- while迴圈

  40. [begin_label:] while search_condition do

  41. statement_list

  42. end while [end_label];

  43. - 如果需要在迴圈內提前終止 while迴圈,則需要使用標簽;標簽需要成對出現。

  44. -- 退出迴圈

  45. 退出整個迴圈 leave

  46. 退出當前迴圈 iterate

  47. 透過退出的標簽決定退出哪個迴圈

  48. --// 內建函式 ----------

  49. -- 數值函式

  50. abs(x) -- 絕對值 abs(-10.9) = 10

  51. format(x, d) -- 格式化千分位數值 format(1234567.456, 2) = 1,234,567.46

  52. ceil(x) -- 向上取整 ceil(10.1) = 11

  53. floor(x) -- 向下取整 floor (10.1) = 10

  54. round(x) -- 四捨五入去整

  55. mod(m, n) -- m%n m mod n 求餘 10%3=1

  56. pi() -- 獲得圓周率

  57. pow(m, n) -- m^n

  58. sqrt(x) -- 算術平方根

  59. rand() -- 隨機數

  60. truncate(x, d) -- 擷取d位小數

  61. -- 時間日期函式

  62. now(), current_timestamp(); -- 當前日期時間

  63. current_date(); -- 當前日期

  64. current_time(); -- 當前時間

  65. date('yyyy-mm-dd hh:ii:ss'); -- 獲取日期部分

  66. time('yyyy-mm-dd hh:ii:ss'); -- 獲取時間部分

  67. date_format('yyyy-mm-dd hh:ii:ss', '%d %y %a %d %m %b %j'); -- 格式化時間

  68. unix_timestamp(); -- 獲得unix時間戳

  69. from_unixtime(); -- 從時間戳獲得時間

  70. -- 字串函式

  71. length(string) -- string長度,位元組

  72. char_length(string) -- string的字元個數

  73. substring(str, position [,length]) -- strposition開始,取length個字元

  74. replace(str ,search_str ,replace_str) -- str中用replace_str替換search_str

  75. instr(string ,substring) -- 傳回substring首次在string中出現的位置

  76. concat(string [,...]) -- 連線字串

  77. charset(str) -- 傳回字串字符集

  78. lcase(string) -- 轉換成小寫

  79. left(string, length) -- string2中的左邊起取length個字元

  80. load_file(file_name) -- 從檔案讀取內容

  81. locate(substring, string [,start_position]) -- instr,但可指定開始位置

  82. lpad(string, length, pad) -- 重覆用pad加在string開頭,直到字串長度為length

  83. ltrim(string) -- 去除前端空格

  84. repeat(string, count) -- 重覆count

  85. rpad(string, length, pad) --在str後用pad補充,直到長度為length

  86. rtrim(string) -- 去除後端空格

  87. strcmp(string1 ,string2) -- 逐字元比較兩字串大小

  88. -- 流程函式

  89. case when [condition] then result [when [condition] then result ...] [else result] end 多分支

  90. if(expr1,expr2,expr3) 雙分支。

  91. -- 聚合函式

  92. count()

  93. sum();

  94. max();

  95. min();

  96. avg();

  97. group_concat()

  98. -- 其他常用函式

  99. md5();

  100. default();

  101. --// 儲存函式,自定義函式 ----------

  102. -- 新建

  103. CREATE FUNCTION function_name (引數串列) RETURNS 傳回值型別

  104. 函式體

  105. - 函式名,應該合法的識別符號,並且不應該與已有的關鍵字衝突。

  106. - 一個函式應該屬於某個資料庫,可以使用db_name.funciton_name的形式執行當前函式所屬資料庫,否則為當前資料庫。

  107. - 引數部分,由"引數名""引數型別"組成。多個引數用逗號隔開。

  108. - 函式體由多條可用的mysql陳述句,流程控制,變數宣告等陳述句構成。

  109. - 多條陳述句應該使用 begin...end 陳述句塊包含。

  110. - 一定要有 return 傳回值陳述句。

  111. -- 刪除

  112. DROP FUNCTION [IF EXISTS] function_name;

  113. -- 檢視

  114. SHOW FUNCTION STATUS LIKE 'partten'

  115. SHOW CREATE FUNCTION function_name;

  116. -- 修改

  117. ALTER FUNCTION function_name 函式選項

  118. --// 儲存過程,自定義功能 ----------

  119. -- 定義

  120. 儲儲存存過程 是一段程式碼(過程),儲存在資料庫中的sql組成。

  121. 一個儲存過程通常用於完成一段業務邏輯,例如報名,交班費,訂單入庫等。

  122. 而一個函式通常專註與某個功能,視為其他程式服務的,需要在其他陳述句中呼叫函式才可以,而儲存過程不能被其他呼叫,是自己執行 透過call執行。

  123. -- 建立

  124. CREATE PROCEDURE sp_name (引數串列)

  125. 過程體

  126. 引數串列:不同於函式的引數串列,需要指明引數型別

  127. IN,表示輸入型

  128. OUT,表示輸出型

  129. INOUT,表示混合型

  130. 註意,沒有傳回值。

儲存過程

  1. /* 儲存過程 */ ------------------

  2. 儲存過程是一段可執行性程式碼的集合。相比函式,更偏向於業務邏輯。

  3. 呼叫:CALL 過程名

  4. -- 註意

  5. - 沒有傳回值。

  6. - 只能單獨呼叫,不可夾雜在其他陳述句中

  7. -- 引數

  8. IN|OUT|INOUT 引數名 資料型別

  9. IN 輸入:在呼叫過程中,將資料輸入到過程體內部的引數

  10. OUT 輸出:在呼叫過程中,將過程體處理完的結果傳回到客戶端

  11. INOUT 輸入輸出:既可輸入,也可輸出

  12. -- 語法

  13. CREATE PROCEDURE 過程名 (引數串列)

  14. BEGIN

  15. 過程體

  16. END

使用者和許可權管理

  1. /* 使用者和許可權管理 */ ------------------

  2. -- root密碼重置

  3. 1. 停止MySQL服務

  4. 2. [Linux] /usr/local/mysql/bin/safe_mysqld --skip-grant-tables &

  5. [Windows] mysqld --skip-grant-tables

  6. 3. use mysql;

  7. 4. UPDATE `user` SET PASSWORD=PASSWORD("密碼") WHERE `user` = "root";

  8. 5. FLUSH PRIVILEGES;

  9. 使用者資訊表:mysql.user

  10. -- 掃清許可權

  11. FLUSH PRIVILEGES;

  12. -- 增加使用者

  13. CREATE USER 使用者名稱 IDENTIFIED BY [PASSWORD] 密碼(字串)

  14. - 必須擁有mysql資料庫的全域性CREATE USER許可權,或擁有INSERT許可權。

  15. - 只能建立使用者,不能賦予許可權。

  16. - 使用者名稱,註意引號:如 'user_name'@'192.168.1.1'

  17. - 密碼也需引號,純數字密碼也要加引號

  18. - 要在純文字中指定密碼,需忽略PASSWORD關鍵詞。要把密碼指定為由PASSWORD()函式傳回的混編值,需包含關鍵字PASSWORD

  19. -- 重新命名使用者

  20. RENAME USER old_user TO new_user

  21. -- 設定密碼

  22. SET PASSWORD = PASSWORD('密碼') -- 為當前使用者設定密碼

  23. SET PASSWORD FOR 使用者名稱 = PASSWORD('密碼') -- 為指定使用者設定密碼

  24. -- 刪除使用者

  25. DROP USER 使用者名稱

  26. -- 分配許可權/新增使用者

  27. GRANT 許可權串列 ON 表名 TO 使用者名稱 [IDENTIFIED BY [PASSWORD] 'password']

  28. - all privileges 表示所有許可權

  29. - *.* 表示所有庫的所有表

  30. - 庫名.表名 表示某庫下麵的某表

  31. GRANT ALL PRIVILEGES ON `pms`.* TO 'pms'@'%' IDENTIFIED BY 'pms0817';

  32. -- 檢視許可權

  33. SHOW GRANTS FOR 使用者名稱

  34. -- 檢視當前使用者許可權

  35. SHOW GRANTS; SHOW GRANTS FOR CURRENT_USER; SHOW GRANTS FOR CURRENT_USER();

  36. -- 撤消許可權

  37. REVOKE 許可權串列 ON 表名 FROM 使用者名稱

  38. REVOKE ALL PRIVILEGES, GRANT OPTION FROM 使用者名稱 -- 撤銷所有許可權

  39. -- 許可權層級

  40. -- 要使用GRANTREVOKE,您必須擁有GRANT OPTION許可權,並且您必須用於您正在授予或撤銷的許可權。

  41. 全域性層級:全域性許可權適用於一個給定伺服器中的所有資料庫,mysql.user

  42. GRANT ALL ON *.*和 REVOKE ALL ON *.*只授予和撤銷全域性許可權。

  43. 資料庫層級:資料庫許可權適用於一個給定資料庫中的所有標的,mysql.db, mysql.host

  44. GRANT ALL ON db_name.*和REVOKE ALL ON db_name.*只授予和撤銷資料庫許可權。

  45. 表層級:表許可權適用於一個給定表中的所有列,mysql.talbes_priv

  46. GRANT ALL ON db_name.tbl_nameREVOKE ALL ON db_name.tbl_name只授予和撤銷表許可權。

  47. 列層級:列許可權適用於一個給定表中的單一列,mysql.columns_priv

  48. 當使用REVOKE時,您必須指定與被授權列相同的列。

  49. -- 許可權串列

  50. ALL [PRIVILEGES] -- 設定除GRANT OPTION之外的所有簡單許可權

  51. ALTER -- 允許使用ALTER TABLE

  52. ALTER ROUTINE -- 更改或取消已儲存的子程式

  53. CREATE -- 允許使用CREATE TABLE

  54. CREATE ROUTINE -- 建立已儲存的子程式

  55. CREATE TEMPORARY TABLES -- 允許使用CREATE TEMPORARY TABLE

  56. CREATE USER -- 允許使用CREATE USER, DROP USER, RENAME USERREVOKE ALL PRIVILEGES

  57. CREATE VIEW -- 允許使用CREATE VIEW

  58. DELETE -- 允許使用DELETE

  59. DROP -- 允許使用DROP TABLE

  60. EXECUTE -- 允許使用者執行已儲存的子程式

  61. FILE -- 允許使用SELECT...INTO OUTFILELOAD DATA INFILE

  62. INDEX -- 允許使用CREATE INDEXDROP INDEX

  63. INSERT -- 允許使用INSERT

  64. LOCK TABLES -- 允許對您擁有SELECT許可權的表使用LOCK TABLES

  65. PROCESS -- 允許使用SHOW FULL PROCESSLIST

  66. REFERENCES -- 未被實施

  67. RELOAD -- 允許使用FLUSH

  68. REPLICATION CLIENT -- 允許使用者詢問從屬伺服器或主伺服器的地址

  69. REPLICATION SLAVE -- 用於複製型從屬伺服器(從主伺服器中讀取二進位制日誌事件)

  70. SELECT -- 允許使用SELECT

  71. SHOW DATABASES -- 顯示所有資料庫

  72. SHOW VIEW -- 允許使用SHOW CREATE VIEW

  73. SHUTDOWN -- 允許使用mysqladmin shutdown

  74. SUPER -- 允許使用CHANGE MASTER, KILL, PURGE MASTER LOGSSET GLOBAL陳述句,mysqladmin debug命令;允許您連線(一次),即使已達到max_connections

  75. UPDATE -- 允許使用UPDATE

  76. USAGE -- “無許可權”的同義詞

  77. GRANT OPTION -- 允許授予許可權

表維護

  1. /* 表維護 */

  2. -- 分析和儲存表的關鍵字分佈

  3. ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE 表名 ...

  4. -- 檢查一個或多個表是否有錯誤

  5. CHECK TABLE tbl_name [, tbl_name] ... [option] ...

  6. option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}

  7. -- 整理資料檔案的碎片

  8. OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

雜項

  1. /* 雜項 */ ------------------

  2. 1. 可用反引號(`)為識別符號(庫名、表名、欄位名、索引、別名)包裹,以避免與關鍵字重名!中文也可以作為識別符號!

  3. 2. 每個庫目錄存在一個儲存當前資料庫的選項檔案db.opt。

  4. 3. 註釋:

  5. 單行註釋 # 註釋內容

  6. 多行註釋 /* 註釋內容 */

  7. 單行註釋 -- 註釋內容 (標準SQL註釋風格,要求雙破折號後加一空格符(空格、TAB、換行等))

  8. 4. 樣式萬用字元:

  9. _ 任意單個字元

  10. % 任意多個字元,甚至包括零字元

  11. 單引號需要進行轉義 \'

  12. 5. CMD命令列內的陳述句結束符可以為 ";", "\G", "\g",僅影響顯示結果。其他地方還是用分號結束。delimiter 可修改當前對話的陳述句結束符。

  13. 6. SQL對大小寫不敏感

  14. 7. 清除已有陳述句:\c

  15.  

 

原文地址:https://shockerli.net/post/1000-line-mysql-note/ 

贊(0)

分享創造快樂