第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条件查询相关推荐

  1. ssm框架中利用pagehelper分页,完成模糊查询与select条件查询

    ssm框架中利用pagehelper分页,完成模糊查询与select条件查询 一.问题分析 1.1 往期回顾 pagehelper分页 https://blog.csdn.net/Jia_Peng_T ...

  2. from mysql partition select_玩转select条件查询,避免踩坑

    条件查询 语法: select 列名 from 表名 where 列 运算符 值 说明: 注意关键字where,where后面跟上一个或者多个条件,条件是对前面数据的过滤,只有满足where后面条件的 ...

  3. MySQL:单表查询---简单查询+条件查询+高级查询+表和字段取别名

    目录 一.通用模版展示 简单查询 条件查询 高级查询 表和字段取别名 二.举例说明 简单查询 条件查询 高级查询 表和字段取别名 三.注意事项 四.Mapper简单举例 简单查询 条件查询 高级查询 ...

  4. alin的学习之路(数据库篇:二)(select查询,where条件查询,order by排序,单行函数,多行函数,group by分组)

    alin的学习之路(数据库篇:二)(select查询,where条件查询,order by排序,单行函数,多行函数,group by分组) 1. SQL语句 1.1 sql语言类型 sql是一门独立的 ...

  5. 03_MyBatis基本查询,mapper文件的定义,测试代码的编写,resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询ma

     1 PersonTestMapper.xml中的内容如下: <?xmlversion="1.0"encoding="UTF-8"?> < ...

  6. mybatis-plus在Mapper类中使用@select标签进行多表联合动态条件查询

    1.单表动态条件查询 1)单字段作为参数 直接用@param设置的值作为注入就好了 @Select("select * from ppms_person_message where crea ...

  7. 基于SqlServer的DML(数据查询)实验,掌握select查询语句的使用、掌握有无条件查询、结果排序与分组、掌握视图用法

    实验三 数据库的查询一.实验目的及要求 1. 熟练掌握SELECT查询语句的使用 2. 掌握无条件.有条件查询及查询结果排序与分组 3. 掌握视图的用法二.实验任务 1.掌握查询语句的一般格式. 2. ...

  8. SqlService基础一篇搞定(建库建表、插入数据、修改和删除数据、基础查询、条件查询、模糊查询、聚合函数、分组查询、多表查询)

    SqlService基础知识总汇 前言 一.SQLSERVER建库建表 1.检查数据库名是否存在 2.创建数据库 3.建表 4.修改表结构 5.删除添加约束 二.SQLSERVER插入数据 1.向部门 ...

  9. 第6篇:SELECT查询基础篇

    第6篇:SELECT查询基础篇 DQL(Data QueryLanguage):数据查询语言,从数据库中获取数据的,按照DQL的语法给数据库发送一条指令,数据库按照需要返回数据 查询常量 SELECT ...

最新文章

  1. keras Regressor 回归
  2. android用于查询数据的方法,android: SQLite查询数据
  3. 你好,C++(18) 到底要不要买这个西瓜?4.1.6 操作符之间的优先顺序
  4. Android中ActivityManager学习笔记
  5. 解决mysqlAccess denied for user'root'@'IP地址'问题
  6. Hibernate之检索策略
  7. ERP中的合并会计报表
  8. vue项目中运用webpack动态配置打包多种环境域名
  9. oracle group by 多类别_python数据关系型图表散点图系列多数据系列
  10. JPA 系列教程21-JPA2.0-@MapKeyColumn
  11. linux 小度 驱动_小度Wifi,360随身Wifi2,小米Wifi树莓派驱动下载
  12. 基于R语言的分位数回归(quantile regression)
  13. 30天自制操作系统:第五天 结构体、文字显示与 GDT/IDT初始化
  14. Revit 2022安装教程(附详细安装步骤+激活教程)
  15. java 从已知日期计算干支纪日_根据公历日期计算当日干支(详解)
  16. 校园网连接后,浏览器打不开登录界面可能的一种解决方法
  17. RetinaNet——《Focal Loss for Dense Object Detection》论文翻译
  18. 【Practical】最小二乘与正规方程
  19. 解锁Windows所有电源选项
  20. 云日记结构bug心得

热门文章

  1. 从大脑中汲取灵感,能效提高了1000倍,新芯片拓展AI的可能性
  2. Python利用openpyxl来操作Excel
  3. 多进程,多线程 的使用
  4. C#/Winform 右键菜单-ContextMenuStrip控件
  5. 用PS制作小清新文字图片的方法
  6. 语言争霸VS魔兽争霸 :: IT世界VS魔兽世界
  7. linux shell比大小expr,Linux shell命令中expr(示例代码)
  8. AI 首次在德州扑克战胜人类职业玩家,新算法让机器拥有“直觉”
  9. 「硬见小百科」红外通信原理
  10. 有关Oracle数据库的几个神话