10bet网址
MySQL 5.7参考手册
相关的文档10bet官方网站 本手册下载 本手册摘录

12.20.4功能依赖的检测

下面的讨论提供了几个MySQL检测功能依赖的例子。下面的例子使用了这种表示法:

{X} - > {Y}

明白这是X独特的决定Y,这也意味着Y功能依赖于什么X

示例使用世界数据库,可从https://dev.10bet靠谱mysql.com/doc/index-other.html。您可以在同一页上找到关于如何安装数据库的详细信息。

从键派生的函数依赖

下面的查询选择每个国家的语言计数:

SELECT co. name, COUNT(*) FROM countrylanguage cl, country co WHERE cl. nameCountryCode = co.Code GROUP BY co.Code;

co.Code主键是有限公司的所有列有限公司在功能上依赖于它,用下面的符号表示:

{有限公司代码}- >{有限公司*}

因此,co.name功能依赖于什么集团列和查询有效。

一个独特的指数在非空Column可以代替主键,并且可以应用相同的函数依赖关系。(这对一个独特的索引,允许值,因为它允许多个值,在这种情况下惟一性将丢失。)

从多列键和等式派生的函数依赖

这个查询为每个国家选择一个所有语言的列表,以及有多少人会说这些语言:

选择co.Name, cl。语言,cl。百分比* co. population / 100.0 AS SpokenBy FROM country语言cl,国家co WHERE cl。CountryCode = co.Code GROUP BY cl。CountryCode cl.Language;

两人(cl。CountryCode,cl。语言的两列复合主键cl,以便列对唯一地决定所有列cl:

{cl。CountryCode, cl。语言} - > {cl。*}

此外,由于平等在在哪里条款:

{cl。CountryCode} - >{有限公司代码}

而且,因为co.Code的主键有限公司:

{有限公司代码}- >{有限公司*}

独特的决定关系是传递的,因此:

{cl。CountryCode, cl。语言} - > {cl。*,co.*}

因此,查询是有效的。

与前面的例子一样,a独特的关键在非空可以使用列代替主键。

一个内连接条件可用来代替在哪里。同样的功能依赖适用于:

选择co.Name, cl。语言,cl。百分比* co. population /100.0 AS SpokenBy FROM countrylanguage cl INNER JOIN国家co ON cl。CountryCode = co.Code GROUP BY cl。CountryCode cl.Language;

函数依赖特殊情况

而a中的相等检验在哪里条件或内连接条件是对称的,而外连接条件中的相等性测试则不是,因为表扮演不同的角色。

假设引用完整性被意外地破坏了,并且存在一行countrylanguage没有相应的行国家。考虑与上一个示例相同的查询,但是使用左连接:

选择co.Name, cl。语言,cl。百分比* co. population /100.0 AS SpokenBy FROM countrylanguage cl LEFT JOIN country co ON cl。CountryCode = co.Code GROUP BY cl。CountryCode cl.Language;

对于给定的值cl。CountryCode的价值co.Code在连接结果中找到匹配的行(由cl。CountryCode)或者是如果没有匹配(也由cl。CountryCode)。在每种情况下,这种关系都适用:

{cl。CountryCode} - >{有限公司代码}

cl。CountryCode在功能上依赖于{cl。CountryCode,cl。语言}是主键。

如果在连接结果中co.Code补充,co.Name是也。如果co.Code不是补充,因为co.Code是否是主键,它决定了什么co.Name。因此,在所有情况下:

{有限公司代码}- >{有限公司名称}

收益率:

{cl。CountryCode, cl。语言} - > {cl。*,co.*}

因此,查询是有效的。

但是,假设交换了表,就像下面这个查询:

选择co.Name, cl。语言,cl。百分比* co. population /100.0 AS spoke by FROM country co LEFT JOIN countrylanguage cl ON cl。CountryCode = co.Code GROUP BY cl。CountryCode cl.Language;

现在这个关系应用:

{cl。CountryCode, cl。语言} - > {cl。*,co.*}

所有-补行cl放在一个组中(它们都有集团列等于),并在该组内的值co.Name可能是不同的。这个查询是无效的,MySQL拒绝它。

因此,外连接中的函数依赖关系与行列式列是否属于的左或右左连接。如果存在嵌套的外部连接或连接条件不完全由相等比较组成,则确定函数依赖关系将变得更加复杂。

功能依赖和视图

假设一个国家视图生成它们的代码,大写的名称,以及它们有多少种不同的官方语言:

创建视图country2 AS SELECT co. code, UPPER(co. name) AS UpperName, COUNT(cl. language) AS OfficialLanguages FROM country AS co JOIN countrylanguage AS cl ON cl。CountryCode = co.Code WHERE cl。是Official = 'T' GROUP BY co.Code;

这个定义是有效的,因为:

{有限公司代码}- >{有限公司*}

在视图结果中,选中的第一个列是co.Code,它也是group列,因此决定了所有其他选择的表达式:

{country2。代码}-> {country2.*}

MySQL理解并使用这些信息,如下所述。

该查询通过将视图与城市表:

选择二氧化碳。代码,二氧化碳。UpperName,二氧化碳。官方语言,COUNT(*) AS城市从国家2 AS co2加入城市ci ON ci。CountryCode =二氧化碳。Code GROUP BY co2.Code;

这个查询是有效的,因为如前所述:

{二氧化碳。代码}-> {co2.*}

MySQL能够在视图的结果中发现函数依赖,并使用它来验证使用该视图的查询。如果country2是派生表,如:

选择二氧化碳。代码,二氧化碳。UpperName,二氧化碳。(SELECT co. code, UPPER(co. name) AS UpperName, COUNT(cl. language) AS official allanguages FROM country AS co JOIN countrylanguage AS cl ON cl. countrycode =co. countrycode =co. countrycode)代码在cl。是Official='T' GROUP BY co.Code ) AS co2 JOIN city ci ON ci.CountryCode = co2.Code GROUP BY co2.Code;

功能依赖的组合

MySQL能够结合上述所有类型的函数依赖关系(基于键、基于相等、基于视图)来验证更复杂的查询。