数据库学习(9)MySQL数据库DML——条件查询

文章详细介绍了MySQL中DML操作的条件查询,包括算数运算符如加减乘除和求模,以及IFNULL()函数处理NULL值,DATEDIFF()计算日期差,NOW()获取当前时间。此外,还讲解了比较运算符、逻辑运算符和按位运算符的使用,以及WHERE子句的注意事项和正则表达式的应用。文中通过多个案例展示了如何在实际查询中运用这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

条件查询

很多时候,用户感兴趣的并不是逻辑表里的全部记录,而知识它们当中能够满足某一种或集中条件的记录。这类条件要用WHERE子句来实现数据的筛选。

SELECT ...... FROM ...... WHERE 条件 [AND|OR] 条件 ......;

案例:

SELECT empno,ename FROM t_emp WHERE deptno=10 AND sal>=2000;
SELECT empno,ename FROM t_emp WHERE (deptno=10 OR deptno=20) AND sal>=2000;

算数运算符

WHERE语句中的条件运算会用到以下四种运算符:

序号|运算符
1|数学运算符
2|比较运算符
3|逻辑运算符
4|按位运算符

数学运算符

序号表达式意义例子
1+加法1 + 2 + 3
2-减法1 - 2 - 3
3*乘法5 * 35
4/除法231 / 15
5%求模10 % 3

案例:查询年收入大于等于15000并且工龄大于20年的员工信息

SELECT empno,ename,sal,hiredate FROM t_emp
WHERE deptno=10 AND (sal+IFNULL(comm,0))*12>=15000
AND DATEDIFF(NOW(),hiredate)/365>=20;

关于IFNULL()函数:

(1) 任何数字与NULL做数学运算的结果都为NULL。
(2) 如果想让NULL参与数学运算,那么需要添加MySQL自带的函数IFNULL()。
案例:

SELECT 10+IFNULL(null,0);

注:IFNULL(null,0)的第一个参数可以为任何一个字段或者为null,如果第一个参数为null,那么IFNULL返回的结果就为第二个参数。

关于DATEDIFF ()函数:

DATEDIFF (NOW(),hiredate)函数会返回第一个时间参数减去第二个时间参数的值。

NOW()函数

NOW()函数会返回当前时间。

比较运算符

序号表达式意义例子
1>大于age > 18
2>=大于等于age >= 18
3<小于sal < 3000
4<=小于等于sal <= 3000
5=等于deptno = 10
6!=不等于deptno != 30
7IN包含deptno IN(10,30,40)
8IS NULL为空comm IS NULL
9IS NOT NULL不为空comm IS NOT NULL
10BETWEEN AND范围sal BETWEEN 2000 AND 3000
11LIKE模糊查询ename LIKE “A%”
12REGEXP正则表达式ename REGEXP “[a-zA-Z]{4}”

注:中文正则表达式为[4E00-9FA5],后边的{4}表示一共有多少个字符。

案例1:查询1986-01-01年前入职并且部门编号为10、20和30并且职位不是SALESMAN的员工

SELECT empno,ename,sal,hiredate FROM t_emp
WHERE deptno IN (10,20,30)
AND job != "SALESMAN"
AND hiredate < "1985-01-01";

案例2: 使用正则表达式查找

SELECT ename,comm FROM t_emp WHERE comm IS NOT NULL;
SELECT ename,comm FROM t_emp WHERE comm IS NULL;

SELECT ename,comm,sal FROM t_emp WHERE comm IS NULL
AND sal BETWEEN 2000 AND 3000;

SELECT ename,comm,sal FROM t_emp WHERE comm IS NULL
AND sal BETWEEN 2000 AND 3000
AND ename LIKE "%A%";

SELECT ename,comm,sal FROM t_emp WHERE comm IS NULL
AND sal BETWEEN 2000 AND 3000
AND ename LIKE "_LAKE";

SELECT ename,comm,sal FROM t_emp WHERE comm IS NULL
AND sal BETWEEN 1000 AND 3000
AND ename REGEXP "^[\\u4e00-\\u9fa5]{2,4}$";

注:

SELECT ename,comm,sal FROM t_emp WHERE comm IS NULL
AND sal BETWEEN 1000 AND 3000
AND ename REGEXP "^[\\u4e00-\\u9fa5]{2,4}$";

^[\\u4e00-\\u9fa5]{2,4}$中的^表示开头,$表示结尾,[\\u4e00-\\u9fa5]表示代表中文的正则表达式,{2,4}表示2个字符到4个字符之间。

逻辑运算符

序号表达式意义例子
1AND与关系age > 18 AND sex = “男”
2OR或关系empno = 8000 OR deptno = 20
3NOT非关系NOT deptno = 20
4XOR异或关系age > 18 XOR sex = “男”

注:a XOR b表示如果条件a和条件b同时被满足或者同时不满足,则返回结果为false;如果满足a不满足b或者不满足a但满足b,则返回结果为true。

案例:

SELECT ename,deptno FROM t_emp WHERE NOT deptno IN(10,20);
SELECT ename,deptno FROM t_emp WHERE deptno NOT IN(10,20);

SELECT ename,deptno FROM t_emp WHERE NOT deptno IN(10,20)
XOR sal>=2000;

注:这里可以发现 NOT deptno IN(10,20); deptno NOT IN(10,20);运行结果一致。

按位运算符

二进制位运算的实质是将参与运算的两个操作数,按对应的二进制数逐位进行逻辑运算。

序号表达式意义例子
1&位与关系3 & 7
2 ∣ \vert 位或关系3$\vert$7
3~位取反~ 10
4^位异或3 ^ 7
5<<左移10 << 1
6>>右移10 >> 1

注:
(1) 10 << 1表示将10转换为二进制,在右侧补一位二进制0;
(2) 10 >> 1表示将10转换为二进制,将右侧一位数抹掉,并在左侧补一位二进制0。

WHERE子句的注意事项

(1) WHERE子句中,条件执行的顺序是从左到右的。所以我们应该把索引条件,或者筛选掉记录最多的条件写在最左侧。
(2) 各种子句的执行顺序
条件查询中,各种子句的执行顺序如下:
FROM → \to WHERE → \to SELECT → \to ORDER BY → \to LIMIT
注:这里是WHERE在SELECT之前执行,这是因为必须先要筛选出符合条件的记录,才能从中挑选出结果集中显示的字段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值