将sql查询结果作为一个表来查询的时候的一些注意事项

因为工作,发现了这种sql的写法,但是有的时候感觉并不是自己想要的结果,自己试着玩了属于是

简单来说,这个查询并不是拼接结果的,而是将结果按照一个表来进行sql查询的

表结构,表数据如下

或者将表建好以后插入进去

INSERT INTO `test`.`cpcitemtest`(`itemid`, `itemcode`, `cpctest`, `cpcbom`) VALUES ('12321421', '1242142312', '43254634', '57658654');

INSERT INTO `test`.`testcpcbom`(`testid`, `itemid`, `cpcbomid`) VALUES (12345, '12', '54321');

运行下面的sql

SELECT
ct.itemid AS ct的itemid,
ct.itemcode AS ct的itemcode,
tc.itemid AS tc的itemid
FROM
cpcitemtest ct,(
SELECT t.*
FROM
testcpcbom t
WHERE
t.itemid LIKE '123%'
) tc

可以得到

但是运行下面的这段时

SELECT
ct.itemid AS ct的itemid,
ct.itemcode AS ct的itemcode,
tc.itemid AS tc的itemid,
td.itemid AS td的itemid
FROM
cpcitemtest ct,(
SELECT t.*
FROM
testcpcbom t
WHERE
t.itemid LIKE '1234567%'
) tc,
( SELECT a.* FROM testcpcbom a WHERE a.itemid LIKE '12%' ) td

结果却是

单独运行

SELECT a.* FROM testcpcbom a WHERE a.itemid LIKE '12%'

是有值的

但是

SELECT t.* FROM testcpcbom t WHERE t.itemid LIKE '1234567%'

是没有值的

说明在这种查询之中,有一个表查询出的结果为空时,切记不能放进总的查询中,会使查出的结果为空,即便别的有数据也没用

而且,将sql改成下面有结果的

SELECT
ct.itemid AS ct的itemid,
ct.itemcode AS ct的itemcode,
tc.itemid AS tc的itemid,
td.itemid AS td的itemid
FROM
cpcitemtest ct,(
SELECT t.*
FROM
testcpcbom t
WHERE
t.itemid LIKE '123456%'
) tc,
( SELECT a.* FROM testcpcbom a WHERE a.itemid LIKE '12%' ) td

结果(方便看,将ct中的itemcode改成了1和2)为

明明两个表中的数据都只有两行,为什么会出现四行的数据呢

再修改sql为

SELECT
ct.itemid AS ct的itemid,
ct.itemcode AS ct的itemcode,
tc.itemid AS tc的itemid,
td.itemid AS td的itemid
FROM
cpcitemtest ct,(
SELECT t.*
FROM
testcpcbom t
WHERE
t.itemid LIKE '123456%'
) tc,
( SELECT a.* FROM testcpcbom a WHERE a.itemid LIKE '123456%' ) td

结果为

此时结果又成为了两行数据

大概猜测:这种方法查出的结果是按照从第一个表开始查询,然后拿到结果,在查询第二个,在输出第二个查询的结果时,每一次输出结果都会将前面的结果带出来,以此类推,也就是说,如果第一个表中的结果有两行,第二的查询的结果有两行,第三个查询的结果有一行,则总的结果集就一共有2×2×1=4行结果,那么在所有的结果都能查出两行的时候,应该有8行结果

修改sql试试

SELECT
ct.itemid AS ct的itemid,
ct.itemcode AS ct的itemcode,
tc.itemid AS tc的itemid,
td.itemid AS td的itemid
FROM
cpctest ct,(
SELECT t.*
FROM
testcpc t
WHERE
t.itemid LIKE '12%'
) tc,
( SELECT a.* FROM testcpcbom a WHERE a.itemid LIKE '12%' ) td

结果8行

所以这个结果并不是拼接的,而是和普通sql一样

多字段之间的模糊查询

平常是使用like去模糊匹配一下固定的字段

但是有的时候并不能符合自己的需要,所以要查询字段的值

可以使用

A.ITEM LIKE '%'+B.ITEMID+'%'

以上

