热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql–在第3个表中将2个表与其FK连接所必需的

所以基本上我正在按照下面问我的教程问题.我不太确定如何加入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?


推荐阅读
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
author-avatar
小市民828_719
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有