MySQL—运算符详解(算术、比较、逻辑、范围运算符与集合运算符 模糊查询 NULL值运算与null值判断 位运算符)

MySQL——运算符详解

知识纲要

  • 算术运算符
  • 比较运算符
  • 逻辑运算符
  • 范围运算符与集合运算符
  • 模糊查询
  • NULL值运算与null值判断
  • 位运算符

1.算术运算符

加 减 乘 除 取余
div 也表示除,但是只保留整数部分
+,-,*,/(div),%(mod)

示例

#算术运算符 [+	-		*		/(DIV)		%(MOD)]
DROP TABLE IF EXISTS students;
CREATE TABLE students
(
		stu_id INT,
		stu_name VARCHAR(20),
		stu_sex CHAR(2),
		stu_age INT
);
INSERT INTO students VALUES
	(1001,'张三','男',16),
	(1002,'李四','女',17),
	(1003,'王五','男',20),
	(1004,'赵六','男',19),
	(1005,'孙七','女',18);
SELECT * FROM students;

#查询年龄值为偶数的学生信息
SELECT * FROM students WHERE stu_age%2=0;

#查询年龄值为奇数的学生信息
SELECT * FROM students WHERE stu_age MOD 2!=0;

#将编号大于等于1003的同学 年龄+1
UPDATE students SET stu_age=stu_age+1 WHERE stu_id>=1003;
#SELECT * FROM t_salary;
#查看员工对应的 日薪[每月按21算 basic_salary]
SELECT eid as '员工编号',basic_salary as '月薪',
	basic_salary/21 as '日薪' FROM t_salary;

注意

关于+,在 Java 中,+的左右两边如果有字符串,那么表示字符串的拼接,

但是在 MySQL 中+只表示数值相加, 如果遇到非数值类型,先尝试转成数值,如果转失败,就按 0 计算

#在MySQL中 "+"只表示数学运算的相加
#[若+面对非数值:先将值转数值 再相加;若转换失败 则认为这个值是0 继续相加]
SELECT stu_id+1,stu_name+1 FROM students;
SELECT * FROM students;

MySQL 中字符串拼接要使用字符串函数实现

#使用CONCAT()函数 实现内容的拼接 ["编号-姓名"]
SELECT CONCAT(stu_id,'-',stu_name) FROM students;
SELECT CONCAT(stu_id,'&',stu_name,'&',stu_sex) '信息' FROM students;

2.比较运算符

=,>, <,>=, <=, 
不等于:!= , <>,
<=>(安全等于)

示例

#比较运算符 [= <> != < >  >= <=  <=>]
#查询年龄为19岁的同学姓名
SELECT stu_name FROM students WHERE stu_age=19;

#查询年龄不为19岁的同学姓名
SELECT stu_name FROM students WHERE stu_age!=19;
SELECT stu_name FROM students WHERE stu_age<>19;

#查询年龄在20以上 30岁以下的同学信息
SELECT * FROM students WHERE stu_age>=20 AND stu_age<=30;
#BETWEEN min AND max [范围在min-max之间 包括两端]
SELECT * FROM students WHERE stu_age BETWEEN 20 AND 30;

#SELECT * FROM t_salary;
#查询奖金=0.40的员工薪酬信息 [<=>安全等于 此处与 = 无异]
SELECT * FROM t_salary WHERE commission_pct = 0.40;
SELECT * FROM t_salary WHERE commission_pct <=> 0.40;

注意

安全等于与 = 的区别在于当两个操作码均为 NULL 时,其所得值为 1 而不为 NULL,而当一个操作码为 NULL 时,其所得值为 0而不为 NULL。

在这里插入图片描述在这里插入图片描述

#查询奖金为NULL的员工薪酬信息 [此处 <=>安全等于 可以代替IS]
#SELECT * FROM t_salary WHERE commission_pct = NULL;#ERROR
SELECT * FROM t_salary WHERE commission_pct IS NULL;
SELECT * FROM t_salary WHERE commission_pct <=> NULL;

#查询奖金不为NULL的员工薪酬信息 [实现IS NOT效果]
SELECT * FROM t_salary WHERE commission_pct IS NOT NULL;
SELECT * FROM t_salary WHERE NOT commission_pct <=> NULL;

注意 不为null的表达方式

SELECT * FROM t_salary WHERE NOT> commission_pct <=> NULL>;

