关于MAX和COUNT的澄清问题(SQL)

时间:2018-09-18 14:51:16

标签: mysql sql

我正在做一些家庭作业问题,对于如何在查询中使用COUNT和MAX感到有些困惑。我想知道是否有人可以向我解释这些内容的“哪里”部分,或者我只是在编写完全错误的代码:

目录关系列出了供应商为零件收取的价格。 Catalog.pid是Parts.pid的外键。 Catalog.sid是Suppliers.sid的外键。用SQL编写以下查询。执行它们以确保获得正确的答案。复制SQL查询,并将结果的屏幕截图作为答案。不要列出未在返回结果中指定的其他属性。

目录包含:pid,sid,cost

零件包含:pid,pname,颜色

供应商包含:sid,sname,地址

c。 (2分)返回唯一零件的数量。

public static void solution(String A) {
    char[] a = A.toCharArray();

    for(int i = 0; i < a.length; i++) {
        for(int j = i + 1; j < a.length; j++) {
            if(a[i] < a[j]) {
                a[j] = a[i];
            }
        }
    }

    for(int i = 0; i < a.length; i++) {
        System.out.print(a[i] + " ");
    }
}

public static void main(String args[]) {
    String A = "ab";

    solution(A);
}

-这会在选择时产生编译错误,有人对此有意见吗?

i。 (1分)在所有供应商中找到该零件的pids,pname和最高成本。

select count (distinct *) from Parts;

我不能完全确定我是否正确启动了该工具,并且我不知道在做“哪里”部分时要考虑什么。是否总是需要它?

2 个答案:

答案 0 :(得分:1)

对于不同的零件ID,零件由ID标识

select count(distinct pid) from Parts;

或者如果pid是auto_increment,则可以行

select count(*) from Parts;

您不应该在where条件中使用聚合函数。例如:where max(c.cost)在执行聚集函数之前首先评估where条件,以便where子句无法知道max()的值  如果您要过滤汇总结果,则应使用

例如having c.cost = max(c.cost),但是在这种情况下,您不能对select中的非聚合列使用不带分组依据的聚合函数,并得到另一种错误。

但是如果您还需要其他列,则可以使用子查询

    select p.pid, p.pname, c.cost 
    from Parts p 
    inner join Catalog c on c.sid = p.pid
    inner join Suppliers s on c.pid = s.sid
    inner join  (
        select max(cost) max_cost
        from Catalog
    ) t on t.max_cost = c.cost

答案 1 :(得分:1)

select count(distinct pid) from parts. 

在上面的区别中是不必要的,因为pid可能是零件的主键。因此,上述结果应与

相同
select count(pid) from parts. 

第二个查询不需要与供应商联接,因为它遍及所有供应商。

select p.pid, p.name, max(c.cost)
from parts p left join catalog c
on p.pid=c.pid
group by 1, 2