zoukankan      html  css  js  c++  java
  • 谈谈MySQL的黑暗语法

    MySQL在SQL标准下实现了自己的一套SQL语句

      每种数据库都会在继承标准SQL的基础上有所发展,比如SQL-SERVER在这个基础之上发展出来的SQL“方言”就叫“T-SQL”,MySQL

      发民出来的这套方言就没有名字了,不过他里面也是饱含了许多“黑话”的,比如说“show xxxx;”

    黑暗语法一:from dual

      select查询是可以直接用于计算的比如我想算一下 “1 + 1 = 2”就可以这样

    select 1 + 1;
    +-------+
    | 1 + 1 |
    +-------+
    |     2 |
    +-------+
    1 row in set (0.00 sec)

      但是如果真的有人那么的“死板”,硬要要求你们的每一个select语句都要有一个from子句的话,那么你就可以用from dual来满足他

    select 1 + 1 from dual;
    +-------+
    | 1 + 1 |
    +-------+
    |     2 |
    +-------+
    1 row in set (0.00 sec)

      也就是说“from dual”是MySQL的黑话之一,“from dual”会被MySQL忽略掉的。

    黑暗语法二:--<空格> 注释

      MySQL有一种行内注释语法“-- ”用中文来描述就是“两个连续的减号后面加上空格或换行”,反正说也说不太明白,还是直接来看一下效果吧

    select 1 + 1; -- select 2 + 2;
    +-------+
    | 1 + 1 |
    +-------+
    |     2 |
    +-------+
    1 row in set (0.00 sec)

      可以看到 “--  ”后面的“select 2  + 2;”被MySQL当成注释了;不过这个有一个比较坑的地方,就是“--”后面要有空格(或换行)才算是注释,注意

      了是一定要有“空格”才行

      1): 说一下为什么要有空格才行

      数学经过许多年的发展人类逐步认识到了“整数”,“小数”,“负数” ... ... 之于为什么注释一定要有空格就是因为“负数”,还是以“1 + 1 = 2”的例子

      数学上还另一个写法,就是“负负得正

    select 1--1;                                                                                
    +------+
    | 1--1 |
    +------+
    |    2 |
    +------+
    1 row in set (0.00 sec)

      所以呀为了于“两次取负”相区分,MySQL会以“有没有空格”来区分“是不是注释”!

    黑暗语法三:多行注释

      这里想说MySQL的多行注释也有在标准SQL上做一些扩展,所以说“MySQL多行注释”也是鬼的一B,我们来看一下在正常的多行注释

    select 1 + /* 这是一行不起眼的注释 */ 1;                                                    
    +--------+
    | 1 +  1 |
    +--------+
    |      2 |
    +--------+
    1 row in set (0.00 sec)

      可以看到MySQL表现的和预期一样、MySQL多行注释牛逼的地方在、它可以把它适应MySQL版本,既然要说的与MySQL版本相关的注释,

      那么我交代一下自己的MySQL版本

     select @@version;
    +-----------+
    | @@version |
    +-----------+
    | 8.0.11    |
    +-----------+
    1 row in set (0.00 sec)

      可以看到我这里用的是mysql-8.0.11,我们可以通过注释来限定与版本相关的逻辑(当我的MySQL版本大于等于MySQL-8.0.11时就自动加个一个“2”)

    select 1 + /*!80011 2 +  */ 1;
    +--------------+
    | 1 +  2 +   1 |
    +--------------+
    |            4 |
    +--------------+
    1 row in set (0.00 sec)

      看到了吧、它自己加了个“2”上去,为了对比我们看一下把版本号限制到8.0.14之上版的情况

    select 1 + /*!80014 2 +  */ 1;
    +--------+
    | 1 +  1 |
    +--------+
    |      2 |
    +--------+
    1 row in set (0.00 sec)

      可以看到由于版本号太低所以“+2”的这个逻辑就没有上去。

    参考文档

      '--' as the Start of a Comment

      Comment Syntax

    学习交流

    -----------------------------http://www.sqlpy.com-------------------------------------------------

    -----------------------------http://www.sqlpy.com------------------------------------------------- 

  • 相关阅读:
    排序算法
    【转】《分享一下我研究SQLSERVER以来收集的笔记》未整理
    D3.js学习记录
    D3.js学习记录【转】【新】
    JAVA FILE or I/O学习
    JAVA GUI学习
    android一键锁屏
    源文件如何转换到可执行文件
    手动搭建maven项目
    ThinkingInJava----第11章 持有对象
  • 原文地址:https://www.cnblogs.com/JiangLe/p/9644791.html
Copyright © 2011-2022 走看看