SELECT...FROM 表 a,( SELECT...FROM...WHERE...) tc...的一些注意以及多字段之间的模糊查询的更多相关文章

  1. 某表含有N个字段超精简模糊查询方法

    我们在做多个字段模糊查询时,是不是觉得非常麻烦?比如我要模糊查询某表多个字段存在某数据时,如下 select * from table where a like '%key%' or b  like ...

  2. 【摘录】某表含有N个字段超精简模糊查询方法

    SELECT * FROM  table where CONCAT(a,b,c......) like '%key%' select name from syscolumns where id=obj ...

  3. mysql数据库从删库到跑路之select单表查询

    一 介绍 本节内容: 查询语法 关键字的执行优先级 简单查询 单条件查询:WHERE 分组查询:GROUP BY HAVING 查询排序:ORDER BY 限制查询的记录数:LIMIT 使用聚合函数查 ...

  4. Oracle 表分组 group by和模糊查询like

    分组group by写法 select 字段名 from 表名 group by 字段名 查询这个字段名里的种类分组后可以加聚合函数select 字段名,聚合函数 from 表名 group by 字 ...

  5. 避免SQL全表模糊查询查询

    1.模糊查询效率很低: 原因:like本身效率就比较低,应该尽量避免查询条件使用like:对于like %...%(全模糊)这样的条件,是无法使用索引的,全表扫描自然效率很低:另外,由于匹配算法的关系 ...

  6. mysql关联模糊查询他表字段

    如下:订单表关联了用户的id(多个),要根据用户名模糊查询订单信息,但是订单表只有id.创建视图用不着,咱也没权限.于是如下 SELECT * FROM ( SELECT cu.id AS 'id', ...

  7. 避免SQL全表模糊查询查询 下载文件时-修改文件名字

    避免SQL全表模糊查询查询   1.模糊查询效率很低: 原因:like本身效率就比较低,应该尽量避免查询条件使用like:对于like %...%(全模糊)这样的条件,是无法使用索引的,全表扫描自然效 ...

  8. Oracle下批量将一个用户的所有表的select权限赋值给另外一个用户

    起因 为什么会有这篇文章呢? 因为最近在做项目的时候遇到一个问题...实际生产环境中程序datasource登陆的Oracle数据库用户user1不是我们创建的.这个用户没有访问我们业务表的权限(因为 ...

  9. select 多表查询

    连接查询实际上是通过各个表之间共同列的关联性来查询数据的,它是关系数据库查询最主要的特征. select 表1.字段名1,表2.字段名2,... from 表1,表2 where 连接条件 连接查询分 ...

  10. Oracle ——————建表、select、视图

    --建表 -- 关键字 : create -- 用法 : /* create table table_name ( lie1_name 数据类型 是否为空, lie2_name 数据类型 是否为空, ...

随机推荐

  1. 音标 重音 u 用 中文 吁 去记忆 骑马让马停下来的 吁 - 英语

    音标 重音 u 用 中文 吁 去记忆 骑马让马停下来的 吁

  2. manjaroLinux-xfce4设置显示桌面快捷键

    1.打开窗口快捷键 2.寻找显示桌面 3.设置快捷键 啊!简单的我都不想写了,这不是为让像以前的"我"--小白,食用性更好一点吗?

  3. MySql注入—DNS注入

    MySql注入-DNS注入 1.DNS注入原理 一.DNS注入原理 DNS注入,是通过查询相应DNS解析产生的记录日志来获取想要的数据 对于sql盲注这样的方法常常用到二分法,非常麻烦而且没有回显,要 ...

  4. jsp转换成html

    相信很多人都希望自己的页面越快越好,最好是能静态的,提高客户访问速度.也便于搜索引擎搜索.所以,就希望我们的动态读取数据库的页面,尽可能的生成静态页面.一下系列文章,介绍一下个人的解决方案.      ...

  5. Performance Improvements in .NET 8 -- Exceptions & Reflection & Primitives【翻译】

    Exceptions 在 .NET 6 中,ArgumentNullException 增加了一个 ThrowIfNull 方法,我们开始尝试提供"抛出助手".该方法的目的是简洁地 ...

  6. JSON转换为CSV

    <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> ...

  7. multisim的支路及总线设计

    Multisim的支路及总线设计 1.实验原理 最近在使用multisim设计时,用到了总线和支路设计,这里记录一下,方便以后查阅相关操作.其中主要是总线的使用和支路连接器的使用. 2.实验操作 (1 ...

  8. C++中自定义事件与委托

    自定义事件,和委托其实是一类操作. 在蓝图中都表现为红色方块. 自定义事件通过DECLARE_EVENT(ClassName, EventName)来创建一个属于ClassName的EventName ...

  9. 一篇文章了解CI/CD管道全流程

    从CI/CD过程开始,包含所有阶段并负责创建自动化和无缝的软件交付的一系列步骤称为CI/CD管道工作流.使用CI/CD管道,软件发布工件可以从代码提交阶段到测试.构建.部署和生产阶段在管道中移动和前进 ...

  10. 关于 ThreadLocal 你需要知道的几点

    一.ThreadLocal是什么? 一个类对象类型,提供属线程本地变量,也就是同一个变量对不同线程保存了不同的值,但是和线程自身定义的自属变量不同. 通常以私有静态类型定义,用以保存特定线程特定状态属 ...