所有内容收录在合集~SQL入门到熟练。欢迎点赞关注我哦~
Complex Queries终于可以写复杂一点的查询了。
之前的所有内容都是基础,就像你语文课学会了简单的句子一样,接着就开始复杂的句子学习,也就是让句子有更好的表达,方便交流和执行。
主要运用的是之前学过的查询,子查询是另一个查询中的选择语句
第一步,写一段子查询,需要用到的是内查询和外查询
1 子查询 Subqueries
比如我想找到所有比payment_id3支付金额高的订单
就像写嵌套函数先写里面的,再一层一层括起来一样,先写这些。
select amount
from sakila.payment
where payment_id=3
然后括号括起来,再前面进行添加,
select *
from sakila.payment
where amount >
然后执行,得到的就是大于id3的支付结果。
同样的逻辑,看其他人写的表达,也可以get到具体的意思。
比如下面这个,就是运用avg函数和子查询,得出了一个高于平均值的数据。
2 IN运算符
其实IN 和NOT IN 一样的逻辑。
比如上面那个表不要看到没有数据的值,也是直接写。
3 子查询VS连接 Subqueries VS Joins
前面说过连接有内连接和外连接,外连接有左连接和右连接,其中主要运用左连接。
对于SQL来说,表现和可读性,决定怎么写查询执行会更快。
子查询的一些内容和结果和连接非常相似,
假设两种查询执行时间一样,肯定选更容易读的查询。
容易读的查询就是和你目标更一定的,一眼可以看出的,比如上面的找出没有数据的值,上面的写法一眼就可以看出在做什么。
所以需要自己花时间,研究和对比,哪些代码更容易运用,也就是可读性和执行更好。
举个例子,一个大神写的代码,对比的是连接和子查询,先看子查询,这个看起来有点麻烦,各种列选择了好几个,然后连接2个表格进行了对比,最终执行。
然后对比连接的,连接的更清晰易读,很清晰的可以看出在不同的两个表里,要寻找什么,信息也非常清楚。
4 The ALL Keyword
假设我是一个拼多多的店主,有一天我对第一个顾客很感兴趣,于是我打开电脑,找出了他支付的最大金额,好吧,是9.99元。
现在我可以用这段查询作为一个子查询,寻找所有的金额大于9.99的订单。
所以我还是直接添加括号,然后老样子,
select *
from sakila.payment
where amount>
然后执行得出结果。
这个是刚才一直在用的方法,那么这个小标题是ALL,所以接下来用ALL来解决这个问题。
还是先写一个准备的值。
这次不用MAX函数,特别注意括号里面select后面紧跟的,一定是一列,不然就会报错。
select *
from sakila.payment
where amount>(select amount
from sakila.payment
where customer_id=1)
运行得到顾客1所有的订单。
Error Code: 1242. Subquery returns more than 1 row
因为 顾客1有很多的订单,所以报错了,MYSQL无法对比这些值。
这个时候前面加一个ALL,就会得到所有大于顾客1所有订单金额的订单。
如果不想用表格里面的数字,也可以自行设置数字。
比如:>ALL(10,20,30,...) 然后执行操作的时候,每行会自动按照顺序进行比较,如果金额大于所有的这些值,那么这行就会反应在最终的结果集。
子查询有时候会返回单一值,有时候会返回一列值,有时候会返回一张表。
5 ANY关键字 The ANY Key
学了ALL,还有ANY和SOME,这是一样的。
使用这2个关键词,可以得到任意的大于一定金额的行。
先找出按照顾客id的购买记录。
假设我只想要一个购买记录大于40的客户,我可以写,然后得到大于40的记录,一共有五个。
然后我想看到这些客户的全部信息,那么我在前面进行添加,注意要删掉第一个count(*),不然无法运行。
同样的,解决问题的方法不知有一种,所以还可以用=运算符,然后添加any,意思就是查询返回其中的任何一个,就会返回最终结果。
总结:
1 子查询的特点就是在后面的部分加了一个括号。
2 MAX函数和ALL关键字可以互换,注意一些细节的调整。
3 IN和=ANY也可以直接互换。
完结~
页面更新:2024-04-30
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号