何时在SQL查询中使用标识符

时间:2011-05-03 21:22:29

标签: mysql sql select key

我刚刚查看了一些示例数据库查询,并遇到了这个问题:

找到标识符,名称和&研究部门员工的地址。

方法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线?你怎么知道何时加入这个?

7 个答案:

答案 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用于桥接 JOINEmployee表之间的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的好教程。