啟動MySQL服務
$ sudo service mysql start
或者
/etc/init.d/mysql start
使用root用戶登陸
$ mysql -u 用戶名 -p 密碼
查看命令幫助信息
mysql> HELP 命令名;
查看授予用戶的安全權限
mysql> SHOW GRANTS;
注釋
-- 單行注釋
/* 多行注釋 */
取消正在輸入的命令
\c
查看當前含有哪些數據庫
mysql> SHOW DATABASES;
連接數據庫
mysql> USE 數據庫名
查看當前數據庫中含有哪些表
mysql> SHOW TABLES;
顯示表屬性
mysql> DESCRIBE 表名;
或
mysql> SHOW COLUMNS FROM 表名;
后者將會輸出指定字段的字段名、數據類型、非空約束、是否是主鍵和默認值等信息。
顯示服務器警告或錯誤信息
mysql> SHOW ERRORS;
或
mysql> SHOW WARNINGS;
退出數據庫
mysql> EXIT/QUIT;
新建數據庫
mysql> CREATE DATABASE 數據庫名;
通常SQL語句不區分大小寫,但建議將關鍵字大寫,變量和數據小寫。
新建數據表
mysql> CREATE TABLE 數據表名
-> (
-> 列名1 數據類型(數據長度) PRIMARY KEY, --主鍵
-> 列名2 數據類型(數據長度) NOT NULL, --非空約束
-> 列名3 數據類型(數據長度) DEFAULT '默認值', --默認值約束
-> UNIQUE(列名a), --唯一約束
-> CONSTRAINT 主鍵名 PRIMARY KEY (列名a,列名b,...), --復合主鍵
-> CONSTRAINT 外鍵名 FOREIGN KEY (列名) REFERENCES 表名(主鍵名) --外鍵
-> );
注意最后一個列名后面不加逗號”,”。
數據類型
數據類型 | 大小(字節) | 說明 | 格式 |
---|---|---|---|
INT | 4 | 整數 | - |
FLOAT | 4 | 單精度浮點數 | - |
DOUBLE | 4 | 雙精度浮點數 | - |
ENUM | - | 單選 | ENUM(‘a’,’b’,’c’) |
SET | - | 多選 | SET(‘1’,’2’,’3’) |
DATE | 3 | 日期 | YYYY-MM-DD |
TIME | 3 | 時間點或持續時間 | HH:MM:SS |
YEAR | 1 | 年份值 | YYYY |
CHAR | 0~255 | 定長字符串 | - |
VARCHAR | 0~255 | 變長字符串 | - |
TEXT | 0~65535 | 長文本數據 | - |
CHAR和VARCHAR的區別:
CHAR的長度是固定的,而VARCHAR的長度是可以變化的。
比如,存儲字符串"abc",對于CHAR (10),表示存儲的字符將占10個字節(包括7個空字符),
而同樣的VARCHAR(12)則只占用3個字節的長度,12只是最大值,
當你存儲的字符小于12時,按實際長度存儲。
ENUM和SET的區別:
ENUM類型的數據的值,必須是定義時枚舉的值的其中之一,即單選,而SET類型的值則可以多選。
插入數據
INSERT INTO 數據表名(列名1,列名2,列名3) VALUES(值1,值2,值3);
VALUES中的值為對應列屬性的值,其中CHAR,VARCHAR,TEXT,DATE,TIME,ENUM等類型的數據需要單引號修飾。
SQL約束
主鍵
PRIMARYKEY KEY
或
CONSTRAINT 主鍵名 PRIMARY KEY (列名a,列名b,...)
一個表中可以有多個主鍵。
外鍵
CONSTRAINT 外鍵名 FOREIGN KEY (列名) REFERENCES 數據表名 (被參考的主鍵名)
每個表可以由多個外鍵,每個外鍵必須參考另一個表中的主鍵,被外鍵約束的列的取值必須在它參考的主鍵的列中有對應的值。
非空約束
NOT NULL
MySQL中違反非空約束只會警告不會報錯。
默認值約束
DEFAULT '默認值'
字符類型默認值使用單引號括起。
唯一約束
UNIQUE(列名)
該表中該列值不可重復。
MySQL通配符
_ ### 只能匹配單個任意字符
% ### 匹配0或多個任意字符
必須通過LIKE使用通配符。
通配符不能用于檢索NULL。
使用通配符搜索相對于其他搜索方式通常要花費更長的時間。
將通配符放在搜索模式的開頭處,搜索起來是最慢的,盡量避免這樣做。
MySQL查詢語句關鍵字順序
mysql> SELECT ...
FROM ...
WHERE ...
ORDER BY ...
LIMIT ...;
SELECT操作
查看表中所有的內容
mysql> SELECT * FROM 數據表名;
SELECT基本格式
mysql> SELECT 列名a,列名b,...
-> FROM 數據表名
-> WHERE 限制條件1 AND/OR 限制條件2 ...
-> 其他命令;
WHERE子句操作符
操作符 | 說明 |
---|---|
= | 等于 |
!= | 不等于 |
<> | 不等于 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
<= | 大于等于 |
BETWEEN … AND | 在兩個值之間 |
AND | 需要同時滿足的條件 |
OR | 滿足其一即可的條件 |
IN | 指定條件范圍 |
NOT | 否定其后的任何條件 |
IS NULL | 空值檢查 |
LIKE | 使用通配符 |
AND的優先級大于OR,當同時使用AND和OR時,使用括號來避免因篩選順序不同造成錯誤。
IN操作符的范圍參數放在圓括號中,以逗號分隔。
使用IN通常比使用OR執行速度更快,而且語義更清楚,能夠更動態的建立WHERE子句。
在進行匹配過濾和不匹配過濾時都不會對NULL值進行匹配。
NULL表示不含值,它不同于0、空字符串和空格。
使用單引號限定字符串。
匹配字符串時默認不區分大小寫。
例如:
SELECT 列名a,列名b,... FROM 表名 WHERE 列名a>x1 AND/OR 列名a<x2 AND/OR 列名b='x3';
SELECT 列名a,列名b,... FROM 表名 WHERE 列名a IN/NOT IN ('范圍列名a','范圍列名b',...);
SELECT 列名a,列名b,... FROM 表名 WHERE 列名a LIKE 'xx_xx%';
對查詢結果排序
mysql> SELECT 列名... FROM 表名 ORDER BY 首選排序列名
DESC/ASC, 第二排序列名 DESC/ASC, ... DESC/ASC;
ORDER BY 默認升序排列,使用ASC指定升序排序,使用DESC指定降序排序。
DESC/ASC只能直接作用于直接位于其前面的列名,如果想在多個列上進行降序排序,必須對每個列指定DESC關鍵字。
去除重復值
mysql> SELECT DISTINCT 列名... FROM 表名;
DISTINCT關鍵字作用于所有列而不是僅作用于前置它的列。
限制返回結果數
mysql> SELECT 列名... FROM 表名 LIMIT 檢索起始行,最大輸出行數;
或
mysql> SELECT 列名... FROM 表名 LIMIT
最大輸出行數 OFFSET 檢索起始行; # MySQL 5
若不指定起始行,則從第0行開始檢索,注意MySQL中表行從0開始。
若語句中含有ORDER BY,則LIMIT應該位于ORDER BY之后。
例句:
SELECT 列名,... FROM 表名 ORDER BY 列名 ASC/DESC;
內置函數和計算
函數 | 功能 | 作用類型 |
---|---|---|
COUNT() | 計數 | 任意類型 |
SUM() | 求和 | 數字類數據 |
AVG() | 平均值 | 數字類數據 |
MAX() | 最大值 | 數字類數據 |
MIN() | 最小值 | 數字類數據 |
AS | 重命名 | 不適用 |
例如:
SELECT COUNT/SUM/AVG/MAX/MIN(列名) AS 新的列名,函數2,函數3,... FROM 表名;
會將函數的結果作為新的列的值。
子查詢
mysql> SELECT 所查列名,函數()
-> FROM 表名
-> WHERE 所查列名 IN
-> (SELECT 相關列名 FROM 相關表名 WHERE 限制條件);
處理多個表且處理結果來自一個表時使用子查詢,子查詢可以擴展多層。
連接查詢
mysql> SELECT 列名1,列名2,...
-> FROM 表名1,表名2
-> WHERE 表名1.列名1 = 表名2.列名2;
或
mysql> SELECT 列名1,列名2,...
-> FROM 表名1 JOIN 表名2
-> ON 表名1.列名1 = 表名2.列名2;
使用連接查詢顯示多個表中的數據。
刪除數據庫
mysql-> DROP DATABASE 數據庫名;
重命名數據表
mysql-> RENAME TABLE 原數據表名 TO 新數據表名;
或
mysql-> ALTER TABLE 原數據表名 RENAME 新數據表名;
或
mysql-> ALTER TABLE 原數據表名 RENAME TO 新數據表名;
刪除數據表
mysql-> DROP TABLE 數據表名;
在表中增加列
mysql-> ALTER TABLE 數據表名
-> ADD COLUMN 新增列名 數據類型(數據長度) 約束
-> 插入的位置;
或
mysql-> ALTER TABLE 數據表名
-> ADD 新增列名 數據類型(數據長度) 約束
-> 插入的位置;
插入的位置:
新增列默認放在表的最右邊,使用 FIRST 將新列插入到第一列,使用 AFTER 指定列名 將新列插入到指定列后面。
刪除列
mysql-> ALTER TABLE 表名
-> DROP COLUMN 列名;
或
mysql-> ALTER TABLE 表名
-> DROP 列名;
修改列
mysql-> ALTER TABLE 表名
-> CHANGE 原列名 新列名 數據類型(數據長度) 約束;
數據類型不可省略。修改數據類型可能導致數據丟失,慎用!
修改數據類型
mysql-> ALTER TABLE 表名
-> MODIFY 列名 新數據類型;
修改表中某個值
mysql-> UPDATE 表名
-> SET 列名a=新值a,列名b=新值b,...
-> WHERE 條件;
一定要加限制條件!
刪除某行記錄
mysql-> DELETE FROM 表名
-> WHERE 條件;
一定要加限制條件!
為某列建立索引
mysql-> ALTER TABLE 表名
-> ADD INDEX 索引名 (列名);
或
mysql-> CREATE INDEX 索引名
-> ON 表名 (列名);
顯示某表的索引
mysql-> SHOW INDEX FROM 表名;
創建視圖(一種虛擬存在的表)
mysql-> CREATE VIEW 視圖名(列名1,列名2,...)
-> AS SELECT 目標列名a,目標列名b,...
-> FROM 表名;
在SELECT中使用子查詢或連接查詢可以將視圖建立在多張表上。
導入(將文件中的數據保存進表)
mysql-> LOAD DATA INFILE '文件路徑'
-> INTO TABLE 表名;
導出(將表中數據保存到文件中)
mysql-> SELECT 列名1,列名2,...
-> INTO OUTFILE '文件路徑'
-> FROM 表名;
備份整個數據庫
$ mysqldump -u root 數據庫名 > 備份文件名
備份整個表
$ mysqldump -u root 數據庫名 數據表名 > 備份文件名
恢復數據庫
mysql-> source 文件路徑/備份文件名;
# 注意:需要先使用USE命令選擇數據庫之后才能使用SOURCE命令
或
$ mysql -u root 新建的數據庫名 < 備份文件名;
或者
$ mysqldump -u root -p 新建的數據庫名 < 備份文件名;
復制整個數據表到一張新表中
create table <新表名> (
select * from <數據表>
)
正則表達式
用關鍵字REGEXP來匹配正則表達式
正則表達式都要使用”括起
-
REGEXP的返回值
- 0 表示不匹配
- 1 表示匹配
使用.在正則表達式中匹配任意一個字符
???LIKE和REGEXP所匹配的部分(列值、列名)
v3.23.4以后,MySQL中正則表達式默認不區分大小寫
要區分大小寫,需要在REGEXP之后、表達式之前加BINARY關鍵字
搜索多個字符串之一
-
使用|將多個字符串分隔開
- 只要滿足其中一個字符串即可返回結果
- 搜索多個字符中的一個字符
-
使用[]將多個字符括起
- 只要匹配字符集中的一個字符即可返回結果
- ‘[1a2b]’等同于’[1|a|2|b]’
- 使用[0-9]匹配0到9之間的任意數字,可自定義范圍
- 使用[a-z]匹配a到z之間的任意字母,可自定義范圍
- 在集合的開始處(在[]內部)放置^符號表示否定,將會匹配除字符集中的字符以外的字符
‘[1|2|3] sth.’ 將會匹配1 sht.或2 sth.或3 sth.
‘1|2|3 sth.’ 將會匹配1或2或3 sth.
MySQL中的正則表達式使用雙反斜杠(\)來表示轉義
多數DBMS中使用反斜杠(\)表示轉義,但MySQL要求使用雙反斜杠(\)表示轉義
空白元字符
元字符 | 說明 |
---|---|
\f | 換頁 |
\n | 換行 |
\r | 回車 |
\t | 水平制表 |
\v | 垂直制表 |
字符類(預定義字符集)
字符類 | 說明 |
---|---|
[:alnum:] | 任意字符和數字(同[a-zA-Z0-9]) |
[:alpha:] | 任意字符(同[a-zA-Z]) |
[:blank:] | 空格和水平制表(同[\t]) |
[:cntrl:] | ASCII控制字符(ASCII 0到31和127) |
[:digit:] | 任意數字(同[0-9]) |
[:graph:] | 與[:print:]相同,但不包含空格 |
[:lower:] | 任意小寫字母(同[a-z]) |
[:print:] | 任意可打印字符 |
[:punct:] | 既不在[:alnum:]又不在[:cntrl:]中的任意字符 |
[:space:] | 包括空格在內的任意空白字符(同[\f\n\r\t\v]) |
[:upper:] | 任意大寫字母(同[A-Z]) |
[:xdigit:] | 任意十六進制數(同[a-fA-F0-9]) |
匹配多個實例
重復元字符 | 說明 |
---|---|
* | 0個或多個匹配 |
+ | 1個或多個匹配(同{1,}) |
? | 0個或1個匹配(同{0,1) |
{n} | 指定數目的匹配 |
{n,} | 不少于指定數目的匹配 |
{n,m} | 匹配數目的范圍(m不超過255) |
重復元字符對它前邊的字符或表達式生效
定位元字符
定位元字符 | 說明 |
---|---|
^ | 只匹配文本的開始處 |
$ | 只匹配文本的結尾處 |
[[:<:]] | 只匹配詞的開始處 |
[[:>:]] | 只匹配詞的結尾處 |
定位元字符對它后邊的字符或表達式生效
拼接字段
在 SELECT 之后、FROM 之前使用 Concat()函數拼接字段(列)
將要查詢并拼接的多個列名和其他要插入的字符(例如括號等)作為 Concat()的參數
各個參數之間使用逗號分隔
多數DBMS使用 || 或者 + 來實現拼接,但MySQL使用 Concat()函數
在進行SQL語句轉換時需要留意這一區別
MySQL函數可以嵌套使用
使用 Trim()函數來去除查詢結果中兩邊的所有空格
使用 LTrim()函數來去除查詢結果中左邊的所有空格
使用 RTrim()函數來去除查詢結果中右邊的所有空格
函數參數為要查找的列名
別名(alias)
- 使用 AS 關鍵字創建別名
- AS 可以放在 FROM 之前或者之后
- 別名可以用于為列名重命名
- AS關鍵字只對它前面的一個列名起作用
MySQL算數操作符
操作符 | 說明 |
---|---|
+ | 加 |
- | 減 |
* | 乘 |
/ | 除 |
可以使用圓括號區分運算優先順序
SELECT測試
- MySQL中SELECT語句可以省略FROM子句直接訪問和處理表達式,以便試驗
SQL函數
- 函數的移植性不如SQL語句,不同DBMS之間函數差異較大
- 在使用函數時應該做好代碼注釋,以便以后的修改工作
常用的文本處理函數
函數 | 說明 |
---|---|
Left() | 返回串左邊的字符 |
Length() | 返回串的長度 |
Locate() | 找出串的一個子串 |
Lower() | 將串轉換為小寫 |
LTrim() | 去掉串左邊的空格 |
Rigit() | 返回串右邊的字符 |
RTrim() | 去掉串右邊的空格 |
Soundex() | 返回串的SOUNDEX值 |
SubString() | 返回子串的字符 |
Upper() | 將串轉換為大寫 |
Soundex是將文本串轉換為描述其語音表示的字母數字模式的算法,使得能夠對串進行發音比較而不是字母比較
例如搜索發音類似 Lie 的子串:
mysql> SELECT 列名
FROM 表名
WHERE Soundex(列名)=Soundex('Lie');
該搜索可以匹配到發音與 Lie 類似的 Lee 、 Li 等
日期和時間處理函數
函數 | 說明 |
---|---|
AddDate() | 增加一個日期(天、周等) |
AddTime() | 增加一個時間(時、分等) |
CurDate() | 返回當前日期 |
CurTime() | 返回當前時間 |
Date() | 返回日期時間的日期部分 v4.1.1 |
DateDiff() | 計算兩個日期之差 |
Date_Add() | 高度靈活的日期計算函數? |
Date_Format() | 返回一個格式化的日期或時間串 |
Day() | 返回一個日期的天數部分 |
DayOfWeek() | 返回一個日期對應的星期 |
Hour() | 返回一個時間的小時部分 |
Minute() | 返回一個時間的分鐘部分 |
Now() | 返回當前日期時間 |
Second() | 返回一個時間的秒部分 |
Time() | 返回一個日期的時間部分 v4.1.1 |
Year() | 返回一個日期的年份部分 |
MySQL日期格式使用 yyyy-mm-dd 格式
檢索日期時應該使用Date()函數,直接比較可能檢測不到結果
MySQL會將00-69處理為2000-2069,將70-99處理為1970-1999,為避免歧義,使用標準格式
數值處理函數
函數 | 說明 |
---|---|
Abs() | 返回一個數的絕對值 |
Cos() | 返回一個角度的余弦 |
Exp() | 返回一個數的指數值 |
Mod() | 返回除操作的余數 |
Pi() | 返回圓周率 |
Rand() | 返回一個隨機數 |
Sin() | 返回一個角度的正弦 |
Sqrt() | 返回一個數的平方根 |
Tan() | 返回一個角度的正切 |
SQL聚集函數
函數 | 說明 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某行的平均值 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列之和 |
-
在多個列上進行計算
- 利用標準的算術操作符,所有的聚焦函數都可以用來執行多個列上的計算
- 將列名和算術操作符組成的算數表達式作為函數參數,不要添加逗號、引號等
-
NULL處理
- AVG() 函數忽略值為 NULL 的行
- COUNT(*) 不忽略值為 NULL 的行
- COUNT(列名) 忽略值為 NULL 的行
- MAX() 函數忽略值為 NULL 的行
- MIN() 函數忽略值為 NULL 的行
- SUM() 函數忽略值為 NULL 的行
- AVG()函數
-
AVG() 只能用來確定特定數值列的平均值
- 列名必須作為參數給出
- 為了獲得多個列的平均值,必須使用多個AVG()函數
-
COUNT()函數
- 使用 COUNT(*) 對表中行的數目進行統計,不忽略 NULL 值
- 使用 COUNT(列名) 對特定列的行進行計數,忽略 NULL 值
-
MAX()/MIN()函數
- 可以處理非數值數據
- 聚集不同的值,忽略重復值
-
在聚集函數參數的首位添加 DISTINCT 只對不同的值進行計算
v5.0.3及以上- DISTINCT 后必須跟有列名,不可以用于計算或者表達式
COUNT(*) 不能使用 DISTINCT - 將 DISTINCT 用于 MAX()/MIN() 函數沒有實際意義
- DISTINCT 后必須跟有列名,不可以用于計算或者表達式
-
組合聚集函數
- SELECT 語句可以根據需要包含多個聚集函數
- 每個聚焦函數之間用逗號分隔
-
分組數據
- GROUP BY 子句指示MySQL分組數據,然后對每個組而不是整個結果集進行聚集。
-
使用GROUP BY的一些規定:
- GROUP BY 子句可以包好任意數目的列,這使得能夠對分組進行嵌套
- 如果在 GROUP BY 中嵌套了分組,數據將在最后規定的分組上進行匯總,即在建立分組時,指定的所有列都一起計算,不能從個別的列取回數據。
- GROUP BY 子句中列出的每個列都必須是檢索列或有效的表達式(但不能是聚集函數)。如果在 SELECT 中使用表達式,則必須在 GROUP BY 子句中使用相同的表達式。不能使用別名。
- 除聚集計算語句外,SELECT 語句中的每個列都必須在 GROUP BY 子句中給出。
- 如果分組列具有 NULL 值,則 NULL 作為一個分組返回。如果列中有多行 NULL 值,它們將分為一組。
- GROUP BY子句必須出現在 WHERE 子句之后、ORDER BY 子句之前。
使用 ROLLUP
使用 WITH ROLLUP 關鍵字,可以得到每個分組以及每個分組匯總級別(針對每個分組)的值。
-
WHERE 和 HAVING
- WHERE 過濾行,HAVING 過濾分組。WHERE 中沒有分組的概念
- HAVING 支持所有 WHERE 操作符
- WHERE 在數據分組前進行過濾,HAVING 在數據分組后進行過濾
GROUP BY 和 ORDER BY
ORDER BY | GROUP BY |
---|---|
排序產生的輸出 | 分組行,但輸出可能不是分組的數據 |
任意列都可以使用(甚至非選擇的列) | 只能使用選擇的列或表達式,而且必須使用每個選擇列表達式 |
不一定需要 | 如果與聚集函數一起使用列(或表達式),則必須使用 |
一般在使用 GROUP BY 子句時,應該也給出 ORDER BY 子句,這是保證數據正確排序的唯一方法。
SELECT子句順序
子句 | 說明 | 是否必須使用 |
---|---|---|
SELECT | 要返回的列或表達式 | 是 |
FROM | 從中檢索數據的表 | 僅在從表選擇數據時使用 |
WHERE | 行級過濾 | 否 |
GROUP BY | 分組說明 | 盡在按組計算聚集時使用 |
HAVING | 組級過濾 | 否 |
ORDER BY | 輸出排序順序 | 否 |
LIMIT | 要檢索的行數 | 否 |