MySQL服务操作(管理员权限的命令提示符窗口)
启动MySQL服务
停止MySQL服务
登录MySQL
显式登录,密码会显示出来
隐式登录,写到-p处回车,再输入密码,密码不可见
登录指定IP地址的下的MySQL
登录指定IP地址的下的MySQL
1
| mysql --host=IP地址 --user=root --password=root
|
退出MySQL,都是退出命令,也可以按Ctrl + C进行退出
SQL注释
单行注释,- -后面必须有空格,#后面可以不加空格
多行注释,同Java中的多行注释用法一致
DDL:操作数据库
create
创建数据库,当要创建的数据库已存在时,会在控制台打印错误信息
判断数据库是否存在,若不存在则创建,存在则不会打印错误信息
1
| create database if not exists 数据库名称;
|
创建数据库并指定使用的字符集,如:utf8 和 gbk
1
| create database 数据库名称 character set 字符集名称;
|
判断数据库是否存在,若不存在则对其进行创建并指定其使用的字符集,存在则不会打印错误信息
1
| create database if not exists 数据库名称 character set 字符集名称;
|
retrieve
查询所有数据库的名称
查询指定数据库所使用的字符集
1
| show create database 数据库名称;
|
查询当前所使用的数据库,当当前使用的数据库不存在时,会返回null
update
修改数据库所使用的字符集
1
| alter database 数据库名称 character set 字符集名称;
|
delete
删除数据库,当数据库不存在时,会在控制台打印错误信息
判断数据库是否存在,存在则会将其删除,不存在则不会打印错误信息
1
| drop database if not exists 数据库名称;
|
使用数据库
DDL:操作表
create
数据类型 |
数据名称 |
说明 |
整数类型 |
tinyint |
很小的整数 |
smallint |
小的整数 |
mediumint |
中等大小的整数 |
int(dataLength) |
普通大小的整数;在括号中指定可写入的数据的长度,只能填入整数;括号可以省略,省略后默认数据长度为11 |
小数类型 |
float |
单精度浮点数 |
double(m,d) |
双精度浮点数,在括号中写入整个数据的长度和小数点后面数据的长度,如:double(5,2),小数长度为5,小数点后面有两位数;括号省略不写后,可以写入任意长度的小数 |
decimal(m,d) |
压缩严格的定点数 |
日期类型 |
year |
yyyy,1901~2155 |
time |
HH:mm:ss,-838:59:59~838:59:59 |
date |
yyyy-MM-dd,1000-01-01~9999-12-03 |
datetime |
yyyy-MM-dd HH:mm:ss,1000-01-01 00:00:00~9999-12-31 23:59:59 |
timestamp |
yyyy-MM-dd HH:mm:ss,1970-01-01 00:00:01 UTC~2038-01-19 03:14:07 UTC |
字符串 |
char(M) |
M为0~255之间的整数 |
varchar(M) |
M为0~65535之间的整数 |
blob |
tinyblob |
允许长度0~255字节 |
blob |
允许长度0~65535字节 |
mediumblob |
允许长度0~167772150字节 |
longblob |
允许长度0~4294967295字节 |
clob |
tinytext |
允许长度0~255字节 |
text |
允许长度0~65535字节 |
mediumtext |
允许长度0~167772150字节 |
longtext |
允许长度0~4294967295字节 |
二进制 |
varbinary(M) |
允许长度0~M个字节的变长字节 |
binary(M) |
允许长度0~M个字节的定长字节 |
创建表,创建多个列时,列与列之间要用逗号分隔开,最后一个列后面不需要加逗号
1 2 3 4 5
| create table 表名( 列名1 数据类型1, ... 列名n 数据类型n );
|
创建表演示
1 2 3 4 5 6 7 8
| create table student( id int, name varchar(10); age int, score double(4,1), birthday date, insert_time timestamp );
|
复制表,不包含数据
1
| create table 表名 like 被复制的表名;
|
retrieve
查询数据库中所有表的名称
查询表结构
update
修改表名
1
| alter table 表名 rename to 新表名;
|
修改表使用的字符集
1
| alter table 表名 character set 字符集名称;
|
添加单列
1
| alter table 表名 add 列名 数据类型;
|
添加多列
1 2 3 4 5
| alter table 表名 add( 列名1 数据类型1, ... 列名n 数据类型n );
|
修改列的数据类型
1
| alter table 表名 modify 要修改的列名 修改后的数据类型;
|
修改列的名称和数据类型
1
| alter table 表名 change 要修改的列名 修改后的列名 修改后的数据类型;
|
delete
删除列
删除表,当数据库不存在时,会在控制台打印错误信息
判断表是否存在,存在则会将其删除,不存在则不会打印错误信息
1
| drop table if exists 表名;
|
DML:操作数据
值要与指定的列或表中的列一一对应
除数字类型外,其他类型需要使用引号(‘’,””)包裹
create
为指定列插入数据
1
| insert into 表名(列1,...,列n) values(值1,...,值n);
|
为所有列插入数据
1
| insert into 表名 values(值1,...,值n);
|
DQL:retrieve
语法
关键字 |
作用 |
select |
字段列表 |
from |
表名列表 |
where |
条件列表 |
group by |
分组字段 |
having |
分组之后的条件 |
order by |
排序 |
limit |
分页限定 |
基础查询
查询表中的所有数据
查询表中指定列下的所有数据
1
| select 要查询的列名1, ..., 要查询的列名n from 表名;
|
查询表中指定列所有的数据,并去除重复
1
| select distinct 要查询的列名1, ..., 要查询的列名n from 表名;
|
运算时,若有值为null,就将其修改成指定的值
1
| select ifnull(要查询的列名1,替换后的值), ifnull(要查询的列名2,替换后的值) from 表名;
|
给指定列起别名,可用一个空格代替as
1
| select 列名1 as 别名1, 列名2 别名2 from 表名;
|
条件查询
查找指定列中大于给定参数的所有信息
1
| select * from 表名 where 列名 > 指定参数;
|
查找指定列中大于等于给定参数的所有信息
1
| select * from 表名 where 列名 >= 指定参数;
|
查找指定列中等于给定参数的所有信息,SQL中没有==
1
| select * from 表名 where 列名 = 指定参数;
|
查找指定列中不等于给定参数的所有信息,!=可以用<>代替
1
| select * from 表名 where 列名 != 指定参数;
|
查找指定列中大于等于给定参数1,小于等于给定参数2的所有信息,and可以用&&代替,但不建议使用
1
| select * from 表名 where 列名 >= 指定参数1 and 列名 <= 指定参数2;
|
查找指定列中范围在参数1和参数2之间的数据,包括参数1和参数2
1
| select * from 表名 where 列名 between 指定参数1 and 指定参数2;
|
查找指定列的符合参数1或者参数2的数据,可以用in代替或条件的判断,括号中的参数个数是可变的
1 2
| select * from 表名 where 列名 = 指定参数1 or 列名 = 指定参数2; select * from 表名 where 列名 in (指定参数1,指定参数2);
|
查询该列中值为null的所有数据,null值不能使用=判断
1
| select * from 表名 where 列名 is null;
|
查询该列中值不为null的所有数据,null值不能使用!=判断
1
| select * from 表名 where 列名 is not null;
|
模糊查询
查询字符长度为三个字符的所有数据,一个_就代表一个字符
1
| select * from 表名 where 列名 like '___';
|
查询任意字符长度的所有数据,%代表任意个字符
1
| select * from 表名 where 列名 like '%';
|
查询符合以指定字符开头的,后面只有一个任意字符的所有数据
1
| select * from 表名 where 列名 like '指定字符_';
|
查询符合以指定字符开头的,后面可以有任意个字符的所有数据
1
| select * from 表名 where 列名 like '指定字符%';
|
查询符合第一个字符为任意字符,第二个字符以指定字符开头的,后面可以有任意个字符的所有数据
1
| select * from 表名 where 列名 like '_指定字符%';
|
查询列中指定字符前任意字符,且字符长度不限,而指定字符后只有一个任意字符的数据
1
| select * from 表名 where 列名 like '%指定字符_';
|
查询列中首位和末位字符任意,中间是指定字符的所有数据
1
| select * from 表名 where 列名 like '_指定字符_';
|
查询列中任意位置有指定字符的所有数据
1
| select * from 表名 where 列名 like '%指定字符%';
|
排序查询(默认asc排序)
将表中的所有数据以指定列值的升序排序
1 2
| select * from 表名 group by 列名1 asc, ..., 列名n asc; select * from 表名 order by 列名1 asc, ..., 列名n asc;
|
将表中的所有数据以指定列值的降序排序
1 2
| select * from 表名 group by 列名1 desc, ..., 列名n desc; select * from 表名 order by 列名1 desc, ..., 列名n desc;
|
聚合函数
语法
关键字 |
作用 |
count |
计算个数 |
max |
计算最大值 |
min |
计算最小值 |
sum |
计算和 |
avg |
计算平均值 |
计算表中有多少条数据,后面跟order by列名时,数据的计算不会发生变化;后面跟group by列名时,会查询每一行或每一列是否有数据,有就返回1,没有就返回0
1
| select count(*) from 表名;
|
计算该列中有多少条不为空的数据,后面跟order by列名时,数据的计算不会发生变化;后面跟group by列名时,会查询每一行或每一列是否有数据,有就返回1,没有就返回0
1
| select count(列名) from 表名;
|
查询指定列中数值最大的数据
1
| select *, max(列) from 表名;
|
查询指定列中数值最小的数据
1
| select *, min(列) from 表名;
|
计算指定列中所有数据的和
计算指定列中所有数据的平均值
分组查询
通过给定的列将表中的数据进行分组,重复的数据将会被过滤,只展示一次;select和from的中间建议使用进行分组的列
1
| select 列 from 表名 group by 分组条件;
|
单独使用,与where的使用方法类似
1
| select * from 表名 having 条件判断;
|
having后面必须跟聚合函数返回的结果
1
| select * from 表名 group by 字段 having 条件判断;
|
where后面跟普通条件判断,having后面跟聚合函数条件判断
1
| select * from 表名 where 条件判断 group by 字段 having 条件判断;
|
分页查询
查询从指定索引开始的指定条数据(起始索引 = 当前页码 - 1)
1
| select * from 表名 limit 起始索引,显示条数;
|
update
修改表中的所有数据为指定数据
1
| update 表名 set 要修改的列名1 = 要修改成的数据1, ...,要修改的列名n = 要修改成的数据n;
|
修改表中指定数据
1
| update 表名 set 要修改的列名1 = 要修改成的数据1, ...,要修改的列名n = 要修改成的数据n where 条件判断;
|
delete
删除表中所有数据(一条一条进行删除)
删除表,再创建一个完全一样的空表
根据条件删除对应的数据
1
| delete from 表名 where 条件判断;
|
约束
语法
1级关键字 |
2级关键字 |
作用 |
primary key |
|
主键约束 |
|
auto_increment |
自增约束 |
not null |
|
非空约束 |
unique |
|
唯一约束 |
foreign key |
|
外键约束 |
|
on update cascade |
级联更新 |
|
on delete cascade |
级联删除 |
建表时添加约束
1 2 3 4 5 6 7 8 9 10 11 12
| create table 表名( id int primary key auto_increment, name varchar(10) not null, phone int(11) unique, gender_id int(1), constraint 外键名称 foreign key(gender_id) references 主表名称(主键列名称) on update cascade on delete cascade );
|
对已有表进行添加或删除约束
添加约束
添加非空约束,唯一约束,主键约束,自动增长约束
1
| alter table 表名 modify 列名 数据类型 约束类型;
|
添加外键约束
1
| alter table 表名 add constraint 外键名称 foreign key(外键列名称) references 主表名称(主表列名称);
|
添加外键约束并设置级联更新
1
| alter table 表名 add constraint 外键名称 foreign key(外键列名称) references 主表名称(主表列名称) on update cascade;
|
添加外键约束并设置级联删除
1
| alter table 表名 add constraint 外键名称 foreign key(外键列名称) references 主表名称(主表列名称) on delete cascade;
|
删除约束
删除非空约束,自动增长
1
| alter table 表名 modify 列名 数据类型;
|
删除唯一约束
1
| alter table 表名 drop index 列名;
|
删除主键约束
1
| alter table 表名 drop primary key;
|
删除外键约束,外键列无论有无级联更新或级联删除都会被删除
1
| alter table 表名 drop foreign key 外键名称;
|
数据库的备份和还原(需要在命令提示符窗口中使用)
备份数据库下指定表到指定位置,当指定数据库名称时,生成的文件中会有用法提示;表名称可省略,省略后数据库中的所有表都会被备份
1
| mysqldump -u用户名 -p密码 数据库 表名称 > 保存的路径/文件名称.sql
|
还原数据库
1 2 3 4 5 6
| 步骤一:登录mysql mysql -u用户名 -p密码 步骤二:指定要还原到的数据库 use 数据库名称; 步骤三:数据库还原 source 保存的路径/文件名称.sql
|
多表查询
内连接
隐式内连接
通过关联关系查询两个表中的所有数据
1 2 3 4 5 6
| select * from 表1, 表2 where 表1.关联字段 = 表2.关联字段;
|
显式内连接
通过关联关系查询两个表中的所有数据;inner是可以省略的
1 2 3 4 5 6 7 8
| select * from 表1 inner join 表2 where 表1.关联字段 = 表2.关联字段;
|
外连接
左外连接
以表1为主,根据关联关系查询1中的所有数据及与表2的交集部分;outer是可以省略的
1 2 3 4 5 6 7 8
| select 字段列表 from 表1 left outer join 表2 on 表1.关联字段 = 表2.关联字段;
|
右外连接
以表2为主,根据关联关系查询表2中的所有数据及与表1的交集部分
1 2 3 4 5 6 7 8
| select 字段列表 from 表1 right outer join 表2 on 表1.关联字段 = 表2.关联字段;
|
子查询
查询中嵌套查询,从而获取想要的数据,如下所示
查询学生表中学习成绩最高的学生的所有信息
1 2 3 4 5 6 7 8 9
| select * from 学生表 where 学生表.成绩 = (select max(成绩) from 学生表);
|
查询学生表中学习成绩小于平均成绩的学生的所有信息
1 2 3 4 5 6 7 8 9
| select * from 学生表 where 学生表.成绩 < (select avg(成绩) from 学生表);
|
查询学生表中学习语文或数学的所有的学生信息
1 2 3 4 5 6 7 8 9 10 11 12 13
| select * from 学生表 where 学生表.课程id in (select 课程id from 课程表 where name = '语文' or name = '数学');
|
查询入学时间是2020-9-1的学生信息和班级信息
1 2 3 4 5 6 7 8 9 10 11 12
| select * from 班级表, (select * from 学生表 where 入职时间 = '2020-9-1') 学生表 where 班级表.id = 学生表.班级id;
|
通过学生表中的班级人数,查询出班级编号,班级名称和班级人数
1 2 3 4 5 6 7 8 9 10 11 12
| select 班级表.班级id, 班级表.班级名称,学生表.班级人数 from 班级表, (select 班级id, count(id) 班级人数 from 学生表 group by 班级id) 学生表 where 班级表.id = 学生表.班级id;
|
事务
事务提交(MySQL默认自动提交,1代表自动提交,0代表手动提交)
查询事务的提交方式
修改事务的提交方式,对数据进行操作后需要重启SQLyog才能看到数据有无变化,SQLyog重启后会将事务的提交方式改为自动提交
手动提交
事务的隔离级别
隔离级别 |
说明 |
read uncommitted |
读未提交: 脏读,不可重复读,幻读 |
read committed |
读已提交: 不可重复读,幻读 |
repeatable read |
可重复读: 幻读 |
serializable |
串行化: 无问题 |
查询数据库的隔离级别
修改数据库的隔离级别,需要重启才能查出是否修改成指定的隔离级别,若不想重启就能查出修改的隔离级别,就将global替换成session
1
| set global transaction isolation level 隔离级别;
|
开启事务
DCL:管理用户,授权
管理用户
查询并使用
1 2 3 4 5
| 1.切换到mysql数据库 use mysql; 2.查询用户表 select * from user; 注: host列中的%表示可以在任意主机下使用用户登录数据库
|
创建用户
1
| create user '用户名'@'主机名' identified by '密码';
|
删除用户,删除用户必须使用命令删除
修改用户密码,并重新加载权限表
1 2
| update user set password = password('新密码') where user = '用户名'; flush privileges;
|
修改用户密码
1
| set password for '用户名'@'主机名' = password('新密码');
|
忘记用户名密码
命令提示符窗口中停止mysql服务,需要管理员身份
命令提示符窗口中停止mysql服务,需要管理员身份
使用无验证方式启动mysql服务
1
| mysqld --skip-grant-tables
|
输入以下命令登录mysql服务,再使用上面修改密码的方法修改密码即可
修改完密码后,打开任务管理器,右键点击结束任务(E)将mysqld.exe进程终止
启动mysql服务,再进行登录即可
授权管理
权限 |
说明 |
具体说明 |
all [privileges] |
所有权限 |
|
ALTER |
Alter_priv |
Tables |
ALTER ROUTINE |
Alter_routine_priv |
Stored routines |
CREATE |
Create_priv |
Databases, tables, or indexes |
CREATE ROUTINE |
Create_routine_priv |
Stored routines |
CREATE TABLESPACE |
Create_tablespace_priv |
Server administration |
CREATE TEMPORARY TABLES |
Create_tmp_table_priv |
Tables |
CREATE USER |
Create_user_priv |
Server administration |
CREATE VIEW |
Create_view_priv |
Views |
DELETE |
Delete_priv |
Tables |
DROP |
Drop_priv |
Databases, tables, or views |
EVENT |
Event_priv |
Databases |
EXECUTE |
Execute_priv |
Stored routines |
FILE |
File_priv |
File access on server host |
GRANT OPTION |
Grant_priv |
Databases, tables, or stored routines |
INDEX |
Index_priv |
Tables |
INSERT |
Insert_priv |
Tables or columns |
LOCK TABLES |
Lock_tables_priv |
Databases |
PROCESS |
Process_priv |
Server administration |
PROXY |
See proxies_priv table |
Server administration |
REFERENCES |
References_priv |
Databases or tables |
RELOAD |
Reload_priv |
Server administration |
REPLICATION CLIENT |
Repl_client_priv |
Server administration |
REPLICATION SLAVE |
Repl_slave_priv |
Server administration |
SELECT |
Select_priv |
Tables or columns |
SHOW DATABASES |
Show_db_priv |
Server administration |
SHOW VIEW |
Show_view_priv |
Views |
SHUTDOWN |
Shutdown_priv |
Server administration |
SUPER |
Super_priv |
Server administration |
TRIGGER |
Trigger_priv |
Tables |
UPDATE |
Update_priv |
Tables or columns |
USAGE |
Synonym for “no privileges” |
Server administration |
查询权限
1
| show grants for '用户名'@'主机名';
|
授予权限,*表示所有
1
| grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
|
删除用户权限
1
| revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
|