我刚刚查看了一些示例数据库查询,并遇到了这个问题:
找到标识符,名称和&研究部门员工的地址。
方法I:加入方法
SELECT Ssn, FName, LName, Address
FROM EMPLOYEE, DEPARTMENT
WHERE Dno = Dnumber
AND Dname = ‘Research’
方法II:子查询方法
SELECT Ssn, FName, LName, Address
FROM EMPLOYEE
WHERE Dno IN
( SELECT Dnumber
FROM DEPARTMENT
WHERE Dname = ‘Research’ );
在这些例子中,为什么你不能忽略Dno = Dnumber线?你怎么知道何时加入这个?
答案 0 :(得分:2)
John,您正在使用隐式连接语法cf ansi SQL '89。
WHERE JOIN
SELECT Ssn, FName, LName, Address
FROM EMPLOYEE, DEPARTMENT
WHERE Dno = Dnumber
AND Dname = 'Research'
你应该永远不会使用它,因为它会让人感到困惑
它会导致很多错误,因为如果你不小心,它会cross join
。{
使用显式连接的以下语法比较ANSI SQL '92更清楚。
SELECT Ssn, FName, LName, Address
FROM EMPLOYEE
inner join DEPARTMENT on (employee.dnumber = department.dno)
WHERE Dname = 'Research'
这也解释了为什么你不能忽略dnumber = dno
,,因为这是连接条件
<强> SUBQUERY 强>
子查询实际上是通过其他方式的连接
通常,您应该避免使用子查询,因为连接速度更快(90%的时间)
有些人发现子查询更容易理解。我会说,如果你没有grok加入,请远离SQL! 有时你仍然在做一些复杂或奇怪的连接,然后子查询是一个选项。
回到你的问题:因为子查询实际上是通过其他方式连接你需要连接条件来进行连接: - )。
答案 1 :(得分:1)
我实际上会写这样的东西。
SELECT
Ssn, FName, LName, Address
FROM
EMPLOYEE
LEFT JOIN
DEPARTMENT ON EMPLOYEE.Dno = DEPARTMENT.Dnumber
WHERE
Dname = "Research"
答案 2 :(得分:1)
Dno = Dnumber
用于桥接 JOIN
和Employee
表之间的Department
。您需要它来识别您加入的表之间的关系。
有很多方法可以编写JOIN
语句。
这是一个关于联接的好教程 - http://mysqljoin.com/
答案 3 :(得分:1)
每位员工都属于某个部门。 Dno = Dnumber是定义两者之间关系的原因。所以你必须在你的加入中保持这种关系。 Dname ='Research'进一步筛选仅包括研究部门员工。
如果你不加入Dno到Dnumber,你将会得到一个笛卡尔积。
答案 4 :(得分:0)
您使用Dno = Dnumber
行基本上创建JOIN
条件。
如果你没有使用它们,你就会有一个完整的JOIN
但是,我认为执行JOIN
的正确方法实际上是
SELECT
EMPLOYEE.[Ssn]
, EMPLOYEE.[FName]
, EMPLOYEE.[LName]
, EMPLOYEE.[Address]
FROM
EMPLOYEE
JOIN
DEPARTMENT
ON DEPARTMENT.[Dnumber] = EMPLOYEE.[Dno]
WHERE
DEPARTMENT.[Dname] = 'Research'
答案 5 :(得分:0)
“Dno = Dnumber”行是join子句 - 它告诉查询只在employee表中包含Dno与department表中部门号匹配的记录。
答案 6 :(得分:0)
您需要使用Dno = Dnumber子句来连接这两个表。如果没有这个,你将得到所谓的笛卡尔连接,你将得到n x m个返回的行数,其中n = EMPLOYEE表中的#rows,m = DEPARTMENT表中的#rows。
您可以在http://www.1keydata.com/sql/sqljoins.html找到关于SQL join的好教程。