在SQL查询中处理不同的表

时间:2018-09-25 02:26:23

标签: mysql sql mysql-workbench

我是SQL的新手,仍然在学习如何编写查询。.我对我编写的代码有一些疑问,这些问题主要涉及使用左联接/内联接

供应商(sid:int,sname:VARCHAR(30),地址:VARCHAR(50))

Parts(pid:int,pname:VARCHAR(30),color:VARCHAR(10))

目录(sid:int,pid:int,成本:double)

  1. 查找供应每个黑色零件的供应商名称。

    select s.sid, s.sname from Suppliers s, Parts p
       where p.color = 'black'
       having count(p.pid) = 15;
    

我对此查询的问题是,我是否需要在where子句中的任何地方都有供应商,以便它找到供应每个黑色零件的供应商?

  1. 列出所有供应黑色零件的所有供应商的名字。

     select s.sname from Suppliers s 
          inner join Parts p
          on p.color = 'black';
    

这也是相同的情况,我是正确使用内部联接还是在这个问题中我应该如何利用两个表?

还有这两个问题,我是否需要使用目录,因为这可能会使供应商和零件联系在​​一起?

2 个答案:

答案 0 :(得分:1)

是的,假设您已正确插入数据,则Catalog表是实现您要查询的内容的方法。没有目录就无法将零件和供应商联系在一起(或直接关联)。

让我们以第二种颜色查询为例:(供应商表中没有$('#search').click(function() { $('text').focus(); }); $('#math').click(function() { $('text').focus(); }); 列,因此该列不能用于联接)

color

应该这样做,但是如果没有,请将表模式附加到问题中。您可以通过执行SELECT s.name FROM Suppliers s INNER JOIN Catalog c ON s.sid = c.sid INNER JOIN Parts p ON c.pid = p.pid WHERE p.color = 'black'; 来获取此信息,然后复制/粘贴输出。然后对其他两个表执行相同的操作。

答案 1 :(得分:1)

是的,因为这是将您的供应商和产品连接在一起的常见事物,所以您都需要两个查询的目录。

我可能对此想得太过分了。这是我的思路。

结构

create table suppliers (sid int, sname text, address text);
create table parts (pid int, pname text, color text);
create table catalog (sid int, pid int, cost int);

insert into suppliers values (1, 'walmart', ''), (2, 'target', ''), (3, 'amazon', '');
insert into parts values (1, 'ball', 'black'), (2, 'ball', 'white'), (3, 'bat', 'black'), (4, 'bat', 'white');
insert into catalog (sid, pid) values (1, 1), (1, 2), (1, 3), (2, 1), (3, 2);

选择所有黑色部分

select group_concat(pid) as gc from parts p where p.color = 'black';

gc
------
1,3

选择黑色供应商出售的所有零件

select c.sid, group_concat(c.pid) as gc
from catalog c inner join parts p on c.pid = p.pid and p.color = 'black'
group by c.sid;

sid   gc
----- ------
1     1,3
2     1

查找提供所有黑色零件的供应商

select s.sname
from (
    select c.sid, group_concat(c.pid) as gc
    from catalog c inner join parts p on c.pid = p.pid and p.color = 'black'
    group by c.sid
) a
inner join (
    select group_concat(pid) as gc
    from parts p where p.color = 'black'
) b on a.gc = b.gc
inner join suppliers s on a.sid = s.sid

sname
--------
walmart

与上述类似,您的第二个查询也必须更改为以下内容:

第二个查询

select distinct s.sname
from catalog c
inner join parts p on c.pid = p.pid and p.color = 'black'
inner join suppliers s on c.sid = s.sid

sname
--------
walmart
target

在上面的查询中,我们将目录与零件组合在一起,以获得所有包含黑色零件的目录。然后,我们将结果与供应商合并以获得供应商名称。如果供应商提供多个黑色零件,则其信息可能会出现多次。因此,我们使用distinct获得唯一的名称。

示例:http://rextester.com/IDH97131