3.逻辑运算

与&&,或||,非!
与 AND,或 OR ,非 NOT,异或 XOR

示例


#查询 性别=男 且 年龄>=18岁 的同学信息
SELECT * FROM students WHERE stu_sex='男' AND stu_age>=18;
SELECT * FROM students WHERE stu_sex<=>'男' AND stu_age>=18;

#查询 性别=男 或 年龄>=17岁 的同学信息
SELECT * FROM students WHERE stu_sex='男' OR stu_age>=18;

#查询年龄=20 和 年龄=21 的同学信息
SELECT * FROM students WHERE stu_age=20 OR stu_age=21;
SELECT * FROM students WHERE stu_age IN(20,21);

4.范围和集合

between … and … 和 not between … and …
in(集合) 和 not in(…)

示例

#查询年龄!=20 和 年龄!=21 的同学信息
SELECT * FROM students WHERE stu_age NOT IN(20,21);

#查询年龄范围在:>=19 和 <=20 的同学信息
SELECT * FROM students WHERE stu_age>=19 AND stu_age<=20;
SELECT * FROM students WHERE stu_age BETWEEN 19 AND 20;
SELECT * FROM students WHERE stu_age IN(19,20);

#查询年龄范围不在:>=19 和 <=20 的同学信息
SELECT * FROM students WHERE stu_age<19 OR stu_age>20;
SELECT * FROM students WHERE NOT (stu_age>=19 AND stu_age<=20);
SELECT * FROM students WHERE stu_age NOT BETWEEN 19 AND 20;
SELECT * FROM students WHERE stu_age NOT IN(19,20)

5.模糊查询

like 和 通配符 一起使用
like _ 匹配单个字符
like % 匹配任意个字符

示例

#查询姓名中 包含有"张"的学生信息[WHERE LIKE]
SELECT * FROM students WHERE stu_name LIKE '%张%';

#查询姓"张"的学生信息[WHERE LIKE]
SELECT * FROM students WHERE stu_name LIKE '张%';

SELECT * FROM students WHERE stu_name LIKE '%张三%';
SELECT * FROM students WHERE stu_name LIKE '张三%';
SELECT * FROM students WHERE stu_name LIKE '张三_';

SELECT * FROM students WHERE stu_name LIKE '%张%';
SELECT * FROM students WHERE stu_name LIKE '%张_';
SELECT * FROM students WHERE stu_name LIKE '%张__';

SELECT * FROM students WHERE stu_name LIKE '%张%';

通常情况,可以使用 FIND_IN_SET()函数(精确查询)或 LIKE 操作符搜索 SET 值

mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET(‘value’,set_col)>0;

mysql> SELECT * FROM tbl_name WHERE set_col LIKE ‘%value%’;

第 1 个语句找出 SET_col 包含 value set 成员的行。第 2 个类似,但有所不同:它 在其它地方找出 set_col 包含 value 的行,甚至是在另一个 SET 成员的子字符串中

/*
FIND_IN_SET('张三',stu_name)
FIND_IN_SET('a','a,b,c')
精确查询'value'在column_name列[集合]中的位置
返回值是一个整数 若返回值为0 表示木有找到匹配项
*/
SELECT * FROM students WHERE FIND_IN_SET('张三',stu_name)>0;
SELECT * FROM students WHERE stu_name='张三';
SELECT * FROM students WHERE stu_name LIKE '张三';

#SELECT FIND_IN_SET('a','a,b,c') FROM students; #return 1
#SELECT FIND_IN_SET('a','ab,b,c') FROM students; #return 0

6.NULL值运算与null值判断

关于 null 值计算

所有运算符遇到 null 都是 null,除了<=>

is null 或 is not null,如果使用 null=null,null<>null,null=0,null<>0,null=false 等 都不对

不过 xxx is null 可以使用 xxx <=> null ,xxx is not null 可以写成 not xxx <=> null

示例

#NULL值参与运算 所有运算符遇到null都是null[除"<=>"安全等于在外]
#IS NULL
#IS NOT NULL
SELECT stu_name+NULL FROM students;

#<=> NULL 相当于 IS NULL
SELECT * FROM t_salary WHERE commission_pct IS NULL;
SELECT * FROM t_salary WHERE commission_pct <=> NULL;

