MySQL语句

姜智浩 Lv4

本位与2025-01-06在CSDN上发布 现将其转移至自己的博客

引擎相关

查看存储引擎:

1
show engines;

查看显示支持的存储引擎信息:

1
show variables like 'have%'

查看默认的存储引擎:

1
show variables like 'storage_engine'

数据库相关操作(增 删 改)

创建数据库:

1
2
3
create datbase [if not exists] db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFALUT] COLLATE collation_name]

PS

“[ ]”中的是可选项 可写可不写
将db_name替换成你想给数据库取的名字

查看所有数据库

1
show databases;

查看数据库的详细信息

1
show create database db_name;

使用某个数据库

1
use db_name;

修改数据库编码

1
2
alter database [db_name]
[DEFAULT CHARACTER SET charset_name]| [[DEFAULT]COLLATE collation_name]

PS

例1:将schoolDB的编码方式有GBK修改为UTF8。

法1:ALTER DATABASE schoolDB CHARACTER SET UTF8;

法2:ALTER DATABASE schoolDB collate utf8_general_ci;

删除数据库

1
drop database [if exists] db_name;

表的相关操作(增删改查)

创建表

1
2
3
4
5
create table [if exists] t_name(
name_1 int [primary key],
name_2 varchar(10)[...],
name_3 float(5, 3)[...]
)[engine = INNODB charset = UTF-8];

PS

这里t_name是表名

name_1 name_2 name_3 是字段名

字段名后面[ ]中的是完整性约束(可选填)

完整性约束条件:
PRIMARY KEY主键(唯一来标识的,每一个表都一个,自动非空)
AUTO_INCREMENT自增长
FOREIGN KEY外键
NOT NULL非空
UNIQUE KEY唯一
DEFAULT默认值
最下面的[ ] 中的是引擎和编码方式的选择

修改表

[在name_3的(前面|后面)] 增加新列name_4

1
2
alter table t_name
add name_4 [first|after name_3];

修改列的数据类型

将name_2的数据类型修改成float(4,3)

1
2
alter table t_name
modify name_2 float(4,3)

修改列名

将表t_name中的name_1列的名字修改成new_name_1

1
2
alter table t_name
change name_1 new_name_1;

修改表名

将表t_name的名字修改成new_t_name

1
2
alter table t_name
rename [to] new_t_name;

删除列

将表t_name中的name_1列删除

1
2
alter table t_name
drop column name_1;

删除行

1
2
delete from t_name
where 条件表达式;

修改存储引擎

将表t_name的存储引擎修改成INNODB

1
2
alter table t_name
engine = INNODB;

查看表

查看表名

1
show tables;

查看表的结构

1
2
3
4
5
6
7
8
#法1
show create table t_name;

#法2
describe t_name;

#法3
desc t_name;

复制表

1
2
3
4
5
6
create table [if not existe] t_name
[like t_name_2]
[as 表信息]

#like可以复制表的结构 表中的信息不会被复制 复制出来的是个空表
#as 可以复制表中的信息 相当于CV大法

删除表

将表t_name删除

1
drop table t_name;

数据相关操作

插入数据

1
2
3
insert [into]
t_name(name_1, name_2, name_3)
values(12,'hello', '2025-01-04');

查看插入信息

1
select * from t_name;

修改数据

1
2
3
4
5
update t_name
set name_1 = x,
name_2 = y,
name_3 = z
[where 条件表达式];

PS

若where不写
则更新全部记录

删除数据

1
2
delate from t_name
[where 条件表达式];

完全清除某个表
完全清除表t_name:

1
truncate [table] t_name;

单表查询(重点)

先给出语法:

1
2
3
4
5
6
7
select [distinct] name_1 [as new_name],
[distinct] name_2 [as new_name],
from t_name
[where 条件表达式,]
[group by name [ASC|DESC],]
[order by name [ASC|DESC],]
[limit 条数];

PS

SELECT子句:
指定要查询的列名称,列与列之间用逗号隔开。
还可以为列指定新的别名,显示在输出的结果中。
ALL关键字表示显示所有的行,包括重复行,是系统默认的
DISTINCT表示显示的结果要消除重复的行。
FROM子句:指定要查询的表,可以指定两个以上的表,表与表之间用逗号隔开。
WHERE子句:指定要查询的条件。
如果有WHERE子句,就按照“条件表达式”指定的条件进行查询;
如果没有WHERE子句,就查询所有记录。

GROUP BY :
子句用于对查询结构进行分组。
按照“列名1”指定的字段进行分组;
如果GROUP BY子句后带着HAVING关键字,那么只有满足“条件表达式2”中指定的条件的才能够输出。
GROUP BY子句通常和COUNT()、SUM()等聚合函数一起使用。

HAVING子句:
指定分组的条件,通常放Group by字句之后

ORDER BY子句:用于对查询结果的进行排序。
排序方式由ASC和DESC两个参数指出;
ASC参数表示按升序进行排序。默认情况下是ASC。
DESC参数表示按降序的顺序进行排序。升序表示值按从小到大的顺序排列。

LIMIT 子句:限制查询的输出结果的行数。

多表查询

连接

等值连接

1
2
3
4
5
select x_name_1,
y_name_2
from t_x
inner join t_y on t_x.id = t_y.id
where...;

左连接、右连接和联合查询不过多赘述

子查询

带in关键词的子查询

1
2
3
4
5
select *
from t_name_1
where name_1 in(
select name_2 from t_name_2
);

带比较运算符的子查询

1
2
3
4
5
6
7
select *
from t_name_1
where name = (
select id
from t_name_2
where id = 2
)

索引

引:
面试题:select id,name,age from sd where name=’张飞’
怎么优化?最佳方案是什么?
答:在name上创建索引:
create index in name on sd(name);

语法(已存在的表):

1
2
create index in_id
on t_name(id);

PS

in_id:索引名 (自己取)
t_name:表名
id:列名

在创建表的时候创建索引

1
2
3
4
create table t_name(
...
[unique|fulltext|spatial] index|key [in_id](name[长度])[ASC|DESC]
);

视图

创建视图

1
2
3
4
create view view_name as
#查询语句:
select...
[with [cascaded|local] check option];

删除视图

1
drop view view_name;

用户

创建用户

1
create user '用户名'@'localhost' identifiednby '密码';

查询用户

1
select * from mysql.user;

分配权限

1
grant 权限 on 库.表 to '用户名'@'localhost';

触发器

触发器设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#触发器设置
CREATE TRIGGER before_position_update
BEFORE UPDATE ON staff
FOR EACH ROW
BEGIN
IF OLD.position != NEW.position THEN
CASE NEW.position
WHEN '董事长' THEN
SET NEW.role = 9;
WHEN '经理' THEN
SET NEW.role = 6;
ELSE
SET NEW.role = 2;
END CASE;
END IF;
END;

PS

这里是当position设置为经理或董事长时 自动更改权限等级

显示设置的触发器

1
2
#显示设置的触发器
SHOW TRIGGERS;

备份与恢复

备份

备份数据库到文件。

1
mysqldump -u username -p db_name > backup.sql

恢复

从文件恢复数据库。

1
mysql -u username -p db_name < backup.sql
  • Title: MySQL语句
  • Author: 姜智浩
  • Created at : 2025-01-06 11:45:14
  • Updated at : 2025-03-30 14:44:32
  • Link: https://super-213.github.io/zhihaojiang.github.io/2025/01/06/20250106MySQL语句/
  • License: This work is licensed under CC BY-NC-SA 4.0.