1. 连接与退出

登录 MySQL

mysql -u 用户名 -p密码 数据库[可选] -P 端口 -h IP

输入上述命令后,系统会提示输入密码。

示例:

mysql -u root -p123456 mysql -P 3306 -h 192.168.1.1

指定数据库登录

mysql -u 用户名 -p 数据库名

示例:

mysql -u root -p test_db

退出 MySQL

在 MySQL 提示符下输入:

exit;

quit;

2. 数据库操作

显示所有数据库

SHOW DATABASES;

创建数据库

CREATE DATABASE 数据库名;

示例:

CREATE DATABASE my_database;

删除数据库

DROP DATABASE 数据库名;

示例:

DROP DATABASE my_database;

使用指定数据库

USE 数据库名;

示例:

USE my_database;

3. 表操作

显示当前数据库中的所有表

SHOW TABLES;

显示表的列

SHOW COLUMNS FROM customers;

或者

DESC customers;

创建表

CREATE TABLE 表名 (
    列名1 数据类型 约束,
    列名2 数据类型 约束,
    ...
);

示例:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

删除表

DROP TABLE 表名;

示例:

DROP TABLE users;

查看表结构

DESCRIBE 表名;

DESC 表名;

示例:

DESCRIBE users;

4. 数据操作

插入数据

INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);

示例:

INSERT INTO users (username, email) VALUES ('john_doe', '[email protected]');

查询数据

SELECT 列1, 列2, ... FROM 表名 [WHERE 条件] [ORDER BY 列 ASC|DESC] [LIMIT 数量];

示例:

SELECT * FROM users;
SELECT username, email FROM users WHERE id > 10 ORDER BY created_at DESC LIMIT 5;

更新数据

UPDATE 表名 SET 列1 = 新值1, 列2 = 新值2 WHERE 条件;

示例:

UPDATE users SET email = '[email protected]' WHERE username = 'john_doe';

删除数据

DELETE FROM 表名 WHERE 条件;

示例:

DELETE FROM users WHERE id = 5;

5. 用户与权限管理

创建新用户

CREATE USER '用户名'@'主机' IDENTIFIED BY '密码';

示例:

CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'password123';

授权

GRANT 权限 ON 数据库.表 TO '用户名'@'主机';

授予数据库my_database的权限:

GRANT ALL PRIVILEGES ON my_database.* TO 'new_user'@'localhost';

授予所有数据库的权限:

GRANT ALL PRIVILEGES ON *.* TO 'new_user'@'localhost';

刷新权限

FLUSH PRIVILEGES;

撤销权限

REVOKE 权限 ON 数据库.表 FROM '用户名'@'主机';

示例:

REVOKE ALL PRIVILEGES ON my_database.* FROM 'new_user'@'localhost';

删除用户

DROP USER '用户名'@'主机';

示例:

DROP USER 'new_user'@'localhost';

查询用户

SELECT User, Host FROM mysql.user;

6. 备份与恢复

导出数据库(备份)

使用 mysqldump 工具:

mysqldump -u 用户名 -p 数据库名 > 备份文件.sql

示例:

mysqldump -u root -p my_database > my_database_backup.sql

导入数据库(恢复)

mysql -u 用户名 -p 数据库名 < 备份文件.sql

示例:

mysql -u root -p my_database < my_database_backup.sql

导入数据库文件

source 文件位置

示例:

source /Users/kai/Desktop/atguigudb.sql;

7. 其他常用命令

显示当前使用的数据库

SELECT DATABASE();

查看当前用户

SELECT USER();

显示当前活动的进程

SHOW PROCESSLIST;

杀死指定进程

KILL 进程ID;

示例:

KILL 12345;

显示服务器状态

SHOW STATUS;

显示服务器变量

SHOW VARIABLES;

更改数据库字符集

ALTER DATABASE 数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

示例:

ALTER DATABASE my_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

8. 高级查询

使用 JOIN 进行表连接

