Update Task04:集合运算.md
This commit is contained in:
@@ -39,7 +39,9 @@ SELECT product_id, product_name
|
||||
|
||||
上述查询是对不同的两张表进行求并集运算. 对于同一张表, 实际上也是可以进行求并集的.
|
||||
|
||||
**练习题:**假设连锁店想要增加毛利率超过 50%或者售价低于 800 的货物的存货量, 请使用 UNION 对分别满足上述两个条件的商品的查询结果求并集.
|
||||
**练习题:**
|
||||
|
||||
假设连锁店想要增加毛利率超过 50%或者售价低于 800 的货物的存货量, 请使用 UNION 对分别满足上述两个条件的商品的查询结果求并集.
|
||||
|
||||
结果应该类似于:
|
||||
|
||||
@@ -512,7 +514,8 @@ SELECT SP.shop_id
|
||||
WHERE product_type = '衣服') AS P
|
||||
ON SP.product_id = P.product_id;
|
||||
```
|
||||
先分别在两张表里做筛选, 把复杂的筛选条件按表分拆, 然后把筛选结果(作为表)连接起来, 避免了写复杂的筛选条件, 因此这种看似复杂的写法, 实际上整体的逻辑反而非常清晰. 在写查询的过程中, 首先要按照最便于自己理解的方式来写, 先把问题解决了, 再思考优化的问题.
|
||||
先分别在两张表里做筛选, 把复杂的筛选条件按表分拆, 然后把筛选结果(作为表)连接起来, 避免了写复杂的筛选条件, 因此这种看似复杂的写法, 实际上整体的逻辑反而非常清晰. 在写查询的过程中, 首先要按照最便于自己理解的方式来写, 先把问题解决了, 再思考优化的问题。
|
||||
|
||||
**练习题:**
|
||||
|
||||
找出每个商店里的衣服类商品的名称及价格等信息. 希望得到如下结果:
|
||||
@@ -539,7 +542,8 @@ INNER JOIN --从 Product 表找出衣服类商品的信息
|
||||
WHERE product_type = '衣服')AS P
|
||||
ON SP.product_id = P.product_id;
|
||||
```
|
||||
上述第二种写法虽然包含了子查询, 并且代码行数更多, 但由于每一层的目的很明确, 更适于阅读, 并且在外连结的情形下, 还能避免错误使用 WHERE 子句导致外连结失效的问题, 相关示例见后文中的"结合 WHERE 子句使用外连结"章节.
|
||||
上述第二种写法虽然包含了子查询, 并且代码行数更多, 但由于每一层的目的很明确, 更适于阅读, 并且在外连结的情形下, 还能避免错误使用 WHERE 子句导致外连结失效的问题, 相关示例见后文中的"结合 WHERE 子句使用外连结"章节。
|
||||
|
||||
**练习题:**
|
||||
|
||||
分别使用连结两个子查询和不使用子查询的方式, 找出东京商店里, 售价低于 2000 的商品信息,希望得到如下结果.
|
||||
@@ -578,10 +582,14 @@ SELECT SP.shop_id
|
||||
ON SP.product_id = P.product_id
|
||||
GROUP BY SP.shop_id,SP.shop_name
|
||||
```
|
||||
**思考题:**上述查询得到了每个商品售价最高的商品, 但并不知道售价最高的商品是哪一个.如何获取每个商店里售价最高的商品的名称和售价?
|
||||
**思考题:**
|
||||
|
||||
上述查询得到了每个商品售价最高的商品, 但并不知道售价最高的商品是哪一个.如何获取每个商店里售价最高的商品的名称和售价?
|
||||
>注: 这道题的一个简易的方式是使用下一章的窗口函数. 当然, 也可以使用其他我们已经学过的知识来实现, 例如, 在找出每个商店售价最高商品的价格后, 使用这个价格再与 Product 列进行连结, 但这种做法在价格不唯一时会出现问题.
|
||||
|
||||
**练习题:**每类商品中售价最高的商品都在哪些商店有售?
|
||||
**练习题:**
|
||||
|
||||
每类商品中售价最高的商品都在哪些商店有售?
|
||||
|
||||
### 4.2.1.4 自连结(SELF JOIN)
|
||||
|
||||
@@ -637,22 +645,8 @@ SELECT P1.product_id
|
||||
ON P1.product_type = P2.product_type
|
||||
WHERE P1.sale_price > P2.avg_price;
|
||||
```
|
||||
仅仅从代码量上来看, 上述方法似乎比关联子查询更加复杂, 但这并不意味着这些代码更难理解. 通过上述分析, 很容易发现上述代码的逻辑实际上更符合我们的思路, 因此尽管看起来复杂, 但思路实际上更加清晰.
|
||||
作为对比, 试分析如下代码:
|
||||
仅仅从代码量上来看, 上述方法似乎比关联子查询更加复杂, 但这并不意味着这些代码更难理解. 通过上述分析, 很容易发现上述代码的逻辑实际上更符合我们的思路, 因此尽管看起来复杂, 但思路实际上更加清晰。
|
||||
|
||||
```sql
|
||||
SELECT P1.product_id
|
||||
,P1.product_name
|
||||
,P1.product_type
|
||||
,P1.sale_price
|
||||
,AVG(P2.sale_price) AS avg_price
|
||||
FROM product AS P1
|
||||
INNER JOIN product AS P2
|
||||
ON P1.product_type=P2.product_type
|
||||
WHERE P1.sale_price > P2.sale_price
|
||||
GROUP BY P1.product_id,P1.product_name,P1.product_type,P1.sale_price,P2.product_type
|
||||
```
|
||||
虽然去掉了子查询,查询语句的层次更少, 而且代码行数似乎更少, 但实际上这个方法可能更加难以写出来. 在实践中, 一定要按照易于让自己理解的思路去分层次写代码, 而不要花费很长世间写出一个效率可能更高但自己和他人理解起来难度更高的代码.
|
||||
**练习题:**
|
||||
|
||||
1.分别使用内连结和关联子查询每一类商品中售价最高的商品.
|
||||
|
||||
Reference in New Issue
Block a user