SQL - 使用group by和where显示表中的所有行

时间:2016-03-15 00:24:31

标签: sql

我有以下问题:我应该打印所有国家的沉没船只的数量。所以我写下以下内容:

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来计算。 我怎样才能做到这一点? 提前谢谢。

3 个答案:

答案 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;

请注意,表别名也使查询更容易编写和阅读。

另外,我必须猜测列属于哪些表。当你从头开始使用合格的列名时,就没有猜测。