要求在第三个表格中将两个表格与他们的FK结合在一起

所以基本上我正在跟着一个教程问题,问我下面。 我不太确定如何连接2个不包含其他FK的表,它们(即它们的FK)都位于第3个表中。 我能得到一些帮助/解释吗?

我的答案

SELECT Forest.Fo_name, Species.Sp_name, Species.Sp_woodtype FROM Forest INNER JOIN Species ON Tree.Tr_species=Tree.Tr_forest WHERE Fo_loc='ARTIC' ORDER BY Fo_name, Sp_name 

“对于编号为”ARTIC“的地区的森林,列出森林名称和物种名称以及物种的木材types,消除任何重复,并按森林名称和物种名称命令输出”

物种表

 +--------------+------------------+------+--------------------------------+ | Field | Type | Key | Glossary | +--------------+------------------+------+--------------------------------+ | sp_name | C(10) | PK | Species Name | | sp_woodtype | C(10) | | Wood Yielded by tree | | sp_maxht | I | | Max. Height | +--------------+------------------+------+--------------------------------+ 

森林表

 +--------------+------------------+------+--------------------------------+ | Field | Type | Key | Glossary | +--------------+------------------+------+--------------------------------+ | Fo_name | C(10) | PK | Forest Name | | Fo_size | I | | Forest Area | | Fo_loc | C(10) | | Geographical Area | | Fo_comp | C(10) | | Forest Owner | +--------------+------------------+------+--------------------------------+ 

