我正在努力提高我的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查询的应用程序时也应牢记这一点。
这是什么意思?我怎样才能改进我的查询? 请解释一下我!
答案 0 :(得分:2)
这个数据库的结构在处理模型方面有点古怪; model是PRODUCTS表的关键。
查看此备用语法是否适用于您的数据库;它使用所谓的“内联视图”将问题分解为更容易理解的较小步骤。
找到最慢的PC的速度:
select min(speed) as SlowestSpeed from PC
找到比龟龟更慢的笔记本电脑:
select laptop.model, laptop.speed from laptop
join
(
select min(speed) as SlowestSpeed from PC
) as MyTortoise
where laptop.speed < MyTortoise.SlowestSpeed
获取那些慢速笔记本电脑的型号信息:
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)