MySQL 5.7.13 常用基础命令
- 前言
- 假设
- 用户命令
- 数据库命令
- 表命令
- 记录命令
前言
本文参考了菜鸟教程MySQL的部分内容,以及@尘埃看世界的博客的部分内容,再加上度娘还有@lewo的博客部分内容和@我自己实际学到的和实际运用且可用的MySQL5.7指令的内容整合。
大部分指令对于MySQL8+也是可以的。
假设
- 假设有用户
'root'@'%'
- 假设该用户有密码
12345678
- 假设该用户有数据库
chatroom
- 假设该数据库有表
existuser
- 假设该表有记录(已删除字段id=2的记录)
user_id | username | userpassword |
1 | wto | 246810 |
3 | kpl | dj2602 |
4 | lol | 13579 |
5 | dma | 123fid |
本文默认字段0为自动递增的int类型,即user_id
本文虽参考了诸多教程,但每条SQL语句均经过本人测试,确保能够使用,但请注意,某些部分为方便阅读采取换行式书写,复制请留意
如下为测试样例:
用户命令
注意:在 MySQL5.7 中 user 表的 password 已换成了authentication_string。
- 查询用户
- 查询所有用户
use mysql;
select user, host from mysql.user;
- 查询用户(不重复)
use mysql;
select distinct user from mysql.user;
- 创建用户
create user '用户名'@'IP地址' identified by '密码';
IP地址如果是本地就是localhost
,如果是任意IP就是%
,否则填你允许连接的IP。
- 修改密码
alter user '用户名'@'IP' identified by '新密码';
- 查看权限
show grants for '用户名'@'IP';
- 授予权限(对于MySQL8+远程访问这个很重要)
grant 权限 on 数据库名.表 to '用户名'@'IP' ;
- 读写权限:
- 任意权限填
all privileges
- 固定权限填
select,update,insert,delete,drop,create
- 数据库名:任意数据库填
*
- 表名:任意表填
*
- 允许授予其他用户权限在末尾补充
with grant option
- 举例:给root用户任意读写权限和授予其他用户权限的权限
grant all privileges on *.* to 'root'@'%' with grant option;
- 撤销权限
revoke all privileges on *.* from 'root'@'%';
- 删除用户
drop user '用户名'@'IP';
- 刷新权限
flush privileges;
数据库命令
注意有无引号
注意引号,要么不加,要么加ESC下面那个,英文格式下的,是 ` 不是 ’ 更不是 ",之前的操作加的是单引号 ’ ,包括如字符集这些还是正常单引号 ’ 。
- 查询数据库
show databases;
- 创建数据库
- 直接创建
create database 数据库名;
- 带字符集(如utf8mb4、gb18030等)创建
create database 数据库名 character set 'utf8mb4';
- 带字符集、排序规则创建
create database 数据库名 character set 'utf8mb4' collate 'utf8mb4_unicode_ci';
- 如果不存在则创建
create database if not exists 数据库名;
- 删除数据库
drop database 数据库名
表命令
注意有无引号
- 查询数据表
use 数据库;
show tables;
- 创建数据表
直接创建就不说了,说说如果不存在表才创建:create table if not exists 数据库名.表名 (
user_id int(0) unsigned not null,
username varchar(255) not null,
userpassword varchar(255) not null,
primary key (user_id)
) engine = innodb character set = utf8mb4
结果就跟本文最开始那张表一样,当然,没有记录。
格式就是:create table table_name (字段1 字段1格式,
字段2 字段2格式,
primary key (字段1)
) engine = 引擎 character set = 字符集;
- 修改数据表名
alter table 原表名 rename to 新表名;
- 删除数据表
drop table 数据库名.数据表名
- 合并显示数据表 (前提是字段一样)
order by 字段是为了选择按哪个来排序
- 允许重复
select 字段1,字段2 from 表1 union all select 字段1,字段2 from 表2 order by 字段1;
- 不允许重复
select 字段1,字段2 from 表1 union select 字段1,字段2 from 表2 order by 字段;
- 将含有关键字的记录组成新的表(配合where子句使用)
select username,userpassword from existuser_c where username = 'wto'
union all
select username,userpassword from existuser_d where username = 'kpl'
order by userpassword;
即格式为:select 字段1,字段2 from 表1 where 字段 = 关键字 union all select 字段1,字段2 from 表2 where 字段 = 关键字 order by 字段1;
记录命令
注意有无引号
最好也必须一定要先use 数据库;
- 查询记录
- 查询数据表全部记录
select * from 数据表名;
- 查询数据表某一列(字段)所有数据记录
select 字段名 from 数据表名
- 查询含某个关键词的全部记录
select * from 数据表名 where 字段1 = '关键字' and 字段2 = '关键字';
- 插入记录
- 无条件插入单条记录
insert into 表名 (字段1, 字段2, 字段3) values ('值1', '值2', '值3');
这时该行的字段0进行默认操作(根据你创建表时的规则)
或者你只想要一行行插入:insert into 表名 values ('对应字段0的值', '对应字段1的值', '对应字段2的值', '对应字段3的值');
那就必须把每个字段都给填写 - 不存在记录时插入单条记录
该试验在没有第一条记录的时候无效,且在Java中使用会产生连续两条相同的记录,尚未搞清楚原因insert into 数据表名 (字段1, 字段2)
select '待存值1也是验证存在值','待存值2'
from 数据表
where not exists (select * from 数据表.字段1 = '验证存在值')
;
举例说明:
注意:暂未弄清其原理
比如我想判断是否存在该用户wto,如果不存在就插入用户名和密码insert into existuser (username, userpassword)
select 'wto', '12345'
from existuser
where not exists (select * from existuser where existuser.username = 'wto');
另外该方法也可用于从另一个表取记录插入到该表 - 存在则修改,不存在则插入
insert into existuser (user_id, username, userpassword)
values (1,'sks853', '246810')
on duplicate key update
username = 'sks852', userpassword = '1234';
这个前提还得知道keyword值,也就是字段0 user_id。
- 修改记录
update 表名 set 字段1 = '关键字', 字段2 = '关键字' where 字段名 = '关键字';
- 删除记录
- 删除表内所有记录
delete from 表名;
- 删除含有关键字的记录
delete from 表名 where 字段 = '关键字';
- 删除数值小于关键字的记录(或者大于 > )
delete from 表名 where 字段 < '关键字';
- 删除重复的记录
delete from 表名 where ID字段 not in (select ID字段 from (select min(ID字段) as ID字段 from 表名 group by 字段1,字段2)a);
只有在字段1 和字段2 都一样的情况下才删除该记录,并按ID字段的序号最小值进行保存,ID字段值最大那几个都删掉。
参考各种删除重复记录以及统计重复记录的方法
在菜鸟教程中有个很有意思的回答:
delete,drop,truncate 都有删除表的作用,区别在于:
- delete 和 truncate 仅仅删除表数据,drop 连表数据和表结构一起删除,打个比方,delete 是单杀,truncate 是团灭,drop 是把电脑摔了。
- delete 是 DML 语句,操作完以后如果没有不想提交事务还可以回滚,truncate 和 drop 是 DDL 语句,操作完马上生效,不能回滚,打个比方,delete 是发微信说分手,后悔还可以撤回,truncate 和 drop 是直接扇耳光说滚,不能反悔。
- 执行的速度上,drop>truncate>delete,打个比方,drop 是神舟火箭,truncate 是和谐号动车,delete 是自行车。
另外,在使用自动递增时需要注意,除非你清空数据,像
truncate table 表名;
这样,否则自动递增将会一直向前,哪怕删除了某条记录也是如此。
大概就这么多吧,想到什么再补充,当然还有很多像诸如临时表、索引之类的没写,后面用到再写吧。