10bet网址
MySQL 8.0参考手册
相关的文档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, country co. WHERECountryCode = co.Code;

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

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

因此,co.name在功能上依赖于集团列和查询是有效的。

一个独特的指数在非空列可以用来代替主键,同样的函数依赖性也适用。(这对a不是真的独特的索引,允许值,因为它允许多个值,在这种情况下,独特性就丧失了。)

从多列键和等式推导出的函数依赖关系

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

选择co.Name, cl。语言,cl。百分比* co. population / 100.0 AS SpokenBy FROM countrylanguage cl, country co WHERE cl.;CountryCode = co.CodeCountryCode cl.Language;

两人(cl。CountryCodecl。语言的双列复合主键cl的所有列对cl

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

而且,因为平等在在哪里条款:

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

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

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

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

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

因此,查询是有效的。

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

一个内连接Condition可以用来代替在哪里.同样的函数依赖也适用:

选择co.Name, cl。语言,cl。百分比* co.人口/100.0 AS SpokenBy FROM countrylanguage cl INNER JOIN国家co. cl。CountryCode = co.CodeCountryCode 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.CodeCountryCode cl.Language;

的给定值cl。CountryCode的价值。co.Code中的连接结果要么在匹配行的(由cl。CountryCode)或者是-如果没有匹配则补充cl。CountryCode).在每种情况下,这种关系都适用:

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

cl。CountryCode本身在函数上依赖于{cl。CountryCodecl。语言}是一个主键。

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

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

收益率:

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

因此,查询是有效的。

然而,假设表被交换了,就像下面这个查询:

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

这种关系确实如此应用:

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

实际上,所有-补行made forcl被放入一个单独的组(他们有两个集团列等于),在这个组内的值co.Name可能是不同的。查询无效,MySQL拒绝它。

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

函数依赖关系和视图

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

CREATE VIEW country2 AS SELECT co. code, UPPER(co. name) AS UpperName, COUNT(cl. language) AS officialllanguages FROM country AS co JOIN countrylanguage AS cl ON cl。WHERE cl. code = co.Code是Official = 'T' GROUP BY co.Code;

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

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

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

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

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

的视图,该查询显示国家、它们拥有多少种不同的官方语言,以及它们拥有多少个城市城市表:

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

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

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

MySQL能够在视图的结果中发现函数依赖性,并使用它来验证使用该视图的查询。同样,如果country2是派生表(或公共表表达式),如:

选择二氧化碳。代码,二氧化碳。UpperName,二氧化碳。官方语言,COUNT(*) AS Cities FROM (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。代码在cl。是Official='T' GROUP BY co.Code ) AS co2 JOIN city ci ON ci.CountryCode = co2.Code GROUP BY co2.Code;

函数依赖的组合

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