mysql学习之三大子查询(where,from,exist)

     where子查询(内层的查询结果作为外层的比较条件)

假设一个商品表中有多种商品(catalog_id),每种商品上架都有时间先后。要查询每种商品最新的商品名字和id。

先把问题简单化,我们只查询整个商品表中最新上架的那个商品的id和名字。可用:select goods_id,goods_name from goods order by goods_id desc limit 0,1;

     把good_id降序排列,再用limit取一位。

上面的sql语句虽然可以实现,但是不推荐,原因是用到了order by排序。排序是非常耗费资源的行为,而且如果数据量非常大,速度会变慢。

那么,不使用order by该如何完成上面的查询呢?

我们选择where子查询。

select goods_id,goods_name from goods where goods_id = (select max(goods_id) from goods);

select max(goods_id) from goods子句返回的就是商品中最新的id。


这样我们再看一开始的问题就变得非常简单。

select goods_id,goods_name from goods where goods_id in (select max(goods_id) from goods group by cat_id);

因为子句查询的goods_id有多个,所以这里用in。


from子查询

from子查询相对简单,就是将子句看做一张表。

例如:select goods_id,cat_id,goods_name from (select * from goods where 1 order by cat_id asc,goods_id desc) as temp group by cat_id;(as temp就是将查到的 数据作为临时temp表)


exist子查询

 要查询栏目下有商品的所有栏目的信息。

select * from category where exists(select * from goods where goods.cat_id=category.cat_id);

先判断子句是否成立,即商品表里的cat_id和栏目表里的cat_id是否相等,相等就代表这个栏目下有商品。如果有,就代表存在。用exists就能找到数据了。


还需要好好努力啊!

### MySQL EXISTS 查询语句的使用方法 `EXISTS` 是一种在 SQL 中常用的谓词,主要用于检测子查询是否返回任何行。如果子查询至少返回一行数据,则 `EXISTS` 的结果为真;否则为假。 以下是关于 `EXISTS` 的详细介绍及其用法: #### 基本语法 `EXISTS` 的基本语法如下所示: ```sql SELECT column_name(s) FROM table1 WHERE EXISTS ( SELECT 1 FROM table2 WHERE table1.column = table2.column); ``` 在这个例子中,外层查询依赖于内层子查询的结果来决定哪些记录应该被检索出来[^3]。 #### 工作原理 - 当执行带有 `EXISTS` 的查询时,数据库引擎会逐一检查外层表中的每一行。 - 对于每一条记录,它都会运行一次子查询以判断是否存在满足条件的数据。 - 如果子查询找到匹配项,则当前行会被加入到最终结果集中。 #### 示例代码 假设有一个名为 `customers` 的客户表和一个名为 `orders` 的订单表。现在我们需要找出那些已经下过单的顾客的信息。 可以这样写这个查询: ```sql SELECT * FROM customers c WHERE EXISTS ( SELECT 1 FROM orders o WHERE c.customer_id = o.customer_id); ``` 上述SQL语句的作用是从 `customers` 表里选出所有曾经有过对应订单记录的客户列表。 #### 性能考虑 相比起 `IN` 或者其他形式的连接操作,在某些情况下使用 `EXISTS` 可以带来更好的性能表现,因为它一旦发现符合条件的第一条记录就会停止继续查找剩余部分[^4]。 #### 处理 NULL 值的情况 需要注意的是,即使子查询中有 null 值存在也不会影响整个表达式的评估过程,只要有一条非null的有效记录即可让exists成立。 --- ### 结合实际应用场景分析 通过上面的例子可以看出,当我们想要基于两个不同表格之间的关联关系来做筛选的时候,“exist”就显得特别有用处了。比如人力资源管理系统里面要统计各个部门有多少员工在职状态正常等等都可以采用类似的思路构建相应的select命令串连起来完成需求目标达成目的[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值