比较运算符(非符号类型)
除了前面我们说过的符号类型的比较运算符,还有一些非符号类型的比较运算符,这里我们对其进行讲解
-
IS NULL – 为空运算符
- 判断值,字符串或者表达式是否为空,如果是空就返回1,如果不是空就返回0
- eg: – 这里我们通过一个例子来理解为空运算符
SELECT * FROM employees WHERE commission_pct IS NULL;
- 这个语句就是查询员工表(employees)中的commission_pct字段
- 这里我们如果commission_pct字段为NULL的时候,那么就会返回一个1,那么我们的WHERE语句就会将这个记录保留下来,也就是将commission_pct字段为NULL的记录保留下来,如果是commission_pct字段不为NULL那么我们就会返回一个0,我们的WHERE语句就会将我们的commission_pct字段不为NULL的记录给过滤掉
-
IS NOT NULL – 不为空运算符
- 判断值,字符串,或者表达式是否不为空,如果不为空则返回一个1,如果为空就返回一个0
- eg: — 这里我们通过一个例子来理解不为空运算符
SELECT * FROM employees WHERE comission_pct NOT IS NULL;
- 这里和上面我们举的例子很相似,这里是查询我们的员工表中commission_pct字段不为NULL的记录
-
ISNULL()
- 判断一个值,字符串,或者表达式是否为空,如果为空结果就为1,如果不为空结果就为0
- 注意: ISNULL()是一个函数
- eg: – 这里我们通过一个例子来理解ISNULL()的使用
SELECT * FROM employees WHERE ISNULL(commission_pct);
- 这里也是查询我们的员工表中commission_pct字段为NULL的记录,只不过我们上面讲过的IS NULL是一个关键字我们通过这个关键字来判断我们的字段是否为NULL,而这里的ISNULL()是一个函数,我们通过在这个函数中传递参数,然后来判断传递的参数是否为NULL
注意: 我们还可以使用<==>(安全等于运算符)来查询员工表中commission_pct字段为NULL的记录
SELECT *
FROM employees
WHERE commission_pct <==> NULL;
那么同样的我们就也可以使用<==>(安全等于运算符)加上我们的逻辑运算符中的NOT(!)来查询员工表中从commission_pct字段不为NULL的记录
SELECT *
FROM employees
WHERE NOT commission_pct != NULL;
-
LEAST()
- 在多个值中返回最小值
- LEAST()也是一个函数
- eg: – 这里我们通过下面个例子来理解LEAST()函数的使用
SELECT LEAST('g','b','t','m') FROM DUAL;
- 这里就是找出’g’,‘b’,‘t’,'m’中最小的字符串,这里比较的是字符串的ANSI编码值(其实也就是比较字符串的ASCII编码值)
- 这里我们的ANSI编码向下兼容了ASCII编码
- 由于ASCII编码出现的早,并且ASCII编码中的字符比较少,所以我们的很多编码表中都兼容了ASCII编码,也就是将ASCII编码中的字符放在了编码中的最前面,这也就是为什么我们很多时候发现乱码的时候都是其他字符产生乱码的情况,而英文字符产生乱码的情况就很少
SELECT LEAST('abcd','adc') FROM DUAL;
- 这里就是找出我们的’abcd’和’adc’两个字符串中的最小值
- 那么这里是如何比较出最小值的?
- 这里我们是从每个字符串的第一个字符开始进行比较,比较字符串中每个相应位置的字符的ANSI编码值(但是这个时候我们说过我们的ANSI编码向下兼容了ASCII编码,所以其实也可以看成是比较ASCII编码),一直向后比价,知道比较出结果位置,如果我们一直比不出结果,前面一直相等,那么就是长度长的字符串更大,如果可以可以比价出结果,那么这个时候我们就用不到比较字符串的长度
- eg: 就比如这里我们比较’abcd’和’adc’,这个时候从第一个字符开始比较,也就是字符a和字符a,它们两个的ANSI编码是相等的,然后比较字符b和字符d,这个时候很明显我们的字符d的ANSI编码值要大,所以我们比较出来的结果就是’adc’要大于’abcd’,这个时候直接比较出来之后我们就不用再使用长度进行比较了,但是这个时候要注意我们的LEAST()函数时比较出我们的最小的字符串并返回,所以这个时候结果就是’abcd’
- 这里我们是从每个字符串的第一个字符开始进行比较,比较字符串中每个相应位置的字符的ANSI编码值(但是这个时候我们说过我们的ANSI编码向下兼容了ASCII编码,所以其实也可以看成是比较ASCII编码),一直向后比价,知道比较出结果位置,如果我们一直比不出结果,前面一直相等,那么就是长度长的字符串更大,如果可以可以比价出结果,那么这个时候我们就用不到比较字符串的长度
- 那么这里是如何比较出最小值的?
我们说LEAST是用来比价字符串大小的,这个时候是比较字符串内容的ANSI编码值,那么如果我们就是要比较字符串的长度,这个时候我们要如何做?
- 这个时候我们就要用到一个单行函数: LENGTH() — 这个函数在我们后面我们回去讲
这里我们通过一个例子来理解如何进行比较字符串的长度:
SELECT LEAST(LENGTH('abcd'),LENGTH('adc'))
FROM DUAL;
- 这个时候就不是比价’abcd’和’adc’的内容了,这个时候我们就是比较的两个字符串的长度,其实这个时候就相当于: SELECT LEAST(4,3);所以返回的结果就是3
-
GREATEST()
- 在多个值中返回最大值
- GREATEST()也是一个函数
- GREATST()函数和我们的LEAST()函数功能时刚刚相反的,但是使用上基本都是类似的,所以这里我们就不去着重的讲解,我们可以对照LEAST()函数进行学习
-
BETWEEN 条件下界 AND 条件上界
- 判断数据是否位于条件下界和条件上界之间,如果是在条件下界和条件上界之内就会返回1,如果没有在条件下界和条件上界之间,就返回0
- 注意: 这里判断的结果是包含两个边界的(也即是一个完整的闭区间)
- eg: – 这里我们通过一个例子来理解BETWEEN 条件下界 AND 条件上界的使用
SELECT * FROM employees WHERE salary BETWEEN 6000 AND 8000;
- 这个时候就是查询员工表中工资在6000到8000之间的员工信息(包含6000和8000)
注意: 上面这个例题我们除了可以使用BETWEEN AND之外还可以使用逻辑运算符来完成,下面我们就用逻辑运算符来实现
SELECT *
FROM employees
WHERE salary >= 6000 && salary <= 8000;
- 这个时候我们也是查询员工表中员工工资位于6000到8000之间的员工信息
这里我们再举一个例子: 我们通过BETWEEN 条件下界 AND 条件上界 加上 逻辑运算符NOT(!)来查询员工表中员工工资<6000或者员工工资大于8000的员工的信息
SELECT *
FROM employees
WHERE NOT BETWEEN 6000 AND 8000;
- 这个时候按理我们的BETWEEN 6000 AND 8000 是判断是否位与6000和8000之内,但是我们前面这个时候又加上了NOT(逻辑非)所以这个时候就是表示判断不再6000和8000之内,而我们的BETWEEM AND 是包含边界的,那么这个时候加上了NOT之后就是不包含边界的,也就是判断<6000 或者是 >8000的数据
- 这个时候给BETWEEN AND 加上了NOT之后就相当于: x < 条件下界 OR x > 条件上界
-
IN()
- 判断一个值是否为集合中的一个值,如果是就返回一个1,如果不是就返回一个0
- IN()也是一个函数
- ()中是一个集合
- eg : 这里我们通过一个例子来理解IN(set)的使用
SELECT * FROM employees WHERE department_id IN(10,20,30);
- 这里就是查询部门号为10,20,30的员工信息,这里我们的WHERE department_id IN(10,20,30)是判断我们的员工id是否是10,或者20,或者30,如果是就返回1, 如果不是就返回一个0
对于上面的这个例子我们也可以使用逻辑运算符来完成
SELECT *
FROM employees
WHERE department_id = 10 OR department_id = 20 OR department_id = 30;
- 这里我们也就是查询了员工表中员工id为10或者20或者30的员工信息
- 注意:这里可能会出现一种错误的写法,很多同学在实际编程中都会写出这种错误的写法,错误写法如下:
SELECT *
FROM employees
WHERE department_id = 10 OR 20 OR 30;
- 这个时候显然就是错误的,那么这个时候是错在了哪里?
- 我们应该知道OR运算符的两边都应该是逻辑值,那么这个时候第一个OR右边是20,只要是非0的值在我们的MySQL中都是代表了逻辑真,那么这个时候不管如何运算,结果都将是1,也就是真,那么就会将我们的所有的员工的信息都返回回来,那么这个时候显然就是没有满足我们的需求,也就是没有按照我们的要求去执行,也即是错误的,正确的写法我们的每个OR两边都应该是逻辑表达式,而不是一个数值
-
NOT IN()
- 判断一个值是否不是集合中的任意一个值
- NOT IN()也是一个函数,这个时候我们可以认为NOT IN()就是IN()运算符前面加一个逻辑运算符NOT(逻辑非),表示不再集合中
- eg: – 这里我们通过一个例子来了解NOT IN()运算符的使用
SELECT * FROM employees WHERE salary NOT IN(6000,7000,8000);
- 查询工资不是6000,7000,8000的员工信息
-
LIKE —> 模糊匹配运算符
- 判断一个值是否符合模糊匹配规则
- % : 代表不缺定个数个字符(0个或者1个或者多个)
- _ : 代表一个不确定字符
- / : 代表转义字符(注意: 转义是斜杠而不是反斜杠)
- 使用转义字符查询之后就这个字符就仅仅代表这个字符自己,不再有具体的功能
- ESCAPE字符 : 表示将一个字符视为转义字符
eg:
WHERE last_name LIKE '_$_a%' ESCAPE '$';
- 这个时候就是在此子句中将我们的 视 为 转 义 符 号 , 也 就 是 这 个 语 句 中 的 第 一 个 表 示 的 是 一 个 不 确 定 字 符 , 但 是 后 面 我 们 的 视为转义符号,也就是这个语句中的第一个_表示的是一个不确定字符,但是后面我们的 视为转义符号,也就是这个语句中的第一个表示的是一个不确定字符,但是后面我们的 _ 这里的 _表示的就是单纯的一个下划线
这里我们通过几个例子来理解LIKE(模糊匹配运算符)的使用
eg1: 查询员工表中last_name包含’a’的员工信息
SELECT *
FROM employees
WHERE last_name LIKE '%a%';
- 这里就是查询员工表中last_name中含有a的员工信息,这里的’%a%'表示a前面有不确定个字符,后面也有不确定个字符
eg2: 查询员工表中以字符a开头的员工信息
SELECT *
FROM employees
WHERE last_name LIKE 'a%';
- 这里我们的’a%'就是表示第一个字符为a,然后a后面的%表示的是a后面是不确定个数个字符
eg3: 查询员工表中last_name包含字符’a’,并且包含字符’e’的员工信息
- 对于这个问题我们又两种写法:
写法一:
SELECT *
FROM employees
WHERE last_name LIKE '%a%' AND last_name LIKE '%e%';
- 这里表示的含义就是last_name中既包含’a’,又包含’b’,那么也就是last_name中包含’ae’
写法二:
SELECT *
FROM employees
WHERE last_name LIKE '%a%e%' OR last_name LIKE '%e%a%';
- 这里表示的含义就是last_name中要么是字符’a’在前面,字符’e’在后面 , 要么是字符’e’在前面,字符’a’在前面
eg4: 查询员工表中last_name第三个字符为’a’的员工信息
SELECT *
FROM employees
WHERE last_name LIKE '__a%'
- 这里表示当就是我们的员工表中的last_name字段中’a’为第三个字符
- REGEXP , RLIKE(正则表达运算符)
- 判断一个数是否符合正则表达式的规则
- 如果符合规则,这个时候就是返回一个1,如果不符合规则,那么对应的就是返回一个0
- 这里我们要知道正则表达式是独立于我们的SQL语言而存在的
- 判断一个数是否符合正则表达式的规则
- '^'匹配以该字符后面的字符串开头的字符串
- '$'匹配以该字符前面的字符串结尾的字符串
- '.'匹配任何的单个字符
- [ . . . ]匹配在方括号内的任何字符
eg:[abc]就是匹配’a’或者’b’或者’c’;
这里我们通过一个例题来理解正则表达运算符如何使用
eg:
SELECT 'shkstart' REGEXP '^shk','shkstart' REGEXP 't$','shkstart' REGEXP 'hk';
- 这里的第一个REGEXP就是判断我们的字符串中是不是以字符串’shk’为开头,如果是就返回一个1,第二个REGEXP就是判断我们的字符串是否以字符串’t’结尾,第三个REGEXP就是判断我们的字符串中是否包含了字符串’hk’