MySQL学习(4)-批量执行SQL语句及导入记录文件

2022-09-24 10:09:19

0. 前言

这是MySQL学习系列文章的第四篇。在前几篇中依次介绍了如何安装、基本概念、基本语句,基本上能在控制台上把简单的数据库玩起来了。但是似乎会有些急功近利了,一上来直接就是干货、重点操作之类的,东拼西凑学得半桶水,稍微不那么常见一些的内容就不知道了。

本篇重点参考MySQL官方文档的第3章-Tutorial,对一些基本概念、语句等进行查漏补缺,也或许会发现一些有趣的内容。

本篇就相对轻松一些了,如果只是想简单使用MySQL,跳过本篇也是可以的~

系列文章回顾:
MySQL学习(1)-Windows环境安装和配置
MySQL学习(2)-基本概念、数据类型和简单语句
MySQL学习(3)-表格的“改”和“查”


1. 内容

  1. SELECT语句可以用作简单的计算器:

    SELECT SIN(PI()/4),(4+1)*5;

    在这里插入图片描述

  2. MySQL语句可以使用\c取消,但是只能是小写\c
    在这里插入图片描述

    对于只有1行的语句,也可以用Esc取消,而且毫无痕迹,但是只要分行了,就只能取消当前行了。

  3. MySQL控制台的光标有好几种:

光标类型说明
mysql>等待输入新语句
->语句未输入结束(忘记分号;时总是能看到 😃)
'>输入了字符串,但单引号'不匹配
">输入了字符串,但双引号"不匹配
/*>输入了/*开头的注释,未结束注释
  1. USE db_name;语句只能在单行中写完,如果强行回车并不会出现->光标,而会报错:
    在这里插入图片描述

  2. 登录MySQL服务器时,也可以在-p不接空格直接提供密码,比如:mysql -u root -proot(此处用户名和密码均为 root)。但是登录之后MySQL将作出警告:这样做并不安全
    在这里插入图片描述

  3. 当上一条中-p后面添加空格后,后面的内容将被识别为数据库名称,并且需要输入密码,适用于进入mysql时就想好使用哪个数据库的场合~
    在这里插入图片描述
    如果不放心是否成功地在使用某个数据库了,可以使用SELECT DATABASE();查看当前使用的数据库:
    在这里插入图片描述

  4. 除了采用SHOW COLUMNS FROM tb_name;之外,还可以用DESCRIBE tb_name;来查看表格字段,甚至DESCRIBE还可省略写成DESC(没错,降序也是DESC,可别混淆了)
    在这里插入图片描述

  5. 如果仅知道上一条,那我绝不可能再用SHOW COLUMNS FROM了,毕竟DESC可比它简洁多了。但是别急SHOW COLUMNS FROM后可接WHERE从句或LIKE从句对列进行筛选:
    在这里插入图片描述
    在这里插入图片描述

    “啊,亲爱的SHOW COLUMNS,我为刚才的莽撞切腹自尽~”

  6. 另外,DESCRIBTE除了有小名(简写)DESC之外,还有化名(同义语句)EXPLAIN
    在这里插入图片描述
    不过似乎大家不太爱用EXPLAIN的这个功能,它的更强大之处在于可以采用EXPLAIN + SQL语句查看该语句的执行过程。 以下是HELP EXPLAIN的提示原文:DESCRIBE更常被用于查看表结构信息,而EXPLAIN被用于获取查询语句的执行计划
    在这里插入图片描述
    如果对EXPLAIN有更多兴趣,可以查看Explain官方文档

  7. MySQL语句还可以将语句写在一个SQL脚本中批量执行。共有2中方式可以选择:

    1. 在mysql客户端中运行脚本文件(注意文件名不需要引号'括起来):
      SOURCE d:/sql.txt# 或采用
      \. d:/sql.txt
      比如脚本文件中的语句如下:
      USE dbtest;SHOWTABLES;DESC books;
      运行结果如图:
      在这里插入图片描述
    2. 另一种方式是在启动mysql客户端时,采用>运算符直接指定脚本文件,脚本运行结束后,客户端将关闭
      mysql-u root-p> d:/sql.txt
      运行结果如下图,但其输出排版上似乎少了一份从容优雅:
      在这里插入图片描述

      这批量执行的功能简直是Ctrl+C工程师们的天堂!

  8. 有了上一条脚本执行语句的启发,我想到了上一篇文章在讲为表格添加数据时,没敢 没能提到的功能:对一个表格一次性添加多条记录。但现在有了批量执行,我就可以先来一条INSERT INTO语句:INSERT INTO tb_name VALUES (colVal1, colVal2, colVal3, ...);

    然后疯狂Ctrl+C/V,再修改字段值,最后批量执行就可以了!

    这批量执行的功能简直是Ctrl+C工程师们的天堂!

  9. 但是,先冷静一下,对于批量添加数据,官方其实有更简洁而优雅的做法:

    LOADDATALOCALINFILE'd:/sqlData.txt'INTOTABLE tb_nameLINESTERMINATEDBY'\r'FIELDSTERMINATEDBY'\t';

    其中:

    • LOCAL表明载入的是客户端主机上(而非服务器主机上)的文件;
    • LINES TERMINATED BY '\n'规定了换行符为\n,Windows文档是\r\n换行,而Linux是\n换行,可按自己平台选择;
    • FIELDS TERMINATED BY '\t'规定了字段间采用Tab符号\t分隔,可按照自己文档进行配置;
    • \n换行和\t分隔是默认设置,也是效率最高的设置
    • 如果字段为空,则需要使用\N指代NULL,而不能直接空出;
    • 读取的记录将被添加到表格中,而不会将表格重置为文件中的记录;
    • 更多信息参考官方文档LOAD-DATA

    但是遗憾地,一开始执行这个语句时,一般会碰到这样的问题ERROR 3948(42000):载入本地数据被禁止;必须在客户端和服务器上同时启用该功能。
    在这里插入图片描述
    此处直接给出解决办法如下,具体信息可以参考官方文档LOAD-DATA-LOCAL-SECURITY

    # 1. 设置服务器端local_infile变量为ON:SETGLOBAL local_infile=ON# 2. EXIT指令退出客户端EXIT# 3. 在连接服务器时加上 --local-infile=1 参数:
    mysql-u root-p--local-infile=1

    这下就可以成功载入啦:
    在这里插入图片描述


2. 小结

  1. MySQL控制台有好几种光标,多数光标能够提示目前没能配对的运算符;
  2. 可以在连接mysqld服务器时直接指定使用的数据库;
  3. 可以使用SOURCE或是\.语句来执行MySQL脚本,也可以在连接服务器时就指定脚本;
  4. 可以使用LOAD DATA LOCAL INFILE语句将文档中的数据记录载入表格中,不过需要先开启local_infile功能;

如有错误欢迎指正,共同进步~


今天你学废了吗?

  • 作者:Copperxcx
  • 原文链接:https://blog.csdn.net/Copperxcx/article/details/121899039
    更新时间:2022-09-24 10:09:19