SELECT 列1, 列2, ...
FROM 表1
JOIN 表2 ON 表1.列 = 表2.列
WHERE 条件;

示例:

SELECT users.username, orders.order_date
FROM users
JOIN orders ON users.id = orders.user_id
WHERE users.id = 1;

分组与聚合函数

SELECT 列, COUNT(*) FROM 表名 GROUP BY 列;

示例:

SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;

子查询

SELECT 列 FROM 表 WHERE 列 IN (SELECT 列 FROM 表 WHERE 条件);

示例:

SELECT username FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);

这些命令涵盖了 MySQL 日常使用中的大部分场景。根据具体需求,您可能还需要深入学习更高级的功能和优化技巧。

附录1:命令合集

连接数据库
-- mysql -u 用户名 -p密码 数据库[可选] -P 端口 -h IP
mysql -u root -p -P 3307 -h 127.0.0.1

数据库

显示所有数据库
-- SHOW DATABASES;
show databases;
使用数据库
-- USE 数据库名;
use practice;
查看创建数据库的命令(如何创建的)
-- SHOW CREATE DATABASE 数据库名;
show create database practice;
查看当前使用的数据库
-- SELECT DATABASE();
select database();

数据表

查看当前数据库下的所有表
-- SHOW TABLES;
show tables;
查看某个表下的所有列
-- DESCRIBE 表名;
-- 或者
-- SHOW COLUMNS FROM customers;

show create table customers;
-- 或者
desc table customers;
创建一个表
/*
CREATE TABLE 表名 (
    列名1 数据类型 约束,
    列名2 数据类型 约束,
    ...
);
*/

create table users(
id int auto_increment primary key,
username varchar(50) not null,
email varchar(50) not null,
create_at timestamp default current_timestamp
);
查看创建某个表的命令(如何创建的)
-- SHOW CREATE TABLE 表名;
show create table customers;
删除某个表
-- DROP TABLE 表名;
drop table users;

数据操作

新增数据
-- INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);
insert into users (username, email) values ('EmccK', '[email protected]');
删除数据
-- DELETE FROM 表名 [WHERE 条件]
-- 不加条件则是删除所有
delete from users where id = 2
修改数据
-- UPDATE 表名 SET 列1 = 新值1, 列2 = 新值2 WHERE 条件;
update users set username = 'John' where id = 6;
查询数据
-- SELECT 列1, 列2, ... FROM 表名 [WHERE 条件] [ORDER BY 列 ASC|DESC] [LIMIT 数量];
-- 所有列表:SELECT *
-- 排序:ORDER BY,ASC升序(默认从小到大),DESC降序
-- 限制数量:LIMIT 
select username, email from users order by email asc limit 1;

条件查询数据

查询所有数据
-- SELECT * FROM 数据表;
select * from products;
查找之后去重
-- DISTINCT关键字
select distinct vend_id from products;

-- 同时两列不同
select distinct vend_id, prod_price from products;
查找限制几行
-- LIMIT 数量,限制只有固定数量行
select * from products limit 5;

-- LIMIT 起点索引(包含), **数量**
select * from products limit 5, 10;
排序数据
-- ORDER BY [列1] ASC(升序,默认值,可以不写)/DESC(降序), [列表2] ASC(升序,默认值,可以不写)/DESC(降序)
select * from products order by prod_price;

select * from products order by prod_price desc;

select * from products order by prod_price asc, prod_name desc;

-- 在大多数数据库中,A和a是相同的
过滤数据
-- WHERE关键字
/* 
= 等于 
<> 不等于 
!= 不等于 
< 小于 
<= 小于等于 
> 大于 
>= 大于等于 
BETWEEN AND 在指定的两个值之间,前后都包括 
*/
查询某一列是NULL
-- WHERE 列表 IS NULL
select * from users where email is null;
组合查找
-- 使用 AND 和 OR 可以组合处理多个条件
select prod_id, prod_price, prod_name from products where vend_id = 1003 and prod_price <= 10 order by prod_price;

