簡體   English   中英

子查詢:使用 having 子句過濾掉包含子查詢的 null 值的外部查詢行是一種好習慣嗎

[英]subquery: is it good practise to use having clause to filter out rows of outer query that contains subquery's null values

我有以下表格:

SELECT * FROM medicine

| id | name        | producer |
+----+-------------+----------+
|  1 | aspirin     | pharma   |
|  2 | cetamol     | tamiko   |
|  3 | brufen      | pharma   |
|  4 | cetacodeine | adamco   |
|  5 | actifed     | tamiko   |
|  6 | claritin    | tamiko   |
+----+-------------+----------+

SELECT * FROM liquid

+-----+------+-------+
| lid | m_id | price |
+-----+------+-------+
| l1  |    2 |  1000 |
| l2  |    3 |  1500 |
| l3  |    4 |  3000 |
| l4  |    5 |  2000 |
| l5  |    6 |  1800 |
+-----+------+-------+

SELECT * FROM tablet

+-----+------+-------+
| tid | m_id | price |
+-----+------+-------+
| t1  |    1 |   900 |
| t2  |    2 |   600 |
| t3  |    3 |  1200 |
| t4  |    5 |  2000 |
+-----+------+-------+

其中最后兩個表中的m_id具有引用第一個表中的id的外鍵。

我正在嘗試列出僅由生產商tamiko生產的液體葯物的蓋子名稱執行以下語句將導致包含從子查詢返回的 null 值的行,我想省略

SELECT lid, (SELECT name FROM medicine WHERE liquid.m_id=medicine.id AND medicine.producer='tamiko') AS byTamiko FROM liquid;

+-----+----------+
| lid | byTamiko |
+-----+----------+
| l1  | cetamol  |                                                                                 
| l2  | NULL     |                                                                                 
| l3  | NULL     |                                                                                  
| l4  | actifed  |                                                                                 
| l5  | claritin |                                                                                
+-----+----------+

所以我做了一些嘗試,使用HAVING子句似乎是一個解決方案

SELECT lid, (SELECT name FROM medicine WHERE liquid.m_id=medicine.id AND medicine.producer='tamiko') AS byTamiko FROM liquid HAVING byTamiko IS NOT NULL;

| lid | byTamiko |
+-----+----------+
| l1  | cetamol  |
| l4  | actifed  |
| l5  | claritin |
+-----+----------+

但是,我的老師不同意HAVING子句只能與聚合函數和GROUP BY語句一起使用。 我現在很困惑這是否是適當的用法? 究竟發生了什么使它起作用?

注意:我必須只使用子查詢而不是任何JOIN或不同的語句來執行此查詢。

注意2:請注意,這不是重復的,我試圖解釋它是如何工作的以及它是否是正確的用法。

這不太合適。

在 SQL 標准having有定義為聚合的過濾,而where是聚合前的過濾(如果有任何聚合)。

MySQL 對此進行了擴展,以允許having非聚合查詢。 此擴展允許您在不使用子查詢的情況下過濾列別名。 但是您應該在聚合之前使用where進行過濾。

所以它應該看起來像這樣?

SELECT lid, (
    SELECT name 
    FROM medicine 
    WHERE liquid.m_id=medicine.id AND medicine.producer='tamiko'
) AS byTamiko 
FROM liquid 
WHERE byTamiko IS NOT NULL;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM