作者:小市民828_719 | 来源:互联网 | 2023-08-23 18:48
所以基本上我正在按照下面问我的教程问题.我不太确定如何加入2个不包含其他FK的表,它们(即它们的两个FK)都位于第3个表中.我可以得到一些帮助解释吗?我的答案SELECTFores
所以基本上我正在按照下面问我的教程问题.我不太确定如何加入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“的地区发现的森林,列出了其中发现的森林名称和物种名称及物种木材类型.消除任何重复,并按森林名称和物种名称命令输出”
物种表
+--------------+------------------+------+--------------------------------+
| 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)&整数分别
解决方法:
连接表不需要外键!
因此,当没有FK之间如何连接表的答案就是加入它们.
真正的问题是我们如何选择加入哪些表(或以任何其他方式组合)?
陈述与表
每个基表都带有一个由列名参数化的谓词 – 语句模板.表值是使其谓词成为真正的命题 – 语句的行.
// 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)
查询也有谓词.它的值也是使其谓词成立的行.它的谓词是根据其FROM,WHERE和其他条款构建的.表别名将表值命名为其基表,但列的前缀为别名.所以它的谓词是使用别名前缀列的基表的谓词.
Species s
持有令人满意的行
species [s.name] yields [s.woodtype] and has max height [s.maxht]
CROSS& INNER JOIN在谓词之间放置AND; UNION在他们之间放置OR; EXCEPT插入AND NOT和ON&在哪里和在一个条件; 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]
(无论约束是什么!)如果你只想要上面有以木材类型命名的森林的行,那么你只需通过… WHERE f.name = s.woodtype添加一个条件因为这使得值满足行… AND f.name = s.woodtype.
For forests found in the regions coded as “ARCTIC” list the forest name & species name and species wood type found therein. Eliminate any duplicates and order the output by forest name and species name.
这是一个很大的非正式谓词,返回的行要满足.如果我们尝试仅使用我们已经给出的谓词加上AND,OR和AND NOT(等)来重写它,那么我们只能通过对所有三个给定谓词进行AND运算(因此,基表名称的JOIN)并添加AND Forest.loc =’ARCTIC'(因此,ON或WHERE该条件).
FK(等)和查询(不)
PK和FK是完整性约束的特殊情况.鉴于谓词和可能出现的情况,只会出现一些数据库值.这就是完整性约束所描述的.他们让DBMS保留不应出现的数据库值. (另外,优化查询执行.)因为名称在Species中是唯一的,所以我们将其声明为密钥.森林名称和树麻木同上.因为Tree中的物种是物种中的名称,而名称是物种的关键,我们声明FK Tree.species-> Species.name.同样适用于森林和父母.与启用连接无关. (虽然它们暗示查询结果也满足某些约束.)
查询约束是什么并不重要.如果由于业务规则或树或物种谓词不同而存在未显示为任何物种名称值的树种值,则不存在FK Tree.species-> Species.name.但是每个查询将继续返回满足其谓词的行,如基表谓词所表示的那样. (由于可能的业务情况或谓词可能不同,因此输入行可能不同,因此输出行可能不同.)
什么决定了查询SQL
因此,我们如何选择要加入的表(或以任何其他方式组合)的答案是我们根据需要安排基表名,JOIN,UNION,EXCEPT和WHERE(等)来提供一个查询表达式,其谓词是我们的一个希望我们的行满足.这通常被教导为非正式的感觉,但现在你知道SQL与自然语言的联系.约束是无关紧要的.
注意:前面假设我们不返回查询的重复项.在关系模型中表中没有重复的原因是表操作符和逻辑连接符之间的上述对应关系成立.但是,SQL表可能有重复项. SQL与关系模型(在很多方面)的区别在于,查询变得越来越少(字面上)逻辑.
Is there any rule of thumb to construct SQL query from a human-readable description?