树表

 +--------------+------------------+------+---------------------------------------------+ | Field | Type | Key | Glossary | +--------------+------------------+------+---------------------------------------------+ | Tr_species | C(10) | FK | (FK of species.sp_name | | Tr_forest | C(10) | FK | (FK of forest.fo_name | | Tr_numb | I | PK | Sequence number | | Tr_planted | Date | | Date of planting | | Tr_loc | C(10) | | Forest quadrant | | Tr_parent | I | FK | (FK of tree.numb) procreating tree reference| +--------------+------------------+------+---------------------------------------------+ 

C(10)&我分别代表字符(10)和整数

你可以做多个连接。 将树表链接到主表森林,然后链接物种表:

 SELECT Forest.Fo_name, Species.Sp_name, Species.Sp_woodtype FROM Forest INNER JOIN Tree ON Tree.Tr_forest=Forest.Fo_name INNER JOIN Species ON Tree.Tr_species = Species.sp_name WHERE Fo_loc='ARTIC' ORDER BY Fo_name, Sp_name 

ON条件应该比较不同表中的列。

然后你就可以一步一步地join每个表格。

 SELECT DISTINCT Fo_name, Sp_name, Sp_woodtype FROM Forest AS f INNER JOIN Tree AS t ON t.Tr_forest = f.Fo_name INNER JOIN Species AS s ON t.Tr_speecies = s.Sp_name WHERE f.Fo_loc = 'ARCTIC' ORDER BY Fo_name, Sp_name 

Tree表是森林表和物种表之间的连接。 认为这是两个步骤:

1)从Forest表开始,连接到Tree表(从Forest.Fo_nameTree.Tr_forest

2)现在树已知,join到Species表(从Tree.speciesSpecies.sp_name

我会写这样的最后一个查询:

 SELECT Forest.Fo_name, Species.Sp_name, Species.Sp_woodtype FROM Forest JOIN Tree ON Forest.Fo_name=Tree.Tr_forest JOIN Species ON Tree.species=Species.sp_name WHERE Fo_loc='ARTIC' ORDER BY Fo_name, Sp_name 
 SELECT Forest.Fo_name, Species.Sp_name, Species.Sp_woodtype FROM Forest INNER JOIN Tree INNER JOIN Species ON Species.sp_name = Tree.Tr_species ON Forest.Fo_name=Tree.Tr_forest WHERE Fo_loc='ARTIC' ORDER BY Fo_name, Sp_name 

尝试SQL 99方法

  SELECT DISTINCT F.Fo_name, S.Sp_name, Sp_woodtype FROM Forest F, Species S, Tree T WHERE F.Fo_name = T.Tr_Forest AND S.Sp_name = Tr_species AND f.Fo_loc = 'ARCTIC'; 

AFS是用于使SQL更短,更整洁的别名。

DISTINCT将删除重复。

外键不需要连接表!

所以当没有FK时,如何连接表的答案就是join它们

真正的问题是我们如何selectjoin的表格 (或以其他方式组合)。

报表和表格

每个基表都带有一个谓词 –一个由列名参数化的语句模板。 表值是使谓词变为真正的语句的行。

 // species [name] yields [woodtype] and has max height [maxht] Species(name,woodtype,maxht) // forest [name] has area [size] in area [loc] and owner [comp] Forest(name,size,loc,comp) // tree group [numb] is of species [species] in forest [forest] and was planted in [planted] in quadrant [loc] on date [date] with parent tree group [parent] Tree(species,forest,numb,planted,loc,parent) 

查询也有一个谓词。 它的值也是使谓词成立的行。 它的谓词是根据它的FROMWHERE和其他子句构build的。 一个表别名就像它的基表一样命名一个表值,但是用别名作为前缀。 所以它的谓词是使用别名前缀列的基表的谓词。

 Species s 

持有行满意

 species [s.name] yields [s.woodtype] and has max height [s.maxht] 

(CROSS或INNER)JOIN在谓词之间放置AND; UNION把OR放在它们之间; 除了插入AND NOT和ON&WHERE和条件; SELECT重命名,添加和删除列。 (其他运营商等)

 Species s CROSS JOIN Forest f 

拥有行在哪里

  species [s.name] yields [s.woodtype] and has max height [s.maxht] AND forest [f.name] has area [f.size] in area [f.loc] and owner [f.comp] 

(不pipe约束是什么!)如果你只想要上面那些以森林types命名的森林,那么你只需要通过... WHERE f.name=s.woodtype来添加一个条件, ... AND f.name=s.woodtype

“对于编号为”ARCTIC“的地区的森林,列出森林名称和物种名称以及物种的木材types,消除任何重复,并按森林名称和物种名称命令输出”

这是一个很大的非正式谓词,返回的行是满足。 如果我们试图用已经给出的谓词加上AND,OR和NOT(etc)来重写它,那么我们只能通过对所有三个给定的谓词(因此, JOIN的基表名称)进行AND并添加AND Forest.loc='ARCTIC' (因此, ONWHERE该条件)。

FK(等)和查询(不)

PK和FK是完整性约束的特例。 考虑到谓词和可能出现的情况,只有一些数据库值可能会出现。 这就是完整性约束所描述的。 他们让数据库pipe理系统保留不应该出现的数据库值。 (另外,优化查询执行。)因为名称在物种中是唯一的,所以我们声明它是一个关键字。 森林名称和树木麻木同上。 由于树中的物种是物种中的名称,名称是物种的关键,因此我们声明FK树。物种 – >物种。名称。 森林和父母同上。 与启用连接无关。 (尽pipe它们暗示查询结果也满足一定的限制。)

查询约束是什么并不重要 。 如果因为物种谓词不同而出现树物种值不作为物种名称值,则不存在FK树种.-物种。名称。 但是每个查询都会继续返回满足其谓词的行,用基表谓词表示 。 (由于物种谓词不同,查询谓词将会不同,其行可能不同)。

什么决定了查询SQL

因此,如何select要连接的表(或以任何其他方式组合)的答案是,我们安排基表名称JOIN,UNION,EXCEPT和WHERE(等),以提供一个查询expression式,其谓词是我们希望我们的行满足。 这通常是作为一种非正式的东西来教授的,但是现在你知道SQL和自然语言有什么联系。 而约束是无关紧要的。

注:前面的假设我们没有从查询中返回重复。 关系模型中表格中没有重复的原因是表格操作符和逻辑连接符之间的上述对应关系成立。 但是,SQL表可以有重复的。 在SQL与关系模型(在很多方面)不同的地方,查询变得更less(字面上)是合乎逻辑的。