select * from products where vend_id = 1002 or vend_id = 1003;

-- AND和OR放一起的时候,会优先处理AND语句,再处理OR语句
-- 如果是:列出价格为10美元(含)以上且由1002或1003制造的所有产品,则下面的就是错误的
select * from products where vend_id = 1002 or vend_id = 1003 and prod_price >= 10;

-- 正确的是需要添加括号
select * from products where (vend_id = 1002 or vend_id = 1003) and prod_price >= 10 order by prod_price;

-- IN (1002, 1003) 等价于 vend_id = 1002 OR vend_id = 1003,
-- IN里面是一个列表,IN比OR更快,更容易管理
select * from products where vend_id in (1002, 1003) order by prod_price;
否定查找
-- NOT WHERE子句中用来否定后跟条件的关键字
select * from products where vend_id not in (1002, 1003) order by vend_id;

字符串查找,通配符&正则

查找`prod_name`以`jet`开头的产品-匹配多字符
-- 可以使用 LIKE 关键字,后面跟通配符,不区分大小写
-- 可以使用%查询,%表示任何字符出现任意次数**(0,1,以及任意)**
SELECT * FROM products WHERE prod_name LIKE 'jet%';

-- %可以同时位于两端
SELECT * FROM products WHERE prod_name LIKE '%anvil%';
通配符查找,匹配单字符
-- 可以使用 _ 匹配单字符,使用起来跟%差不多
SELECT * FROM products WHERE prod_name LIKE '_ ton anvil';

最好和其他条件配合查找,因为通配符的查找会比较慢一点

正则表达式查找
-- 使用关键字<u>**REGEXP**</u>,代替LIKE,使用起来是一样的,后面跟正则表达式,这个也是不区分大小写。
-- 正则表达式中的<u>**.**</u>可以匹配任意<u>**一个**</u>字符
SELECT * FROM products WHERE prod_name REGEXP '.000';

-- 如果需要匹配特殊字符,则需要添加<u>\\</u>为前导。<u>**\\-**</u>为查找<u>**-**</u>字符,<u>**\\.**</u>为查找<u>**.**</u>字符
SELECT vend_name FROM vendors WHERE vend_name REGEXP '\\.';

拼接字段

查找供应商和地区,并拼接在一块name(location)的样式
-- MySQL中使用Concat()拼接字符串
SELECT Concat(vend_name, '(', vend_country, ')') FROM vendors ORDER BY vend_name;

-- 使用函数Trim()来去除数据左右两侧多余的空格,RTrim()则是去掉右侧多余的空格,LTrim()则是去掉左侧多余的空格
SELECT Concat(Rtrim(vend_name), '(', Rtrim(vend_country), ')') FROM vendors ORDER BY vend_name;
拼接字段之后设置别名
-- 上述拼接完之后,如果不设置别名的话,其他人是没办法使用的,可以使用AS关键字设置别名
SELECT Concat(Trim(vend_name), '(', Trim(vend_country), ')') AS vend_title FROM vendors ORDER BY vend_name;
计算`orderitems`表里面`order_num`是20005的产品的每一项的总价,命名为`expanded_price`
-- 计算的话,可以直接使用+-*/
SELECT prod_id, quantity, item_price, quantity*item_price AS expanded_price FROM orderitems WHERE order_num = 20005;

常用函数

字母转换成大写
-- Upper()方法,将所有小写字母转换成大写字母
SELECT vend_name, Upper(vend_name) AS vend_name_upcase FROM vendors ORDER BY vend_name;
常用的一些函数
-- Left()  返回字符串左边的字符
-- Length() 返回字符串的长度
-- Locate() 找出串的一个子串
-- Lower() 将串转换成小写
-- LTrim() 去掉左边的空格
-- Right() 返回串右边的字符
-- RTrim() 去掉右边的空格
-- Soundex() 返回串的SOUNDEX值
-- SubString() 返回字串的字符
-- Upper() 将串转换成大写

