MySQL进阶----过滤条件

select * from ... where ...;

通常我们并不需要查看一个表的所有行,我们需要查看的是具备某种条件的行。前面MySQL使用的基础学习中,就使用过简单的条件过滤 where age > 20 ,本文将针对where条件做更详细说明!没有学过基础内容可以看【MySQL使用入门】

简单筛选

符号 含义
> 大于
< 小于
= 等于
>= 大于等于
<= 小于等于
!= 不等于
<> 不等于

复合条件--and 、or和not

来学习MySQL的朋友我默认你学过至少一门编程语言。

一个条件就是一个逻辑表达式,表达式的结果只有true和false。多个表达式可以用andor来连接,分别表示,还可以用not来表示。下面是一些具体使用的示例。

-- 年龄大于10且小于20
select s_name from students where age > 10 and age < 20;
-- 年龄小于10或大于20
select s_name from students where age < 10 or age > 20;
-- 非(年龄小于10或大于20),等价于年龄不小于10且不大于20
select s_name from students where not (age < 10 or age > 20);
  • 在使用andor 时需要注意他们的优先级,具体看下面的需求
-- 检索出所有年龄为20或21岁,成绩优秀(90分以上)的学生的信息
select * from students where age = 20 or age = 21 and score >= 90;
-- 上面的语句貌似是我们想要的结果,然而实际上返回的结果却不是我们想要的。
-- 上面条件的实际含义是:20岁的学生或21岁成绩优秀的学生
-- 为什么会这样,原因是在MySQL中and的优先级比or更高,导致后面两个条件先结合,也就是
select * from students where age = 20 or (age = 21 and score >= 90);
-- 所以为了达到我们的本意,应该向下面这样写
select * from students where (age = 20 or age = 21) and score >= 90;

当你不清楚优先级是怎样安排的,使用括号总是一个保险的选择,而且这样做可以让条件的含义更加清晰。这一点相信你在其他语言中也有同样的经验。

字符串的筛选条件

=这个筛选条件对于字符串来说显然是不够的,下面介绍likeregexp

like

-- 下面两条语句的结果完全相同
select * from students where s_name = '张三';
select * from students where s_name like '张三'; -- like 只有搭配%和_时才和=不一样
-- 下面这条语句筛选出姓张的同学,比如'张三','张无忌'等,它还能匹配'张'。
select * from students where s_name = '张%';
-- 可以匹配'张三'、'张飞'等,但无法匹配'张无忌'。
select * from students where s_name = '张_';

%_ 都是通配符,前者匹配任意字符任意长度,包括0长度,后者匹配单个任意字符。

regexp

除了like这种简单的筛选条件,我们还可以在MySQL中使用正则表达式作为筛选条件

select prod_name from products where regexp 'ipad air[12]';
-- 可以找出商品名:'ipad air1 64g'、'ipad air2 128g'、'ipad air1 128g'等

关于正则表达式的知识这里不详细阐述,请自行查阅相关资料学习。

需要说明的地方:

  • MySQL中正则表达式的转义字符\\
  • 注意likeregexp的重要区别,前者对字符串是完全匹配,后者正则是部分匹配,正则只有在加上首位定位符的情况下才是完全匹配。
  • MySQL的3.23.4之后的版本不区分正则表达式中的大小写!如果需要区分大小写要使用regexp binary

文本处理函数

文本处理函数可以在过滤条件中使用

函数 说明
Left() 返回串左边的字符
Right() 返回串右边的字符
Locate() 找出串的一个子串
SubString() 返回子串的字符
LTrim() 去掉串左边的空格
RTrim() 返回串右边的字符
Length() 返回串的长度
Soundex() 返回串的SOUNDEX值
Lower() 将串转换为小写
Upper() 将串转换为大写
-- 示例:找出'tom','Tom','TOM'等
select name from students where Lower(name) = 'tom';

数值处理函数

函数 说明
Abs() 返回一个数的绝对值
Mod() 返回除操作的余数
Exp() 返回一个数的指数值
Mod() 返回除操作的余数
Sin() 返回一个角度的正弦
Cos() 返回一个角度的余弦
Tan() 返回一个角度的正切
Sqrt() 返回一个数的平方根
Pi() 返回圆周率
Rand() 返回一个随机数
-- 示例:找出所有成绩个位数为5的学生信息,比如75、85、65等
select * from students where Mod(score,10) = 5;

