mysql between和in_MySQL的WHERE语句中BETWEEN与IN的用法和他们的区别_13142ads的博客-程序员宅基地

技术标签: mysql between和in  

MySQL BETWEEN 用法

not可以对between...and取反。

1.数值型

BETWEEN 运算符用于 WHERE 表达式中,选取介于两个值之间的数据范围。BETWEEN 同 AND 一起搭配使用,语法如下:

WHERE column BETWEEN value1 ANDvalue2WHERE column NOT BETWEEN value1 AND value2

通常 value1 应该小于 value2。当 BETWEEN 前面加上 NOT 运算符时,表示与 BETWEEN 相反的意思,即选取这个范围之外的值。

BETWEEN 实例

选取 uid 在 2 到 5 之间的用户数据:

SELECT * FROM user WHERE uid BETWEEN 2 AND 5

2.字符串

除了数值类型外,BETWEEN 也支持字符串范围,如下选择出所有 username 介于 a 至 j 之间的用户(并包括单字母k/K):

SELECT * FROM user WHERE username BETWEEN 'a' AND 'k'

字符范围也支持汉字,但通常来说没什么意义。

3.BETWEEN 边界

虽然几乎所有的数据库都支持 BETWEEN ... AND 运算符,但不同的数据库对 BETWEEN ... AND 处理方式是有差异的。在 MySQL 中,BETWEEN 包含了 value1 和 value2 边界值,如上面选取 uid 在 2 到 5 之间的用户数据例子。

而有的数据库则不包含 value1 和 value2 边界值(类似于 > and = and

4.BETWEEN 时间日期

BETWEEN AND 常用于检索时间或日期段内的内容,下面是一些常见的 BETWEEN 时间日期例子:

// int 时间戳格式,查询 2008-08-08 20:00:00 到 2009-01-01零点之前的数据SELECT * FROM table WHERE column_time BETWEEN 1218196800 AND 1230739199

// DATE 格式,查询 2008-08-08 到 2009-01-01零点之前的数据SELECT * FROM table WHERE column_time BETWEEN '2008-08-08' AND '2009-01-01'

// DATETIME 格式,查询 2008-08-08 20:00:00 到 2009-01-01零点之前的数据SELECT * FROM table WHERE column_time BETWEEN '2008-08-08 20:00:00' AND '2008-12-31 23:59:59'但对于查询到当前时间的数据,建议使用>=运算符:// DATETIME 格式,查询 2008-08-08 20:00:00到当前时刻的数据SELECT * FROM table WHERE column_time >= '2008-08-08 20:00:00'

可见,同样的需求,不同的字段类型,写法可能就不一样。int 时间戳格式效率最优。

以上 BETWEEN 的各个例子,虽然都是 SELECT 查询,但 BETWEEN 也可以用于 UPDATE、DELETE 等适用 WHERE 表达式的 SQL 中。

5.BETWEEN 数据比较

BETWEEN 还具有数据比较功能,语法如下:

exprBETWEEN min AND max

当 expr 表达式的值大于或等于 min 且小于或等于 max 时, BETWEEN 的返回值为 1 ,否则返回 0 。利用这个功能,可以判断一个表达式或值否则在某个区间:

// 返回 0

SELECT 1 BETWEEN 2 AND 3

// 返回 1

SELECT 'b' BETWEEN 'a' AND 'c'

//判断日期范围SELECT 20080808 BETWEEN 20080101 AND 20090101

BETWEEN 与 =、> 等运算符在某些情况下有着类似的功能,但 BETWEEN 运算级别更高且效率上更甚一筹。当然由于 BETWEEN 存在边界值的问题而不够灵活,因此不同的情况,采用何种运算符,需要具体对待。

MySQL IN 用法

1.IN 运算符用于 WHERE 表达式中,以列表项的形式支持多个选择,语法如下:

WHERE column IN(value1,value2,...)WHERE column NOT IN (value1,value2,...)

当 IN 前面加上 NOT 运算符时,表示与 IN 相反的意思,即不在这些列表项内选择。

IN 使用实例

选取 uid 为 2、3、5 的用户数据:

SELECT * FROM user WHERE uid IN (2,3,5)

2.IN 子查询

更多情况下,IN 列表项的值是不明确的,而可能是通过一个子查询得到的:

SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=0)

在这个 SQL 例子里,我们实现了查出所有状态为 0 的用户(可能是被禁止)的所有文章。首先通过一个查询得到所有所有 status=0 的用户:

SELECT uid FROM user WHERE status=0

