mac*_*ian 91 sql database relational-algebra relational-database
当谈到theta连接,equijoins和自然连接时,我无法理解关系代数.有人可以帮我更好地理解吗?如果我在theta上使用=符号,那么它与使用自然连接完全相同吗?
out*_*tis 133
甲theta连接允许任意的比较关系(如≥).
一个等值连接是使用等于运算符一个theta连接.
一个自然的加入是对那些在每个关系相同的名称属性的等值连接.
此外,自然连接会删除相等比较中涉及的重复列,因此每个比较列中只有1个保留; 在粗略的关系代数术语中:
? = ?R,S-as ? ?aR=aS
Bog*_*SFT 53
虽然解释确切差异的答案很好,但我想说明关系代数如何转换为SQL以及3个概念的实际值是什么.
您问题中的关键概念是加入的想法.要了解连接,您需要了解笛卡尔积(该示例基于SQL,其中等效称为交叉连接,如指出时);
这在实践中不是很有用.考虑这个例子.
Product(PName, Price)
====================
Laptop, 1500
Car, 20000
Airplane, 3000000
Component(PName, CName, Cost)
=============================
Laptop, CPU, 500
Laptop, hdd, 300
Laptop, case, 700
Car, wheels, 1000
Run Code Online (Sandbox Code Playgroud)
笛卡尔积产品x组件将 - 吼叫或sql小提琴.您可以看到有12行= 3 x 4.显然,像"带有"轮子"的"笔记本电脑"这样的行没有任何意义,这就是为什么在实践中很少使用笛卡尔积.
| PNAME | PRICE | CNAME | COST |
--------------------------------------
| Laptop | 1500 | CPU | 500 |
| Laptop | 1500 | hdd | 300 |
| Laptop | 1500 | case | 700 |
| Laptop | 1500 | wheels | 1000 |
| Car | 20000 | CPU | 500 |
| Car | 20000 | hdd | 300 |
| Car | 20000 | case | 700 |
| Car | 20000 | wheels | 1000 |
| Airplane | 3000000 | CPU | 500 |
| Airplane | 3000000 | hdd | 300 |
| Airplane | 3000000 | case | 700 |
| Airplane | 3000000 | wheels | 1000 |
Run Code Online (Sandbox Code Playgroud)
JOINs可以为这些产品增加更多价值.我们真正想要的是将产品与其相关组件"加入",因为每个组件都属于产品.这样做的方法是使用连接:
产品JOIN组件打开Pname
关联的SQL查询将是这样的(你可以在这里玩所有的例子)
SELECT *
FROM Product
JOIN Component
ON Product.Pname = Component.Pname
Run Code Online (Sandbox Code Playgroud)
结果:
| PNAME | PRICE | CNAME | COST |
----------------------------------
| Laptop | 1500 | CPU | 500 |
| Laptop | 1500 | hdd | 300 |
| Laptop | 1500 | case | 700 |
| Car | 20000 | wheels | 1000 |
Run Code Online (Sandbox Code Playgroud)
请注意,结果只有4行,因为笔记本电脑有3个组件,Car有1个,Airplane没有.这更有用.
回到你的问题,你问的所有联接是我刚刚展示的JOIN的变体:
自然连接 =连接(ON子句)在所有具有相同名称的列上进行; 它从结果中删除重复的列,而不是所有其他连接; 大多数DBMS(由各种供应商创建的数据库系统,如Microsoft的SQL Server,Oracle的MySQL等)甚至不打扰支持这一点,这只是不好的做法(或故意选择不实现它).想象一下,开发人员会将Product中第二列的名称从Price更改为Cost.然后所有的自然连接都将在PName和Cost上完成,因为没有数字匹配,所以会产生0行.
Theta Join =这是每个人都使用的通用连接,因为它允许您指定条件(SQL中的ON子句).您可以在几乎任何您喜欢的条件下加入,例如在前两个字母相似或价格不同的产品上.在实践中,这种情况很少发生 - 在95%的情况下,您将加入平等条件,这导致我们:
Equi Join =在实践中最常用的.上面的例子是一个equi连接.数据库针对此类连接进行了优化!equi join的oposite是一个非equi连接,即当你加入"="以外的条件时.数据库没有针对此进行优化!它们都是一般theta连接的子集.自然连接也是一个theta连接,但条件(theta)是隐含的.
信息来源:大学+认证的SQL Server开发人员+最近完成了斯坦福大学的MOO"数据库简介",所以我敢说我的关系代数是新鲜的.
one*_*hen 14
@outis的答案很好:关于关系的简洁和正确.
但是,就SQL而言,情况稍微复杂一些.
考虑通常的供应商和零件数据库,但在SQL中实现:
SELECT * FROM S NATURAL JOIN SP;
Run Code Online (Sandbox Code Playgroud)
将返回带有列的结果集**
SNO, SNAME, STATUS, CITY, PNO, QTY
连接在两个表中具有相同名称的列上执行SNO.请注意,结果集有六列,只包含一列SNO.
现在考虑一个theta eqijoin,其中必须明确指定连接的列名(加上范围变量S并且SP是必需的):
SELECT * FROM S JOIN SP ON S.SNO = SP.SNO;
Run Code Online (Sandbox Code Playgroud)
结果集将有七列,包括两列SNO.结果集的名称是SQL标准所称的"依赖于实现",但可能如下所示:
SNO, SNAME, STATUS, CITY, SNO, PNO, QTY
或许这个
S.SNO, SNAME, STATUS, CITY, SP.SNO, PNO, QTY
换句话说,NATURAL JOIN在SQL中可以考虑从结果集中删除具有重复名称的列(但是唉不会删除重复的行 - 您必须记住更改SELECT为SELECT DISTINCT自己).
**我不太清楚结果SELECT * FROM table_expression;是什么.我知道它不是关系,因为除了其他原因,它可以包含具有重复名称的列或没有名称的列.我知道它不是一个集合,因为除了其他原因,列顺序很重要.它甚至不是SQL表或SQL表表达式.我称之为结果集.
hei*_*erg 11
Natural是Equi的子集,它是Theta的子集.
如果我在theta连接上使用=符号它与使用自然连接完全相同???
不一定,但它将是一个Equi.自然意味着你匹配所有类似命名的列,Equi只意味着你只使用'='(而不是'小于',等等)
这是纯粹的学术界,你可以使用关系数据库多年,从来没有听到任何人使用这些术语.
Theta Join:
当您使用任何运算符(例如=,<,>,> =等)进行联接查询时,该联接查询就会出现在Theta联接下。
等值联接:
仅使用等号运算符查询联接时,该联接查询位于等联接下。
例:
>选择*从Emp JOIN部门打开Emp.DeptID = Dept.DeptID; >选择*从Emp内部联接部门使用(DeptID)
这将显示: _________________________________________________ | Emp.Name | Emp.DeptID | 部门名称| Dept.DeptID | | | | | |
注意:等参联接也是theta联接!
自然连接:自然连接
的一种,通过比较两个表中所有相同名称的列而隐式出现。
注意:此处,每对相同名称的列对的连接结果只有一个列。
例
选择*来自Emp Natural Join部门
这将显示: _______________________________ | DeptID | Emp.Name | 部门名称| | | | |