SQL 代码是一把双刃剑,用好了事半功倍,用的不好则很容易产生灾难性的生产事故。因此在编写 SQL 语句时候,遵守基本的语法规范非常重要,因为这可以有效提升 SQL 代码的安全性,并保持高性能与简洁。
MySQL8 数据库的语法非常丰富,功能也很强,此处不会全部罗列出来,因为后面会出专门的章节讲解,本章节仅从 MySQL8 规范的角度,选取一些典型的语法示例进行讲解。
字符串是字节或者字符的序列,字符串使用单引号 ' 或者 双引号 ” 括起来,支持字符串拼接:
'你好,试试吧!' //单引号示例 "你好,试试吧!" //双引号示例 '你好,' ' ' '试试吧!' //字符串拼接示例 select _utf8mb4'string'; //为字符串指定特定字符集 SELECT _utf8mb4'string' COLLATE utf8mb4_danish_ci; //为字符串指定特定字符集与排序规则
特殊字符转义:\0 一个 ASCII NUL 字符; \' 单引号 ' 字符; \" 双引号 " 字符; \b 退格字符; \n 换行 字符; \r 一个回车符; \t 制表符; \Z ASCII 26; \\ 反斜杠 \ 字符; \% 一个 % 通配符; \_ 一个 _ 通配符。
转义示例:
# 单引号示例 select '试试吧', '"试试吧"', '""试试吧""', '试试''吧', '\'试试吧'; 试试吧 | "试试吧" | ""试试吧"" | 试试'吧 | '试试吧 # 双引号示例 select "试试吧", "'试试吧'", "''试试吧''", "试试""吧", "\"试试吧"; 试试吧 | '试试吧' | ''试试吧'' | 试试"吧 | "试试吧 # 换行符示例 SELECT '你好,\n试试吧'; 你好, 试试吧
数字包括整数和浮点数,前面可以由 + 或者 - 表示正负值。按照精确程度分为精确值和近似值,精确值由整数或小数组成,例如:1,1.1,-2,-2.1,+3.10 等;近似值由带尾数和指数的科学计数法表示,例如:1.1E3,1.2E-3 等。
DECIMAL 精确值示例:
try8 DECIMAL(3,2)signed // 定义 try8 精度为3,小数位为2,取值范围:-9.99 至 9.99 try8 DECIMAL(3,2)unsigned // 定义 try8 精度为3,小数位为2,取值范围:0 至 9.99
FLOAT 近似值示例:
try8 FLOAT(3,2)signed // 定义 try8 精度为3,小数位为2,取值范围:-9.99 至 9.99 try8 FLOAT(3,2)unsigned // 定义 try8 精度为3,小数位为2,取值范围:0 至 9.99
小提示:DECIMAL 是推荐的可以用于金钱的精确值类型,对于要求不高的场景可以使用 FLOAT 近似值类型。
MySQL8 日期和时间值可以用多种格式表示,例如带引号的字符串或数字,具体取决于值的类型。
date:日期格式允许使用较宽松的语法,任何标点符号都可以用作日期部分之间的分割符号,但是在新版 MySQL8 中,建议使用 - 来分割,否则会收到不规范语法提醒。
YYYY-MM-DD //字符串日期示例:2023-02-27 YYYYMMDD //数字日期示例:20230227
datetime / timestamp:
datetime 和 timestamp 都是日期和时间组合的类型,格式为:YYYY-MM-DD HH:MM:SS。其中 timestamp 支持存储 UTC 时区,如果遇到无效的时间类型,datetime / timestamp 转换为:0000-00-00 00:00:00 。
小提示:无论是带定界符的字符串还是数字型的日期时间,只要是有意义,MySQL 都可以正常识别。
常量 TRUE 和 FALSE 计算结果分别为 1 和 0,常量名称不区分大小写。
NULL 值表示:无数据,NULL 可以写在任何数据中,它与 0 或者空的字符串不同。在排序的时候,NULL 值排序位于其它值之前默认升序,在其它值之后进行降序。
MySQL8 中的一些对象,包括数据库、表、索引、列、别名、视图、存储过程、分区、表空间、资源组和其他对象名称,称为标识符。标识符可以被引用或不被引用,如果标识符包含特殊字符或者是保留字,则必须引用。
标识符使用 Unicode (UTF-8) 存储,下面描述了每种标识符的最大长度,例如:最大的别名长度为 256 个字符。
Database 数据库:64 Table 表:64 Column 列:64 Index 索引:64 Constraint 约束:64 Stored Program 存储过程:64 View 视图:64 Tablespace 表空间:64 Server 服务:64 Log File Group 日志文件组:64 Alias 别名:256 Compound Statement Label 复合语句标签:16 User-Defined Variable 用户定义变量:64 Resource Group 资源组:64
对象名称可能是合格的或者不合格的,限定名称至少包含一个限定符,用来覆盖缺失的上下文信息。
限定符示例:
# 数据库示例 selct * from tb_name; selct * from db_name.tb_name; # 触发器示例 create trigger mytrigger ... on mytable ...; create trigger mytrigger ... on mydb.mytable ...;
底层操作系统的大小写敏感性在数据库、表和触发器名称的大小写敏感性中起着一定的作用,这意味着在 Windows 中不区分大小写,但在大多数 Unix 变体中区分大小写,macOS 又比较特殊。
其它须知:分区、子分区、列、索引、存储例程、事件和资源组名称在任何平台上都不区分大小写,列别名也不区分大小写,但是,日志文件组的名称区分大小写,这与标准 SQL 不同。
MySQL8教程 - MySQL8 语法规范,主要用于介绍 MySQL 和 MySQL8 数据库,从 MySQL8 语法开始,逐步到 MySQL8 规范讲解等,通篇实用易懂,让 MySQL8 入门更加快速和简单。
《MySQL8教程》主打原创、全部免费,欢迎学习和转载,如需交流请加微信号:try8_cn。