下面的讨论提供了几个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;