mysql常用命令查詢手冊

啟動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() 函數沒有實際意義
  • 組合聚集函數

    • 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 要檢索的行數

原文鏈接:http://www.lxweimin.com/p/73a50d4e89ab

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容