常用的时间函数

image.png

💡 时间格式默认最好是:yyyy-mm-dd

SELECT * FROM orders WHERE Year(order_date) = 2005 AND Month(order_date) = 9;

数值处理函数

image.png

汇总数据

常用的汇总函数

image.png

AVG函数

查询某一列的平均值,后面可以跟条件

-- 查询所有产品的平均值
SELECT AVG(prod_price) AS avg_price FROM products;

-- 查询vend_id为1003的产品的平均值
SELECT AVG(prod_price) AS avg_price FROM products WHERE vend_id = 1003;
COUNT函数
-- 查询某个表下数据总数
SELECT COUNT(*) AS num_cust FROM customers;

-- 只对有值的行计数,如果某一个行没有值,则不计数
SELECT COUNT(cust_email) AS num_cust FROM customers;
MAX函数和MIN函数
-- 查询最大值
SELECT MAX(prod_price) as max_price FROM products;

-- 查询最小值
SELECT MIN(prod_price) as min_price FROM products;
SUM函数
-- 计算某列下的所有值的和
SELECT SUM(quantity) AS items_ordered FROM orderitems WHERE order_num = 20005;

-- 计算值
SELECT SUM(quantity*item_price) AS total_price FROM orderitems WHERE order_num = 20005;

-- 去除重复的值
SELECT AVG(DISTINCT prod_price) AS avg_price FROM products WHERE vend_id = 1003;
组合聚集函数
SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS price_max, AVG(prod_price) AS price_avg FROM products;

分组数据

返回每个供应商提供的产品数目
SELECT vend_id COUNT(*) AS num_prods FROM products GROUP BY vend_id;
设置分组过滤条件
SELECT vend_id COUNT(*) AS num_prods FROM products GROUP BY vend_id HAVING COUNT(*) >= 3;
列出具有2个(含)以上、价格为10(含)以上的产品的供应商
SELECT vend_id, COUNT(*) AS num_prods FROM products WHERE prod_price >= 10 GROUP BY vend_id HAVING num_prods >= 2 ORDER BY num_prods;
查找总计订单价格大于等于50的订单的订单号和总计订单价格,`orderitems`
SELECT order_num, SUM(item_price * quantity) AS ordertotal FROM orderitems GROUP BY order_num HAVING ordertotal >= 50 ORDER BY ordertotal;

子查询

要列出订购物品TNT2的所有客户 1. 检索包含物品TNT2的所有订单的编号`orderitems` 2. 检索具有前一步骤列出的订单编号的所有客户的ID`orders` 3. 检索前一步骤返回的所有客户ID的客户信息
-- 1. 检索包含物品TNT2的所有订单的编号
SELECT order_num FROM orderitems WHERE prod_id = 'TNT2';
-- 得到结果:20005, 20007

-- 2. 检索具有前一步骤列出的订单编号的所有客户的ID
SELECT cust_id FROM orders WHERE order_num IN (20005, 20007);
-- 得到结果:10001, 10004

-- 3. 检索前一步骤返回的所有客户ID的客户信息
SELECT * FROM customers WHERE cust_id IN (10001, 10004);



-- 1和2可以合并成一个语句
SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id = 'TNT2');

-- 1、2、3三个合并成一个子句
SELECT * FROM customers WHERE cust_id IN (SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id = 'TNT2'));
显示customers表中每个客户的订单总数

附录2:关键字

  • SHOW:显示
  • DATABASES:数据库
  • TABLE:表
  • COLUMN:列
  • ROW:行
  • PRIMARY KEY:主键
  • CREATE:新建
  • WHERE:哪个
  • IS:是
  • FROM:从哪里
  • DELETE:删除数据
  • LIKE:通配符匹配
  • REGEXP:正则表达式匹配
  • AS:设置别名