日期处理函数

函数 说明
AddDate() 增加一个日期(天、周等)
AddTime() 增加一个时间(时、分等)
CurDate() 返回当前日期
CurTime() 返回当前时间
Date() 返回日期时间的日期部分
DateDiff() 计算两个日期之差
Date_Add() 高度灵活的日期运算函数
Date_Format() 返回一个格式化的日期或时间串
Day() 返回一个日期的天数部分
DayOfWeek() 对于一个日期,返回对应的星期几
Hour() 返回一个时间的小时部分
Minute() 返回一个时间的分钟部分
Month() 返回一个日期的月份部分
Now() 返回当前日期和时间
Second() 返回一个时间的秒部分
Time() 返回一个日期时间的时间部分
Year() 返回一个日期的年份部分
-- 示例:找出所有1999年出生的同学的信息
select * from students where Year(birthday) = 1999;

<!>注意 在MySQL中为日期类型赋值格式为yyyy-mm-dd,datetime类型不仅包含日期还包含时间,所以如果对于想筛选日期为1999-07-24时使用birthday = '1999-07-42'是不准确的,这样只能匹配00:00:00时间。应该在birthday的外面套上Date()函数。在对日期处理时要善用日期处理函数!

between

用于数值区间时间区间

-- 示例:找出所有90后同学的信息
select * from students where Date(birthday) between '1990-01-01' and '1990-12-31';

in

in可以表示范围,准确的说是一个集合

  • 用法一:圆括号
-- 示例:找出所有年龄为15、18或24的学生的信息
select * from students where age in (15,18,24);
  • 用法二:子查询
-- 假设有一个表items存储商品信息,一个表orders存储订单信息(假设一个订单只有一个商品)
-- 示例:找出所有购买ipad air系列产品的订单
select * from orders where orders.item_id in (
select item_id from items where item_name regexp 'ipad air'
);

空值检查

null值在MySQL中比价特殊,它表示未指定或者不确定的值。是否具有null值需要用is null来判断

-- 示例:找出所有未填写简介信息(必须值为null,空字符串不算,仅空格也不算)的书的book_id
select book_id from books where info is null;

<!>注意 NULL与不匹配

在通过过滤选择出不具有特定值的行时,你可能希望返回具有NULL值的行。但是,不行。因为未知具有特殊的含义,数据库不知道它们是否匹配,所以在匹配过滤或不匹配过滤时不返回它们。 因此,在过滤数据时,一定要验证返回数据中确实给出了被过滤列具有NULL的行。

总结

  • 比较关系:大于、小于、等于...
  • and、or、not
  • 字符串筛选:like、正则、文本处理函数
  • 函数:数值处理、日期处理、文本处理
  • between、in、控制检查

