mysql中 where in 用法详解

这里分两种情况来介绍

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 的用户:

[sql] view plain copy
 
  1. 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 一起搭配使用,语法如下:

[sql] view plain copy
 
  1. WHERE column BETWEEN value1 AND value2  
  2. WHERE column NOT BETWEEN value1 AND value2  

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

[sql] view plain copy
 
  1. 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 时间日期例子:

[sql] view plain copy
 
  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'  

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

[sql] view plain copy
 
  1. expr BETWEEN min AND max  

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

[sql] view plain copy
 
  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 表达式中,以列表项的形式支持多个选择,语法如下:

[sql] view plain copy
 
  1. WHERE column IN (value1,value2,...)  
  2. WHERE column NOT IN (value1,value2,...)  

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

[sql] view plain copy
 
  1. 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 的用户:

[sql] view plain copy
 
  1. SELECT uid FROM user WHERE status=0  

然后将查询结果作为 IN 的列表项以实现最终的查询结果,注意在子查询中返回的结果必须是一个字段列表项。
IN 运算符补充说明
IN 列表项不仅支持数字,也支持字符甚至时间日期类型等,并且可以将这些不同类型的数据项混合排列而无须跟 column 的类型保持一致:

[sql] view plain copy
 
  1. 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 来代替:

[sql] view plain copy
 
  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

 
阅读更多
posted @ 2018-04-27 08:52  阿波罗任先生  阅读(4651)  评论(0编辑  收藏  举报