当谈到theta连接,equijoins和自然连接时,我无法理解关系代数.有人可以帮我更好地理解吗?如果我在theta上使用=符号,那么它与使用自然连接完全相同吗?
我刚刚阅读了自然连接/使用 - SQL92的功能,这些功能(遗憾地?)缺少SQL Server当前的保留节目.
有没有人来自支持SQL Server(或其他不支持的DBMS)的DBMS - 它们听起来有用,还是一堆蠕虫(听起来也可能!)?
可能重复:
内部联接vs其中
今天我和我的项目经理就Cartesian产品进行了辩论.他说'自然连接'比使用'select from where'要好得多,因为后者会导致db引擎在内部执行笛卡尔积,但前者使用另一种方法来阻止这种情况.据我所知,自然连接语法在性能或含义方面与"从哪里选择"没有任何不同,我的意思是你可以根据自己的喜好使用.
SELECT * FROM table1,table2 WHERE table1.id=table2.id
SELECT * FROM table1 NATURAL JOIN table2
Run Code Online (Sandbox Code Playgroud)
请详细说明导致笛卡尔积的第一个查询,但第二个查询更加智能
想象一下,我有两个简单的表,例如:
CREATE TABLE departments(dept INT PRIMARY KEY, name);
CREATE TABLE employees(id PRIMARY KEY, fname, gname,
dept INT REFERENCES departments(dept));
Run Code Online (Sandbox Code Playgroud)
(当然简化).
我可以有以下任何陈述:
SELECT * FROM employees e INNER JOIN departments d ON e.dept=d.dept;
SELECT * FROM employees e NATURAL JOIN departments d;
SELECT * FROM employees e JOIN departments d USING(dept);
Run Code Online (Sandbox Code Playgroud)
可以在这里找到一个工作示例:SQL Fiddle:http://sqlfiddle.com/#!15/864a5/13/10
它们都给出了几乎相同的结果 - 当然是相同的行.
我一直更喜欢第一种形式,因为它具有灵活性,可读性和可预测性 - 你清楚地定义了什么与什么有关.
现在,除了第一种形式有重复的列之外,其他两种形式是否真的有优势?或者他们只是语法糖?
我可以看到后一种形式的缺点是你应该命名你的主键和外键相同,这并不总是实用的.
我有一张桌子,设计非常糟糕(不是我感谢),它以类似于以下的方式存储数据:
[key],[lease_id],[building_name],~20多列数据
对于中心和总部,可以并且将存在lease_id.我被要求找到所有实例,其中建筑物中的租赁数据与总部的数据不匹配相同的租约.
我可以通过自我加入很容易地做到这一点.这里的挑战是有大约20列可供比较,虽然我可以手动输入每一列我想知道是否有更好的方法来做到这一点(这也意味着查询可以在将来使用,考虑到任何表更改).
在语法上荒谬的伪代码 - 我想做一些类似于下面的工作:
select lp.*
from lease_proposal lp
inner join
(
select *
from lease_proposal lp2
where building_id = '001' -- assume 001 is head office for sake of example
) lp2
on lp2.lease_id = lp.lease_id
where lp.* <> lp2.*
Run Code Online (Sandbox Code Playgroud) 所以这比标题所暗示的要多一点.我有其中包含的表名列和数量列,我想显示谁拥有500和1500之间的总和数量的结果.
例:
name qty
------ ----
brad 100
cody 300
kylie 1100
brad 800
nelson 1200
bob 600
nelson 100
kylie 600
Run Code Online (Sandbox Code Playgroud)
我想要显示结果
name qty
------ ----
brad 900
nelson 1300
bob 600
Run Code Online (Sandbox Code Playgroud)
希望这是有道理的.这是我得到的查询
SELECT name, SUM(qty) AS Total
FROM t1
NATURAL JOIN t2
WHERE qty BETWEEN 500 AND 1500
GROUP BY name
ORDER BY name
Run Code Online (Sandbox Code Playgroud)
问题是它似乎只是将qty中的字段汇总在500到1500之间,而不是仅显示该范围内的Total字段.我尝试做"WHERE SUM(qty)BETWEEN ...."但这会导致编译错误(我正在使用SQLite studio)
这是我所在的数据库课的作业问题,我正在学习,而不仅仅是得到答案.谢谢!
sql ×7
database ×2
join ×2
sql-server ×2
t-sql ×2
cartesian ×1
mysql ×1
nested-loops ×1
product ×1
select ×1
sqlite ×1
sqlitestudio ×1