MySQL--WHERE专题
MySQL进阶----过滤条件
select * from ... where ...;
通常我们并不需要查看一个表的所有行,我们需要查看的是具备某种条件的行。前面MySQL使用的基础学习中,就使用过简单的条件过滤
where age > 20
,本文将针对where条件做更详细说明!没有学过基础内容可以看【MySQL使用入门】
简单筛选
符号 | 含义 |
---|---|
> | 大于 |
< | 小于 |
= | 等于 |
>= | 大于等于 |
<= | 小于等于 |
!= | 不等于 |
<> | 不等于 |
复合条件--and 、or和not
来学习MySQL的朋友我默认你学过至少一门编程语言。
一个条件就是一个逻辑表达式,表达式的结果只有true和false。多个表达式可以用
and
和or
来连接,分别表示与和或,还可以用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);
- 在使用
and
和or
时需要注意他们的优先级,具体看下面的需求
-- 检索出所有年龄为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;
当你不清楚优先级是怎样安排的,使用括号总是一个保险的选择,而且这样做可以让条件的含义更加清晰。这一点相信你在其他语言中也有同样的经验。
字符串的筛选条件
=
这个筛选条件对于字符串来说显然是不够的,下面介绍like
和regexp
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中正则表达式的转义字符为
\\
。 - 注意
like
和regexp
的重要区别,前者对字符串是完全匹配,后者正则是部分匹配,正则只有在加上首位定位符的情况下才是完全匹配。 - 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专题的更多相关文章
- 「mysql优化专题」90%程序员没听过的存储过程和存储函数教学(7)
一.MYSQL储存过程简介(技术文): 储存过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时 ...
- 「mysql优化专题」高可用性、负载均衡的mysql集群解决方案(12)
一.为什么需要mysql集群? 一个庞大的分布式系统的性能瓶颈中,最脆弱的就是连接.连接有两个,一个是客户端与后端的连接,另一个是后端与数据库的连接.简单如图下两个蓝色框框(其实,这张图是我在悟空问答 ...
- 「mysql优化专题」90%程序员面试都用得上的索引优化手册(5)
目录(技术文) 多关于索引,分为以下几点来讲解: 一.索引的概述(什么是索引,索引的优缺点) 二.索引的基本使用(创建索引) 三.索引的基本原理(面试重点) 四.索引的数据结构(B树,hash) 五. ...
- mysql优化专题」90%程序员都会忽略的增删改优化(2)
补充知识点:操作数据语句优化的认识 通常情况下,当访问某张表的时候,读取者首先必须获取该表的锁,如果有写入操作到达,那么写入者一直等待读取者完成操作(查询开始之后就不能中断,因此允许读取者完成操作). ...
- 「mysql优化专题」这大概是一篇最好的mysql优化入门文章(1)
优化,一直是面试最常问的一个问题.因为从优化的角度,优化的思路,完全可以看出一个人的技术积累.那么,关于系统优化,假设这么个场景,用户反映系统太卡(其实就是高并发),那么我们怎么优化? 如果请求过多, ...
- 【转】[Mysql] Linux Mysql 日志专题
原文链接:http://blog.csdn.net/xiaoxu0123/article/details/6258538 1, 设置存放的目录: [root@Linux etc]# more /etc ...
- 「mysql优化专题」主从复制面试宝典!面试官都没你懂得多!(11)
内容较多,可先收藏,目录如下: 一.什么是主从复制 二.主从复制的作用(重点) 三.主从复制的原理(重中之重) 四.三步轻松构建主从 五.必问面试题干货分析(最最重要的点) 一.什么是主从复制(技术文 ...
- 「mysql优化专题」什么是慢查询?如何通过慢查询日志优化?(10)
日志就跟人们写的日记一样,记录着过往的事情.但是人的日记是主观的(记自己想记的内容),而数据库的日志是客观的,根据记录内容分为以下好几种日志(技术文): a.错误日志:记录启动.运行或停止mysqld ...
- 「mysql优化专题」详解引擎(InnoDB,MyISAM)的内存优化攻略?(9)
注意:以下都是在MySQL目录下的my.ini文件中改写(技术文). 一.InnoDB内存优化 InnoDB用一块内存区域做I/O缓存池,该缓存池不仅用来缓存InnoDB的索引块,而且也用来缓存Inn ...
- 「mysql优化专题」优化之路高级进阶——表的设计及优化(6)
正文:表的设计及优化(真技术文) 优化①:创建规范化表,消除数据冗余 数据库范式是确保数据库结构合理,满足各种查询需要.避免数据库操作异常的数据库设计方式.满足范式要求的表,称为规范化表,范式产生于2 ...
随机推荐
- WSL ubuntu重置密码
1. 在powershell中切换到root: 2. 进入ubuntu: 3. 修改制定用户的密码: 4. 切换回默认的用户:
- 对模拟器虚假设备识别能力提升15%!每日清理大师App集成系统完整性检测
前言 每日清理大师是一款智能便捷的手机清理软件,可快速清理无用缓存.垃圾文件和应用残留,还可深度清理如社交软件中的无用缓存等,有效解决手机卡顿.耗电快.内存不足等问题.每日清理大师App在结合了系统完 ...
- MySQL 误删用户故障解决方案
目录 "误删"所有用户 解决方式一: 停止数据库 跳过 授权表 和 网络启动(重要) 插入新的用户 重启启动数据库 解决方式二: 停止数据库 跳过 授权表 和 网络启动(重要) 授 ...
- spring再学习之基本概念
二.spring之IOC与DI 注入的方式: set方法注入: 构造方法注入: 字段注入: 注入类型: 值类型注入:8中基本类型 引用类型注入: BeanFaactory是原始接口:功能比较单一. A ...
- synchronized底层原理
synchronized底层语义原理 Java 虚拟机中的同步(Synchronization)基于进入和退出管程(Monitor)对象实现. 在 Java 语言中,同步用的最多的地方可能是被 syn ...
- Git使用疑问
1.git操作是出现Username for 'https://github.com':的验证问题 Username for 'https://github.com': 输入的是github上的邮箱账 ...
- Gym 101128J Saint John Festival(凸包 + 二分判点和凸包关系)题解
题意:给你一堆黑点一堆红点,问你有最多几个黑点能找到三个红点,使这个黑点在三角形内? 思路:显然红点组成的凸包内的所有黑点都能做到.但是判断黑点和凸包的关系朴素方法使O(n^2),显然超时.那么我现在 ...
- 计量经济学导论10:ARIMA模型
目录 ${\rm ARIMA}$ 模型 滞后算子 ${\rm MA}(q)$ 模型 ${\rm MA}(1)$ 模型 ${\rm MA}(q)$ 模型 ${\rm AR}(p)$ 模型 ${\rm A ...
- Flutter CodePen challenges
Flutter CodePen challenges 挑战赛 https://mp.weixin.qq.com/s/qIYokWN9SVgr-F7YxbJuOQ CodePen Flutter 编辑器 ...
- Redis 博文索引
博文索引 Redis 对象与编码 Redis 持久化 Redis 主从复制 Redis 哨兵 Redis 缓存淘汰 Redis 集合统计 Redis 简介