然后将查询结果作为 IN 的列表项以实现最终的查询结果,注意在子查询中返回的结果必须是一个字段列表项。

3.IN 运算符补充说明

IN 列表项不仅支持数字,也支持字符甚至时间日期类型等,并且可以将这些不同类型的数据项混合排列而无须跟 column 的类型保持一致:

SELECT * FROM user WHERE uid IN(1,2,'3','c')

一个 IN 只能对一个字段进行范围比对,如果要指定更多字段,可以使用 AND 或 OR 逻辑运算符:

SELECT * FROM user WHERE uid IN(1,2) OR username IN('admin','5idev')

使用 AND 或 OR 逻辑运算符后,IN 还可以和其他如 LIKE、>=、= 等运算符一起使用。

4.关于 IN 运算符的效率问题

如果 IN 的列表项是确定的,那么可以用多个 OR 来代替:

SELECT * FROM user WHERE uid IN (2,3,5)//等效为:SELECT * FROM user WHERE (uid=2 OR aid=3 OR aid=5)

一般认为,如果是对索引字段进行操作,使用 OR 效率高于 IN,但对于列表项不确定的时候(如需要子查询得到结果),就必须使用 IN 运算符。另外,对于子查询表数据小于主查询的时候,也是适用 IN 运算符的。

between和in的区别

如果要让选择的结果在某一个范围之内的话可以用between和in这两个关键字。大多数情况下二者的反映都是一样的,但是如果为空的情况就不一样了。如下:

WHERE vbeln BETWEEN pa_vb_s ANDpa_vb_e.WHERE VBELN IN pa_vb.

他们的定义如下:

SELECT-OPTIONS pa_vb FOR vbrk-vbeln.

PARAMETERS: pa_vb_s TYPE vbeln,

pa_vb_e TYPE VBELN.

如果他们都为空的话,between会限制select语句让它一条记录都无法选出来,但是in的话则相反,这个限制条件不会起任何作用,会选择出所有的记录。这是二者最大的区别。

但是有一个小小的陷阱,ranges变量和select-options感觉上时相同的。但是在用select语句的时候表现会不同。代码如下:

PARAMETERS: pa_vb_s TYPE vbeln,

pa_vb_e TYPE VBELN.

ranges pa_vbfor VBRK-vbeln.

pa_vb-sign = 'I'.

pa_vb-option = 'BT'.

PA_VB-LOW =PA_VB_S.

PA_VB-HIGH =PA_VB_E.

APPEND pa_vb.

此时如果用刚才的select语句用in去限制的话,也会一条都选不出来,跟踪程序发现就问题在append。如果用selct-options这句,在选择框里什么都不填的话,那么select-options这个ragnes变量里面是空值,就是内表记录数是0,相当于没有append。但是我们自定义ragnes变量的时候会append空值,即使没有输入。这样就和between的功效一样了。要想和selct-options的作用一样这样写就可以了。

IF PA_VB_S IS NOT INITIAL or PA_VB_E IS NOTINITIAL.

APPEND pa_vb.

ENDIF.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_31748605/article/details/113905971

智能推荐

java servlet原理_servlet运行原理_林宇诚的博客-程序员宅基地

一、Servlet运行周期Servlet运行在Servlet容器中,其生命周期由容器来管理。Servlet的生命周期通过javax.servlet.Servlet接口中的init()、service()和destroy()方法来表示。Servlet的生命周期包含了下面4个阶段:(1)加载和实例化Servlet容器负责加载和实例化Servlet。当Servlet容器启动时,或者在容器检测到需要这个S...

FreeRTOS-07内核控制函数_weixin_30425949的博客-程序员宅基地

根据正点原子FreeRTOS视频整理单片机:STM32F207VCFreeRTOS源码版本:v10.0.1内核控制函数:转载于:https://www.cnblogs.com/seifguo/p/9493049.html

机房收费系统重构之SQLhelper的理解_起个昵称好难呀q的博客-程序员宅基地

