第7篇:SELECT条件查询
第7篇:SELECT条件查询
本篇内容
1. 条件查询语法
2. 条件查询运算符详解(=、<、>、>=、<=、<>、!=)
3. 逻辑查询运算符详解(and、or)
4. like模糊查询介绍
5. between and查询
6. in、not in查询
7. NULL值存在的坑
8. is null/is not null(NULL值专⽤查询)
9. <=>(安全等于)运算符
10. 经典⾯试题
条件查询
WHERE子句在FROM字句之后使用
SELECT aname,apass
FROM account
WHERE apass='AA';SELECT aname,apass-> FROM account-> WHERE aname='zhangwuji'-> ORDER BY aname DESC;也可以使用ORDER BY进行指定排序,但是需要注意的是,排序是在MySQL查询完数据之后才排序的,并不是在MySQL数据库里面排序,是对查询完成的数据进行排序的
WHERE子句操作符
操作符 | 描述 | 实例 |
---|---|---|
= | 等号,检测两个值是否相等,如果相等返回true | (A = B) 返回false。 |
<> 或 != | 不等于,检测两个值是否相等,如果不相等返回true | (A != B) 返回 true。 |
> | 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true | (A > B) 返回false。 |
< | 小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true | (A < B) 返回 true。 |
>= | 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true | (A >= B) 返回false。 |
<= | 小于等于号,检测左边的值是否小于于或等于右边的值, 如果左边的值小于或等于右边的值返回true | (A <= B) 返回 true。 |
注意:不等于判断
<> 这个是最早的⽤法。
!=是后来才加上的。
两者意义相同,在可移植性上前者优于后者
故⽽sql语句中尽量使⽤<>来做不等判断
检查单个值
SELECT studentNo,studentName FROM student WHERE sex='男';
检索男性的所有信息
不匹配检查
SELECT studentNo,studentName FROM student WHERE sex <> '男';
SELECT studentNo,studentName FROM student WHERE sex != '男';
检索gender不是男性的信息
范围值检索
SELECT sid,sname FROM student age BETWEEN 30 AND 50 ORDER BY sid DESC,aname;
检索年龄在30到50岁间的id和姓名信息,并先按照id降序排列,相同的sid再按照姓名升序排列
在使用BETWEEN关键字必须指定两个范围值,范围值用AND关键字分隔
ORDER by 指定排序,将检索出的数据进行排序
空值检查
NULL代表空,并不是0或者空格,注意,在计算机只认识二进制码,所以ASCII码才是字符的在底层的表现形式,空格和0都有自己的ASCII码,所以区别于NULL。SELECT * FROM student WHERE gender IS NULL;
判断字段为NULL时使用的是IS NULL子句为判断字符的,而不是=
说明:
数值按照⼤⼩⽐较。
字符按照ASCII码对应的值进⾏⽐较,⽐较时按照字符对应的位置⼀个字符⼀个
字符的⽐较。
逻辑查询运算符
AND & OR操作符
用AND & OR操作符来给WHERE子句增加附加条件
SELECT * FROM student WHERE sid='S-204' AND gender='female';
检索表中的所有id为‘S-204’且gender为‘female’的信息
SELECT * FROM student WHERE sid = 'S-204' OR sid= 'S-205';
计算次序
AND和OR同时存在时,无论怎么排列,都会先执行AND语句,AND的计算优先级高于OR
SELECT * FROM student WHERE sid='S-205' or sid='S-204' AND gender='female';
会有male字段存在,就是因为先计算AND,之后才计算OR
解决办法是用括号明确分组相应的操作符
SELECT * FROM student WHERE (sid='S-205' or sid='S-204') AND gender='female';
IN查询
SELECT * FROM student WHERE sid IN('S-201','S-202','S-203','S-204') AND gender = 'male';
在应用中,IN和OR的结果是一样的,但是IN相比于OR只需要将要添加的条件放在IN后面的括号里面即可,而OR操作符需要在每一个条件后面加上OR
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sNpxbO59-1625475506623)(https://sc03.alicdn.com/kf/H097111b56e264d6e80129c401936ce1dS.jpg)]
in 后⾯括号中可以包含多个值,对应记录的字段满⾜in中任意⼀个都会被返回
in列表的值类型必须⼀致或兼容
in列表中不⽀持通配符。
NOT IN查询
NOT IN和IN相反,NOT IN是和列表中都不匹配的会被返回。
select 列名 from 表名 where 字段 not in (值1,值2,值3,值4);
SELECT * FROM student WHERE sid NOT IN('S-201','S-202','S-203','S-204') AND gender = 'male';
LIKE(模糊查询)
LIKE操作符用在WHERE字句之后,作用是指示MySQL后跟的搜索模式利用通配符匹配而不是直接相等匹配
%通配符
SELECT * FROM student WHERE sid LIKE '%4';
查询在sid字段任意以4结尾的所有信息
SELECT * FROM student WHERE gender LIKE 'fe%';
检索在gender字段以fe开头的所有信息
%是用来告诉MySQL接受fe之后的任意字符,无论后面有多少字符
SELECT * FROM student WHERE sid LIKE '%20%';
查询sid字段中任意位置包含20的信息,无论20前后有任意字符
SELECT * FROM student WHERE gender LIKE 'f%e';
查询所有gender字段中首位包含f和e的信息,中间无论是什么
%除了可以匹配一个和多个字符之外,还可以匹配0个字符。%代表搜索模式中给定位置的0个,1个或多个字符
注意空格不是NULL,空格可以被匹配,但是NULL是无法被匹配的
_通配符
%可以匹配0个,1个和多个字符,_匹配的是该位置的一个字符,仅仅只匹配一个字符
SELECT * FROM student WHERE gender LIKE '_f%';
只能匹配到f前面有一个字符的信息,无法匹配f前有两个字符的信息
SELECT * FROM student WHERE gender LIKE '_ f%';
通配符使用技巧
不要过度使用通配符,因为它处理起来更耗时(为什么通配符处理起来更耗时)
若必须使用通配符,请不要将通配符放在搜索模式的开始处,如 %f,这样检索起来是最慢的
仔细注意通配符的位置,如果放错地方,可能不会返回想要的数据
BETWEEN AND(区间查询)
操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围,这些值可以是数值、⽂本或
者⽇期,属于⼀个闭区间查询。selec 列名 from 表名 where 列名 between 值1 and 值2;返回对应的列的值在[值1,值2]区间中的记录
使⽤between and可以提⾼语句的简洁度
两个临界值不要调换位置,只能是⼤于等于左边的值,并且⼩于等于右边的值。
SELECT * FROM student WHERE age BETWEEN 40 AND 90;
查询student表中年龄从40~90岁的信息
正则表达式进行搜索(REGEXP)
基本字符匹配
SELECT * FROM student WHERE gender REGEXP '.m';
告诉MySQL,REGEXP后面跟的是一个正则表达式,正则表达式匹配与通配符匹配有本质区别,要做以区分
.是正则表达式中一个特殊的字符,代表匹配任意一个字符
注意
SELECT * FROM student WHERE sname LIKE '小';
该句不会返回数据,因为LIKE匹配的是整个列,相应的文本在列值中没有完整的出现,所以不会匹配到,若是想要能查询到
SELECT * FROM student WHERE sname LIKE '小%';
这里就会返回数据
SELECT * FROM student WHERE sname REGEXP '小';
这句会返回数据,因为REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到他,
进行OR匹配(|)
SELECT * FROM student WHERE age REGEXP '88|12|46';
|代表或,将88、12、46匹配并返回查询结果
匹配几个字符之一
SELECT * FROM student WHERE sid REGEXP 'S-20[234]';
匹配所有的sid字段以S-20开头,以2,3、4结尾的行,并返回
[]是另一种形式的OR语句
SELECT * FROM student WHERE sid REGEXP 'S-20 2|3|4';
这句返回少了一个S-202,因为MySQL假定你的意思是S-20 2、3或者4,如你需要得到上面的返回行,需要将2、3、4括在一个集合中,否则将应用于整个串字符集是可以被否定的
SELECT * FROM student WHERE sid REGEXP 'S-20[^234]';
匹配后缀是2,3,4以外的数据
匹配范围
集合可以匹配一个范围
SELECT * FROM student WHERE sid REGEXP 'S-20[2-5]';
匹配S-20后面所有是的2-5之间的值
匹配特殊字符
在正则表达式中有特殊意义字符我们已经学了 . | [] -四个,这些字符单独用时都有其特殊含义,到但是当我们想要匹配这些字符时,怎么匹配呢?
我们需要在这些字符前加上转义字符\\
\\. --> .
\\- --> -
SELECT * FROM student WHERE gender REGEXP '\\.';
\\n --> 换行
\\f --> 换页
\\r --> 回车
\\t --> 制表
\\v --> 纵向制表
匹配字符类
具体匹配见MySQL必知必会76页
匹配多个实例
* 0个或者多个匹配
+ 1个或多个匹配(等于{1,})
? 0个或1个匹配(等于{0,1})
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围(m不超过255)
定位符
^ 文本的开始
$ 文本的结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾
SELECT * FROM student WHERE gender REGEXP '^[f\\.]';
匹配以f和.为开头的文本
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uREaD17M-1625475506625)(https://sc03.alicdn.com/kf/H097111b56e264d6e80129c401936ce1dS.jpg)]
NULL存在的坑
NULL只能用IS NULL & IS NOT NULL作为条件查询
NULL代表空,并不是0或者空格,注意,在计算机只认识二进制码,所以ASCII码才是字符的在底层的表现形式,空格和0都有自己的ASCII码,所以区别于NULL。SELECT * FROM student WHERE gender IS NULL;
判断字段为NULL时使用的是IS NULL子句为判断字符的,而不是=
<=>(安全等于)
<=>既可以判断NULL,也可以判断普通数值,但是可读性低,select * from test8 t where t.a<=>null;
经典面试题
以下两条语句查询结果是否一样?
SELECT * FROM student;
SELECT * FROM student WHERE name LIKE '%';
当name字段没有NULL时,结果一致,当name字段有NULL时,第二条语句查询结果没有NULL。
总结
• like中的%可以匹配⼀个到多个任意的字符,_可以匹配任意⼀个字符
• 空值查询需要使⽤IS NULL或者IS NOT NULL,其他查询运算符对NULL值⽆效
• 建议创建表的时候,尽量设置表的字段不能为空,给字段设置⼀个默认值
• <=>(安全等于)玩玩可以,建议少使⽤
第7篇:SELECT条件查询相关推荐
- ssm框架中利用pagehelper分页,完成模糊查询与select条件查询
ssm框架中利用pagehelper分页,完成模糊查询与select条件查询 一.问题分析 1.1 往期回顾 pagehelper分页 https://blog.csdn.net/Jia_Peng_T ...
- from mysql partition select_玩转select条件查询,避免踩坑
条件查询 语法: select 列名 from 表名 where 列 运算符 值 说明: 注意关键字where,where后面跟上一个或者多个条件,条件是对前面数据的过滤,只有满足where后面条件的 ...
- MySQL:单表查询---简单查询+条件查询+高级查询+表和字段取别名
目录 一.通用模版展示 简单查询 条件查询 高级查询 表和字段取别名 二.举例说明 简单查询 条件查询 高级查询 表和字段取别名 三.注意事项 四.Mapper简单举例 简单查询 条件查询 高级查询 ...
- alin的学习之路(数据库篇:二)(select查询,where条件查询,order by排序,单行函数,多行函数,group by分组)
alin的学习之路(数据库篇:二)(select查询,where条件查询,order by排序,单行函数,多行函数,group by分组) 1. SQL语句 1.1 sql语言类型 sql是一门独立的 ...
- 03_MyBatis基本查询,mapper文件的定义,测试代码的编写,resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询ma
1 PersonTestMapper.xml中的内容如下: <?xmlversion="1.0"encoding="UTF-8"?> < ...
- mybatis-plus在Mapper类中使用@select标签进行多表联合动态条件查询
1.单表动态条件查询 1)单字段作为参数 直接用@param设置的值作为注入就好了 @Select("select * from ppms_person_message where crea ...
- 基于SqlServer的DML(数据查询)实验,掌握select查询语句的使用、掌握有无条件查询、结果排序与分组、掌握视图用法
实验三 数据库的查询一.实验目的及要求 1. 熟练掌握SELECT查询语句的使用 2. 掌握无条件.有条件查询及查询结果排序与分组 3. 掌握视图的用法二.实验任务 1.掌握查询语句的一般格式. 2. ...
- SqlService基础一篇搞定(建库建表、插入数据、修改和删除数据、基础查询、条件查询、模糊查询、聚合函数、分组查询、多表查询)
SqlService基础知识总汇 前言 一.SQLSERVER建库建表 1.检查数据库名是否存在 2.创建数据库 3.建表 4.修改表结构 5.删除添加约束 二.SQLSERVER插入数据 1.向部门 ...
- 第6篇:SELECT查询基础篇
第6篇:SELECT查询基础篇 DQL(Data QueryLanguage):数据查询语言,从数据库中获取数据的,按照DQL的语法给数据库发送一条指令,数据库按照需要返回数据 查询常量 SELECT ...
最新文章
- keras Regressor 回归
- android用于查询数据的方法,android: SQLite查询数据
- 你好,C++(18) 到底要不要买这个西瓜?4.1.6 操作符之间的优先顺序
- Android中ActivityManager学习笔记
- 解决mysqlAccess denied for user'root'@'IP地址'问题
- Hibernate之检索策略
- ERP中的合并会计报表
- vue项目中运用webpack动态配置打包多种环境域名
- oracle group by 多类别_python数据关系型图表散点图系列多数据系列
- JPA 系列教程21-JPA2.0-@MapKeyColumn
- linux 小度 驱动_小度Wifi,360随身Wifi2,小米Wifi树莓派驱动下载
- 基于R语言的分位数回归(quantile regression)
- 30天自制操作系统:第五天 结构体、文字显示与 GDT/IDT初始化
- Revit 2022安装教程(附详细安装步骤+激活教程)
- java 从已知日期计算干支纪日_根据公历日期计算当日干支(详解)
- 校园网连接后,浏览器打不开登录界面可能的一种解决方法
- RetinaNet——《Focal Loss for Dense Object Detection》论文翻译
- 【Practical】最小二乘与正规方程
- 解锁Windows所有电源选项
- 云日记结构bug心得
热门文章
- 从大脑中汲取灵感,能效提高了1000倍,新芯片拓展AI的可能性
- Python利用openpyxl来操作Excel
- 多进程,多线程 的使用
- C#/Winform 右键菜单-ContextMenuStrip控件
- 用PS制作小清新文字图片的方法
- 语言争霸VS魔兽争霸 :: IT世界VS魔兽世界
- linux shell比大小expr,Linux shell命令中expr(示例代码)
- AI 首次在德州扑克战胜人类职业玩家,新算法让机器拥有“直觉”
- 「硬见小百科」红外通信原理
- 有关Oracle数据库的几个神话