首页 > 数据库 >【重学 MySQL】十七、比较运算符的使用

【重学 MySQL】十七、比较运算符的使用

时间:2024-09-08 16:25:51浏览次数:7  
标签:十七 name 示例 运算符 MySQL NULL WHERE SELECT

【重学 MySQL】十七、比较运算符的使用

在这里插入图片描述

MySQL中的比较运算符用于在查询中比较两个表达式的大小、相等性或其他条件关系。这些运算符非常基础且重要,因为它们允许你根据特定条件过滤数据。

等于(=

在MySQL中,等号运算符(=)用于比较两个值是否相等。如果两边的值相等,则表达式的结果为TRUE;否则,结果为FALSE。等号运算符在SELECT语句的WHERE子句中非常常见,用于筛选满足特定条件的记录。

基本用法

SELECT column_name(s)
FROM table_name
WHERE column_name = value;

这里,column_name是你想要比较的列名,table_name是表名,而value是你想要与列中的值进行比较的值。

示例

假设有一个名为employees的表,其中包含idnamesalary等列,你想找出薪资为5000的所有员工:

SELECT *
FROM employees
WHERE salary = 5000;

这个查询会返回salary列中值为5000的所有行的数据。

注意事项

  • 当比较字符串时,MySQL默认是不区分大小写的(这取决于字符集的校对规则)。但是,你可以通过指定二进制校对规则(如_bin)来使比较区分大小写。
  • 在与NULL进行比较时,使用等号运算符(=)是无效的,因为任何与NULL的比较操作都会返回NULL,而不是TRUEFALSE。要检查NULL值,应使用IS NULLIS NOT NULL
  • 在进行数值比较时,MySQL会自动进行类型转换(如果可能的话),但在某些情况下,这可能会导致意外的结果。因此,在编写涉及多种数据类型的比较时,最好确保类型一致或显式进行类型转换。
  • MySQL中的等号运算符还可以与其他运算符(如逻辑运算符)结合使用,以构建更复杂的查询条件。

结论

等号运算符(=)在MySQL中用于比较两个值是否相等,是SQL查询语句中非常基础且重要的一个部分。正确理解和使用等号运算符对于编写有效的SQL查询至关重要。

安全等于运算符(<=>

安全等于运算符(<=>)与等于运算符(=)的作用是相似的,唯一的区别是‘<=>’可以用来对NULL进行判断。在两个操作数均为NULL时,其返回值为1,而不为NULL;当一个操作数为NULL时,其返回值为0,而不为NULL。

SELECT 1 <=> '1', 1 <=> 0, 'a' <=> 'a', (5 + 3) <=> (2 + 6), '' <=> NULL,NULL <=> NULL FROM dual;

#查询commission_pct等于0.40
SELECT employee_id,commission_pct FROM employees WHERE commission_pct = 0.40;

SELECT employee_id,commission_pct FROM employees WHERE commission_pct <=> 0.40;

#如果把0.40改成 NULL 呢?

可以看到,使用安全等于运算符时,两边的操作数的值都为NULL时,返回的结果为1而不是NULL,其他返回结果与等于运算符相同。

不等于(<>!=

在MySQL中,不等于运算符有两个主要的形式:<>!=。这两个运算符在功能上是完全相同的,都可以用来比较两个值是否不相等。如果两边的值不相等,则表达式的结果为TRUE;否则,结果为FALSE

示例

假设我们有一个名为students的表,其中包含idnamegrade等列,我们想要找出所有成绩不等于90分的学生:

使用<>运算符:

SELECT *
FROM students
WHERE grade <> 90;

或者使用!=运算符:

SELECT *
FROM students
WHERE grade != 90;

这两个查询都会返回grade列中值不等于90的所有行的数据。

注意事项

  • 当与NULL值进行比较时,<>!=运算符的行为是一致的。任何与NULL的比较操作(除了IS NULLIS NOT NULL)都会返回NULL,而不是TRUEFALSE。因此,如果你想要检查某个列的值是否不是NULL,你应该使用IS NOT NULL
  • 在编写SQL查询时,选择<>还是!=主要取决于个人偏好和团队的编码规范。然而,需要注意的是,在某些情况下(特别是在与其他编程语言或框架的集成中),这两个运算符的可用性可能会有所不同。
  • 在某些SQL方言或特定版本的数据库系统中,这两个运算符的支持程度可能略有不同,但在大多数情况下,它们都是可互换使用的。

总的来说,<>!=是MySQL中用于表示不等于的两种等效运算符,你可以根据自己的喜好和项目的需求来选择使用哪一个。

大于(>)、大于等于(>=)、小于(<)、小于等于(<=

在MySQL中,大于(>)、大于等于(>=)、小于(<)和小于等于(<=)是基本的比较运算符,用于在SQL查询的WHERE子句中比较列的值与指定的值或表达式。这些运算符允许你根据列的值筛选出满足特定条件的记录。

大于(>

大于运算符(>)用于比较两个值,以确定左边的值是否大于右边的值。如果左边的值大于右边的值,则表达式的结果为TRUE;否则,结果为FALSE

示例

假设我们有一个名为sales的表,其中包含dateamount等列,我们想要找出所有销售额大于1000的记录:

SELECT *
FROM sales
WHERE amount > 1000;

大于等于(>=

大于等于运算符(>=)用于比较两个值,以确定左边的值是否大于或等于右边的值。如果左边的值大于或等于右边的值,则表达式的结果为TRUE;否则,结果为FALSE

示例

继续上面的例子,如果我们想要找出所有销售额大于或等于1000的记录:

SELECT *
FROM sales
WHERE amount >= 1000;

小于(<

小于运算符(<)用于比较两个值,以确定左边的值是否小于右边的值。如果左边的值小于右边的值,则表达式的结果为TRUE;否则,结果为FALSE

示例

回到sales表的例子,如果我们想要找出所有销售额小于1000的记录:

SELECT *
FROM sales
WHERE amount < 1000;

小于等于(<=

小于等于运算符(<=)用于比较两个值,以确定左边的值是否小于或等于右边的值。如果左边的值小于或等于右边的值,则表达式的结果为TRUE;否则,结果为FALSE

示例

最后,如果我们想要找出所有销售额小于或等于1000的记录:

SELECT *
FROM sales
WHERE amount <= 1000;

这些比较运算符是SQL查询中非常基础且常用的部分,它们允许你根据数据的实际值来过滤和检索数据。

IS NULLIS NOT NULL

在MySQL中,IS NULLIS NOT NULL 是用于处理NULL值的不同方面的关键词和函数。

IS NULL

IS NULL 是一个条件表达式,用于检查某个列的值是否为NULL。如果列的值是NULL,则表达式的结果为TRUE;否则,结果为FALSE。它常用于WHERE子句中,以筛选出NULL值的记录。

示例

SELECT *
FROM table_name
WHERE column_name IS NULL;

这个查询会返回column_name列中值为NULL的所有行的数据。

IS NOT NULL

IS NOT NULL 也是一个条件表达式,但它用于检查某个列的值是否不是NULL。如果列的值不是NULL,则表达式的结果为TRUE;否则,结果为FALSE。与IS NULL相反,它用于筛选出非NULL值的记录。

示例

SELECT *
FROM table_name
WHERE column_name IS NOT NULL;

这个查询会返回column_name列中值不为NULL的所有行的数据。

总结

  • IS NULLIS NOT NULL 是条件表达式,用于在WHERE子句中过滤出NULL值或非NULL值的记录。

LEASTGREATEST

在MySQL中,LEASTGREATEST 是两个非常有用的函数,它们允许你在一组值中找出最小或最大的值。这两个函数可以接受两个或更多的参数,并返回参数列表中的最小或最大值。

LEAST

LEAST 函数返回其参数列表中的最小值。如果参数中有NULL值,则LEAST函数会忽略NULL值,但如果所有参数都是NULL,则结果也是NULL。

语法

LEAST(value1, value2, ..., valueN)

示例

SELECT LEAST(1, 3, 2, 5, 4); -- 结果是 1
SELECT LEAST(NULL, 3, 2, 5, 4); -- 结果是 2,因为NULL被忽略
SELECT LEAST(NULL, NULL); -- 结果是 NULL,因为没有非NULL值

GREATEST

LEAST相反,GREATEST函数返回其参数列表中的最大值。同样地,如果参数中有NULL值,GREATEST会忽略它们,但如果所有参数都是NULL,则结果也是NULL。

语法

GREATEST(value1, value2, ..., valueN)

示例

SELECT GREATEST(1, 3, 2, 5, 4); -- 结果是 5
SELECT GREATEST(NULL, 3, 2, 5, 4); -- 结果是 5,因为NULL被忽略
SELECT GREATEST(NULL, NULL); -- 结果是 NULL,因为没有非NULL值

注意事项

  • LEASTGREATEST的参数中包含字符串时,比较是基于字符串的字典顺序进行的。这意味着,如果你混合了数字和字符串作为参数,结果可能会与你期望的不同,特别是当字符串看起来像数字时。
  • 如果需要确保比较是基于数值的,确保所有参数都是数值类型,或者在使用之前将字符串参数转换为数值类型。
  • LEASTGREATEST函数在数据分析和处理中非常有用,特别是在需要动态地选择一组值中的最小或最大值时。

BETWEEN AND

在MySQL中,BETWEEN AND是一个在查询中指定范围搜索的条件。它允许你选择一个字段的值在指定的两个值之间的所有记录(包括边界值)。这个条件对于过滤数据非常有用,特别是当你想要检索一个字段在某个范围内的所有行时。

语法

SELECT column_names
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
  • column_names 是你想要从表中检索的列名。
  • table_name 是包含数据的表名。
  • column_name 是你想要应用范围搜索的列名。
  • value1value2 定义了搜索范围的下限和上限。column_name 的值必须在这个范围内(包括value1value2)。

注意事项

  • value1 应该小于或等于 value2。如果 value1 大于 value2,则查询可能不会返回任何结果,因为不存在一个数同时大于某个数且小于另一个较小的数。
  • BETWEEN AND 包括边界值。也就是说,如果列的值等于 value1value2,那么相应的行也会被检索出来。
  • 你可以使用日期、数字或字符串(尽管对于字符串,比较是基于字典顺序的,可能不是你想要的)作为 value1value2

示例

假设我们有一个名为orders的表,其中包含order_idorder_dateamount等列。如果我们想要找出所有在2023年1月1日到2023年1月31日之间下的订单,我们可以这样写查询:

SELECT *
FROM orders
WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31';

这个查询会返回order_date列的值在’2023-01-01’和’2023-01-31’之间(包括这两个日期)的所有行的数据。

INNOT IN

在MySQL中,INNOT IN 是两个非常有用的操作符,它们允许你在WHERE子句中指定一个值列表,并基于这些值来过滤查询结果。这两个操作符在处理多个可能的值作为过滤条件时特别有用。

IN

IN 操作符允许你指定一个值列表,然后返回字段值在该列表中的所有记录。如果字段的值等于列表中的任何一个值,那么该记录就会被选中。

语法

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ..., valueN);

示例

假设你有一个名为employees的表,其中有一个名为department_id的列,你想要查询ID为1、2或3的部门的所有员工,你可以这样写:

SELECT *
FROM employees
WHERE department_id IN (1, 2, 3);

这个查询会返回department_id为1、2或3的所有员工的记录。

NOT IN

IN相反,NOT IN操作符允许你指定一个值列表,并返回字段值不在该列表中的所有记录。如果字段的值不等于列表中的任何一个值,那么该记录就会被选中。

语法

SELECT column_name(s)
FROM table_name
WHERE column_name NOT IN (value1, value2, ..., valueN);

示例

继续使用上面的employees表作为例子,如果你想要查询ID不是1、2或3的部门的所有员工,你可以这样写:

SELECT *
FROM employees
WHERE department_id NOT IN (1, 2, 3);

这个查询会返回department_id不是1、2或3的所有员工的记录。

注意事项

  • 当使用INNOT IN时,列表中的值可以是数字、字符串或日期等数据类型,但重要的是要确保这些值与你要比较的字段的数据类型相匹配。
  • 如果列表中包含NULL值,则INNOT IN的行为可能会与你的预期不同。特别是,column_name IN (NULL, ...)永远不会为真,因为任何值与NULL的比较操作都会返回NULL,而不是TRUE或FALSE。因此,如果你的值列表中可能包含NULL,你可能需要重新考虑你的查询策略。
  • 对于包含大量值的列表,使用INNOT IN可能会影响查询的性能。在这种情况下,考虑使用其他查询策略,如连接(JOINs)或临时表。

LIKE

在MySQL中,LIKE操作符用于在WHERE子句中搜索列中的指定模式。它通常与通配符一起使用,以匹配字符串中的零个、一个或多个字符。最常见的通配符是%(表示任意数量的字符)和_(表示单个字符)。

MySQL 通配符

在MySQL中,通配符主要用于LIKE操作符中,以匹配字符串中的特定模式。最常见的通配符有两个:%(百分号)和_(下划线)。

%(百分号)

%通配符代表零个、一个或多个字符。当在LIKE语句中使用时,%可以放在模式的开始、结束或中间位置,以匹配任意长度的字符串。

示例
  • 匹配以"a"开头的任意字符串:LIKE 'a%'
  • 匹配以"z"结尾的任意字符串:LIKE '%z'
  • 匹配包含"abc"的任意字符串:LIKE '%abc%'
  • 匹配任意字符串(包括空字符串):LIKE '%'

_(下划线)

_通配符代表单个字符。它必须匹配字符串中的一个确切字符位置。

示例
  • 匹配任意单个字符后跟"bc"的字符串:LIKE '_bc'
  • 匹配以"a"开头,后跟任意单个字符,然后是"c"的字符串:LIKE 'a_c'

注意事项

  • 当使用%_作为搜索模式的一部分时,请确保它们是作为通配符使用,而不是作为文字字符。如果需要在模式中包含这些字符作为文字字符,你可能需要使用ESCAPE子句来指定一个转义字符。
  • 使用通配符进行搜索时,MySQL会扫描表中的每一行,并检查列值是否与模式匹配。对于大型表,这可能会导致查询性能下降。
  • 在某些情况下,如果你可以使用其他类型的搜索(如=><BETWEEN等),则应避免使用LIKE和通配符,因为这些搜索通常更高效。
  • 对于更复杂的文本搜索需求,MySQL提供了全文搜索功能,它提供了更强大和灵活的搜索能力,包括支持停用词、词干提取、布尔搜索等。

使用ESCAPE子句

如果你需要在搜索模式中包含%_作为文字字符,你可以使用ESCAPE子句来指定一个转义字符。然后,在模式中,你可以通过在特殊字符前加上转义字符来将其视为文字字符。

示例

假设你有一个名为products的表,其中有一个名为description的列,你想要找到描述中包含100%的产品。你可以这样写:

SELECT *
FROM products
WHERE description LIKE '100\%\%' ESCAPE '\';

在这个例子中,\被定义为转义字符,所以\%表示一个文字%字符。注意,由于%在SQL字符串中也是特殊字符(用于表示字符串的结束),所以你可能需要使用两个%字符来表示一个文字%字符(取决于你的SQL客户端或应用程序如何处理字符串)。但是,在LIKE模式的上下文中,单个%字符就足够了,并且我们在这里使用ESCAPE子句来确保它被解释为文字字符。因此,上面的查询应该能够正确工作。然而,如果你只是想要匹配一个文字%字符,那么一个%就足够了,如上例所示。

语法

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern;

在这里,pattern可以包含文字字符、%_等通配符。

示例

使用%通配符

假设你有一个名为customers的表,其中包含名为name的列,你想要找到所有名字以"J"开头的客户,你可以这样写:

SELECT *
FROM customers
WHERE name LIKE 'J%';

这个查询会返回name列中所有以"J"开头的记录。

如果你想要找到名字中包含"son"的所有客户,不论"son"前后是否有其他字符,你可以这样写:

SELECT *
FROM customers
WHERE name LIKE '%son%';

使用_通配符

如果你想要找到名字中第二个字符是"a"的所有客户,你可以使用_来表示第一个字符(它可以是任何字符),然后紧跟一个"a":

SELECT *
FROM customers
WHERE name LIKE '_a%';

这个查询会返回name列中所有第二个字符为"a"的记录。

注意事项

  • 使用LIKE操作符时,请确保模式(pattern)是明确的,以避免返回过多的结果。例如,使用%作为模式的开始和结束可能会返回表中的所有记录。

  • 对于大型数据集,使用LIKE进行模糊匹配可能会影响查询性能。在这种情况下,考虑使用全文搜索功能(如果可用)或优化你的数据库结构和查询策略。

  • 在某些情况下,你可能需要使用ESCAPE子句来定义转义字符,以便在模式中包含%_或其他特殊字符作为文字字符。例如,如果你想要搜索包含%字符的字符串,你可以这样做:

    SELECT *
    FROM customers
    WHERE name LIKE '25\% off%' ESCAPE '\';
    

    在这个例子中,\被定义为转义字符,所以\%表示一个文字%字符。

REGEXPRLIKE

在MySQL中,REGEXPRLIKE是等价的,它们都用于执行正则表达式匹配。这两个操作符可以在WHERE子句中用来搜索列中符合特定正则表达式模式的字符串。

语法

SELECT column_name(s)
FROM table_name
WHERE column_name REGEXP pattern;

-- 或者

SELECT column_name(s)
FROM table_name
WHERE column_name RLIKE pattern;

在这里,pattern是一个正则表达式,用于定义要搜索的模式。

示例

假设你有一个名为employees的表,其中包含名为email的列,你想要找到所有电子邮件地址以"gmail.com"结尾的员工,你可以这样写:

SELECT *
FROM employees
WHERE email REGEXP 'gmail\.com$';

-- 或者

SELECT *
FROM employees
WHERE email RLIKE 'gmail\.com$';

注意,在正则表达式中,.是一个特殊字符,它匹配除换行符之外的任何单个字符。因此,如果你想要匹配文字.字符,你需要使用反斜杠\来对其进行转义。同样,$是一个特殊字符,它匹配字符串的末尾。

正则表达式功能

MySQL的正则表达式功能相当强大,支持多种元字符和模式修饰符。以下是一些常用的正则表达式元字符:

  • . 匹配除换行符之外的任何单个字符。
  • ^ 匹配字符串的开始。
  • $ 匹配字符串的末尾。
  • | 逻辑“或”操作符。
  • * 匹配前面的子表达式零次或多次。
  • + 匹配前面的子表达式一次或多次。
  • ? 匹配前面的子表达式零次或一次。
  • {n} n 是一个非负整数。匹配确定的 n 次。
  • {n,} n 是一个非负整数。至少匹配n 次。
  • {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
  • [xyz] 字符集合。匹配所包含的任意一个字符。
  • [^xyz] 负值字符集合。匹配未包含的任意字符。
  • \s 任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]
  • \S 任何非空白字符。等价于 [^ \f\n\r\t\v]
  • \d 匹配一个数字字符。等价于 [0-9]
  • \D 匹配一个非数字字符。等价于 [^0-9]
  • \w 匹配包括下划线的任何单词字符。等价于[A-Za-z0-9_]
  • \W 匹配任何非单词字符。等价于 [^A-Za-z0-9_]

注意事项

  • 正则表达式匹配是区分大小写的,但你可以使用REGEXP_LIKE()函数(在MySQL 8.0及更高版本中可用)并指定一个不区分大小写的匹配模式。
  • 对于复杂的正则表达式或大型数据集,使用REGEXPRLIKE可能会影响查询性能。在这种情况下,考虑使用其他查询策略或优化你的数据库结构。
  • 不同的数据库系统(如PostgreSQL、Oracle、SQL Server等)可能支持不同的正则表达式语法和函数。因此,在将查询从一个系统迁移到另一个系统时,请务必检查相应的文档。

这些比较运算符是SQL查询的基础,它们允许你根据几乎任何条件来筛选数据。在编写查询时,理解并熟练使用这些运算符非常重要。

标签:十七,name,示例,运算符,MySQL,NULL,WHERE,SELECT
From: https://blog.csdn.net/weixin_43344151/article/details/142006607

相关文章

  • MySQL入门到精通
    一、创建数据库CREATEDATABASE数据库名称;如果数据库存在,则会提示报错。二、选择数据库USE数据库名称;三、创建数据表CREATETABLE数据表名称;四、MySQL数据类型MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串类型4.1数值类型数值类型类......
  • MySQL 函数查询返回NULL
    createtableuser(idbigintprimarykeyauto_increment,ageint);gorm使用函数查询时,通过IFNULL来确保查询不到记录时有默认值。max函数selectmax(age)fromuser;selectIFNULL(max(age),0)fromuser;sum函数count函数默认是0。......
  • MySQL基础(8)- 单行函数(1)
    目录一、函数的理解二、数值函数1.基本函数2.取随机数3.四舍五入截断操作 4.单行函数嵌套5.角度与弧度 6.三角函数7.指数和对数8. 进制间的转换 三、字符串函数 四、日期和时间1.获取日期、时间2.日期与时间戳3.获取月份、星期、星期数、天数等函数 4.......
  • MySQL 用哪种类型来存储日期时间呢?【送源码】
    构建数据库写程序避免不了使用日期和时间,对于数据库来说,有多种日期时间字段可供选择,如timestamp和datetime以及使用int来存储unixtimestamp。不仅新手,包括一些有经验的程序员还是比较迷茫,究竟我该用哪种类型来存储日期时间呢?那我们就一步一步来分析他们的特点,这样我......
  • Mysql高级篇(中)——七种常见的 join 查询图
    注意:MySQL是不支持FULLOUTERJOIN这种语法的,因此要实现图中6、7的查询结果,可以使用UNION关键字结合LEFTJOIN、RIGHTJOIN实现,UNION可以实现去重的效果;参考如下代码:--MySQL中图标6的实现方式SELECT*FROMtableAALEFTJOINtableBBONA.key=B.ke......
  • Mysql高级篇(中)——索引介绍
    Mysql高级篇(中)——索引介绍一、索引本质二、索引优缺点三、索引分类(1)按数据结构分类(2)按功能分类(3)按存储引擎分类(4)按存储方式分类(5)按使用方式分类四、索引基本语法(1)创建索引(2)查看索引(3)删除索引(4)ALTER关键字创建/删除索引五、适合创建索引的情况思考题六、不适合创......
  • 从零搭建一个网站-云服务器Linux版——2:安装服务器MySQL+报错
    使用需要的东西:     软件:Xshell。    硬件:一台云服务器,一个域名。        系统环境:Windows11专业版 23H2。        Linux版本:CentOS9前景提要:在上一章已进行了服务器购买,系统搭设,Xshell访问服务器,域名购买,域名解析,Nginx软件搭建运行,......
  • 配置PHP的Session存储到Mysql / Redis / memcache 以及使用opcache以及apc缓存清除工
    一、配置PHP的Session存储到Mysql,Redis以及memcache等        PHP的会话默认是以文件的形式存在的,可以通过简单的配置到将Session存储到NoSQL中,即提高了访问速度,又能很好地实现会话共享!1.默认配置:session.save_handler=filessession.save_path=/tmp/2.配......
  • 六、MySQL高级—架构介绍(1)
    ......
  • 十、MySQL高级—查询截取分析(3)
    ......