MySQL-MySQL知识复习(一)

本文最后更新于:August 13, 2022 pm

MySQL是一个关系型数据库管理系统。简单复习数据库MySQL知识。

目录

0.数据库用户设置

0.1 创建用户

1
2
3
4
5
create user 用户名@主机名 identified by '密码';
# 例如
create user loong@localhost identified by '123';
# 主机名是允许登录的主机名,可以写通配符表示 % 表示允许所有
create user loong@'%' identified by '123';

0.2 删除用户

1
2
3
drop user 用户名@主机名;
drop user loong@localhost;
drop user loong@'%';

0.3 修改用户密码

  1. 方法一
1
2
update user set password = password('新密码') where user = '用户名';
# password 为给密码加密的函数
  1. 方法二
1
set password for 用户名@主机名 = password('新密码');

0.4 root用户密码忘记

  1. 先停止MySQL服务
1
2
# CMD命令窗口(以管理员身份运行)
net stop mysql
  1. 使用无验证方式启动MySQL服务
1
mysqld --skip-grant-tables
  1. 打开新的CMD窗口,直接输入命令:mysql,再回车就可以登录成功。
  1. use mysql;
1
use mysql;
  1. update user set password = password(‘新密码’) where user =’root’;
1
update user set password = password('新密码') where user ='root';
  1. 关闭两个窗口
  1. 打开任务管理器,手动结束mysqld.exe的进程。
  1. 启动MySQL服务。
  1. 使用新密码登录。

0.5 查询用户权限

1
show grants for 用户名@主机名;

0.6 授予权限

1
2
grant 权限列表 on 数据库名.表名 to 用户名@主机名;
grant all on *.* to 用户名@主机名;# 所有权限

0.7 撤销权限

1
revoke 权限列表 on 数据库名.表名 from 用户名@主机名;

1.数据库的使用

1.1 MySQL服务启动和关闭

1
2
3
4
5
//开启
net start mysql80 //mysql80为服务器的默认名称

//关闭
net stop mysql80

1.2 登录MySQL

1
2
3
4
5
mysql -h 服务器地址 -u 用户名 -p密码 //-p与密码间没用空格,当是在本地时 -h 可以省略或者写localhost或127.0.0.1

mysql -u root -prootmm //root 为用户名,rootmm 为命名,这种写法容易造成密码泄露

mysql -u root -p //回车后再输入密码,这时输入的密码是加密后的

1.3 查看数据库字符集

1
show character set;
  1. MySQL字符集系统变量
系统变量名 说明
character_set_server 服务器安装时指定的默认编码格式。服务器启动时通过该变量设置字符集。使用utf8mb4作为MySQL的默认字符集。
character_set_client 用来设置客户端使用的字符集。用来决定MySQL如何解释客户端发到服务端的SQL命令。
character_set_connection 用来设置连接数据库时的字符集。用来决定MySQL如何处理客户端发来的SQL命令。
character_set_results 数据库给客户端返回时使用的编码格式,当SQL返回结果时,这个变量的取值决定了发给客户端的字符编码。
character_set_database 用来设置默认创建数据库的编码格式,如果在创建数据库时没用设置编码格式,就按照这个默认字符集设置当前选中的数据库。
character_set_system 数据库系统使用的编码格式,这个值一直是utf8,不需要设置。它是为存储系统元数据的编码格式。数据库、表和字段都用这个字符集。

1.4 查看当前系统参数

1
shwo variables like 'char%';

1.5 修改系统参数

1
character_set_database=utf8; //其他类似,直接赋结果即可。

需要注意的是,这种修改方式只在当前客户端有效,关闭后就会恢复成默认值。若要永久性生效,则需要在配置文件 my.ini 中修改。

2.退出MySQL

1
2
3
//两种方法都行
exit
quit

3.数据库

3.1 创建数据库(create)

1
create database 数据库名;

3.2 删除数据库(drop)

1
2
drop database 数据库名;
drop database if exists 数据库名; //如果存在此数据库才执行

3.3 选择数据库(use)

1
use 数据库名;

3.4 查看数据库(show)

1
show databases;

3.5 修改数据库(alter)

1
2
3
alter database 数据库名 
default character set gb2312
default collate gb2312_chinese_ci;

3.6 显示数据库中所有表的信息

1
show table status from 数据库名;

表名以 loong 开头的表的信息

1
show table status from 数据库名 like 'loong';

查询结果按列打印

1
show table status from 数据库名 like 'loong'\G;

4.表

4.1 创建表(create)

4.1.1 常规创建

1
2
3
create table 表名(
字段名 字段类型
);

示例:

1
2
3
4
5
6
7
create table loong(
tutorial_id INT NOT NULL AUTO_INCREMENT comment '编号',
tutorial_title VARCHAR(100) NOT NULL,
tutorial_author VARCHAR(40) NOT NULL,
submission_date DATE,
PRIMARY KEY ( tutorial_id )
);

4.1.2 复制其他表

1
create table 表名1 [[like 表名2] | select 语句 ];
1. 复制表结构
1
create table 表名1 like 表名2; //表1复制表2的结构
2. 复制表结构及数据
1
create table 表名1 select * from 表名2;

4.2 删除表(drop)

1
drop table [if exists] 表名;

4.3 查看表(show)

1
show tables;

4.4 修改表(alter)

1
alter table 表名 修改选项

4.4.1 添加字段(add)

