mysql中 where in 用法详解

 

 

https://blog.csdn.net/haibo0668/article/details/52584307

 

 

 

 

sssss

mysql中 where in 用法详解

我是高手高手高高手 2016-09-19 11:33:29  102915  收藏 14

分类专栏: php MY SQL



这里分两种情况来介绍

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

 

1、in 后面是记录集,如:

select  *  from  table  where   uname  in(select  uname  from  user); 

例子:

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 的列表项以实现最终的查询结果,注意在子查询中返回的结果必须是一个字段列表项。

 

2、in 后面是字符串,如:

select  *  from  table  where   uname  in('aaa',bbb','ccc','ddd','eee',ffff''); 

注意:这里一定要将字符串用单引号'' 标注起来;

 

3、in 后面是数组,用如下方法,请参考:

//$pieces是含数据的数组

for($i=0;$i<count($pieces);$i++){

$uname=$uname."'".$pieces[$i]."',";

}

$the_uname ="uname in(".$uname."'')";

select  *  from  table  where    ".$the_uname." ;

备注:这种方法的原理其实很简单,二就是把数组编程上面“第2种情况”的形式

 

 

 

mysql中使用FIND_IN_SET查询在逗号隔开的字符串中符合多个ID的数据

 

 

FIND_IN_SET(str,strlist)函数   它不同于 like 模糊查询,它是以“,”来分隔值

str 要查询的字符串

strlist 字段名 参数以”,”分隔 如 (1,2,6,8)

查询字段(strlist)中包含(str)的结果,返回结果为null或记录

下面举例说明

test表中有如下字段及值

下面我想查询area中包含”1″这个参数的记录

SELECT * from test where FIND_IN_SET('1',area)

返回值

下面查询btype字段中包含”15″这个参数的值

SELECT * from test where FIND_IN_SET('15',btype)

返回值

 

 

 

 

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

 
  1. WHERE column BETWEEN value1 AND value2

  2. WHERE column NOT BETWEEN value1 AND value2

通常 value1 应该小于 value2。当 BETWEEN 前面加上 NOT 运算符时,表示与 BETWEEN 相反的意思,即选取这个范围之外的值。
BETWEEN 实例
选取 uid 在 2 到 5 之间的用户数据:

SELECT * FROM user WHERE uid BETWEEN 2 AND 5

返回查询结果如下:

20151216160201795.png (639×132)

除了数值类型外,BETWEEN 也支持字符串范围,如下选择出所有 username 介于 a 至 j 之间的用户(并包括单字母k/K):
SELECT * FROM user WHERE username BETWEEN 'a' AND 'k'
字符范围也支持汉字,但通常来说没什么意义。
MySQL BETWEEN 边界
虽然几乎所有的数据库都支持 BETWEEN ... AND 运算符,但不同的数据库对 BETWEEN ... AND 处理方式是有差异的。在 MySQL 中,BETWEEN 包含了 value1 和 value2 边界值,如上面选取 uid 在 2 到 5 之间的用户数据例子。
而有的数据库则不包含 value1 和 value2 边界值(类似于 > and <),也有数据库包含 value1 而不包含 value2(类似于 >= and <)。所以在使用 BETWEEN ... AND 的时候,请检查你的数据库是如何处理 BETWEEN 边界值的。
MySQL BETWEEN 时间日期
BETWEEN AND 常用于检索时间或日期段内的内容,下面是一些常见的 BETWEEN 时间日期例子:

 
  1. // int 时间戳格式,查询 2008-08-08 20:00:00 到 2009-01-01 零点之前的数据

  2. SELECT * FROM table WHERE column_time BETWEEN 1218196800 AND 1230739199

  3.  
  4. // DATE 格式,查询 2008-08-08 到 2009-01-01 零点之前的数据

  5. SELECT * FROM table WHERE column_time BETWEEN '2008-08-08' AND '2009-01-01'

  6.  
  7. // DATETIME 格式,查询 2008-08-08 20:00:00 到 2009-01-01 零点之前的数据

  8. SELECT * FROM table WHERE column_time BETWEEN '2008-08-08 20:00:00' AND '2008-12-31 23:59:59'

  9. 但对于查询到当前时间的数据,建议使用 >= 运算符:

  10. // DATETIME 格式,查询 2008-08-08 20:00:00 到当前时刻的数据

  11. SELECT * FROM table WHERE column_time >= '2008-08-08 20:00:00'

  12.  

可见,同样的需求,不同的字段类型,写法可能就不一样。从效率上来讲,int 时间戳格式效率最优。
以上 BETWEEN 的各个例子,虽然都是 SELECT 查询,但 BETWEEN 也可以用于 UPDATE、DELETE 等适用 WHERE 表达式的 SQL 中。
MySQL BETWEEN 数据比较
BETWEEN 还具有数据比较功能,语法如下:

expr BETWEEN min AND max

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

 
  1. // 返回 0

  2. SELECT 1 BETWEEN 2 AND 3

  3. // 返回 1

  4. SELECT 'b' BETWEEN 'a' AND 'c'

  5. // 判断日期范围

  6. SELECT 20080808 BETWEEN 20080101 AND 20090101

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

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

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

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

当 IN 前面加上 NOT 运算符时,表示与 IN 相反的意思,即不在这些列表项内选择。
IN 使用实例
选取 uid 为 2、3、5 的用户数据:

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

返回查询结果如下:

20151216160410446.png (638×104)

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 的列表项以实现最终的查询结果,注意在子查询中返回的结果必须是一个字段列表项。
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、>=、= 等运算符一起使用。
关于 IN 运算符的效率问题
如果 IN 的列表项是确定的,那么可以用多个 OR 来代替:

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

  2. // 等效为:

  3. SELECT * FROM user WHERE (uid=2 OR aid=3 OR aid=5)

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

 

 

 

出处:http://blog.csdn.net/k8080880/article/details/8482659 

http://www.jb51.net/article/76517.htm



 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Servlet使用适配器模式进行增删改查案例(Dept.java)

package org.entity;/*** * * 项目名称&#xff1a;test_BaseDao * 类名称&#xff1a;Dept * 类描述&#xff1a; 部门表的实体类 * 创建人&#xff1a;Mu Xiongxiong * 创建时间&#xff1a;2017-9-13 上午8:44:37 * 修改人&#xff1a;Mu Xiongxiong *…

HashSet的存储方式

存储结构 存储过程

使用org.apache.commons.io.FileUtils,IOUtils工具类操作文件

转载自 使用org.apache.commons.io.FileUtils,IOUtils;工具类操作文件 File src new File("G:/2012/portal/login.jsp"); File tar new File("G:/2012/portal/loginZs.jsp"); File tarDir new File("G:/2012/portal/center/"); FileUti…

写给新手的WebAPI实践

此篇是写给新手的Demo&#xff0c;用于参考和借鉴&#xff0c;用于发散思路。老鸟可以忽略了。 自己经常有这种情况&#xff0c;遇到一个新东西或难题&#xff0c;在了解和解决之前总是说“等搞定了一定要写篇文章记录下来”&#xff0c;但是当掌握了之后&#xff0c;就感觉好简…

用limit 实现java的简单分页

https://blog.csdn.net/xinyuezitang/article/details/84324359 用limit 实现java的简单分页 xinyuezitang 2018-11-21 16:01:13 4447 收藏 9 分类专栏&#xff1a; Java 小Demo 文章标签&#xff1a; 分页 limit mysql 实现java分页 版权 一 mysql 中limit 用法 select …

Map集合的遍历

COPY/*** Map接口的使用* 特点&#xff1a;1.存储键值对 2.键不能重复&#xff0c;值可以重复 3.无序*/ public class Demo1 {public static void main(String[] args) {Map<String,Integer> mapnew HashMap<String, Integer>();//1.添加元素map.put("tang&qu…

Servlet使用适配器模式进行增删改查案例(IBaseDaoUtil.java)

/*** */ package org.dao;import java.util.List;/*** * * 项目名称&#xff1a;test_BaseDao * 类名称&#xff1a;IBaseDaoUtil * 类描述&#xff1a; 公共接口 * 创建人&#xff1a;Mu Xiongxiong * 创建时间&#xff1a;2017-9-10 上午11:02:57 * 修改人…

Mybatis使用IN语句查询

https://blog.csdn.net/u011781521/article/details/79669180 Mybatis使用IN语句查询 lfendo 2018-03-23 16:45:03 201525 收藏 140 分类专栏&#xff1a; MyBatis 文章标签&#xff1a; mybatis JAVA sql 版权 一、简介 在SQL语法中如果我们想使用in的话直接可以像如下一…

IdentityServer4 实现 OpenID Connect 和 OAuth 2.0

关于 OAuth 2.0 的相关内容&#xff0c;点击查看&#xff1a;ASP.NET WebApi OWIN 实现 OAuth 2.0 OpenID 是一个去中心化的网上身份认证系统。对于支持 OpenID 的网站&#xff0c;用户不需要记住像用户名和密码这样的传统验证标记。取而代之的是&#xff0c;他们只需要预先在一…

Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

转载自 Java动态代理机制详解&#xff08;JDK 和CGLIB&#xff0c;Javassist&#xff0c;ASM&#xff09; class文件简介及加载 Java编译器编译好Java文件之后&#xff0c;产生.class 文件在磁盘中。这种class文件是二进制文件&#xff0c;内容是只有JVM虚拟机能够识别的机器码…

Servlet使用适配器模式进行增删改查案例(IDeptDao.java和IEmpDao.java)

这两个接口进行放置emp和dept单独接口 /*** */ package org.dao;import org.entity.Dept;/*** * * 项目名称&#xff1a;test_BaseDao * 类名称&#xff1a;IDeptDao * 类描述&#xff1a; 部门的私有接口&#xff0c;此接口专属于部门独立的功能公共的都在IBaseDaoUt…

彻底理解JAVA动态代理

转载自 彻底理解JAVA动态代理 代理设计模式 定义&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。 代理模式的结构如下图所示。 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念。 代理模式示例代码 public interface Subject { pu…

docker 安装redis 挂载到宿主机

1.首先去redis获取对应版本的配置文件redis.conf&#xff1a; http://download.redis.io/releases/ 我选择的是 6.0.9 解压以后 有一个redis.conf 2.将 bind 127.0.0.1注释&#xff0c;daemonize yes注释掉&#xff0c;如果需要redis密码则找到 requirepass 并填上你的密码 …

Servlet使用适配器模式进行增删改查案例(BaseDaoUtilImpl.java)

/*** */ package org.dao.impl;import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;import org.dao.BaseDao; import org.entity.Dept; import org.entity.Emp;/*** * * 项目名称&#xff1a;test_BaseDao …

搭建consul 集群

上图是官网提供的一个事例系统图&#xff0c;图中的Server是consul服务端高可用集群&#xff0c;Client是consul客户端。consul客户端不保存数据&#xff0c;客户端将接收到的请求转发给响应的Server端。Server之间通过局域网或广域网通信实现数据一致性。每个Server或Client都…

Java类加载的那些事

转载自 Java类加载的那些事 前言 Java源代码被编译成class字节码&#xff0c;最终需要加载到虚拟机中才能运行。整个生命周期包括&#xff1a;加载、验证、准备、解析、初始化、使用和卸载7个阶段。 加载 1、通过一个类的全限定名获取描述此类的二进制字节流&#xff1b; …

JAVA集合(笔记)

集合简介 概念&#xff1a;对象的容器&#xff0c;定义了对多个对象进项操作的的常用方法。可实现数组的功能。和数组的区别&#xff1a; 数组长度固定&#xff0c;集合长度不固定。数组可以存储基本类型和引用类型&#xff0c;集合只能存储引用类型。 位置&#xff1a; jav…

部署kafka kafka的service容器和zookeeper kafka客户端 Elasticsearch的客户端

创建network docker network create -d overlay --attachable loc_net docker stack up -c kafka.yml kafka docker stack up -c kafdrop.yml kafdrop docker stack up -c els.yml els docker stack ls docker service ls 查看service的启动错误原因 docker service ps d…

Servlet使用适配器模式进行增删改查案例(DeptDaoImpl.java)

/*** */ package org.dao.impl;import java.util.List;import org.dao.IDeptDao; import org.entity.Dept;/*** * * 项目名称&#xff1a;test_BaseDao * 类名称&#xff1a;DeptDaoImpl * 类描述&#xff1a; 部门的实现类* 创建人&#xff1a;Mu Xiongxiong * 创建…