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 字段名 = '关键字';
  • 删除记录
    • 删除表内所有记录
      select from 表名;

    • 删除含有关键字的记录
      select from 表名 where 字段 = '关键字';

    • 删除数值小于关键字的记录(或者大于 > )
      select 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 都有删除表的作用,区别在于:

  1. delete 和 truncate 仅仅删除表数据,drop 连表数据和表结构一起删除,打个比方,delete 是单杀,truncate 是团灭,drop 是把电脑摔了。
  2. delete 是 DML 语句,操作完以后如果没有不想提交事务还可以回滚,truncate 和 drop 是 DDL 语句,操作完马上生效,不能回滚,打个比方,delete 是发微信说分手,后悔还可以撤回,truncate 和 drop 是直接扇耳光说滚,不能反悔。
  3. 执行的速度上,drop>truncate>delete,打个比方,drop 是神舟火箭,truncate 是和谐号动车,delete 是自行车。

另外,在使用自动递增时需要注意,除非你清空数据,像truncate table 表名;这样,否则自动递增将会一直向前,哪怕删除了某条记录也是如此。

大概就这么多吧,想到什么再补充,当然还有很多像诸如临时表、索引之类的没写,后面用到再写吧。

发布了7 篇原创文章 · 获赞 3 · 访问量 520

猜你喜欢

转载自blog.csdn.net/qq_43634664/article/details/104155459