大家好!我是黄啊码,上节课我们将了DISTINCT、 FROM 、 GROUP BY、 HAVING 、 ORDER BY 这些筛选数据的技能,是不是总感觉少了些啥?
你:啊码,你把最重要的where给漏了!
黄啊码:啪,不是漏了,是想单独拿出来讲讲,毕竟讲那么多你们不一定能消化得完
你:每节课的开始,就是啪我一下吗?
黄啊码:额,不是,纯粹是感觉你有点欠揍,哈哈哈。
好了,进入正题吧:WHERE 子句,说起来 SQL 其实很简单,只要能把满足条件的内容筛选出来即可,但在实际使用过程中,不同人写出来的 WHERE 子句存在很大差别,比如执行效率的高低,有没有遇到莫名的报错等。
这是今天的
学会使用 WHERE 子句,如何使用比较运算符对字段的数值进行比较筛选;
在 SQL 中,我们可以使用 WHERE 子句对条件进行筛选,在此之前,你需要了解 WHERE 子句中的比较运算符。这些比较运算符的含义你可以参见下面这张表格:
啊码贴出的这图只是常用数据库的运算符,建议别直接copy就用。
你:为啥?作为老师,不应该是直接给准确答案吗?
黄啊码:啪,你见过参考答案上边写标准答案四个字吗?
你:我只见过》答:略。
黄啊码:。。。
注:你需要查看使用的 DBMS 是否支持,不同的 DBMS 支持的运算符可能是不同的,比如 Access 不支持(!=),不等于应该使用(<>)。在 MySQL 中,不支持(!>)(!<)等。
你:啊码,什么是DBMS?
黄啊码:啪!!Database Management System的缩写啊。要知其然,也要知其所以然。至于什么是DBMS,要么等啊码有空解释一下,要么自己搜索一下,这不在这节课主要内容里。
比如我们想要查询年龄大于11岁数据:
select * from user_info where user_age > 11
你:如果要查询10-15的数据呢
黄啊码:在英文中,介于你我中间表示什么?
你:一般叫做第三者
黄啊码:啪,什么鬼?between你没学过吗?
你:啊码,I love chinese
黄啊码:啪,那你还说英文,看例子
select * from user_info where user_age BETWEEN 10 and 15
我刚才介绍了比较运算符,如果我们存在多个 WHERE 条件子句,可以使用逻辑运算符:
比如要查询user_age10-15的数据,其实不止有一种方式,还有可以用and,and就跟我们平常的汉语所说的,前者跟后者相关联结合:
select * from user_info where user_age>=10 and user_age<=15
黄啊码:结果是不是一模一样?
你:这居然都一样,那为什么还用between?
黄啊码:啪。哪来哪么多why,古汉语一个字不还有多种意思?
你:好吧。。。
那比如我们需要拿到user_age=10或者user_age=15的数据呢?
你:比吃饭还简单,看我的:
select * from user_info where user_age=10 or user_age=15
黄啊码:小瞧你的悟性了,看来打你没打错。
你:错是没错,就是少打点吧,打多容易笨。
黄啊码:看你后边表现啦。
好啦,接下来说in,给in其实和between和and有共通之处,比如说数组里有1,2,3,我们可以拿between 1 and 3,也可以1<=变量名<=3,那么我们也可以理解成1,2,3就在这数组里,如下:
如果我们想要拿到user_age为10,11,12,15的数据,我们该怎么表示:
select * from user_info where user_age in(10,11,12,15)
你:我去,这也行。
黄啊码:是的,所以用中文解释编程完全行得通,周杰仑说过:中文才是最屌的【轮是假的,所以车跑了】
来,那么问题来了,我想拿到user_age不是10,11,12,15的数据呢
你:这不简单,直接加not就行了,比如别人说谢谢用的是Thanks,我们就直接用No thanks,哈哈哈哈
黄啊码:啪,写出来,别飞了
你:来啦,来啦
select * from user_info where user_age not in(10,11,12,15)
黄啊码:孺子可教也,不得不给你个赞啊,大聪明今天不错。
我们要检索文本中包含某个词的所有数据,这里就需要使用通配符。通配符就是我们用来匹配值的一部分的特殊字符。这里我们需要使用到 LIKE 操作符。
如果我们想要匹配任意字符串出现的任意次数,需要使用(%)通配符。比如我们想要查找user_name中包含“三”字的数据都有哪些:
select * from user_info where user_name like '%三'
你:那如果我们想要找有关刘三姐这条数据呢,我们先把user_id=7改为刘三姐试试看:
黄啊码:呜呼,数据呢???
其实%用在前边表示前缀,用在后边表示后缀,所以我们查有关刘三姐这条数据,肯定是要变成
那如果我们想要匹配单个字符,就需要使用下划线 (_
) 通配符。(%)和(_
)的区别在于,(%)代表一个或多个字符,而(_
)只代表一个字符。
我们现在把刘三姐改成刘六三姐看看,然后我们只取有刘六三姐这条数据,怎么取呢,大聪明?
你:啥?肯定是明媒正娶啊。
黄啊码:啪,单身太久了,连学习都想着讨老婆了?好好听课,看着
select * from user_info where user_name like '__三%';
记得,因为前边是两个字,所以用两个_ 看,这不就出来了吗?
你:啊码威武霸气!
黄啊码:少拍马屁,不好好学习,如果没有钱,以后看你怎么明媒正娶。
你:谨听啊码之言。
黄啊码:是吗?今天的课后作业来了:如果where后边有and和or,哪个先执行?
你:回去再说,告辞!
今天啊码对 SQL 语句中的 WHERE 子句进行了讲解,你可以使用比较运算符、逻辑运算符和通配符这三种方式对检索条件进行过滤。
比较运算符是对数值进行比较,不同的 DBMS 支持的比较运算符可能不同,你需要事先查阅相应的 DBMS 文档。通配符可以让我们对文本类型的字段进行模糊查询,不过检索的代价也是很高的,通常都需要用到全表扫描,所以效率很低。只有当 LIKE 语句后面不用通配符,并且对字段进行索引的时候才不会对全表进行扫描,这个等后边我们深入学习后再讲数据库查询如何优化。
好了,今天的课程学到这里,有问题的留个言,别忘了一键三连,下次我们还会再见!
我是黄啊码,码字的码,退。。。退。。。退。。。朝!