1
alter table 表名 add 新字段名 数据类型 [约束条件] [first|after 已存在的字段名];
  • first:将新添加的字段设置为表的第一个字段;
  • after:将新添加的字段添加到指定的已存在字段名的后面。

4.4.2 修改字段数据类型(modify)

1
alter table 表名 modify 字段名 新数据类型;

4.4.3 删除字段(drop)

1
alter table 表名 drop 字段名;

4.4.4 修改字段名(change)

1
alter table 表名 change 旧字段名 新字段名 新数据类型

4.4.5 修改表名(rename)

1
alter table 旧表名 rename [to] 新表名;
  • to:为可选参数,用否不影响。

4.5 查看表结构(desc)

1
2
3
4
5
describe tablename; //tablename 为表名,describe 也可以简写为 desc
desc tablename;

//显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。两则的效果差不多
show columns from 表名;

4.6 显示建表语句

1
show create table 表名;

4.7 表的数据操作

4.7.1 插入数据(insert into)

1. 指定字段插入数据
1
2
3
insert into 表名(字段1,字段2,····,字段n)
value
(值1,值2,····,值n);
2. 不指定字段插入数据
1
2
insert into 表名 value
(值1,值2,···,值n);

两者区别:

  • 指定字段:可以不按照表中字段的顺序。
  • 不指定字段:值的顺序必须与表中字段的顺序相同。
3. 同时插入多条数据
1
2
3
4
5
6
insert into 表名(字段1,字段2,····,字段n)
value
(值1,值2,···),
(值1,值2,···),
.......
(值1,值2,···);
4. 将其他表的数据插入表中
1
2
3
insert into 表名1(字段1,字段2,····)
select 对应字段1,对应字段2,····
from 表名2;

4.7.2 修改数据

1
update 表名 set 字段1=值1[,字段2=值2,字段3=值3····] [where 子句] [limit 子句];

4.8 删除数据

4.8.1
1
delete from 表名 [where 子句] [order by 子句] [limit 子句];

如果不使用 where 条件,将删除所有数据。

4.8.2
1
truncate table 表名;

删除表中全部数据。

4.8 显示表的详细索引信息

1
show index from 表名;

5.查看版本支持的数据库存储引擎

1
show engines \G;

6.数据类型

6.1 数值类型

1
2
3
4
5
6
7
8
tinyint
smallint
mediumint
int或integer
bigint
float
double
decimal

6.2 日期和时间类型

1
2
3
4
5
date //YYYY-MM-DD
time //HH:MM:SS
year //YYYY
datetime //YYYY-MM-DD HH:MM:SS
timestamp //YYYYMMDD HHMMSS

6.3 字符串类型

1
2
3
4
5
6
7
8
9
10
char //定长字符串
varchar //变长字符串
tinyblob //不超过255个字符的二进制字符串
tinytext //短文本字符串
blob //长文本数据
text //二进制形式的中等长度文本数据
mediumblob //中等长度文本数据
mediumtext //
longblob
longtext

7.查询数据(select)

1
2
select 字段1,字段2····
from 表名;

8.where子句

1
2
select 数据1,数据2,···· from 表名1,表名2·····
where 条件1 [and 或者 or] 条件2····;

表之间使用逗号(,)分割,并使用 WHERE 语句来设定查询条件。可以使用AND或者OR指定一个或多个条件。

以 A=10,B=20 为例:

操作符 描述 实例
= 等号,检测两个值是否相等,如果相等返回true (A = B) 返回false。
<> 或 != 不等于,检测两个值是否相等,如果不相等返回true (A != B) 返回 true。
> 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true (A > B) 返回false。
< 小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true (A < B) 返回 true。
>= 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true (A >= B) 返回false。
<= 小于等于号,检测左边的值是否小于于或等于右边的值, 如果左边的值小于或等于右边的值返回true (A <= B) 返回 true。

9.update更新

1
update 表名 set 字段1=新值,字段2=新值;

可以同时更新一个或多个字段。也可以在后面加上 WHERE 子句来指定任何条件,更新数据表中指定行的数据时 WHERE 子句是非常有用的。

10.delete语句

1
delete from 表名;

如果没有指定 WHERE 子句,MySQL表中的所有记录将被删除。可以在 WHERE 子句中指定任何条件,想删除数据表中指定的记录时 WHERE 子句是非常有用的。

11.like语句

1
2
3
select 字段1,字段2,···字段n
from 表名1,表名2,···表名
where 字段1 like 条件 [and 或者 or] 字段2='其他值';

可以在WHERE子句中指定任何条件,可以在WHERE子句中使用LIKE子句。使用LIKE子句代替等号(=)。LIKE 通常与 % 一同使用,类似于一个元字符的搜索。

12.排序(order by)

1
2
3
select 字段1,字段2,···字段n from
表名1,表名2,···
order by 字段1,[字段2,····] [asc 或者 desc]

可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升排列。

13.分组

根据一个或多个列对结果集进行分组。在分组的列上可以使用 COUNT, SUM, AVG,等函数。

1
2
3
4
select 字段名,function(字段名)
from 表名
where 字段名 operator value
group by 字段名;//是按照这个字段名进行分组

13.1 使用 with rollup

WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。

1
2
3
4
5
select 字段名,function(字段名)
from 表名
where 字段名 operator value
group by 字段名 //是按照这个字段名进行分组,这个一般与输出的字段名一样
with rollup;

14.查看当前数据库名称

1
select database();