下面的讨论提供了几个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。CountryCode
,cl。语言
的双列复合主键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。CountryCode
,cl。语言
}是一个主键。
在连接结果中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;