我有以下问题:我应该打印所有国家的沉没船只的数量。所以我写下以下内容:
use ships;
select CLASSES.CLASS, COUNT(*)
from CLASSES
left join SHIPS on CLASSES.CLASS = SHIPS.CLASS
left join OUTCOMES on NAME = SHIP
where RESULT = 'sunk'
group by CLASSES.CLASS;
但如果某个国家没有沉船,它将不会出现在结果中。但我希望每个国家都能参与其中,如果它没有沉没的船只来购买0来计算。 我怎样才能做到这一点? 提前谢谢。
答案 0 :(得分:1)
这取决于您使用的SQL方言。如果使用Informix作为数据库,则可以使用nvl()函数:
SELECT <whatever>, nvl(ships, 0) AS ship_num FROM SHIPS;
使用Sqlite3可以使用coalesce()函数:
SELECT <whatever>, coalesce(ships, 0) AS ship_num FROM SHIPS;
等。 SQL的所有方言都将具有这样的功能之一,但它们的命名方式不同。但基本原理是相同的 - 如果我得到的值是NULL,则使用提供的值 - 在您的情况下为零,但它可以是任何内容,甚至是列值或字符串“未指定”等。如果您提供数据库你在查询,我可以给你使用的功能。
答案 1 :(得分:1)
假设代码足以作为问题的样本,无论在代码中的哪个地方都没有提到,有很多方法可以计算,我最喜欢的方法是使用if
(mysql)或{{1 case
内的(sql server)..
mysql - 使用count
if
sqlserver - 使用use ships;
select CLASSES.CLASS, COUNT(IF(RESULT = 'sunk', 1, NULL))
from CLASSES
left join SHIPS on CLASSES.CLASS = SHIPS.CLASS
left join OUTCOMES on NAME = SHIP
group by CLASSES.CLASS;
case
答案 2 :(得分:1)
执行此操作的正确方法是使用LEFT JOIN
,但使用ON
子句中的条件:
select c.CLASS, COUNT(o.RESULT)
from CLASSES c left join
SHIPS s
on c.CLASS = s.CLASS left join
OUTCOMES o
on s.NAME = o.SHIP and
o.RESULT = 'sunk'
group by c.CLASS;
请注意,表别名也使查询更容易编写和阅读。
另外,我必须猜测列属于哪些表。当你从头开始使用合格的列名时,就没有猜测。