改进SQL查询

时间:2011-06-04 08:53:50

标签: sql database select

我正在努力提高我的SQL知识,并使sql-ex.ru成功。

现在我遇到了这样的问题。 我有这样的任务:

*数据库方案由四个表组成:

Product(maker, model, type)
PC(code, model, speed, ram, hd, cd, price)
Laptop(code, model, speed, ram, hd, screen, price)
Printer(code, model, color, type, price)

表格产品包含有关制造商,型号和类型('PC','笔记本电脑'或'打印机')的信息。假设Product表中的型号对于所有制造商和产品类型都是唯一的。

通过表“PC”中的代码唯一指定的每个 PC 的特征在于型号(引用到产品表的外键),速度(处理器的速度,以MHz为单位),RAM的总量 - ram(在Mb中),硬盘驱动器容量 - 高清(以Gb为单位),CD ROM速度 - cd(例如,'4x')和价格。

笔记本电脑类似于PC之一,除了CD ROM速度,它被屏幕尺寸 - 屏幕(以英寸为单位)取代。对于“打印机”表中的每台打印机,都会告知打印机是否为彩色(彩色打印机的颜色属性为'y';否则为'n'),打印机类型(激光,喷墨或矩阵),以及价格。*

查找速度低于所有PC的笔记本电脑型号。 结果集:类型,型号,速度。

我正在输入这样的查询:

SELECT 'Laptop', Laptop.model,
Laptop.speed FROM Laptop WHERE
Laptop.speed < All (SELECT speed FROM
PC)

它运行正常,但网站告知它对任何数据库都不完全正确:

请注意,仅当具有laptop类型的产品位于Laptop表中时,此决定才有效。对于我们的数据库,这个条件得到满足,因为只有三种类型的产品,因此有三个表。因此,违反此条件可能只与重组相关联,但在开发具有内置SQL查询的应用程序时也应牢记这一点。

这是什么意思?我怎样才能改进我的查询? 请解释一下我!

8 个答案:

答案 0 :(得分:2)

这个数据库的结构在处理模型方面有点古怪; model是PRODUCTS表的关键。

查看此备用语法是否适用于您的数据库;它使用所谓的“内联视图”将问题分解为更容易理解的较小步骤。

  1. 找到最慢的PC的速度:

        select min(speed) as SlowestSpeed from PC
    
  2. 找到比龟龟更慢的笔记本电脑:

       select laptop.model, laptop.speed from laptop
       join
       ( 
        select min(speed) as SlowestSpeed from PC
       ) as MyTortoise
       where laptop.speed < MyTortoise.SlowestSpeed
    
  3. 获取那些慢速笔记本电脑的型号信息:

      select PRODUCT.model, PRODUCT.type, SlowLaptops.speed
      from PRODUCT
      inner join
      (
    
       select laptop.model, laptop.speed from laptop
       join
       ( 
        select min(speed) as TheSlowest from PC
       ) as MyTortoise
       where laptop.speed < MyTortoise.SlowestSpeed
    
      ) as SlowLaptops
    
      on PRODUCT.model = SlowLaptops.model
    

答案 1 :(得分:1)

SELECT 'laptop' as title, 
       laptop.model,
       laptop.speed
  FROM laptop
 WHERE laptop.speed < (SELECT MIN(speed) FROM PC)
 GROUP BY model, speed

答案 2 :(得分:1)

所有查询都是正确的。只需在查询中添加DISTINCT关键字即可。

SELECT DISTINCT type,l.model,l.speed
FROM product p,laptop l
WHERE p.model=l.model
AND l.speed < all (select speed from pc)

答案 3 :(得分:0)

您的查询使用了一个子选项,可以针对所有笔记本电脑测试所有PC,但如果您首先选择最低的PC速度并将其与所有笔记本电脑进行比较,则可以更有效地表达:

像这样:

SELECT 
  'laptop' as title
  , laptop.model
  , laptop.speed
FROM laptop
WHERE laptop.speed < (SELECT MIN(speed) FROM PC)

此免责声明表示此查询有效,因为laptop位于笔记本电脑表中,而PC位于PC表中。
如果您合并表格,则需要在查询中进行更改:

Computer (type, code, model, speed, ram, hd, screen, price)

然后执行以下查询:

SELECT 'laptop' as title
  , computer.model
  , computer.speed
FROM computer 
WHERE type = 'laptop' 
  AND computer.speed < (SELECT MIN(speed) FROM computer WHERE type = 'PC')

当然,免责声明适用于任何查询;如果更改表的布局,则还需要更改查询。

如果你想通过Q17,你必须加入桌面产品

  

假设Product表中的型号对于所有制造商和产品类型都是唯一的。

所以你有独特的加入钥匙。

SELECT 
  product.type
  , laptop.model
  , laptop.speed
FROM laptop
INNER JOIN product ON (laptop.model = product.model)
WHERE laptop.speed < (SELECT MIN(speed) FROM PC)

答案 4 :(得分:0)

SELECT DISTINCT Product.type, Laptop.model, Laptop.speed
  FROM Laptop, PC, Product
 WHERE Laptop.speed<(SELECT MIN(speed) FROM  PC) AND Product.type='Laptop'

右。

您的查询结果:

type        model   speed

Laptop      1298    350

答案 5 :(得分:0)

SELECT DISTINCT type='Laptop', Laptop.model, Laptop.speed
FROM Laptop, PC
WHERE Laptop.speed < ALL (SELECT speed FROM PC)

答案 6 :(得分:0)

     select Product.type, Laptop.model, Laptop.speed
     from Laptop join Product on (Product.model = Laptop.model)
     where Laptop.speed < ALL( select speed from PC)
     group by Laptop.model,Laptop.speed, Product.type

答案 7 :(得分:0)

SELECT distinct type,Laptop.model,speed 从笔记本电脑,产品 WHERE type ='Laptop'和speed&lt;(SELECT min(speed)FROM PC)