Hi,你們好,今天我給你們帶來的是「MariaDB(MySQL)經常使用語句的使用」php
說明html
1、MySQL語句不區分字符大小寫,在Unix或類Unix(Linux)系統下「參數」區分字符大小寫mysql
2、多數MySQL語句以";"結尾;若是結尾處不寫";"MySQL會等待輸入下一條語句,直到結尾有";"爲止正則表達式
3、一行須要執行多條語句用";"進行分隔sql
本篇內容以Linux系統爲例;本文中的[ 符號裏邊的內容爲可選內容,既無關緊要的 ]、{ 符號裏的內容爲必須給出的內容 }、| 符號爲或者之意;語句以前的符號# 爲Linux系統的命令提示符(需在系統下執行的)、符號> 爲MySQL數據庫提示符(需在MySQL數據庫中執行的);字體顏色爲紅色的是須要注意的地方(可能會出現誤操做的地方)shell
舒適提示:使用電腦閱讀效果更佳數據庫
MariaDB(MySQL)語句分類安全
服務端命令:經過mysql鏈接發往服務器執行並取回結果(SQL語句)服務器
DDL(Data Defined Language):要用於管理數據庫組件,例如表、索引、視圖、用戶、存儲過程網絡
CREATE DATABASE, ALTER DATABASE, DROP DATABASE, CREATE TABLE, ALTER TABLE, DROP TABLE, CREATE INDEX, DROP INDEX, CREATE USER, DROP USER, SELECT
DML(Data Manipulation Language):數據操縱語言,主要用管理表中的數據,實現數據的增、刪、改、查
INSERT, DELETE, UPDATE, SELECT
DCL:權限管理
GRANT, REVOKE
客戶端命令:本地執行
如下語句有兩種表示方式(clear,\c),語句結尾處不用加; 但加了也不會出錯 |
|
語句 |
說明 |
? (\?) |
獲取命令幫助 |
clear (\c) |
清除當前的輸入語句 |
connect (\r) |
從新鏈接MySQL |
delimiter (\d) |
設置語句分隔符,默認爲分號; |
ego (\G) |
語句結束標記,結果以垂直方式顯示 |
exit (\q) |
退出MySQL |
go (\g) |
語句結束標記 |
help (\h) |
顯示此幫助 |
prompt (\R) |
更改MySQL提示符 |
quit (\q) |
退出MySQL |
source (\.) |
裝載並運行SQL腳本,腳本存放的位置"MySQL"用戶須要有權限讀取 |
status (\s) |
獲取MySQL狀態信息 |
system (\!) |
執行shell命令 |
use (\u) |
設定哪一個庫爲默認數據庫 |
1、登陸/退出MySQL
登陸
登陸本地數據庫
匿名登陸
# mysql [數據庫名稱]
# mysql -p [數據庫名稱]
指定用戶登陸
# mysql -u 用戶名 -p [數據庫名稱]
# mysql -u 用戶名 –p用戶的密碼 [數據庫名稱]
遠程登陸數據庫
# mysql -h 主機 -u 用戶名 -p用戶的密碼 [數據庫名稱]
注意:在登陸時可指定數據庫"[DATABASE_NAME]"
退出
> exit
> quit
> \q
Ctrl+C
2、選擇/切換數據庫:在數據庫中執行的操做都要先選擇數據庫
> USE 數據庫名稱;
3、數據庫管理
建立
建立一個新的數據庫
> CREATE {DATABASE | SCHEMA} 數據庫名稱;
建立一個新的數據庫,若是數據庫不存在,則建立
> CREATE DATABASE IF NOT EXISTS 數據庫名稱;
注意:數據庫名稱在建立時定義,後期不可更改
修改
修改指定數據庫的默認字符集
> ALTER DATABASE 數據庫名稱 CHARACTER SET '字符集名稱';
查詢
查看當前設備上已有的數據庫
> SHOW DATABASES;
查看以指定字符開頭的數據庫
> SHOW DATABASES LIKE 'name%';
查看以指定字符結尾的數據庫
> SHOW DATABASES LIKE '%name';
查看數據庫所支持的引擎
> SHOW ENGINES;
查看所支持的字符集
> SHOW CHARACTER SET;
常見字符集
big5:繁體中文
gb2312:簡體中文
utf8:統一的字符編碼標準
查看字符集的排序方式
> SHOW COLLATION;
查看當前數據庫的版本號和當前日期
> SELECT VERSION(), CURRENT_DATE;
刪除
刪除數據庫:刪庫需當心(MySQL沒有回收站)
> DROP {DATABASE | SCHEMA} 數據庫名稱;
> DROP {DATABASE | SCHEMA} [IF EXISTS] 數據庫名稱;
建議把不用的數據庫移動到其餘位置,而不是刪除
# mv /var/lib/mysql/DATABASE_NAME /PATH/TO/DIRECTORY_NAME
4、數據表管理
建立
在數據庫內建立數據表
> USE 數據庫名稱;
> CREATE TABLE 數據表名稱 (字段1 數據類型 修飾符,字段2 數據類型 修飾符,字段3 數據類型 修飾符 ...) [table_option];
MySQL數據類型參考:點我查看
在建立數據表時還能夠定義如下內容:
定義鍵
主鍵:PRIMARY KEY (字段1, 字段2, ...)
惟一鍵:UNIQUE KEY (字段1, 字段2,...)
外鍵:FOREIGN KEY (column)
定義索引
KEY|INDEX [索引名稱] (字段1, 字段2,...)
> CREATE TABLE server ( IDC_ROOM VARCHAR(3) NOT NULL,RACK_SLOT VARCHAR(10)NOT NULL ,SN VARCHAR(30) PRIMARY KEY,HOSTNAME VARCHAR(16) NOT NULL,MACHINE_TYPE VARCHAR(10) NOT NULL ) ;
table_option:
| ENGINE [=] engine_name: 【定義存儲引擎】
| AUTO_INCREMENT [=] value: 【設置默認自動增加數據從數字幾開始算,默認爲1】
| [DEFAULT] CHARACTER SET [=] charset_name: 【定義字符集,如不定義則從數據庫繼承】
| [DEFAULT] COLLATE [=] collation_name: 【定義排序規則】
| COMMENT [=] 'string': 【定義數據表的註釋信息】
| MAX_ROWS [=] value 【定義最大行數】
| MIN_ROWS [=] value 【定義最小行數】
| PASSWORD [=] 'string' 【加密】
| ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT} 【定義行格式】
DEFAULT:默認格式
DYNAMIC:動態格式
FIXED:固定長度
COMPRESSED:壓縮存儲
REDUNDANT:冗餘存儲
COMPACT:緊緻存儲
鍵類型能夠在字段中指明
> CREATE TABLE 數據表名稱 (ID TINYINT NOT NULL AUTO_INCREMENT UNIQUE KEY,NAME VARCHAR(20) NOT NULL UNIQUE KEY);
也能夠單獨指明:把多個字段聯合起來定義(多字段索引)
> CREATE TABLE 數據表名稱 (ID TINYINT NOT NULL AUTO_INCREMENT ,NAME VARCHAR(20) NOT NULL,UNIQUE KEY(ID,NAME));
注意:建立數據表的時候,表名不可以使用"table"做爲其名稱
在指定數據庫中建立數據表
> CREATE TABLE 數據庫名稱.數據表名稱 (字段1 數據類型 修飾符,字段2 數據類型 修飾符,字段3 數據類型 修飾符 ...) [table_option];
插入
向數據表中插入數據
一次插入一行
> INSERT INTO [數據庫名稱.]數據表名稱(字段1,字段2,字段3 ...)
一次插入多行
> INSERT INTO [數據庫名稱.]數據表名稱(字段1,字段2,字段3 ...) {VALUES | VALUE} (DATE1: '字段1的值','字段2的值',字段3的值' ...),(DATE2: '字段1的值','字段2的值','字段3的值' ...) ...;
注意
(1) 使用INSERT語句,能夠一次插入一行,也能夠一次插入多行"(line1_data),(line2_data)..."
(2) 若是想用INSERT語句插入空值時,能夠直接用NULL
替換表中已有數據:若是沒有數據,則插入;若是已有數據,則替換(支持單行插入、多行插入、給定字段插入或全字段插入)
> REPLACE [INTO] 數據表名稱(字段1,字段2,字段3 ...) VALUES ('字段1的值','字段2的值','字段3的值','字段4的值','字段5的值','字段6的值')[,(line2_data)...];
從文件中讀取數據並插入到表中:一個空表,填充它的一個簡易方法是建立一個文本文件,每條信息各一行,而後用一個語句將文件的內容裝載到表中
> LOAD DATA LOCAL INFILE '/PATH/TO/ FILE_NAME' INTO TABLE [數據庫名稱.]數據表名稱;
注意:若是須要填充空值時,使用\N(反斜線+字母N)表示
我演示的是從文件中導入到數據庫,表中的敏感數據我已修改
從EXCEL表格中插入數據:點我查看
修改
修改數據表的名稱
> RENAME TABLE [數據庫名稱.]數據表名稱 TO 數據庫名稱.新表名稱 ;
> ALTER TABLE [數據庫名稱.]數據表名稱 RENAME TO 數據庫名稱.新表名稱;
修改註釋信息
> ALTER TABLE [數據庫名稱.]數據表名稱 COMMENT = '註釋信息';
給表中添加一個新字段
> ALTER TABLE 數據表名稱 ADD 新字段名 數據類型 修飾符 [FIRST | AFTER 字段名];
指明字段位置
FIRST:添加到第一字段
AFTER:添加到哪一個字段後面
若是不指定字段位置,則放在最後
修改字段名稱(CHANGE)
> ALTER TABLE 數據表名稱 CHANGE 原名稱 新名稱 原有屬性信息(數據類型、修飾符...);
修改/更新指定字段
> UPDATE [LOW_PRIORITY] [IGNORE] [數據庫名稱.]數據表名稱 SET 字段1=字段1的值[,字段2=字段2的值] ... WHERE where_condition [ORDER BY ...] [LIMIT row_count]
注意:用UPDATE修改行時必須使用WHERE子句指明條件(儘可能指主鍵),不然將修改全部
查詢
查詢當前數據庫中的數據表
> USE 數據庫名稱;
> SHOW TABLES;
查詢指定庫中的數據表
> SHOW TABLES IN 數據庫名稱;
> SHOW TABLES FROM 數據庫名稱;
查看數據表的詳細信息
> DESCRIBE [數據庫名稱.]數據表名稱;
> DESC [數據庫名稱.]數據表名稱;
查看數據表的狀態信息
> SHOW TABLE STATUS [LIKE '數據表名稱'];
查看數據表的狀態信息(垂直顯示)
> SHOW TABLE STATUS [LIKE '數據表名稱']\G;
輸出內容說明
查看建立命令
> SHOW CREATE TABLE [數據庫名稱.]數據表名稱;
顯示以指定字符開頭的表的狀態
> SHOW TABLE STATUS WHERE Name LIKE '數據表名稱%'\G;
顯示指定時間建立的表
> SHOW TABLE STATUS WHERE Create_time LIKE '時間%'\G;
SELECT語句:用來從數據表中檢索信息
> SELECT SELECT_EXPR FROM [數據庫名稱.]數據表名稱1,[數據表名稱2 ...] [WHERE where_condition];
SELECT語句的子句的執行過程
SELECT_EXPR
*:全部字段(全部行,全部列)
ALL
字段1,字段2,字段3:投影;只顯示指定字段
DISTINCT:相同的數據,只顯示一次
field AS field_alias:給field取個別名field_alias
只查看錶中不一樣的數據
> SELECT DISTINCT FROM [數據庫名稱.] 數據表1,[數據表2 ...];
查看指定表中全部字段(慎用)
> SELECT * FROM [數據庫名稱.]數據表名稱1,[數據表2 ...];
查看指定表中的指定列(若是表太大則不適合執行)
> SELECT 字段1,字段2,字段3 ... FROM [數據庫名稱.]數據表名稱;
定義顯示的字段別名
> SELECT 字段 AS 字段別名 FROM [數據庫名稱.]數據表名稱;
FROM子句:指定要查詢的關係
單表查詢(簡單查詢):後面跟一個表名
多表查詢:後面跟多個表名
子查詢:後面跟WHERE子句
WHERE子句:選擇、指明條件;只輸出符合條件的行(重要)
> SELECT 字段1,字段2,字段3 ... FROM [數據庫名稱.]數據表名稱 WHERE where_condition;
where_condition:
操做符
BETWEEN x AND y |
在x和y範圍之間的值 |
IS NULL |
空值 |
IS NOT NULL |
非空值 |
IN (LIST) |
使用列表給出的值;用於離散取值 |
算數運算
+ |
加 |
- |
減 |
* |
乘 |
/ |
除 |
% |
取模 |
比較表達式
> |
大於 |
< |
小於 |
>= |
大於等於 |
<= |
小於等於 |
= |
等於 |
!= 或 <> |
不等於 |
<=> |
空值比較 |
組合條件(邏輯運算)
AND (&&) |
與;而且關係,既兩個條件同時知足 |
OR (||) |
或;或者關係,既兩個條件知足一個 |
NOT (!) |
非;條件不知足即爲真 |
注意:AND和OR能夠混用,但AND比OR具備更高的優先級。若是你使用兩個操做符,使用圓括號指明如何對條件進行分組是一個好主意( NOT xxx AND NOT xxx AND NOT xxx 等於NOT ( xxx OR xxx OR xxx ) )
字符串比較
通配符
LIKE '模式':支持使用「通配符」作模糊匹配
%:任意長度的任意字符
_:任意單個字符
正則表達式
{RLIKE | REGEXP} '模式':基基於正則表達式作模式匹配;不用索引、效率低
正則表達式元字符:點我查看
排序(ORDER BY):將查詢到的結果排序顯示;若是表太大,排序操做極其消耗資源
> ORDER BY 字段名稱 {ASC | DESC}
升序:默認(ASC)
> SELECT 字段1,字段2,字段3 ... FROM [數據庫名稱.]數據表名稱 ORDER BY 字段名稱 ASC;
降序(DESC)
> SELECT 字段1,字段2,字段3 ... FROM [數據庫名稱.]數據表名稱 ORDER BY 字段名稱 DESC;
注意:默認是區分字符大小寫的,如不想區分字符大小寫則執行「ORDER BY BINARY 字段名稱」
LIMIT子句
LIMIT [offset,]count
LIMIT #:只顯示前#行的內容
LIMIT x,y:忽略x行,顯示y行後的行
x:偏移量
y:偏移後取幾個值予以顯示
注意:在MySQL中字符串必須加引號,而數值必定不能加引號
聚合計算
> SELECT 聚合計算函數 FROM [數據庫名稱.]數據表名稱;
聚合計算函數
AVG(字段名稱):求平均值
MAX(字段名稱):求最大值
MIN(字段名稱):求最小值
SUM(字段名稱):求合
COUNT(字段名稱):求個數之和
分組(GROUP BY):分組主要目的是爲了作聚合計算
> SELECT * FROM [數據庫名稱.]數據表名稱 GROUP BY '字段名';
對分組進行過濾
> HAVING conditions;
複製
複製表結構
> CREATE TABLE 數據表名稱 LIKE 原數據庫.原數據表;
複製表中的幾個字段並將其建立成一個新表(不會複製其屬性)
> CREATE TABLE 數據表名稱 SELECT 字段1,字段2,字段3 ... FROM 原數據庫.原數據表;
刪除
刪除表:刪表需當心(MySQL沒有回收站)
> DROP TABLE [IF EXISTS] [數據庫名稱.]數據表名稱;
刪除表中的行(DELETE)
> DELETE FROM [數據庫名稱.]數據表名稱 [WHERE where_condition];
> DELETE FROM 數據表名稱 [ORDER BY ...] [LIMIT row_count]
注意:用DELETE刪除行時必須使用WHERE子句,不然將清空整張表(DELETE FROM table_name)
先排序後刪除
> DELETE FROM [數據庫名稱.]數據表名稱 [WHERE where_condition] [ORDER BY '字段名' [DESC]]
刪除字段(列)
> ALTER TABLE 數據表名稱 DROP 字段名稱;
清空整張數據表
> TRUNCATE [數據庫名稱.]數據表名稱;
5、索引管理
建立
建立索引
> CREATE {INDEX | INDEXES} 索引名稱 ON [數據庫名稱.]數據表名稱(字段1,字段2,字段3 ...);
建立多列索引
> CREATE UNIQUE {INDEX | INDEXES} 索引名稱 ON [數據庫名稱.]數據表名稱;
給表中指定的字段加入索引
> ALTER TABLE [數據庫名稱.]數據表名稱 ADD INDEX(‘字段名稱’);
查詢
查看錶中索引
> SHOW {INDEX | INDEXES} FROM [數據庫名稱.]數據表名稱;
、 刪除:索引不用時,要當即刪除
刪除索引:這可能會致使查詢操做下降
> DROP {INDEX | INDEXES} 索引名稱 ON [數據庫名稱.]數據表名稱;
注意:INDEX爲一個索引,INDEXES爲多個索引
6、鍵管理
建立
(1) 在數據表建立的時候定義主鍵
(2) 給已有的表中指定的字段加入主鍵
ALTER TABLE [數據庫名稱.]數據表名稱 ADD {PRIMARY KEY | UNIQUE KEY}(‘字段名稱’);
修改
先刪除鍵,再添加鍵
查詢
查詢主鍵
> SHOW KEYS FROM [數據庫名稱.]數據表名稱 WHERE key_name='PRIMARY';
刪除
刪除鍵:不是自增加的才能夠刪除,若是是自增加(有auto_increment屬性)必須先將表中其餘屬性刪除
> ALTER TABLE [數據庫名稱.]數據表名稱 DROP {PRIMARY KEY | UNIQUE KEY};
7、用戶管理
MySQL用戶和操做系統中的用戶不一樣;不能用MySQL用戶登陸操做系統,一樣也不能用操做系統用戶訪問MySQL
用戶是公開的,你們均可以看到;而密碼只有某個受權使用用戶才能獲取
MySQL使用本身獨有的加密機制password()函數加密用戶密碼
MySQL默認管理員是root,和操做系統管理員名稱一致
MySQL用戶由'用戶名'@'主機'共同組成
MySQL用戶名:不能超過16個字符
主機
主機名:zhangdaifu
IP地址:10.0.0.1
網絡地址:10.0.0.1/255.0.0.0
支持使用通配符表示:10.%.%._/255.0.0.0
如需表示通配符自己的含義則須要進行轉義\
建立
建立用戶賬號
> CREATE USER '用戶名'@'主機';
建立用戶帳號並設置其密碼
> CREATE USER '用戶名'@'主機' IDENTIFIED BY '密碼';
修改
修改用戶名
> UPDATE mysql.user SET USER='新用戶名稱' WHERE User='用戶名';
查詢:MySQL用戶在mysql.user表中保存
查看全部用戶信息
> SELECT User,Host[, ...] FROM mysql.user;
查看指定用戶信息
> SELECT User,Host[, ...] FROM mysql.user WHERE User='用戶名';
刪除
刪除用戶賬號
> DROP USER '用戶名'[@'主機' [, 用戶名@主機] ...] ;
8、密碼管理
建立
給用戶配置密碼
爲當前登陸用戶配置密碼
> SET PASSWORD = PASSWORD("用戶的密碼");
修改
經過命令行修改
# mysqladmin -u'用戶名' -p'老密碼' password '新密碼'
使用UPDATE直接編輯user表
> UPDATE mysql.user SET PASSWORD=用戶的密碼 WHERE User='用戶名';
刷新權限:flush privileges;
經過SET PASSWORD語句修改
> SET PASSWORD FOR 用戶名=PASSWORD('用戶的密碼');
參考:https://blog.csdn.net/qq_33285112/article/details/78982766
查詢
> SELECT User,Password FROM mysql.user WHERE User='用戶名';
刪除
清除指定用戶密碼
> UPDATE mysql.user SET PASSWORD='' WHERE User='用戶名'
9、權限管理
MySQL使用賬號的目的是爲了「認證」
MySQL用戶信息存儲在如下表中
user |
存儲了用戶的帳號、全局權限及其餘非權限字段 |
db |
數據庫級別的權限、庫級別的權限 |
host |
已被廢棄,已被整合進user表 |
tables_priv |
表級別的權限 |
columns_priv |
列(字段)級別的權限 |
procs_priv |
存儲過程和存儲函數相關的權限 |
proxies_priv |
代理用戶權限 |
MySQL服務器在啓動時會讀取這6張表,並在內存中生成「受權表」
受權
權限級別:管理權限、數據庫、數據表、字段、存儲例程
> GRANT permissions_type,... ON [object_type] { [數據庫名稱.]數據表名稱 | function_name | procedure_name } TO 'user_name'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION];
> flush privileges
權限類型
ALL:全部權限;不安全
database_name.table_name
*.*:全部庫的全部表
數據庫.*:指定庫的全部表
數據庫.數據表:指定庫的指定表
數據庫.routine_name:指定庫上的存儲過程或存儲函數
[object_type]
TABLE:給數據表受權;默認
FUNCTION:給存儲函數受權
PROCEDURE:給存儲過程受權
[WITH GRANT OPTION]:將本身所擁有的權限轉權一個副本給其餘用戶
查詢
查看當前用戶所擁有的權限
> SHOW GRANTS;
查看指定用戶所擁有的權限
> SHOW GRANTS FOR '用戶名'@'權限類型';
刪除
回收受權
> REVOKE 權限類型[, ...] ON [數據庫名稱.]數據表名稱 FROM '用戶名'@'主機';
注意:MariaDB服務進程啓動時,會讀取mysql庫的全部受權表至內存中
(1) GRANT或REVOKE命令等執行的權限操做會保存於表中,MariaDB此時通常會自動重讀受權表,權限修改會當即生效
(2) 其它方式實現的權限修改,要想生效,必須手動運行FLUSH PRIVILEGES命令方可
檢查上一條語句是否正確執行(相似於Shell變量"$?")
> SHOW WARNINGS;
常見錯誤
(1) ERROR 1046 (3D000): No database selected
未選擇數據庫
(2) ERROR 1050 (42S01): Table 'table1' already exists
表'table1'已存在
(3) ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
登陸數據庫沒有輸入密碼
(4) ERROR 1317 (70100): Query execution was interrupted
查詢執行被中斷