MySQL常用命令速查表
速查表,顧名思義就是為了在需要的時候方便快速查詢相關知識點。本文精心為大家整理了 MySQL 中最常使用的語句和命令,絕對是日常開發、求職面試的必備良方!
連接服務器
使用 mysql 客戶端工具連接 MySQL 服務器的命令行如下:
mysql [-h host_name] [-P port_num] [-u user_name] [-p] [-D db_name]
其中,host_name 表示服務器主機名,默認為本機;port_num 表示 MySQL 服務端口,默認為 3306;user_name 表示用戶名,默認為當前操作系統用戶;-p 提示輸入密碼;db_name 表示要連接的數據庫。例如:
[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 服務器相關的命令參考:
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 結束并發送到服務器。
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.19 |
+-----------+
1 row in set (0.00 sec)
查看連接
使用 show processlist 命令可以查看所有連接到服務器的進程:
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 命令殺掉指定連接進程:
mysql> kill 23;
ERROR 1317 (70100): Query execution was interrupted
其中,23 是當前連接進程的 pid,所以上面的命令斷開了當前連接。
退出連接
使用 exit;、quit; 或者 \q 命令退出 mysql 客戶端:
mysql> exit;
Bye
賬戶和權限
創建用戶
使用 CREATE USER 語句創建一個用戶:
CREATE USER [IF NOT EXISTS] user_name@host IDENTIFIED BY 'auth_string';
其中,user_name 表示用戶名;host 表示允許用戶從哪個主機連接 MySQL 服務器,如果省略(等價于 %)表示任何主機;IDENTIFIED BY 用于指定用戶的密碼。例如:
mysql> create user tony identified by 'Pswd123!';
Query OK, 0 rows affected (0.14 sec)
查看用戶
MySQL 中的用戶信息存儲在 mysql.user 系統表中:
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() 函數查看當前用戶:
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
修改密碼
使用 ALTER USER 語句修改用戶的密碼:
mysql> alter user tony identified by 'Pswd123@';
Query OK, 0 rows affected (0.12 sec)
鎖定/解鎖用戶
使用 ALTER USER 語句鎖定或者解鎖用戶:
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 表示解鎖。
用戶授權
MySQL 使用 GRANT 語句給用戶授權:
GRANT priv_type [, priv_type] ...
ON priv_level
TO user_name@host;
其中,priv_type 表示權限,例如查詢(SELECT)、執行(EXECUTE)、全部(ALL)權限等;priv_level 表示權限的級別,分為全局(*.*)、數據庫(db.*)、表級(db.table)權限等。以下語句為用戶 tony 授予 hrdb 數據庫中 employees 表上的增刪改查權限:
mysql> grant select,insert,update,delete
-> on hrdb.employees
-> to tony;
Query OK, 0 rows affected (0.07 sec)
查看權限
使用 SHOW GRANTS [FOR user_name] 語句查看授予用戶的權限和角色:
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,返回當前用戶的權限和角色。
撤銷權限
撤銷授予用戶的權限和角色使用 REVOKE 語句:
REVOKE priv_type [, priv_type] ...
ON priv_level
FROM user_name@host;
其中的參數與 GRANT 語句相同。以下語句撤銷用戶 tony 對 employess 表的刪除權限:
mysql> revoke delete
-> on hrdb.employees
-> from tony;
Query OK, 0 rows affected (0.01 sec)
管理角色
角色(Role)是 MySQL 8.0 引入的新功能,本質上就是一個命名的權限集合(用戶也是)。
創建角色
創建角色使用 CREATE ROLE 語句:
CREATE ROLE [IF NOT EXISTS] role_name@host;
以下語句用于創建角色 test:
mysql> create role test;
Query OK, 0 rows affected (0.04 sec)
角色授權
為角色授權和用戶授權相同,只需要把用戶名改成角色名。以下語句將數據庫 hrdb 上所有表的查看權限授予 test 角色:
mysql> grant select
-> on hrdb.*
-> to test;
Query OK, 0 rows affected (0.01 sec)
授予角色
為用戶授權角色與授予權限幾乎相同,以下語句 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)
撤銷角色
撤銷角色與撤銷權限類似:
mysql> revoke test from tony;
Query OK, 0 rows affected (0.01 sec)
刪除角色
刪除角色使用 DROP ROLE 語句:
mysql> drop role test;
Query OK, 0 rows affected (0.00 sec)
刪除用戶
刪除用戶賬號使用 DROP USER 語句:
mysql> drop user if exists tony;
Query OK, 0 rows affected (0.01 sec)
管理數據庫
查看數據庫
使用 show databases; 命令查看當前 MySQL 服務器中所有可用的數據庫:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| ds |
| hrdb |
| information_schema |
| mydb |
| mysql |
| performance_schema |
| sys |
| world_x |
+--------------------+
8 rows in set (0.00 sec)
創建數據庫
使用 CREATE DATABASE 語句創建一個新的數據庫:
CREATE DATABASE [IF NOT EXISTS] db_name [CHARACTER SET charset_name];
其中,db_name 是數據庫的名稱;如果該數據庫已經存在,將會返回錯誤;此時如果指定了 IF NOT EXISTS 選項,不會返回錯誤。
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)
切換數據庫
使用 USE db_name; 語句切換當前默認的數據庫:
mysql> use testdb;
Database changed
以上語句將 testdb 設置為默認數據庫。
刪除數據庫
使用 DROP DATABASE 語句刪除一個數據庫,該數據庫中的所有對象以及與該數據庫相關的數據文件也會被刪除:
DROP DATABASE [IF EXISTS] db_name;
我們將 testdb 數據庫和相關的數據文件刪除:
mysql> drop database testdb;
Query OK, 0 rows affected (0.23 sec)
管理表
創建表
MySQL 使用 CREATE TABLE 語句創建表:
CREATE TABLE [IF NOT EXISTS] table_name(
col1 data_type column_constraint,
col2 data_type column_constraint,
...,
table_constraints
) ENGINE=storage_engine;
其中,data_type 定義字段的數據類型,常用的數據類型包括:SMALLINT、INT、BIGINT、DECIMAL、CHAR、VARCHAR、TEXT、DATE、DATETIME 等。數據庫約束包括主鍵約束(PRIMARY KEY)、外鍵約束(FOREIGN KEY)、唯一約束(UNIQUE)、非空約束(NOT NULL)、檢查約束(CHECK)以及默認值(DEFAULT)。storage_engine 指定存儲引擎,常用的存儲引擎包括 InnoDB(默認)、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 語句查看當前數據庫中的所有表:
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| departments |
| employees |
| jobs |
+------------------+
3 rows in set (0.01 sec)
查看表結構
MySQL 提供了查看表結構的 DESCRIBE 語句:
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)
另外,可以通過 SHOW CREATE TABLE 語句顯示創建表的語句:
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 語句,以下命令為 employees 表增加一個字段 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 語句,以下命令為字段 phone_number 增加一個唯一約束:
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 語句:
mysql> alter table employees drop column phone_number;
Query OK, 0 rows affected (0.18 sec)
Records: 0 Duplicates: 0 Warnings: 0
刪除表
要刪除表可以使用 DROP TABLE 語句:
mysql> drop table if exists employees, departments, jobs;
Query OK, 0 rows affected (0.09 sec)
索引與約束
創建索引
MySQL 為主鍵和唯一約束自動創建相應的索引,我們也可以創建額外的索引。創建索引的命令如下:
CREATE [UNIQUE] INDEX index_name
ON table_name(col1 ASC, col2 DESC);
查看索引
查看表中的所以可以使用 SHOW INDEXES 語句:
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)
修改索引
修改索引支持設置索引的可見性:
ALTER INDEX index VISIBLE | INVISIBLE;
可見性是指對優化器而言,默認為可見(VISIBLE);INVISIBLE 表示不可見。
刪除索引
刪除索引使用以下命令:
DROP INDEX index_name ON table_name;
增加約束
為表增加約束可以使用 ALTER TABLE 語句:
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 語句:
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;
查詢語句
單表查詢
查詢單個表中的字段:
SELECT col1, col2, ... FROM t;
查詢所有字段:
SELECT * FROM t;
排除查詢結果中的重復數據:
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 運算符進行簡單的字符串模式匹配:
expr LIKE pattern [ESCAPE escape_character]
其中,pattern 用于指定一個匹配模式,百分號(%)匹配任意多個字符,下劃線(_)匹配任意單個字符;escape_character 指定轉義字符
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 運算符可以進行更強大的正則表達式匹配。
排序操作
指定排序字段的方式如下:
SELECT col1, col2, ...
FROM t
ORDER BY col1 ASC, col2 DESC;
限定數量
限制返回結果的數量:
SELECT col1, col2, ...
FROM t
ORDER BY col1 ASC, col2 DESC
LIMIT offset, rows;
分組操作
指定分組和過濾:
SELECT col1, col2, agg_func()
FROM t
GROUP BY col1, col2 WITH ROLLUP
HAVING conditions;
常用的聚合函數:AVG、COUNT、MIN、MAX、SUM 等。
多表連接
連接查詢用于從多個表中查詢關聯數據:
SELECT t1.col1, t2.col1, ...
FROM table1 AS t1
[INNER | LEFT | RIGHT | CROSS] JOIN t2
ON conditions;
子查詢
子查詢是指嵌套在其他查詢語句中的查詢:
SELECT t.col1, t.col2, ...
FROM (SELECT ...) t ;
EXISTS 與關聯子查詢:
SELECT t1.col1, t1.col2, ...
FROM t1
WHERE EXISTS ( SELECT 1
FROM t2
WHERE t2.col1 = t1.col1);
集合運算
集合運算包括并集、交集和差集:
SELECT col1, col2, ...
FROM t1
UNION [ALL] | INTERSECT | MINUS
SELECT c1, c2, …
FROM t2;
UNION ALL 保留結果中的重復數據,其他運算符消除了重復結果。
通用表表達式
通用表表達式類似于派生表或者語句級別的視圖,但是可讀性和性能更好,并且支持遞歸調用。以下查詢生成 1 到 10 的數字序列:
WITH RECURSIVE cte(n) AS (
SELECT 1 AS n -- 初始查詢
UNION ALL
SELECT n+1 FROM cte WHERE n < 10) -- 遞歸查詢
SELECT * FROM cte;
DML 語句
插入數據
插入數據使用 INSERT 語句:
INSERT INTO table(col1,col2,...)
VALUES (val1,val2,...);
一次插入多條記錄:
INSERT INTO table(col1,col2,...)
VALUES (val11,val12,...), (val21,val22,...), (val31,val32,...);
插入查詢語句的結果:
INSERT INTO table(col1,col2,...)
SELECT ...;
更新數據
更新數據使用 UPDATE 語句:
UPDATE table_name
SET col1 = val1,
col2 = val2,
...
WHERE conditions;
UPDATE 語句支持跨表更新:
UPDATE t1, t2,
[INNER JOIN | LEFT JOIN] t1 ON t1.col1 = t2.col1
SET t1.col2 = t2.col2,
t2.c3 = expr
WHERE conditions;
刪除數據
刪除數據使用 DELETE 語句:
DELETE FROM table_name
WHERE conditions;
DELETE語句支持多表刪除:
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 語句用于快速清除表中的全部數據:
TRUNCATE [TABLE] table_name;
合并數據
合并語句同時執行了 INSERT 和 UPDATE 操作:
INSERT INTO table(col1,col2,...)
VALUES (val1,val2,...)
ON DUPLICATE KEY UPDATE
col1 = val1,
col2 = val2,
…;
與此類似的操作還有 REPLACE INTO 語句:
REPLACE INTO table_name(col1, col2, ...)
VALUES (val1,val2,...);
事務控制
數據庫事務是一組相關的操作,要么全部成功,要么全部失敗。
開始事務
START TRANSACTION 語句用于開始一個事務:
START TRANSACTION;
BEGIN 或者 BEGIN WORK 的作用也一樣。
提交事務
提交事務的命令如下:
COMMIT;
回滾事務
回滾事務的命令如下:
ROLLBACK;
事務保存點
事務保存點可以用于回滾部分事務:
SAVEPOINT identifier;
ROLLBACK TO identifier;
RELEASE SAVEPOINT identifier;
視圖
創建視圖
使用以下命令創建視圖:
CREATE [OR REPLACE] VIEW view_name
AS
select-statement
WITH CHECK OPTION;
WITH CHECK OPTION 選項可以阻止通過視圖修改或者插入視圖范圍之外的基礎表數據。
查看所有視圖
SHOW TABLES 語句支持查看視圖:
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;
存儲過程/函數
創建存儲過程/函數
創建存儲過程使用 CREATE PROCEDURE 語句:
DELIMITER //
CREATE PROCEDURE GetEmployeeNameById(IN pn_empid INT)
BEGIN
SELECT first_name, last_name FROM employees
WHERE employee_id = pn_empid;
END //
DELIMITER ;
創建函數使用 CREATE FUNCTION 語句:
DELIMITER //
CREATE FUNCTION add_numbers(p1 INT, p2 INT)
RETURNS INT
DETERMINISTIC
BEGIN
RETURN p1 + p2;
END //
DELIMITER ;
調用存儲過程/函數
調用存儲過程使用 CALL 語句:
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)
存儲函數可以像系統函數一樣使用:
mysql> select add_numbers(1, 2);
+-------------------+
| add_numbers(1, 2) |
+-------------------+
| 3 |
+-------------------+
1 row in set (0.00 sec)
刪除存儲過程/函數
刪除存儲過程/函數使用 DROP 語句:
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)
觸發器
觸發器是一個特殊的存儲過程,當表中的數據被修改(INSERT、UPDATE、DELETE)時自動執行。
創建觸發器
創建觸發器使用 CREATE TRIGGER 語句:
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE| DELETE }
ON table_name FOR EACH ROW
trigger_body;
對于 INSERT,可以使用NEW 變量;對于 UPDATE,可以使用 OLD 和 NEW 變量;對于 DELETE,可以使用 OLD 變量。
查看觸發器
使用以下命令查看觸發器:
SHOW TRIGGERS
[FROM | IN database_name]
[LIKE 'pattern' | WHERE condition];
刪除觸發器
刪除觸發器的語句如下:
DROP TRIGGER [IF EXISTS] trigger_name;
備份與恢復
使用 mysqldump 備份數據庫
mysqldump 是 MySQL 邏輯備份工具,用于導出創建數據庫(CREATE DATABASE)和生成數據(INSERT 語句或者文本文件)的 SQL 腳本。
使用 mysqldump 備份所有的數據庫的命令如下:
mysqldump -u user_name -p -r file_name --all-databases
其中,user_name 表示用戶名;file_name 表示備份文件名;-\-all-databases 表示備份所有的數據庫。
導出特定數據庫的命令如下:
mysqldump -u user_name -p -r file_name --databases db_name1 db_name2
其中,--databases 表示需要導出的數據庫。
mysqldump 也可以選擇導出指定的表:
mysqldump -u user_name -p -r file_name db_name table1 table2
以上命令表示導出數據庫 db_name 中的表 table1 和 table2。
使用 mysql 還原數據庫
mysql 客戶端可以用于導入備份生成的 SQL 文件:
mysql -u user_name -p < file_name