【数据库——MySQL】(5)运算符、表达式和系统函数

news/2025/2/21 8:45:55/

目录

  • 1. 常量
    • 1.1 数值常量
    • 1.2 字符串常量
    • 1.3 日期时间常量
    • 1.4布尔值
    • 1.5 NULL值
  • 2. 变量
    • 2.1 系统变量
    • 2.2 用户变量
  • 3. 运算符与表达式
    • 3.1 赋值运算符
    • 3.2 算术运算符
    • 3.3 比较运算符
    • 3.4 判断运算符
    • 3.5 字符串匹配
    • 3.6 逻辑运算符和位运算符
    • 3.7 表达式和运算符的优先级
  • 4. 系统函数
  • 参考书籍

1. 常量

1.1 数值常量

  1. 十进制数常量
    十进制数常量分为整数常量和浮点数常量,整数常量即不带小数点的十进制数,浮点数常量是使用小数点的数值常量。

  2. 非十进制数常量
    非十进制数常量包括b(B)二进制表示和x(X)十六进制表示,它们只能表示整数。

    有两种表示方式:

    1. 以0打头,在进制表示符后跟进制数;
    2. 以进制表示符打头后跟进制数字符串,但十六进制数字需要双数。

1.2 字符串常量

字符串常量可以用引号括起来,也可以通过十六进制表达。

  1. 一般字符串常量
    一般字符串常量用单引号括起来,例如:‘你好,How are you!’。其中,ASCII字符用一个字节存储,中文用2个字节存储。

  2. Unicode字符串常量
    Unicode字符串常量前面有一个N标志符,代表SQL-92标准的国际语言(National Language),用单引号括起字符串。例如:N’你好,How are you!'。其中,每个字符(中文或者英文)用两个字节存储。

  3. 字符串中特殊的字符表示
    在字符串中不仅可以使用普通的字符,也可使用几个转义序列来表示特殊的字符,见下表。每个转义序列以一个反斜杠(“\”)开始。

    序列含意
    \0一个ASCII零值字节(NUL)字符
    \n一个回车符
    \r一个换行符(Windows中使用\r\n作为新行标志)
    \t一个定位符
    \b一个退格符
    \Z一个ASCII 为26字符(Ctrl+Z)
    \’一个单引号(“'”)
    \"一个双引号(“"”)
    \\一个反斜线(“\”)
    \%一个“%”符,用于在正文中搜索包含“%”字符,否则 “%”将解释为一个通配符。
    \_一个“_”符,用于在正文中搜索包含“”字符,否则 “”将解释为一个通配符。
  4. 字符串中包含引号字符
    字符串内包含单引号(‘),字符串需要用双引号("),否则需要用转义字符(’)表示单引号;字符串内包含双引号(“),字符串需要用单引号('),否则需要用转义字符(”)表示双引号。

  5. 十六进制、二进制表示字符串
    每对(即2个)十六进制数字被转换为一个字符,不区分大小写。

    每8位(1个字节)二进制数字被转换为一个字符。

    在输出显示时,十六进制和二进制表示被默认为表达字符,而在参与算术运算时则被认为是表达数值。

1.3 日期时间常量

满足日期时间要求的字符串它当然本身就是字符串,但当用于日期时间位置、符合日期时间格式要求并且有效时,就会被看成是日期时间常量。
日期型常量包括年、月、日,如“2023-09-20”格式。

时间型常量包括小时数、分钟数、秒数及微秒数,如“10:38:33.00025”格式。

日期时间型常量是日期时间组合,如“2023-09-20 10:38:33”。

注意,MySQL是按“年-月-日”的顺序表示日期的,中间的间隔符“-”也可以使用如“\”、“@”或“%”等特殊符号。此外,日期时间常量必须有效,如’2023-02-31’的字符串就是错误的日期时间常量。

1.4布尔值

布尔值只包含两个可能的值:TRUEFALSETRUE 的数字值为 1FALSE 的数字值为 0

1.5 NULL值

NULL 值可适用于各种列类型,它通常用来表示“没有值”、“无数据”等含义,并且不同于数字类型(0),或字符串类型的空字符串(‘’)。

2. 变量

2.1 系统变量

MySQL有一些特定的设置,例如,有些定义数据如何被存储,有些影响到处理速度,还有些与日期有关,这些设置就是系统变量。

  1. 系统变量获取和设置
    系统变量在MySQL服务器启动时就被引入并初始化为默认值。例如:@@VERSION可获得当前使用的MySQL版本,像这样的系统变量的值是不可以改变的。

    大多数的系统变量应用于SQL语句中必须在名称前加两个@符号,而为了与其他SQL产品保持一致,某些特定的系统变量是要省略这@@符号的。如CURRENT_DATE(系统日期)、CURRENT_TIME(系统时间)、CURRENT_TIMESTAMP(系统时间戳)和CURRENT_USER(SQL用户名)。

    有些系统变量是可以通过SET语句来修改的:

    SET [GLOBAL| SESSION] 系统变量名 = 表达式
    

    或者

    SET	@@GLOBAL.| @@SESSION.系统变量名 = 表达式
    
  2. 全局系统变量和会话系统变量

    1. 全局系统变量(指定GLOBAL):当MySQL启动的时候,全局系统变量就被初始化了,并且应用于此后每一个启动的会话。如果设置GLOBAL来系统变量(需要超级用户权限),则该值被记住,并被用于新的连接,直到服务器重新启动为止。

    2. 会话系统变量只适用于当前的会话。大多数会话系统变量的名字和全局系统变量的名字相同。当启动会话的时候,默认情况下每个会话系统变量都和同名的全局系统变量的值相同。一个会话系统变量的值是可以改变的,但是这个新的值仅适用于当前正在运行的会话。

    3. 若改变了全局系统变量的值,同名的会话系统变量的值也保持不变。

  3. 系统变量清单

    SHOW VARIABLES [LIKE 条件]					#显示系统变量清单。
    SHOW GLOBAL VARIABLES [LIKE 条件]			#显示所有全局系统变量
    SHOW SESSION VARIABLES [LIKE 条件]			#显示所有会话系统变量
    

2.2 用户变量

用户自己定义的变量叫用户变量,可在其中保存值,以后再引用它,这样在一个会话中可以将值从一个语句传递到另一个语句。

用户变量可用下列语句定义和赋值:

SET	@变量名 = 表达式, ...

说明:

  1. 变量名由当前字符集的文字和数字字符、“.”、“_”和“$”组成。当变量名中需要包含一些特殊符号(如空格、#等)时,可以使用双引号或单引号将整个变量括起来。@必须放在一个用户变量的前面,以便将它和列名区分开。

  2. 用户变量的数据类型取决于赋予它的表达式值。表达式可以是常量、已经赋值的用户变量或它们通过运算符组成的式子,也可以是NULL值。

  3. 没有初始化的用户变量的值为NULL。

  4. 只有当一个用户变量已经被创建并初始化后,它才可以用于其他SQL语句中,变量名前必须加上@符号。

  5. 用其他语句代替SET语句来为用户变量分配一个值,分配符必须为“:=”,而不能用“=”,因为在非SET语句中“=”被视为比较操作符。

  6. 用户变量可以用于存放数据库的查询结果。

3. 运算符与表达式

3.1 赋值运算符

因“=”只有在SET语句中才被作为赋值运算符使用,其他上下文情形下都被视作等于比较运算符,而“:=”则在任何合法的SQL语句中都是赋值运算符,故实际应用中要进行赋值运算,建议优先采用“:=”形式。

3.2 算术运算符

算术运算符是用于数值型数据运算的,常用的算术运算符见下表。

运算符作用实例
DIV整数除法5 DIV 2 = 2
/除法5 / 2 = 2.5
%,MOD取模运算5 % 2 = 1
*乘法5 * 2 = 10
-减法或负号-5-2 = -7
+加法-5 + 2 = -3

3.3 比较运算符

运算符作用
=等于
<=>安全等于
<>.!=不等于
<=小于等于
<小于
>=大于等于
>大于

等于(=)时的一些注意事项:

  1. 若两个参数均为数值或者数值表达式,则按照数值进行比较。
  2. 若用数值字符串和数字进行比较,则自动将字符串转换为数字后用数值进行比较。
  3. 用非数值字符串和数字进行比较,字符串转换为0,然后进行比较。
  4. 若两个都是(单引号或双引号括起)字符串,则按照字符串进行比较。只有字符串顺序和个数完全相同,字符串才相等。注意,空格也是字符。
  5. ASCII码字符在不同的字符集中存储的代码是相同的,中文在不同的中文字符集中存储的代码是相同的,但在中文字符集和其他非中文字符集代码是不同的。
  6. 大小写字符是否相等取决于当前字符排序规则。
  7. 元组比较两项对应列的数据项是否相等。
  8. 若有一个或两个参数为NULL,则比较运算的结果为NULL。
  9. 半角字符和全角字符是不相等的。

3.4 判断运算符

  1. IS NULL(ISNULL)IS NOT NULL
  2. 值是否在范围内:BETWEEN...AND...
  3. 值是否在其中:IN、NOT IN

3.5 字符串匹配

  1. 字符串通配符匹配:LIKE

    表达式 LIKE 匹配条件
    

    如果表达式满足匹配条件,返回值为1;如果不匹配,则返回0。表达式或匹配条件中任何一个为空,则结果为NULL。

    可以使用下面两种通配符

    1. ‘%’:匹配任何数目的字符,甚至包括’'字符。
    2. ‘_’:只能匹配一个字符。
  2. 字符串是否匹配正则表达式规范:REGEXP

    通过正则表达式可实现更复杂的字符串匹配。

    表达式 REGEXP 匹配条件
    

    如果表达式满足匹配条件,返回1;如果不满足,则返回0。若表达式或匹配条件任意一个为空,则结果为 NULL

    REGEXP运算符在进行匹配时,常用的有下面几种通配符:

    1. ‘^’:匹配以该字符后面的字符开头的字符串;
    2. ‘$’:匹配以该字符后面的字符结尾的字符串;
    3. ‘.’:匹配任何一个单字符;
    4. ‘[…]’:匹配在方括号内的任何字符。
    5. ‘*’:匹配零个或多个在它前面的字符,例如,'x*‘匹配任何数量的’x’字符,’[0-9]*‘匹配任何数量的数字,而’*'匹配任何数量的任何字符。

3.6 逻辑运算符和位运算符

  1. 逻辑运算符

    运算符作用
    NOT,!逻辑非
    AND,&&逻辑与
    OR,||逻辑或
    XOR逻辑异或
  2. 位逻辑运算符和位移动运算符

    运算符作用
    ~按位取反
    &按位与
    |按位或
    ^按位异或
    <<左移
    >>右移

3.7 表达式和运算符的优先级

  1. 表达式
    所谓“表达式”就是操作数(包括常量和变量)、列名函数通过运算符进行有机组合的式子。

  2. 运算符的优先级
    当一个复杂的表达式有多个运算符时,运算符优先级决定执行运算的先后次序,会影响所得到的运算结果。

    MySQL运算符的优先级如下表所示,级别数字越小表示优先级越高。

    运算符级别
    !0
    -,~1
    ^2
    *,/,DIV,%,MOD3
    +,-4
    <<, >>5
    &6
    |7
    =,<=>,<>,!=,<=,<,>=,>,IS NULL,IN,LIKE,REGEXP8
    BETWEEN AND9
    NOT10
    AND,&&11
    XOR12
    OR,||13
    =,:=14

4. 系统函数

见 菜鸟教程。

参考书籍

《MySQL实用教程(第4版)》

上一篇文章:【数据库——MySQL】(4)表记录操作——增、删、改
下一篇文章:【数据库——MySQL】(6)查询(1)


http://www.ppmy.cn/news/1128003.html

相关文章

命运2中文wiki搭建记录——MediaWiki安装与初设置

命运2中文wiki搭建记录 本文转自我的博客&#xff0c;原文地址——>命运2中文wiki搭建记录——MediaWiki安装与初设置 可能是出于闲的发霉&#xff0c;想自己搭建一个命运2wiki。 因为bilibili上的命运2Bwiki也全是自己搭的。指路——>命运2Bwiki 但是当自己实际上手Me…

详解FreeRTOS:FreeRTOS任务挂起过程源码分析(进阶篇—3)

本篇博文讲解FreeRTOS中任务挂起过程的源代码,帮助各位更好理解挂起任务的原理和流程。 在详解FreeRTOS:FreeRTOS任务管理函数(基础篇—11)中,讲述了可以使用vTaskSuspend()函数实现挂起任务。 函数源码如下: 程序说明如下: (1)、通过函数 prvGetTCBFromHandle()获取要…

自定义子组件的v-model

一、传统的父子传参 作为前端程序员&#xff0c;我们在开发时&#xff0c;用到最多的就是父子传参了吧&#xff0c;这一点相信大家都很熟悉了&#xff0c;在这里简单的说一下 1.父传子 &#xff08;1&#xff09; 在父组件中引入子组件&#xff0c;并在父组件的components中注…

某高校的毕设

最近通过某个平台接的单子&#xff0c;最后Kali做的测试没有公开可以私聊给教程。 下面是规划与配置 1.vlan方面&#xff1a;推荐一个vlan下的所有主机为一个子网网段 连接电脑和http客户端的接口配置为access接口 交换机与交换机或路由器连接的接口配置为trunk接口---也可以…

xyhcms getshell

下载xyhcms3.6.2021版本并用phpstudy搭建 function get_cookie($name, $key ) {if (!isset($_COOKIE[$name])) {return null;}$key empty($key) ? C(CFG_COOKIE_ENCODE) : $key;$value $_COOKIE[$name];$key md5($key);$sc new \Common\Lib\SysCrypt($key);$value $sc-…

【前端设计模式】之策略模式

概述 在前端开发中&#xff0c;我们经常会遇到需要根据不同的条件或情况来执行不同的算法或行为的情况。这时&#xff0c;策略模式就能派上用场。策略模式是一种行为型设计模式&#xff0c;它将不同的算法封装成独立的策略对象&#xff0c;使得这些算法可以互相替换&#xff0…

【AI视野·今日Robot 机器人论文速览 第四十期】Mon, 25 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Mon, 25 Sep 2023 Totally 36 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;CloudGripper, 一套云化的机器抓取人数据采集系统&#xff0c;包含了32个机械臂的集群。(from KTH Royal Institute of Te…

Java分支结构:一次不经意的选择,改变了我的一生。

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、顺序结构二、分支结构1、if语句2、switch语句 好久不见&#xff01;命运之轮常常在不经意间转动&#xff0c;有时一个看似微…