SQL查询多表选择
我有三张桌子,SQL查询多表选择,sql,Sql,我有三张桌子, -部分定义一些常规项目部分的表格。 -Categorytable>有一个“section”列(外键)。 -产品表->有一个“类别”列(外键) 我想得到所有属于X部门的产品 我怎么做 从选择中选择?这里有很多相同的答案。然而,出于某种原因,他们都加入了部分表,这(可能)是不必要的 select s.section, p.* from section s inner join category c on c.section = s.section inner join product
-
部分
定义一些常规项目部分的表格。-
Category
table>有一个“section”列(外键)。-
产品
表->有一个“类别”列(外键)
我想得到所有属于X部门的产品
我怎么做
从选择中选择?这里有很多相同的答案。然而,出于某种原因,他们都加入了
部分
表,这(可能)是不必要的
select s.section, p.*
from section s
inner join category c on c.section = s.section
inner join product p on p.category = c.category
where s.section = 'section1'
select
p.*
from
Product p,
Category c
where
p.category_id = c.id and
c.section_id = 123
;
根据@nemiss的请求,显式ANSI
JOIN
语法:
select
p.*
from Product p
join Category c
on c.id = p.category_id
and c.section_id = 123
;
包含
部分
表的可能原因:根据部分名称(而不是ID)选择产品
如果执行此操作,您需要确保Section.name
已编制索引
alter table Product add index name;
这里有很多相同的答案。然而,出于某种原因,他们都加入了
部分
表,这(可能)是不必要的
select
p.*
from
Product p,
Category c
where
p.category_id = c.id and
c.section_id = 123
;
根据@nemiss的请求,显式ANSI
JOIN
语法:
select
p.*
from Product p
join Category c
on c.id = p.category_id
and c.section_id = 123
;
包含
部分
表的可能原因:根据部分名称(而不是ID)选择产品
如果执行此操作,您需要确保Section.name
已编制索引
alter table Product add index name;
对第节不是必需的!!它只是定义了有关该部分的信息,但对我的查询没有帮助!我不喜欢使用multi-from(表1、表2),可以改为使用join吗?您不必连接到节,但通常不直接基于id进行查询,而是根据行的某些特征进行查询。您的查询较短,但灵活性要差得多。如果数据库中没有显式强制FK关系,也会受到影响,因为在这种情况下,c.section_id可能包含一个不存在的值。@Mike Burton,OP说他正在使用FKs。他确实这么说。从形式上讲,这并不一定是真的。我认识一些开发人员,他们在FK的定义中包含了“非正式”表链接。这也不意味着他使用的DBMS在管理FKs方面做得很好(有几个旧系统可以强制提交无效的遗留数据)。此外,我的主要观点是,查询忽略了显式关系,而选择了一个幻数,这在几乎所有情况下都是糟糕的代码设计。是的!第节不是必需的!!它只是定义了有关该部分的信息,但对我的查询没有帮助!我不喜欢使用multi-from(表1、表2),可以改为使用join吗?您不必连接到节,但通常不直接基于id进行查询,而是根据行的某些特征进行查询。您的查询较短,但灵活性要差得多。如果数据库中没有显式强制FK关系,也会受到影响,因为在这种情况下,c.section_id可能包含一个不存在的值。@Mike Burton,OP说他正在使用FKs。他确实这么说。从形式上讲,这并不一定是真的。我认识一些开发人员,他们在FK的定义中包含了“非正式”表链接。这也不意味着他使用的DBMS在管理FKs方面做得很好(有几个旧系统可以强制提交无效的遗留数据)。此外,我的主要观点是,查询忽略了显式关系而使用了幻数,这在几乎所有情况下都是糟糕的代码设计。