#NOT <=> NULL 相当于 IS NOT NULL
SELECT * FROM t_salary WHERE commission_pct IS NOT NULL;
SELECT * FROM t_salary WHERE NOT commission_pct <=> NULL;

7.位运算符

&		位与
|		位或
^		位异或
>>	右位移
<<	左位移
~		位反

示例

# &[位与] 如果对应的二进制位都是1 则位与运算结果是1 反之结果是0
SELECT 10 & 15;
#10		1010
#15		1111
#RS		1010

# |[位或] 如果对应的二进制位有一个或两个1 则位与运算结果是1 反之结果是0
SELECT 10 | 15;
#10		1010
#15		1111
#RS		1111

# ^[位异或] 对应的二进制位不同 运算结果是1 反之结果是0
SELECT 10 ^ 15;
#10		1010
#15		1111
#RS		0101

# <<[左位移] 如:1<<2 是1的二进制值左位移两位(删除左侧两高位 右侧两低位补0)
#00000001<<2	->	00000100 = 4
SELECT 1<<2;

# >>[右位移] 如:1>>1
#00000001>>1	->	00000000 = 0
SELECT 1>>1;

# ~[位取反] 将二进制位逐个取反[1->0	0->1]
SELECT 1 &~ 1;

总结

在这里插入图片描述


练习

创建学生信息表studentinfo,包含以下字段:学号、姓名、性别、年龄、身高和体重,完成以下操作

1.查询编号大于3的学生
2.查询编号不大于4的学生
3.查询姓名不是"黄蓉"的学生
4.查询没被删除的学生
5.查询编号大于3的女同学
6.查询编号小于4或没被删除的学生
7.查询年龄不在10岁到15岁之间的学生
8.查询姓黄的学生
9.查询姓黄并且"名"是一个字的学生
10.查询姓黄或叫靖的学生
11.查询编号为3至8的学生
12.查询编号不是3至8的男生
13.查询没有填写身高的学生

答案

drop table if EXISTS studentinfo;
CREATE table studentinfo
(
	s_id int,
	s_name VARCHAR(20),
	s_sex CHAR(2),
	s_age int,
	s_height int,
	s_weight int
);

insert into studentinfo VALUES(1,'张三','男',19,175,130);
insert into studentinfo VALUES(2,'李四','男',19,180,135);
insert into studentinfo VALUES(3,'王五','男',20,187,140);
insert into studentinfo VALUES(4,'赵六','男',18,170,120);
insert into studentinfo values(5,'黄蓉','女',18,158,100);
insert into studentinfo values(6,'赵梦','女',18,163,95);
insert into studentinfo values(7,'刘靖','女',12,150,85);

#1.查询编号大于3的学生
SELECT * from studentinfo where s_id>3;
#2.查询编号不大于4的学生
SELECT * from studentinfo WHERE s_id<=4;
#3.查询姓名不是"黄蓉"的学生
SELECT * from studentinfo WHERE s_name!='黄蓉';
#4.查询没被删除的学生  #逻辑删除
ALTER table studentinfo add COLUMN is_delete int default 0;
UPDATE studentinfo set is_delete=1 WHERE s_id=4;
SELECT * FROM studentinfo WHERE is_delete=0;
#5.查询编号大于3的女同学
SELECT * from studentinfo where s_id>3 and s_Sex='女';
#6查询编号小于4或没被删除的学生
SELECT * from studentinfo WHERE s_id<4 and is_delete=0;
#7.查询年龄不在10岁到15岁之间的学生
SELECT * FROM studentinfo WHERE s_age NOT BETWEEN 10 AND 15;
#8.查询姓黄的学生
SELECT * FROM studentinfo WHERE s_name like '黄%';
#9.查询姓黄并且"名"是一个字的学生
SELECT * FROM studentinfo WHERE s_name like '黄_';
#10.查询姓黄或叫靖的学生
SELECT * FROM studentinfo WHERE s_name like '黄%' OR s_name LIKE '%靖%';
#11.查询编号为3至8的学生
SELECT * FROM studentinfo WHERE s_id BETWEEN 3 AND 8;
#12查询编号不是3至8的男生
SELECT * FROM studentinfo WHERE s_id NOT BETWEEN 3 AND 8 AND s_sex='男';
#查询没有填写身高的学生
SELECT * FROM studentinfo WHERE s_height IS NULL;

个人所填答案 错误欢迎大家指正 谢谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#YF#_长沙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值