MySQL NATURAL JOIN 3 与父表相关的表,并且对父表有约束

标签 mysql sql select natural-join

我有 3 个子表,它们与具有以下架构的父表相关:

Product(maker, model, type)
PC(model, price, ...)
Laptop(model, price, ...)
Printer(model, price, ...)

Product 表是 PCLaptopPrinter 的父表。 这三个子表都有一个引用 Prodcut 表的外键 model。 此外,PC、笔记本电脑和打印机没有相同的架构。

我想找到SELECT某个制造商生产的所有产品(电脑、笔记本电脑和打印机)的型号和价格的最佳方法。

我是 SQL 新手,我的直觉现在告诉我应该将父表连接到每个子表,过滤结果,然后执行并集。该查询似乎返回了正确的结果。

这是我的查询:

SELECT model, price FROM Product NATURAL JOIN PC WHERE maker = 'B' UNION 
SELECT model, price FROM Product NATURAL JOIN Laptop WHERE maker = 'B' UNION 
SELECT model, price FROM Product NATURAL JOIN Printer WHERE maker = 'B';

这是查询我的信息的有效方式吗?我觉得我输入了太多内容并重复了许多相同的约束来实现我的结果。

我可以编写更好的查询吗?

谢谢。

最佳答案

为了提高效率,请使用 UNION ALL 而不是 UNION(或 UNION DISTINCT)

SELECT model, price FROM Product NATURAL JOIN PC WHERE maker = 'B' UNION ALL
SELECT model, price FROM Product NATURAL JOIN Laptop WHERE maker = 'B' UNION ALL
SELECT model, price FROM Product NATURAL JOIN Printer WHERE maker = 'B';

执行速度的差异来自于 UNION 需要带有索引的内部临时表(以跳过重复行),而 UNION ALL 将创建没有此类索引的表。

想了解更多,请仔细阅读文章 http://www.percona.com/blog/2007/10/05/union-vs-union-all-performance/

关于MySQL NATURAL JOIN 3 与父表相关的表,并且对父表有约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26033982/

相关文章:

mysql - mysql中两个相同表的区别

MySQL 说无法将 : invalid settings. EC2 连接到 RDS

mysql - 如何从同一列表中选择包含 ID 而不是仅包含 ID 的记录

mySQL : Sort ID by a given string of ID ?(为分层数据构建面包屑)

sql - 为什么只能在 where 条件下以文本形式找到浮点值

AngularJS 选择 - 匹配第一个字符

php - 关于从数据库中获取 Joomla 文章

MySQL 守护进程命令行登录挂起

MySQL:使用自动增量的整数作为主键 - 我应该将其声明为无符号吗?

mysql - 将字符串插入 SELECT (MySql) 时保持前导零