MySQL之where使用

举报
李子捌 发表于 2021/11/10 09:14:33 2021/11/10
【摘要】 本专栏会持续输出MySQL系列文章,祝大家每天进步亿点点!文末私信作者,我们一起去大厂。本篇总结的是 《MySQL之where使用》,后续会每日更新~关于《Redis入门到精通》、《并发编程》、《Java全面入门》、《鸿蒙开发》等知识点可以参考我的往期博客相信自己,越活越坚强,活着就该逢山开路,遇水架桥!生活,你给我压力,我还你奇迹!1、简介当我们需要获取数据库表数据的特定子集时,可以使用w...
  • 本专栏会持续输出MySQL系列文章,祝大家每天进步亿点点!文末私信作者,我们一起去大厂
  • 本篇总结的是 《MySQL之where使用》,后续会每日更新~
  • 关于《Redis入门到精通》、《并发编程》、《Java全面入门》、《鸿蒙开发》等知识点可以参考我的往期博客
  • 相信自己,越活越坚强,活着就该逢山开路,遇水架桥!生活,你给我压力,我还你奇迹!

751a8ffe445fbc514b868f41fb1efccd.jpeg


1、简介

当我们需要获取数据库表数据的特定子集时,可以使用where子句指定搜索条件进行过滤。where子句的使用场景非常丰富,它是MySQL语句中需要重点掌握的一个知识点。where实现的所有功能都可以在MySQL之外实现,但是直接在MySQL中过滤查询速度更快,也能节省网络传输开销。


2、正文

首先准备一张User表,DDL和表数据如下所示,可以直接复制使用。

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
  `age` int(11) NOT NULL COMMENT '年龄',
  `sex` smallint(6) NOT NULL COMMENT '性别',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '李子捌', 18, 1);
INSERT INTO `user` VALUES (2, '张三', 22, 1);
INSERT INTO `user` VALUES (3, '李四', 38, 1);
INSERT INTO `user` VALUES (4, '王五', 25, 1);
INSERT INTO `user` VALUES (5, '六麻子', 13, 0);
INSERT INTO `user` VALUES (6, '田七', 37, 1);
INSERT INTO `user` VALUES (7, '谢礼', 18, 1);

SET FOREIGN_KEY_CHECKS = 1;

数据的初始顺序如下所示:

mysql> select * from user;
+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  1 | 李子捌 |  18 |   1 |
|  2 | 张三   |  22 |   1 |
|  3 | 李四   |  38 |   1 |
|  4 | 王五   |  25 |   1 |
|  5 | 六麻子 |  13 |   0 |
|  6 | 田七   |  37 |   1 |
|  7 | 谢礼   |  18 |   1 |
+----+--------+-----+-----+
7 rows in set (0.00 sec)


2.1 where子句位置

  • where子句位于from之后,比如:
mysql> select * from user where age=18;
+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  1 | 李子捌 |  18 |   1 |
|  7 | 谢礼   |  18 |   1 |
|  8 | 李子柒 |  18 |   1 |
+----+--------+-----+-----+
3 rows in set (0.00 sec)
  • 如果使用order by,where子句位于order by之前,比如:
mysql> select * from user where age = 18 order by name;
+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  1 | 李子捌 |  18 |   1 |
|  8 | 李子柒 |  18 |   1 |
|  7 | 谢礼   |  18 |   1 |
+----+--------+-----+-----+
3 rows in set (0.00 sec)


2.2 操作符

where子句支持8个操作符,它们分别如下所示:

操作符

操作符说明

=

等于

<>

不等于

!=

不等于

<

小于

<=

小于等于

>

大于

>=

大于等于

BETWEEN AND

两个值之间的区间 比如 BETWEEN 1 AND 100

接下来使用表中操作符一个个的进行where子查询。


2.2.1 操作符 =

操作符=可以用于查询完全匹配的数据注意MySQL默认不区分英文大小写.


需求:

查询name等于李子捌的数据

语句:

select * from user where name = '李子捌';

结果:

+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  1 | 李子捌 |  18 |   1 |
+----+--------+-----+-----+
1 row in set (0.00 sec)

操作符=如果存在多条匹配数据,那么符合where字句条件的数据均会返回,如果需要指定排序方式,可以结合order by对数据进行排序。


2.2.2 操作符 <> 和 !=

这两个操作符实现的效果相同,均是匹配不相等的数据。


需求:

查询name不等于李子捌的数据

语句:

select * from user where name <> '李子捌';
select * from user where name != '李子捌';

结果:

+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  2 | 张三   |  22 |   1 |
|  3 | 李四   |  38 |   1 |
|  4 | 王五   |  25 |   1 |
|  5 | 六麻子 |  13 |   0 |
|  6 | 田七   |  37 |   1 |
|  7 | 谢礼   |  18 |   1 |
|  8 | 李子柒 |  18 |   1 |
+----+--------+-----+-----+
7 rows in set (0.00 sec)


2.2.3 操作符<= 、 <、>=、>

这四个操作符用于数值类型的列数据比较,但是如果作用于文本字段,MySQL也能执行只是返回的结果可能并不是你预期的数据(理论上没人会这么玩,但确实不报错!)


需求:

查询年龄小于等于20的所有用户

语句:

 select * from user where age <= 20;

结果:

+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  1 | 李子捌 |  18 |   1 |
|  5 | 六麻子 |  13 |   0 |
|  7 | 谢礼   |  18 |   1 |
|  8 | 李子柒 |  18 |   1 |
+----+--------+-----+-----+
4 rows in set (0.00 sec)


2.2.4 BETWEEN AND

BETWEEN AND 用于查询两个数值范围之间的值,这个范围是两个闭区间,因此包含起始值和结束值。比如BETWEEN 1 AND 100,包含1和100的数据。


需求:

查询年龄大于等于20小于等于50的用户

语句:

select * from user where age between 20 and 50;
+----+------+-----+-----+
| id | name | age | sex |
+----+------+-----+-----+
|  2 | 张三 |  22 |   1 |
|  3 | 李四 |  38 |   1 |
|  4 | 王五 |  25 |   1 |
|  6 | 田七 |  37 |   1 |
+----+------+-----+-----+
4 rows in set (0.00 sec)


2.3 空值null

空值null指的是不包含数据,它可以在建表的时候指定其中的列是否可以包含空值。需要注意null和数据值类型的0,字符类型的空格不一样,空值null指的是没有值

关于空值null的查询,MySQL提供了专门的where子句is null。


需求:

查询name为空值的数据

语句:

select * from user where name is null;

结果:

Empty set (0.00 sec)

因为user表中不存在name值为空值的数据,所以没有数据返回。如果我们需要查询name列不为空的数据,该怎么查询呢?

这个时候我们可以使用is not null

mysql> select * from user where name is not null;
+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  1 | 李子捌 |  18 |   1 |
|  2 | 张三   |  22 |   1 |
|  3 | 李四   |  38 |   1 |
|  4 | 王五   |  25 |   1 |
|  5 | 六麻子 |  13 |   0 |
|  6 | 田七   |  37 |   1 |
|  7 | 谢礼   |  18 |   1 |
|  8 | 李子柒 |  18 |   1 |
+----+--------+-----+-----+
8 rows in set (0.00 sec)


👇🏻 关注公众号 获取更多资料👇🏻

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。