MySQL数据库05:DQL查询运算符
文章目录
一、运算符简介
二、算术运算符
三、比较运算符
四、逻辑运算符
五、条件查询
五、位运算符(了解)
5.1按位与
5.2按位或
5.3按位异或
5.4按位右移
5.5按位左移
5.6按位取反
一、运算符简介
数据库中的表结构确立后,表中的数据代表的意义就已经确定。通过MSQL运算符进行运算,就可以获取到表结构以外的另一种数据。例如,学生表中存在一个birth字段,这个字段表示学生的出生年份,而运用MySQL的算术运算符用当前的年份减学生出生的年份,那么得到的就是这个学生的实际年龄数据。
MySQL支持4种运算符:
- 算术运算符
- 比较运算符
- 逻辑运算符
- 位运算符
二、算术运算符
算术运算符 | 说明 |
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算 |
/或DIV | 除法运算 |
%或MOD | 取余运算,换回余数 |
对于算术运算符中的加减乘除,如果我们直接进行数字之间的运算,则会直接在终端上打印计算的结果:
-- 1.算术运算符
select 6 + 2;
select 8 - 4;
select 3 * 2;
select 8 / 4;
select 5 % 2;
接下来我们将算术运算与表结合起来,表数据仍然使用之前的商品数据:
-- 将所有商品的价格 + 10
select pname,price + 10 as new_price from product;
-- 将所有商品的价格上调10%
select pname,price * 1.1 as new_price from product;
这里就是from从product这个表中查询pname和price + 10(price * 1.1)这2个数据,因为价格不能叫做价格+10(价格*1.1),因此将修改后的价格进行了重命名为new_price。
三、比较运算符
比较运算符 | 说明 |
= | 等于 |
< 和 <= | 小于和小于等于 |
> 和 >= | 大于和大于等于 |
<=> | 安全的等于,两个操作码均为NULL时,其所得值为1;而当一个操作吗为NULL时,其所得值为0 |
<>或!= | 不等于 |
IS NULL 或ISNULL | 判断一个值是否为NULL |
IS NOT NULL | 判断一个值是否不为NULL |
LEAST | 当有两个或者多个参数时,返回最小值 |
GREATEST | 当有两个或者多个参数时,返回最大值 |
BETWEEN AND | 判断一个值是否落在两个值之间 |
IN | 判断一个值是IN列表中的任意一个值 |
NOT IN | 判断一个值不是IN列表中的任意一个值 |
LIKE | 通配符匹配 |
PEGEXP | 正则表达式匹配 |
四、逻辑运算符
逻辑运算符 | 说明 |
NOT 或者 ! | 逻辑非 |
AND 或者 && | 逻辑与 |
OR 或者 || | 逻辑或 |
XOR | 逻辑异或 |
五、条件查询
比价运算符与逻辑运算符通常情况下都是在一起使用的,而运用他俩最多的场景就是条件查询,我们话不多说直接结合表从案例中理解:
-- 查询商品名称为“海尔洗衣机”的商品所有信息
(1)select * from product where pname = "海尔洗衣机";
(1)查询商品名称为“海尔洗衣机”的商品所有信息查询我们需要先知道从哪个表查起,我们这里只有一个表,因此使用from product,然后执行查询操作使用select关键字,接着查询哪些字段呢?因为是查询所有信息,所有用 * 代表所有字段,即所有列,然后用where关键字加条件,条件为“海尔洗衣机”属于名称pname字段。
-- 查询价格为800的商品
(2)select * from product where price = 800;
(2)查询价格为800的商品,没说查询哪些列,就默认所有列用*代替,接着是从product中查询所有为from product,执行查询操作select,条件where为价格price为800的商品。
-- 查询价格不为800的所有商品
(3)select * from product where price != 800;select * from product where price <> 800;select * from product where not (price = 800);
(3)查询不等于800的商品只需要将(2)中的等于改为不等于就行,有3种方式一是使用!=,二是使用<>,这也表示不等于,三是使用not,将等于800的结果取反就行。
-- 查询价格大于等于60的所有商品
(4)select * from product where price >= 60;
(4)查询价格大于60的商品只需要将条件改为大于等于60即可。
-- 查询价格在200到1000之间的商品
(5)select * from product where price >= 200&&price <= 1000;select * from product where price between 200 and 1000;
(5)查询价格在200到1000之间的商品,只需要将条件修改为200到1000之间,可以使用区间,也可以使用逻辑与。
-- 查询价格为200或者800的所有商品
(6)select * from product where price in(200,800);select * from product where price = 200 or price = 800;select * from product where price = 200 || price = 800;
(6)查询价格为200或者800的所有商品只需要修改条件,这里如果可以使用in关键字,in关键字之后更一个列表,只要值包含在in的列表中则表示为真,这里也就是说只要price在200或者800这个列表中,即要么等于200,要么等于800,结果就为真。或者使用逻辑或运算也能达到一样的效果。
-- 查询含有“裤”字的所有商品
(7)select * from product where pname like "%裤";
(7)查询含有“裤”字的所有商品,查询的条件是名字,这里需要用到模糊查询,%用来匹配任意字符,这里就表示不管前面是什么,只要以“裤”结尾就查询,如果使用“%裤%”就表示不管前面和后面是什么,只要中间出现了“裤”就查询。
-- 查询以“海”开头的所有商品
(8)select * from product where pname like "海%";
(8)查询以“海”开头的所有商品,只需要改变一下模糊查询条件,“海%”表示的是首字符为海,后面的内容不重要。
-- 查询第二个字为“蔻”的所有商品
(9)select * from product where pname like "_蔻%";
(9)查询第二个字为“蔻”的所有商品,就需要修改模糊查询条件,怎么确定第二个字,这就要用到下划线_,下划线_代表的是单个字符,所以这里"_蔻%"表示第1个字不重要,第2个字为蔻,之后的不重要。
-- 查询category_id为null的商品
(10)select * from product where category_id is null;
(10)查询category_id为null的商品,这里就需要将条件改为是null,但是不能直接将category_id等于null,因为我们之前说过null和任意值包括它本身都不相等,所有要用is null。
-- 查询category_id不为null的商品
(11)select * from product where category_id is not null;
(11)查询category_id不为null的商品,需要将条件改为is not null,也不能直接!=null。
-- 使用least求最小值
(12)select least(10,5,20) as small_number;select least(10,null,20) as small_number;-- 如果求最小值时,有个值为null,则不会进行比较,结果直接为null
(12)使用least求最小值,就向least中传入几个参数,最后返回其中的最小值as存入small_number变量中。如果求最小值时,有个值为null,则不会进行比较,结果直接为null。
-- 使用greatest求最小值
(13)select greatest(10,5,20) as big_number;select greatest(10,null,20) as big_number;-- 如果求最大值时,有个值为null,则不会进行比较,结果直接为null
(13)使用greatest求最小值,就向greatest中传入几个参数,最后返回其中的最小值as存入big_number变量中。如果求最大值时,有个值为null,则不会进行比较,结果直接为null。
五、位运算符(了解)
位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。
位运算符 | 说明 |
| | 按位或 |
& | 按位与 |
^ | 按位异或 |
<< | 按位左移 |
>> | 按位右移 |
~ | 按位取反,反转所以比特位 |
举例如下:
select 3&5; -- 按位与
select 3|5; -- 按位或
select 3^5; -- 按位异或
select 3>>1; -- 按位右移
select 3<<1; -- 按位左移
select ~3; -- 按位取反
5.1按位与
select 3&5; -- 按位与
3的二进制为:0011
5的二进制为:0101
按位与:从低到高依次比较,二者都为1时结果为1,否则为0
3: 0011
5: 0101
----------
0001
所以3和5按位与的结果为0001,翻译为十进制就是1。
5.2按位或
select 3|5; -- 按位或
3的二进制为:0011
5的二进制为:0101
按位或:从低到高依次比较,二者其中之一为1,则整体结果就为1
3: 0011
5: 0101
----------
0111
所以3和5按位与的结果为0111,翻译为十进制就是7。
5.3按位异或
select 3^5; -- 按位异或
3的二进制为:0011
5的二进制为:0101
按位或:从低到高依次比较,二者相反为1,相同为0
3: 0011
5: 0101
----------
0110
所以3和5按位与的结果为0110,翻译为十进制就是6。
5.4按位右移
select 3>>1; -- 按位右移
3的二进制为:0011
按位或:符号>>的左边是操作对象,右边是移动长度,按位右移就是将左边对象的二进制位整体向右移动几位,头部补0,尾部溢出的位直接舍掉
3: 0011
0001 1
所以3按位右移1位的结果为0001,翻译为十进制就是1。
5.5按位左移
select 3<<1; -- 按位左移
3的二进制为:0011
按位或:符号<<的左边是操作对象,右边是移动长度,按位左移就是将左边对象的二进制位整体向左移动几位,头部溢出的位不用舍掉,尾部补0。
3: 0011
00110
所以3按位左移1位的结果为00110,翻译为十进制就是6。
5.6按位取反
select ~3; -- 按位取反
我们之前不是说3的二进制位为:0011吗,那按位取反不应该是1100等于10吗?这里为什么是这么大的一个数呢?其实这是因为在64位机器上3的二进制是64位格式的:
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0011
按位取反:
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1100
这样取反过后就是一个非常大的数字。
关于位运算符我们只需要了解一下就行,知道有这些东西,我们在日常查找中用到的不多。
这次我们了解了查询中运算符的应用,下一节我们将学习排序查询的相关知识,尽情期待!