MySQL中的比较运算符用于在查询中比较两个表达式的大小、相等性或其他条件关系。这些运算符非常基础且重要,因为它们允许你根据特定条件过滤数据。
=
)在MySQL中,等号运算符(=
)用于比较两个值是否相等。如果两边的值相等,则表达式的结果为TRUE
;否则,结果为FALSE
。等号运算符在SELECT语句的WHERE子句中非常常见,用于筛选满足特定条件的记录。
SELECT column_name(s)
FROM table_name
WHERE column_name = value;
这里,column_name
是你想要比较的列名,table_name
是表名,而value
是你想要与列中的值进行比较的值。
假设有一个名为employees
的表,其中包含id
、name
和salary
等列,你想找出薪资为5000的所有员工:
SELECT *
FROM employees
WHERE salary = 5000;
这个查询会返回salary
列中值为5000的所有行的数据。
_bin
)来使比较区分大小写。=
)是无效的,因为任何与NULL的比较操作都会返回NULL,而不是TRUE
或FALSE
。要检查NULL值,应使用IS NULL
或IS NOT NULL
。等号运算符(=
)在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
的表,其中包含id
、name
和grade
等列,我们想要找出所有成绩不等于90分的学生:
使用<>
运算符:
SELECT *
FROM students
WHERE grade <> 90;
或者使用!=
运算符:
SELECT *
FROM students
WHERE grade != 90;
这两个查询都会返回grade
列中值不等于90的所有行的数据。
<>
和!=
运算符的行为是一致的。任何与NULL的比较操作(除了IS NULL
和IS NOT NULL
)都会返回NULL,而不是TRUE
或FALSE
。因此,如果你想要检查某个列的值是否不是NULL,你应该使用IS NOT NULL
。<>
还是!=
主要取决于个人偏好和团队的编码规范。然而,需要注意的是,在某些情况下(特别是在与其他编程语言或框架的集成中),这两个运算符的可用性可能会有所不同。总的来说,<>
和!=
是MySQL中用于表示不等于的两种等效运算符,你可以根据自己的喜好和项目的需求来选择使用哪一个。
>
)、大于等于(>=
)、小于(<
)、小于等于(<=
)在MySQL中,大于(>
)、大于等于(>=
)、小于(<
)和小于等于(<=
)是基本的比较运算符,用于在SQL查询的WHERE子句中比较列的值与指定的值或表达式。这些运算符允许你根据列的值筛选出满足特定条件的记录。
>
)大于运算符(>
)用于比较两个值,以确定左边的值是否大于右边的值。如果左边的值大于右边的值,则表达式的结果为TRUE
;否则,结果为FALSE
。
假设我们有一个名为sales
的表,其中包含date
和amount
等列,我们想要找出所有销售额大于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 NULL
、IS NOT NULL
在MySQL中,IS NULL
、IS 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 NULL
和 IS NOT NULL
是条件表达式,用于在WHERE子句中过滤出NULL值或非NULL值的记录。LEAST
和 GREATEST
在MySQL中,LEAST
和 GREATEST
是两个非常有用的函数,它们允许你在一组值中找出最小或最大的值。这两个函数可以接受两个或更多的参数,并返回参数列表中的最小或最大值。
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值
LEAST
或GREATEST
的参数中包含字符串时,比较是基于字符串的字典顺序进行的。这意味着,如果你混合了数字和字符串作为参数,结果可能会与你期望的不同,特别是当字符串看起来像数字时。LEAST
和GREATEST
函数在数据分析和处理中非常有用,特别是在需要动态地选择一组值中的最小或最大值时。BETWEEN AND
在MySQL中,BETWEEN AND
是一个在查询中指定范围搜索的条件。它允许你选择一个字段的值在指定的两个值之间的所有记录(包括边界值)。这个条件对于过滤数据非常有用,特别是当你想要检索一个字段在某个范围内的所有行时。
SELECT column_names
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
column_names
是你想要从表中检索的列名。table_name
是包含数据的表名。column_name
是你想要应用范围搜索的列名。value1
和 value2
定义了搜索范围的下限和上限。column_name
的值必须在这个范围内(包括value1
和value2
)。value1
应该小于或等于 value2
。如果 value1
大于 value2
,则查询可能不会返回任何结果,因为不存在一个数同时大于某个数且小于另一个较小的数。BETWEEN AND
包括边界值。也就是说,如果列的值等于 value1
或 value2
,那么相应的行也会被检索出来。value1
和 value2
。假设我们有一个名为orders
的表,其中包含order_id
、order_date
和amount
等列。如果我们想要找出所有在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’之间(包括这两个日期)的所有行的数据。
IN
和 NOT IN
在MySQL中,IN
和 NOT 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的所有员工的记录。
IN
或NOT IN
时,列表中的值可以是数字、字符串或日期等数据类型,但重要的是要确保这些值与你要比较的字段的数据类型相匹配。IN
和NOT IN
的行为可能会与你的预期不同。特别是,column_name IN (NULL, ...)
永远不会为真,因为任何值与NULL的比较操作都会返回NULL,而不是TRUE或FALSE。因此,如果你的值列表中可能包含NULL,你可能需要重新考虑你的查询策略。IN
或NOT IN
可能会影响查询的性能。在这种情况下,考虑使用其他查询策略,如连接(JOINs)或临时表。LIKE
在MySQL中,LIKE
操作符用于在WHERE
子句中搜索列中的指定模式。它通常与通配符一起使用,以匹配字符串中的零个、一个或多个字符。最常见的通配符是%
(表示任意数量的字符)和_
(表示单个字符)。
在MySQL中,通配符主要用于LIKE
操作符中,以匹配字符串中的特定模式。最常见的通配符有两个:%
(百分号)和_
(下划线)。
%
(百分号)%
通配符代表零个、一个或多个字符。当在LIKE
语句中使用时,%
可以放在模式的开始、结束或中间位置,以匹配任意长度的字符串。
LIKE 'a%'
LIKE '%z'
LIKE '%abc%'
LIKE '%'
_
(下划线)_
通配符代表单个字符。它必须匹配字符串中的一个确切字符位置。
LIKE '_bc'
LIKE 'a_c'
%
或_
作为搜索模式的一部分时,请确保它们是作为通配符使用,而不是作为文字字符。如果需要在模式中包含这些字符作为文字字符,你可能需要使用ESCAPE
子句来指定一个转义字符。=
、>
、<
、BETWEEN
等),则应避免使用LIKE
和通配符,因为这些搜索通常更高效。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 '\';
在这个例子中,\
被定义为转义字符,所以\%
表示一个文字%
字符。
REGEXP
和 RLIKE
在MySQL中,REGEXP
和RLIKE
是等价的,它们都用于执行正则表达式匹配。这两个操作符可以在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_]
。常见的正则表达式涵盖了多个方面,包括校验数字、校验字符、特殊需求等。
^[0-9]*$
。匹配任意个数字,包括0个。^\d{n}$
。其中n表示具体的位数,例如\d{8}
表示8位数字。^\d{n,}$
。^\d{m,n}$
。^(0|[1-9][0-9]*)$
。^([1-9][0-9]*)+(\.[0-9]{1,2})?$
。^(\-)?\d+(\.\d{1,2})?$
。^(\-|\+)?\d+(\.\d+)?$
。^[0-9]+(\.[0-9]{2})?$
。^[0-9]+(\.[0-9]{1,3})?$
。^[1-9]\d*$
或 ^([1-9][0-9]*){1,3}$
或 ^\+?[1-9][0-9]*$
。^\-[1-9]\d*$
。^\d+$
或 ^[1-9]\d*|0$
。^-[1-9]\d*|0$
或 ^((-\d+)|(0+))$
。^\d+(\.\d+)?$
或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
。^((-\d+(\.\d+)?)|(0+(\.0+)?))$
或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
。^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$
或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
。^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$
或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
。^(-?\d+)(\.\d+)?$
或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
。^[\u4e00-\u9fa5]{0,}$
。^.{3,20}$
。^[A-Za-z]+$
。^[A-Z]+$
。^[a-z]+$
。^[A-Za-z0-9]+$
。^\w+$
或 ^\w{3,20}$
。^[\u4E00-\u9FA5A-Za-z0-9_]+$
。^[\u4E00-\u9FA5A-Za-z0-9]+$
或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
。[^~\x22]+
。^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
。[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?
。[a-zA-z]+://[^\s]*
或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
。^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
。^(\(\d{3,4}-)|\d{3,4}-)?\d{7,8}$
。\d{3}-\d{8}|\d{4}-\d{7}
。^\d{15}|\d{18}$
。^[a-zA-Z][a-zA-Z0-9_]{4,15}$
。^[a-zA-Z]\w{5,17}$
。^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
。以上是一些常见的正则表达式示例,它们可以应用于各种编程和数据处理场景,以实现对文本数据的校验和提取。
REGEXP_LIKE()
函数(在MySQL 8.0及更高版本中可用)并指定一个不区分大小写的匹配模式。REGEXP
或RLIKE
可能会影响查询性能。在这种情况下,考虑使用其他查询策略或优化你的数据库结构。这些比较运算符是SQL查询的基础,它们允许你根据几乎任何条件来筛选数据。在编写查询时,理解并熟练使用这些运算符非常重要。