
现有js表如上图所示
SELECT * FROM `js`
WHERE Tno IN('T001');
这是最基本的查询语句,要注意带单引号
-- 会报错
SELECT * FROM `js`
WHERE Tno IN(T001);
现在考虑能不能不把IN函数中的内容罗列出来
CREATE TABLE tmp(
tnoo VARCHAR(5)
);
INSERT INTO tmp VALUES('T002'),('T003');
SELECT * FROM `js`,`tmp`
WHERE Tno IN(`tmp`.tnoo);
结果如下:

如果再对tmp表插入两行
INSERT INTO tmp VALUES('T002'),('T003');
SELECT `js`.* FROM `js`,`tmp`
WHERE Tno IN(`tmp`.tnoo);
就会出现这样的结果:

想要解决这个问题,可以用distinct。
由此可见IN函数的算法相当于是两层for循环嵌套,当匹配不break
同理,IN函数可以嵌套SELECT
SELECT `js`.* FROM `js`,`tmp`
WHERE Tno IN(
SELECT `js`.`Tno` FROM `js` WHERE Tsex='男'
);
这里有一个问题,from后面不可以加tmp,正确结果是5行,加了tmp后会先做笛卡尔积,会出现5n行(n为tmp中列为合法值的列数)。
本文探讨了MySQL中SELECT嵌套和IN函数的使用,特别是在避免数据重复和优化查询效率方面。通过示例展示了如何利用DISTINCT解决IN函数带来的冗余结果,并解释了IN函数内部的算法原理,同时提醒了在使用IN与SELECT嵌套时避免产生笛卡尔积的错误做法。

833

被折叠的 条评论
为什么被折叠?



