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;
个人所填答案 错误欢迎大家指正 谢谢!!!