MySQL--WHERE专题的更多相关文章

  1. 「mysql优化专题」90%程序员没听过的存储过程和存储函数教学(7)

    一.MYSQL储存过程简介(技术文): 储存过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时 ...

  2. 「mysql优化专题」高可用性、负载均衡的mysql集群解决方案(12)

    一.为什么需要mysql集群? 一个庞大的分布式系统的性能瓶颈中,最脆弱的就是连接.连接有两个,一个是客户端与后端的连接,另一个是后端与数据库的连接.简单如图下两个蓝色框框(其实,这张图是我在悟空问答 ...

  3. 「mysql优化专题」90%程序员面试都用得上的索引优化手册(5)

    目录(技术文) 多关于索引,分为以下几点来讲解: 一.索引的概述(什么是索引,索引的优缺点) 二.索引的基本使用(创建索引) 三.索引的基本原理(面试重点) 四.索引的数据结构(B树,hash) 五. ...

  4. mysql优化专题」90%程序员都会忽略的增删改优化(2)

    补充知识点:操作数据语句优化的认识 通常情况下,当访问某张表的时候,读取者首先必须获取该表的锁,如果有写入操作到达,那么写入者一直等待读取者完成操作(查询开始之后就不能中断,因此允许读取者完成操作). ...

  5. 「mysql优化专题」这大概是一篇最好的mysql优化入门文章(1)

    优化,一直是面试最常问的一个问题.因为从优化的角度,优化的思路,完全可以看出一个人的技术积累.那么,关于系统优化,假设这么个场景,用户反映系统太卡(其实就是高并发),那么我们怎么优化? 如果请求过多, ...

  6. 【转】[Mysql] Linux Mysql 日志专题

    原文链接:http://blog.csdn.net/xiaoxu0123/article/details/6258538 1, 设置存放的目录: [root@Linux etc]# more /etc ...

  7. 「mysql优化专题」主从复制面试宝典!面试官都没你懂得多!(11)

    内容较多,可先收藏,目录如下: 一.什么是主从复制 二.主从复制的作用(重点) 三.主从复制的原理(重中之重) 四.三步轻松构建主从 五.必问面试题干货分析(最最重要的点) 一.什么是主从复制(技术文 ...

  8. 「mysql优化专题」什么是慢查询?如何通过慢查询日志优化?(10)

    日志就跟人们写的日记一样,记录着过往的事情.但是人的日记是主观的(记自己想记的内容),而数据库的日志是客观的,根据记录内容分为以下好几种日志(技术文): a.错误日志:记录启动.运行或停止mysqld ...

  9. 「mysql优化专题」详解引擎(InnoDB,MyISAM)的内存优化攻略?(9)

    注意:以下都是在MySQL目录下的my.ini文件中改写(技术文). 一.InnoDB内存优化 InnoDB用一块内存区域做I/O缓存池,该缓存池不仅用来缓存InnoDB的索引块,而且也用来缓存Inn ...

  10. 「mysql优化专题」优化之路高级进阶——表的设计及优化(6)

    正文:表的设计及优化(真技术文) 优化①:创建规范化表,消除数据冗余 数据库范式是确保数据库结构合理,满足各种查询需要.避免数据库操作异常的数据库设计方式.满足范式要求的表,称为规范化表,范式产生于2 ...

随机推荐

  1. 【2020杭电多校】Distinct Sub-palindromes 找规律

    题目链接:Distinct Sub-palindromes 题意: 给你一个长度n,你需要找出来一些串,这些串由A...Z和a...z构成.我们设长度为n的所有串中所包含回文子串最少的数量为ans.问 ...

  2. Redundant Paths POJ - 3177 把原图变成边—双连通图

    无向图概念:(这里的x->y表示x和y之间有一条无向边)1.桥:对于一个无向图,如果删除某条边后,该图的连通分量增加,则称这条边为桥 比如1->2->3->4这样一个简单得图一 ...

  3. RSA 加密解密使用实例

    http://www.dtmao.cc/news_show_692109.shtml 本文不讨论RSA加密解密本身,只记录使用方法及遇到的坑,RSA原理及注意事项可在网上查找. 背景:公司的一个需求, ...

  4. Dubbo SPI 机制源码分析(基于2.7.7)

    Dubbo SPI 机制涉及到 @SPI.@Adaptive.@Activate 三个注解,ExtensionLoader 作为 Dubbo SPI 机制的核心负责加载和管理扩展点及其实现.本文以 E ...

  5. ajax全局

    $.ajaxSetup({ complete: function (xhr) { xhr.promise().done(function (json) { if (json.errorNo == &q ...

  6. 流水线cpu —Verilog HDL

    一.准备工作 先看看书(<计算机原理与设计 Verilog HDL版>),搞懂一点原理.然后照着书上的代码写一写(用8.4的就可以了,不用8.6的). 注意mux2x32,mux4,cla ...

  7. OAuth2授权流程

  8. ARM汇编---程序获取符号的物理地址

    在移植u-boot的过程看到过u-boot在重定向时的实现,当时不知道怎么就觉得很好理解就把这个知识点没怎么深入的理解,最近在看华为的鸿蒙OS在Cortex-A平台上的实现过程时再次遇到一时间看不太懂 ...

  9. GUI编程

    组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 鼠标 键盘事 破解工具 简介 GUI的核心技术:Swing AWT 界面不美观 需要jre环境 为了了解MVC架构 了解监听. AWT 包 ...

  10. React Toolchains

    React Toolchains Create React App / component library https://create-react-app.dev/docs/getting-star ...