MySQL常用命令速查表
速查表,顧名思義就是為了在需要的時(shí)候方便快速查詢相關(guān)知識(shí)點(diǎn)。本文精心為大家整理了 MySQL 中最常使用的語(yǔ)句和命令,絕對(duì)是日常開發(fā)、求職面試的必備良方!
連接服務(wù)器
使用 mysql 客戶端工具連接 MySQL 服務(wù)器的命令行如下:
mysql [-h host_name] [-P port_num] [-u user_name] [-p] [-D db_name]
其中,host_name 表示服務(wù)器主機(jī)名,默認(rèn)為本機(jī);port_num 表示 MySQL 服務(wù)端口,默認(rèn)為 3306;user_name 表示用戶名,默認(rèn)為當(dāng)前操作系統(tǒng)用戶;-p 提示輸入密碼;db_name 表示要連接的數(shù)據(jù)庫(kù)。例如:
[root@sqlhost ~]# mysql -u root -p
Enter password: *********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.19 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
查看幫助
在 mysql 提示符中輸入 help; 或者 \h 獲取使用幫助。
mysql> help
For information about MySQL products and services, visit:
http://www.mysql.com/
For developer information, including the MySQL Reference Manual, visit:
http://dev.mysql.com/
To buy MySQL Enterprise support, training, or other products, visit:
https://shop.mysql.com/
List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
? (\?) Synonym for `help'.
clear (\c) Clear the current input statement.
connect (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
ego (\G) Send command to mysql server, display result vertically.
exit (\q) Exit mysql. Same as quit.
go (\g) Send command to mysql server.
help (\h) Display this help.
notee (\t) Don't write into outfile.
print (\p) Print current command.
prompt (\R) Change your mysql prompt.
quit (\q) Quit mysql.
rehash (\#) Rebuild completion hash.
source (\.) Execute an SQL script file. Takes a file name as an argument.
status (\s) Get status information from the server.
system (\!) Execute a system shell command.
tee (\T) Set outfile [to_outfile]. Append everything into given outfile.
use (\u) Use another database. Takes database name as argument.
charset (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.
resetconnection(\x) Clean session context.
For server side help, type 'help contents'
使用 help contents 命令可以獲取 MySQL 服務(wù)器相關(guān)的命令參考:
mysql> help contents;
You asked for help about help category: "Contents"
For more information, type 'help <item>', where <item> is one of the following
categories:
Account Management
Administration
Components
Compound Statements
Contents
Data Definition
Data Manipulation
Data Types
Functions
Geographic Features
Help Metadata
Language Structure
Plugins
Storage Engines
Table Maintenance
Transactions
User-Defined Functions
Utility
mysql 中的 SQL 命令支持以 ;、\g 或者 \G 結(jié)束并發(fā)送到服務(wù)器。
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.19 |
+-----------+
1 row in set (0.00 sec)
查看連接
使用 show processlist 命令可以查看所有連接到服務(wù)器的進(jìn)程:
mysql> show processlist;
+----+-----------------+-----------------+------+---------+--------+------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------------+------+---------+--------+------------------------+------------------+
| 4 | event_scheduler | localhost | NULL | Daemon | 107092 | Waiting on empty queue | NULL |
| 23 | root | localhost:64802 | NULL | Query | 0 | starting | show processlist |
+----+-----------------+-----------------+------+---------+--------+------------------------+------------------+
2 rows in set (0.00 sec)
使用 kill pid 命令殺掉指定連接進(jìn)程:
mysql> kill 23;
ERROR 1317 (70100): Query execution was interrupted
其中,23 是當(dāng)前連接進(jìn)程的 pid,所以上面的命令斷開了當(dāng)前連接。
退出連接
使用 exit;、quit; 或者 \q 命令退出 mysql 客戶端:
mysql> exit;
Bye
賬戶和權(quán)限
創(chuàng)建用戶
使用 CREATE USER 語(yǔ)句創(chuàng)建一個(gè)用戶:
CREATE USER [IF NOT EXISTS] user_name@host IDENTIFIED BY 'auth_string';
其中,user_name 表示用戶名;host 表示允許用戶從哪個(gè)主機(jī)連接 MySQL 服務(wù)器,如果省略(等價(jià)于 %)表示任何主機(jī);IDENTIFIED BY 用于指定用戶的密碼。例如:
mysql> create user tony identified by 'Pswd123!';
Query OK, 0 rows affected (0.14 sec)
查看用戶
MySQL 中的用戶信息存儲(chǔ)在 mysql.user 系統(tǒng)表中:
mysql> select user,host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| tony | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)
使用 user() 或者 current_user() 函數(shù)查看當(dāng)前用戶:
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
修改密碼
使用 ALTER USER 語(yǔ)句修改用戶的密碼:
mysql> alter user tony identified by 'Pswd123@';
Query OK, 0 rows affected (0.12 sec)
鎖定/解鎖用戶
使用 ALTER USER 語(yǔ)句鎖定或者解鎖用戶:
mysql> alter user tony account lock;
Query OK, 0 rows affected (0.10 sec)
mysql> select user,host,account_locked from mysql.user;
+------------------+-----------+----------------+
| user | host | account_locked |
+------------------+-----------+----------------+
| tony | % | Y |
| mysql.infoschema | localhost | Y |
| mysql.session | localhost | Y |
| mysql.sys | localhost | Y |
| root | localhost | N |
+------------------+-----------+----------------+
5 rows in set (0.00 sec)
mysql> alter user tony account unlock;
Query OK, 0 rows affected (0.10 sec)
其中,account lock 表示鎖定;account unlock 表示解鎖。
用戶授權(quán)
MySQL 使用 GRANT 語(yǔ)句給用戶授權(quán):
GRANT priv_type [, priv_type] ...
ON priv_level
TO user_name@host;
其中,priv_type 表示權(quán)限,例如查詢(SELECT)、執(zhí)行(EXECUTE)、全部(ALL)權(quán)限等;priv_level 表示權(quán)限的級(jí)別,分為全局(*.*)、數(shù)據(jù)庫(kù)(db.*)、表級(jí)(db.table)權(quán)限等。以下語(yǔ)句為用戶 tony 授予 hrdb 數(shù)據(jù)庫(kù)中 employees 表上的增刪改查權(quán)限:
mysql> grant select,insert,update,delete
-> on hrdb.employees
-> to tony;
Query OK, 0 rows affected (0.07 sec)
查看權(quán)限
使用 SHOW GRANTS [FOR user_name] 語(yǔ)句查看授予用戶的權(quán)限和角色:
mysql> SHOW GRANTS FOR tony;
+--------------------------------------------------------------------------+
| Grants for tony@% |
+--------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `tony`@`%` |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `hrdb`.`employees` TO `tony`@`%` |
+--------------------------------------------------------------------------+
2 rows in set (0.00 sec)
如果省略 FOR user_name,返回當(dāng)前用戶的權(quán)限和角色。
撤銷權(quán)限
撤銷授予用戶的權(quán)限和角色使用 REVOKE 語(yǔ)句:
REVOKE priv_type [, priv_type] ...
ON priv_level
FROM user_name@host;
其中的參數(shù)與 GRANT 語(yǔ)句相同。以下語(yǔ)句撤銷用戶 tony 對(duì) employess 表的刪除權(quán)限:
mysql> revoke delete
-> on hrdb.employees
-> from tony;
Query OK, 0 rows affected (0.01 sec)
管理角色
角色(Role)是 MySQL 8.0 引入的新功能,本質(zhì)上就是一個(gè)命名的權(quán)限集合(用戶也是)。
創(chuàng)建角色
創(chuàng)建角色使用 CREATE ROLE 語(yǔ)句:
CREATE ROLE [IF NOT EXISTS] role_name@host;
以下語(yǔ)句用于創(chuàng)建角色 test:
mysql> create role test;
Query OK, 0 rows affected (0.04 sec)
角色授權(quán)
為角色授權(quán)和用戶授權(quán)相同,只需要把用戶名改成角色名。以下語(yǔ)句將數(shù)據(jù)庫(kù) hrdb 上所有表的查看權(quán)限授予 test 角色:
mysql> grant select
-> on hrdb.*
-> to test;
Query OK, 0 rows affected (0.01 sec)
授予角色
為用戶授權(quán)角色與授予權(quán)限幾乎相同,以下語(yǔ)句 test 角色授予 tony 用戶:
mysql> grant test
-> to tony;
Query OK, 0 rows affected (0.01 sec)
mysql> show grants for tony;
+------------------------------------------------------------------+
| Grants for tony@% |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `tony`@`%` |
| GRANT SELECT, INSERT, UPDATE ON `hrdb`.`employees` TO `tony`@`%` |
| GRANT `test`@`%` TO `tony`@`%` |
+------------------------------------------------------------------+
3 rows in set (0.01 sec)
撤銷角色
撤銷角色與撤銷權(quán)限類似:
mysql> revoke test from tony;
Query OK, 0 rows affected (0.01 sec)
刪除角色
刪除角色使用 DROP ROLE 語(yǔ)句:
mysql> drop role test;
Query OK, 0 rows affected (0.00 sec)
刪除用戶
刪除用戶賬號(hào)使用 DROP USER 語(yǔ)句:
mysql> drop user if exists tony;
Query OK, 0 rows affected (0.01 sec)
管理數(shù)據(jù)庫(kù)
查看數(shù)據(jù)庫(kù)
使用 show databases; 命令查看當(dāng)前 MySQL 服務(wù)器中所有可用的數(shù)據(jù)庫(kù):
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| ds |
| hrdb |
| information_schema |
| mydb |
| mysql |
| performance_schema |
| sys |
| world_x |
+--------------------+
8 rows in set (0.00 sec)
創(chuàng)建數(shù)據(jù)庫(kù)
使用 CREATE DATABASE 語(yǔ)句創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù):
CREATE DATABASE [IF NOT EXISTS] db_name [CHARACTER SET charset_name];
其中,db_name 是數(shù)據(jù)庫(kù)的名稱;如果該數(shù)據(jù)庫(kù)已經(jīng)存在,將會(huì)返回錯(cuò)誤;此時(shí)如果指定了 IF NOT EXISTS 選項(xiàng),不會(huì)返回錯(cuò)誤。
mysql> create database testdb;
Query OK, 1 row affected (0.15 sec)
mysql> create database testdb;
ERROR 1007 (HY000): Can't create database 'testdb'; database exists
mysql> create database if not exists testdb;
Query OK, 1 row affected, 1 warning (0.05 sec)
mysql> show warnings;
+-------+------+-------------------------------------------------+
| Level | Code | Message |
+-------+------+-------------------------------------------------+
| Note | 1007 | Can't create database 'testdb'; database exists |
+-------+------+-------------------------------------------------+
1 row in set (0.00 sec)
切換數(shù)據(jù)庫(kù)
使用 USE db_name; 語(yǔ)句切換當(dāng)前默認(rèn)的數(shù)據(jù)庫(kù):
mysql> use testdb;
Database changed
以上語(yǔ)句將 testdb 設(shè)置為默認(rèn)數(shù)據(jù)庫(kù)。
刪除數(shù)據(jù)庫(kù)
使用 DROP DATABASE 語(yǔ)句刪除一個(gè)數(shù)據(jù)庫(kù),該數(shù)據(jù)庫(kù)中的所有對(duì)象以及與該數(shù)據(jù)庫(kù)相關(guān)的數(shù)據(jù)文件也會(huì)被刪除:
DROP DATABASE [IF EXISTS] db_name;
我們將 testdb 數(shù)據(jù)庫(kù)和相關(guān)的數(shù)據(jù)文件刪除:
mysql> drop database testdb;
Query OK, 0 rows affected (0.23 sec)
管理表
創(chuàng)建表
MySQL 使用 CREATE TABLE 語(yǔ)句創(chuàng)建表:
CREATE TABLE [IF NOT EXISTS] table_name(
col1 data_type column_constraint,
col2 data_type column_constraint,
...,
table_constraints
) ENGINE=storage_engine;
其中,data_type 定義字段的數(shù)據(jù)類型,常用的數(shù)據(jù)類型包括:SMALLINT、INT、BIGINT、DECIMAL、CHAR、VARCHAR、TEXT、DATE、DATETIME 等。數(shù)據(jù)庫(kù)約束包括主鍵約束(PRIMARY KEY)、外鍵約束(FOREIGN KEY)、唯一約束(UNIQUE)、非空約束(NOT NULL)、檢查約束(CHECK)以及默認(rèn)值(DEFAULT)。storage_engine 指定存儲(chǔ)引擎,常用的存儲(chǔ)引擎包括 InnoDB(默認(rèn))、MyISAM、Memory 、Archive、NDB 等。
CREATE TABLE departments
( department_id INTEGER NOT NULL
, department_name CHARACTER VARYING(30) NOT NULL
, manager_id INTEGER
, location_id INTEGER
, CONSTRAINT dept_id_pk
PRIMARY KEY (department_id)
) ;
CREATE TABLE jobs
( job_id CHARACTER VARYING(10) NOT NULL
, job_title CHARACTER VARYING(35) NOT NULL
, min_salary INTEGER
, max_salary INTEGER
, CONSTRAINT job_id_pk
PRIMARY KEY(job_id)
) ;
CREATE TABLE employees
( employee_id INTEGER NOT NULL
, first_name CHARACTER VARYING(20)
, last_name CHARACTER VARYING(25) NOT NULL
, email CHARACTER VARYING(25) NOT NULL
, hire_date DATE NOT NULL
, job_id CHARACTER VARYING(10) NOT NULL
, salary NUMERIC(8,2)
, commission_pct NUMERIC(2,2)
, manager_id INTEGER
, department_id INTEGER
, CONSTRAINT emp_emp_id_pk
PRIMARY KEY (employee_id)
, CONSTRAINT emp_salary_min
CHECK (salary > 0)
, CONSTRAINT emp_email_uk
UNIQUE (email)
, CONSTRAINT emp_dept_fk
FOREIGN KEY (department_id)
REFERENCES departments(department_id)
, CONSTRAINT emp_job_fk
FOREIGN KEY (job_id)
REFERENCES jobs(job_id)
, CONSTRAINT emp_manager_fk
FOREIGN KEY (manager_id)
REFERENCES employees(employee_id)
) ;
查看所有表
使用 SHOW TABLES 語(yǔ)句查看當(dāng)前數(shù)據(jù)庫(kù)中的所有表:
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| departments |
| employees |
| jobs |
+------------------+
3 rows in set (0.01 sec)
查看表結(jié)構(gòu)
MySQL 提供了查看表結(jié)構(gòu)的 DESCRIBE 語(yǔ)句:
mysql> desc employees;
+----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| employee_id | int | NO | PRI | NULL | |
| first_name | varchar(20) | YES | | NULL | |
| last_name | varchar(25) | NO | | NULL | |
| email | varchar(25) | NO | UNI | NULL | |
| hire_date | date | NO | | NULL | |
| job_id | varchar(10) | NO | MUL | NULL | |
| salary | decimal(8,2) | YES | | NULL | |
| commission_pct | decimal(2,2) | YES | | NULL | |
| manager_id | int | YES | MUL | NULL | |
| department_id | int | YES | MUL | NULL | |
+----------------+--------------+------+-----+---------+-------+
11 rows in set (0.01 sec)
另外,可以通過(guò) SHOW CREATE TABLE 語(yǔ)句顯示創(chuàng)建表的語(yǔ)句:
mysql> show create table employees\G
*************************** 1. row ***************************
Table: employees
Create Table: CREATE TABLE employees (
employee_id int NOT NULL,
first_name varchar(20) DEFAULT NULL,
last_name varchar(25) NOT NULL,
email varchar(25) NOT NULL,
hire_date date NOT NULL,
job_id varchar(10) NOT NULL,
salary decimal(8,2) DEFAULT NULL,
commission_pct decimal(2,2) DEFAULT NULL,
manager_id int DEFAULT NULL,
department_id int DEFAULT NULL,
PRIMARY KEY ( employee_id ),
UNIQUE KEY emp_email_uk ( email ),
KEY emp_dept_fk ( department_id ),
KEY emp_job_fk ( job_id ),
KEY emp_manager_fk ( manager_id ),
CONSTRAINT emp_dept_fk FOREIGN KEY ( department_id ) REFERENCES departments ( department_id ),
CONSTRAINT emp_job_fk FOREIGN KEY ( job_id ) REFERENCES jobs ( job_id ),
CONSTRAINT emp_manager_fk FOREIGN KEY ( manager_id ) REFERENCES employees ( employee_id ),
CONSTRAINT emp_salary_min CHECK (( salary > 0))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
增加字段
增加字段使用 ALTER TABLE ... ADD COLUMN 語(yǔ)句,以下命令為 employees 表增加一個(gè)字段 phone_number:
mysql> alter table employees add column phone_number varchar(20);
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
修改字段
修改字段使用 ALTER TABLE ... MODIFY 語(yǔ)句,以下命令為字段 phone_number 增加一個(gè)唯一約束:
mysql> alter table employees modify phone_number varchar(20) unique;
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
刪除字段
刪除字段使用 ALTER TABLE ... DROP COLUMN 語(yǔ)句:
mysql> alter table employees drop column phone_number;
Query OK, 0 rows affected (0.18 sec)
Records: 0 Duplicates: 0 Warnings: 0
刪除表
要?jiǎng)h除表可以使用 DROP TABLE 語(yǔ)句:
mysql> drop table if exists employees, departments, jobs;
Query OK, 0 rows affected (0.09 sec)
索引與約束
創(chuàng)建索引
MySQL 為主鍵和唯一約束自動(dòng)創(chuàng)建相應(yīng)的索引,我們也可以創(chuàng)建額外的索引。創(chuàng)建索引的命令如下:
CREATE [UNIQUE] INDEX index_name
ON table_name(col1 ASC, col2 DESC);
查看索引
查看表中的所以可以使用 SHOW INDEXES 語(yǔ)句:
mysql> show indexes from departments\G
*************************** 1. row ***************************
Table: departments
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: department_id
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
Visible: YES
Expression: NULL
1 row in set (0.01 sec)
修改索引
修改索引支持設(shè)置索引的可見(jiàn)性:
ALTER INDEX index VISIBLE | INVISIBLE;
可見(jiàn)性是指對(duì)優(yōu)化器而言,默認(rèn)為可見(jiàn)(VISIBLE);INVISIBLE 表示不可見(jiàn)。
刪除索引
刪除索引使用以下命令:
DROP INDEX index_name ON table_name;
增加約束
為表增加約束可以使用 ALTER TABLE 語(yǔ)句:
ALTER TABLE table_name ADD CONSTRAINT symbol PRIMARY KEY(col1,...);
ALTER TABLE table_name ADD CONSTRAINT symbol UNIQUE(col1,...);
ALTER TABLE table_name ADD CONSTRAINT symbol FOREIGN KEY (col1) REFERENCES other_table(col1);
ALTER TABLE table_name ADD CONSTRAINT symbol CHECK (expr);
ALTER TABLE table_name ALTER COLUMN col_name SET DEFAULT (expr);
ALTER TABLE table_name MODIFY COLUMN col_name data_type NOT NULL;
刪除約束
刪除約束同樣可以使用 ALTER TABLE 語(yǔ)句:
ALTER TABLE table_name DROP CHECK|CONSTRAINT symbol;
ALTER TABLE table_name ALTER COLUMN col_name DROP DEFAULT;
ALTER TABLE table_name MODIFY COLUMN col_name data_type NULL;
查詢語(yǔ)句
單表查詢
查詢單個(gè)表中的字段:
SELECT col1, col2, ... FROM t;
查詢所有字段:
SELECT * FROM t;
排除查詢結(jié)果中的重復(fù)數(shù)據(jù):
SELECT DISTINCT col1, col2, ...
FROM t;
查詢條件
使用 WHERE 指定查詢條件:
SELECT col1, col2, ...
FROM t
WHERE conditions;
常用的查詢條件包括:=、!=、<>、<、<=、>、>=、BETWEEN、IN、EXISTS、LIKE、AND、OR、NOT、IS [NOT] NULL 等。
模糊匹配
使用 LIKE 運(yùn)算符進(jìn)行簡(jiǎn)單的字符串模式匹配:
expr LIKE pattern [ESCAPE escape_character]
其中,pattern 用于指定一個(gè)匹配模式,百分號(hào)(%)匹配任意多個(gè)字符,下劃線(_)匹配任意單個(gè)字符;escape_character 指定轉(zhuǎn)義字符
mysql> select first_name
-> from employees
-> where first_name like '%s_n';
+------------+
| first_name |
+------------+
| Harrison |
| Jason |
| Susan |
+------------+
3 rows in set (0.01 sec)
另外, REGEXP 或者 RLIKE 運(yùn)算符可以進(jìn)行更強(qiáng)大的正則表達(dá)式匹配。
排序操作
指定排序字段的方式如下:
SELECT col1, col2, ...
FROM t
ORDER BY col1 ASC, col2 DESC;
限定數(shù)量
限制返回結(jié)果的數(shù)量:
SELECT col1, col2, ...
FROM t
ORDER BY col1 ASC, col2 DESC
LIMIT offset, rows;
分組操作
指定分組和過(guò)濾:
SELECT col1, col2, agg_func()
FROM t
GROUP BY col1, col2 WITH ROLLUP
HAVING conditions;
常用的聚合函數(shù):AVG、COUNT、MIN、MAX、SUM 等。
多表連接
連接查詢用于從多個(gè)表中查詢關(guān)聯(lián)數(shù)據(jù):
SELECT t1.col1, t2.col1, ...
FROM table1 AS t1
[INNER | LEFT | RIGHT | CROSS] JOIN t2
ON conditions;
子查詢
子查詢是指嵌套在其他查詢語(yǔ)句中的查詢:
SELECT t.col1, t.col2, ...
FROM (SELECT ...) t ;
EXISTS 與關(guān)聯(lián)子查詢:
SELECT t1.col1, t1.col2, ...
FROM t1
WHERE EXISTS ( SELECT 1
FROM t2
WHERE t2.col1 = t1.col1);
集合運(yùn)算
集合運(yùn)算包括并集、交集和差集:
SELECT col1, col2, ...
FROM t1
UNION [ALL] | INTERSECT | MINUS
SELECT c1, c2, …
FROM t2;
UNION ALL 保留結(jié)果中的重復(fù)數(shù)據(jù),其他運(yùn)算符消除了重復(fù)結(jié)果。
通用表表達(dá)式
通用表表達(dá)式類似于派生表或者語(yǔ)句級(jí)別的視圖,但是可讀性和性能更好,并且支持遞歸調(diào)用。以下查詢生成 1 到 10 的數(shù)字序列:
WITH RECURSIVE cte(n) AS (
SELECT 1 AS n -- 初始查詢
UNION ALL
SELECT n+1 FROM cte WHERE n < 10) -- 遞歸查詢
SELECT * FROM cte;
DML 語(yǔ)句
插入數(shù)據(jù)
插入數(shù)據(jù)使用 INSERT 語(yǔ)句:
INSERT INTO table(col1,col2,...)
VALUES (val1,val2,...);
一次插入多條記錄:
INSERT INTO table(col1,col2,...)
VALUES (val11,val12,...), (val21,val22,...), (val31,val32,...);
插入查詢語(yǔ)句的結(jié)果:
INSERT INTO table(col1,col2,...)
SELECT ...;
更新數(shù)據(jù)
更新數(shù)據(jù)使用 UPDATE 語(yǔ)句:
UPDATE table_name
SET col1 = val1,
col2 = val2,
...
WHERE conditions;
UPDATE 語(yǔ)句支持跨表更新:
UPDATE t1, t2,
[INNER JOIN | LEFT JOIN] t1 ON t1.col1 = t2.col1
SET t1.col2 = t2.col2,
t2.c3 = expr
WHERE conditions;
刪除數(shù)據(jù)
刪除數(shù)據(jù)使用 DELETE 語(yǔ)句:
DELETE FROM table_name
WHERE conditions;
DELETE語(yǔ)句支持多表刪除:
DELETE t1, t2
FROM t1
INNER JOIN t2 ON t1.col1 = t2.col1
WHERE conditions;
DELETE t1
FROM t1
LEFT JOIN t2 ON t1.col1 = t2.col1
WHERE t2.key IS NULL;
另外,TRUNCATE TABLE 語(yǔ)句用于快速清除表中的全部數(shù)據(jù):
TRUNCATE [TABLE] table_name;
合并數(shù)據(jù)
合并語(yǔ)句同時(shí)執(zhí)行了 INSERT 和 UPDATE 操作:
INSERT INTO table(col1,col2,...)
VALUES (val1,val2,...)
ON DUPLICATE KEY UPDATE
col1 = val1,
col2 = val2,
…;
與此類似的操作還有 REPLACE INTO 語(yǔ)句:
REPLACE INTO table_name(col1, col2, ...)
VALUES (val1,val2,...);
事務(wù)控制
數(shù)據(jù)庫(kù)事務(wù)是一組相關(guān)的操作,要么全部成功,要么全部失敗。
開始事務(wù)
START TRANSACTION 語(yǔ)句用于開始一個(gè)事務(wù):
START TRANSACTION;
BEGIN 或者 BEGIN WORK 的作用也一樣。
提交事務(wù)
提交事務(wù)的命令如下:
COMMIT;
回滾事務(wù)
回滾事務(wù)的命令如下:
ROLLBACK;
事務(wù)保存點(diǎn)
事務(wù)保存點(diǎn)可以用于回滾部分事務(wù):
SAVEPOINT identifier;
ROLLBACK TO identifier;
RELEASE SAVEPOINT identifier;
視圖
創(chuàng)建視圖
使用以下命令創(chuàng)建視圖:
CREATE [OR REPLACE] VIEW view_name
AS
select-statement
WITH CHECK OPTION;
WITH CHECK OPTION 選項(xiàng)可以阻止通過(guò)視圖修改或者插入視圖范圍之外的基礎(chǔ)表數(shù)據(jù)。
查看所有視圖
SHOW TABLES 語(yǔ)句支持查看視圖:
SHOW FULL TABLES
WHERE table_type = 'VIEW';
查看視圖定義
查看視圖的定義:
SHOW CREATE VIEW view_name;
重命名視圖
重命名視圖與重命名表類似:
RENAME TABLE view_name TO new_view;
刪除視圖
刪除視圖的命令如下:
DROP VIEW [IF EXISTS] view_name;
存儲(chǔ)過(guò)程/函數(shù)
創(chuàng)建存儲(chǔ)過(guò)程/函數(shù)
創(chuàng)建存儲(chǔ)過(guò)程使用 CREATE PROCEDURE 語(yǔ)句:
DELIMITER //
CREATE PROCEDURE GetEmployeeNameById(IN pn_empid INT)
BEGIN
SELECT first_name, last_name FROM employees
WHERE employee_id = pn_empid;
END //
DELIMITER ;
創(chuàng)建函數(shù)使用 CREATE FUNCTION 語(yǔ)句:
DELIMITER //
CREATE FUNCTION add_numbers(p1 INT, p2 INT)
RETURNS INT
DETERMINISTIC
BEGIN
RETURN p1 + p2;
END //
DELIMITER ;
調(diào)用存儲(chǔ)過(guò)程/函數(shù)
調(diào)用存儲(chǔ)過(guò)程使用 CALL 語(yǔ)句:
mysql> CALL GetEmployeeNameById(100);
+------------+-----------+
| first_name | last_name |
+------------+-----------+
| Steven | King |
+------------+-----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
存儲(chǔ)函數(shù)可以像系統(tǒng)函數(shù)一樣使用:
mysql> select add_numbers(1, 2);
+-------------------+
| add_numbers(1, 2) |
+-------------------+
| 3 |
+-------------------+
1 row in set (0.00 sec)
刪除存儲(chǔ)過(guò)程/函數(shù)
刪除存儲(chǔ)過(guò)程/函數(shù)使用 DROP 語(yǔ)句:
mysql> drop procedure if exists GetEmployeeNameById;
Query OK, 0 rows affected (0.03 sec)
mysql> drop function if exists add_numbers;
Query OK, 0 rows affected (0.01 sec)
觸發(fā)器
觸發(fā)器是一個(gè)特殊的存儲(chǔ)過(guò)程,當(dāng)表中的數(shù)據(jù)被修改(INSERT、UPDATE、DELETE)時(shí)自動(dòng)執(zhí)行。
創(chuàng)建觸發(fā)器
創(chuàng)建觸發(fā)器使用 CREATE TRIGGER 語(yǔ)句:
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE| DELETE }
ON table_name FOR EACH ROW
trigger_body;
對(duì)于 INSERT,可以使用NEW 變量;對(duì)于 UPDATE,可以使用 OLD 和 NEW 變量;對(duì)于 DELETE,可以使用 OLD 變量。
查看觸發(fā)器
使用以下命令查看觸發(fā)器:
SHOW TRIGGERS
[FROM | IN database_name]
[LIKE 'pattern' | WHERE condition];
刪除觸發(fā)器
刪除觸發(fā)器的語(yǔ)句如下:
DROP TRIGGER [IF EXISTS] trigger_name;
備份與恢復(fù)
使用 mysqldump 備份數(shù)據(jù)庫(kù)
mysqldump 是 MySQL 邏輯備份工具,用于導(dǎo)出創(chuàng)建數(shù)據(jù)庫(kù)(CREATE DATABASE)和生成數(shù)據(jù)(INSERT 語(yǔ)句或者文本文件)的 SQL 腳本。
使用 mysqldump 備份所有的數(shù)據(jù)庫(kù)的命令如下:
mysqldump -u user_name -p -r file_name --all-databases
其中,user_name 表示用戶名;file_name 表示備份文件名;-\-all-databases 表示備份所有的數(shù)據(jù)庫(kù)。
導(dǎo)出特定數(shù)據(jù)庫(kù)的命令如下:
mysqldump -u user_name -p -r file_name --databases db_name1 db_name2
其中,--databases 表示需要導(dǎo)出的數(shù)據(jù)庫(kù)。
mysqldump 也可以選擇導(dǎo)出指定的表:
mysqldump -u user_name -p -r file_name db_name table1 table2
以上命令表示導(dǎo)出數(shù)據(jù)庫(kù) db_name 中的表 table1 和 table2。
使用 mysql 還原數(shù)據(jù)庫(kù)
mysql 客戶端可以用于導(dǎo)入備份生成的 SQL 文件:
mysql -u user_name -p < file_name