在敲完登录以后,随着越来越来功能实现,发现有时候在一个窗体中就有可能访问3`4张表,这样没访问一遍数据库就写一遍连接语句,显然不符合我们设计原则。所以这时候就需要我们去想办法把这些重复的代码进行封装,提高代码的复用性。所以SQLHelper就顺应时代出现了。下面简单介绍一下:定义: SqlHelper用于简化你重复的去写那些数据库连接(SqlConnection),SqlCommand,

Ajax_valentinelzt的博客-程序员宅基地

Ajax实现原理// 创建Ajax对象var xhr = new XMLHttpRequest()// 告诉Ajax请求地址以及请求方式xhr.open('get', 'http://www.example.com')// 发送请求xhr.send()// 获取服务端给与客户端的响应数据xhr.onload = function(){ console.log(xhr.respon...

高德地图多边形坐标串转数组,实现多边形重现(就是当时画的多边形网格再给拼出来:))_你是我的youaremine的博客-程序员宅基地

有使用过高德地图的网格的朋友应该知道,在绘制完网格以后可以获取一组坐标点,然后将这组坐标点保存起来以便显示的时候用。可是万事具备的时候,突然发现用这个串的时候,竟然用不了,当时个人上网搜了一通发现就是没有解决方案,感觉是自己的道行还尚浅,实在没有办法了就自己整了个方法,将数据库中查出的串自己搞了一个二维数组来存储,直接实现了从数组转成多边形的过程,贴出源码,大家一起来~,以上及以下是自己的一...

《自然语言处理技术:Python实战》第一章 初识自然语言处理技术(1.3)_feiwen110的博客-程序员宅基地

1.3 基于GMM-HMM算法的语音识别准备数据集数据预处理导入第三方库from python_speech_features import mfccfrom scipy.io import wavfilefrom hmmlearn import hmmimport joblibimport numpy as npimport os定义 生成训练标签 函数# 生成wavdict,key=wavid,value=wavfiledef gen_wavlist(wavpat

随便推点

计算机电源分金牌,机·科普贴:电脑电源金、银、铜牌到底是什么意思?_抓根的博客-程序员宅基地

原标题:机·科普贴:电脑电源金、银、铜牌到底是什么意思?POWER玩家在选购电脑时,普遍看重强劲的CPU和显卡以及多大容量的内存和硬盘。很少有人关心电源的选择。但作为电脑能源的供给中心,电源始终是最容易被人忽略的一个点。好的电源不仅可以让电脑运行更为稳定,同时寿命方面也更加耐用。而差的电源能够带给玩家的更多是“烈士”墙。 在选购电源时,很多玩家都对电源的铜牌、银牌、金牌、白金牌等产生疑问,那么到底...

选择一个以太坊客户端_小曦阳哟的博客-程序员宅基地

选择一个以太坊客户端开发时选择GANACHEGANACHE是一个运行在个人桌面上的上的以太坊开发者的个人区块链。GANACHE是Truffle Suite的一部分,通过把合约和交易放到前面来简化dapp的开发。通过使用GANACHE,你可以快速的看到你的应用是如何影响区块链的。其中细节:如你的账户、余额、合约及Gas成本。你也可以调整Ganache’s的采矿控制来更好的适用你的

html5设计原理_haorantiangang的博客-程序员宅基地

避免不必要的复杂性下面我就给大家介绍一些这份文档中记载的设计原理。第一个,非常简单:避免不必要的复杂性。好像很简单吧。我用一个例子来说明。假设我使用HTML 4.01规范,我打开文档,输入doctype。这里有人记得HTML 4.01的doctype吗?好,没有,我猜没有。除非……我的意思是说,你是傻冒。现场恐怕真有人背过,这就是HTML 4.01的doctype:view s

python cx_oracle_cx_Oracle是一个在Python中连接Oracle数据库_严强强的博客-程序员宅基地

cx_Oracle是一个在Python中连接Oracle数据库并取数据的包(不清楚是否为唯一的包)配置方法-1,关于Oracle数据库首先我是安装了正常的完整能用的Oracle的,但是还是建议下一个InstantClient,在Oracle的官网应该有。2,关于安装cx_OracleWINDOWS下,使用pipinstall是没用的(看了一眼,似乎是因为只提供tag.gz文件的原因)可以直接去cx...

[转]SIFT,SURF,ORB,FAST 特征提取算法比较_weixin_33913377的博客-程序员宅基地

转载地址:https://blog.csdn.net/vonzhoufz/article/details/46461849主要的特征检测方法有以下几种,在一般的图像处理库中(如opencv, VLFeat, Boofcv等)都会实现。FAST ,Machine Learning for High-speed Corner Detection, 2006SIFT,Distinctiv...

原生JS实现表单序列化serialize()_weixin_30593261的博客-程序员宅基地

有一个form表单,要用AJAX后台提交,原来想拼接json,但是数据多了麻烦,不灵活。用HTML5的FormData来初始化表单var formdata=new FormData(document.getElementById("advForm"));看似还可以,但发现有两个问题,一,formdata.get()方法不知为什么用不了二,Form Data 数据格...

推荐文章

热门文章

相关标签