MySQL 常用命令速查表:日常開發(fā)、求職面試必備良方
作者: 不剪發(fā)的Tony老師
畢業(yè)于北京航空航天大學(xué),十多年數(shù)據(jù)庫(kù)管理與開發(fā)經(jīng)驗(yàn),目前在一家全球性的金融公司從事數(shù)據(jù)庫(kù)架構(gòu)設(shè)計(jì)。CSDN學(xué)院簽約講師以及GitChat專欄作者。csdn上的博客收藏于以下地址:https://tonydong.blog.csdn.net
備注:PDF 版本點(diǎn)此下載。
文章目錄
連接服務(wù)器
查看幫助
查看連接
退出連接
賬戶和權(quán)限
創(chuàng)建用戶
查看用戶
修改密碼
鎖定/解鎖用戶
用戶授權(quán)
查看權(quán)限
撤銷權(quán)限
管理角色
刪除用戶
管理數(shù)據(jù)庫(kù)
查看數(shù)據(jù)庫(kù)
創(chuàng)建數(shù)據(jù)庫(kù)
切換數(shù)據(jù)庫(kù)
刪除數(shù)據(jù)庫(kù)
管理表
創(chuàng)建表
查看所有表
查看表結(jié)構(gòu)
增加字段
修改字段
刪除字段
刪除表
索引與約束
創(chuàng)建索引
查看索引
修改索引
刪除索引
增加約束
刪除約束
查詢語(yǔ)句
單表查詢
查詢條件
排序操作
限定數(shù)量
分組操作
多表連接
子查詢
集合運(yùn)算
通用表表達(dá)式
DML 語(yǔ)句
插入數(shù)據(jù)
更新數(shù)據(jù)
刪除數(shù)據(jù)
合并數(shù)據(jù)
事務(wù)控制
開始事務(wù)
提交事務(wù)
回滾事務(wù)
事務(wù)保存點(diǎn)
視圖
創(chuàng)建視圖
查看所有視圖
查看視圖定義
重命名視圖
刪除視圖
存儲(chǔ)過(guò)程/函數(shù)
創(chuàng)建存儲(chǔ)過(guò)程/函數(shù)
調(diào)用存儲(chǔ)過(guò)程/函數(shù)
刪除存儲(chǔ)過(guò)程/函數(shù)
觸發(fā)器
創(chuàng)建觸發(fā)器
查看觸發(fā)器
刪除觸發(fā)器
備份與恢復(fù)
使用 mysqldump 備份數(shù)據(jù)庫(kù)
使用 mysql 還原數(shù)據(jù)庫(kù)
速查表(Cheat Sheet),顧名思義就是為了在需要的時(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;或者\(yùn)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 或者\(yùn)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;或者\(yùn)q命令退出 mysql 客戶端:
mysql> exit;
Bye
賬戶和權(quán)限
詳細(xì)的 MySQL 賬戶和權(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ù)
MySQL 數(shù)據(jù)庫(kù)管理的詳細(xì)內(nèi)容可以參考這篇文章。
查看數(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)
管理表
關(guān)于 MySQL 表管理的詳細(xì)內(nèi)容可以參考這篇文章。
創(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è)置索引的可見性:
ALTER INDEX index VISIBLE | INVISIBLE;
可見性是指對(duì)優(yōu)化器而言,默認(rèn)為可見(VISIBLE);INVISIBLE 表示不可見。
刪除索引
刪除索引使用以下命令:
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ù)
MySQL 備份與恢復(fù)的詳細(xì)信息可以參考這篇文章。
使用 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
最后,這里還有一份 MySQL 必備學(xué)習(xí)資源匯總。
定期更新數(shù)據(jù)庫(kù)領(lǐng)域相關(guān)文章,歡迎關(guān)注??、點(diǎn)贊??、轉(zhuǎn)發(fā)??!