Когда использовать идентификатор в запросах SQL - PullRequest
0 голосов
/ 04 мая 2011

Я только что посмотрел несколько примеров запросов к базе данных и наткнулся на это:

Найдите идентификатор, имя и адрес сотрудников исследовательского отдела.

Метод 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 ]

2 голосов
/ 04 мая 2011

Джон, вы используете синтаксис неявного соединения cf ansi SQL '89.

ГДЕ ПРИСОЕДИНЯЙТЕСЬ

SELECT Ssn, FName, LName, Address
FROM EMPLOYEE, DEPARTMENT
WHERE Dno = Dnumber
AND Dname = 'Research'

Вы не должны никогда использовать это, потому что это чертовски запутанно.
И это вызывает много ошибок, потому что это cross join, если вы не будете осторожны.
Следующий синтаксис с использованием явных объединений cf ANSI SQL '92, который намного понятнее.

SELECT Ssn, FName, LName, Address
FROM EMPLOYEE
inner join DEPARTMENT on (employee.dnumber = department.dno)
WHERE Dname = 'Research'

Это также отвечает, почему вы не можете пропустить dnumber = dno, , потому что это условие соединения

подзапрос
Подзапрос - это действительно соединение другими способами.
В общем, вы должны избегать подзапроса, потому что соединение происходит быстрее (90% времени)

Некоторым людям легче понять подзапросы. Я бы сказал, что если вы не вступаете в грок, то держитесь подальше от SQL!
Тем не менее, иногда вы делаете что-то сложное или странное для объединения, и тогда подзапрос является опцией.

Возвращаясь к вашему вопросу: , потому что подзапрос действительно является соединением, иными словами, вам необходимо это условие соединения, чтобы сделать соединение: -).

1 голос
/ 04 мая 2011

Каждый сотрудник принадлежит к отделу.Dno = Dnumber - это то, что определяет отношения между ними.Таким образом, вы должны сохранить эти отношения в вашем соединении.Dname = «Исследования» - дополнительные фильтры, чтобы включить только сотрудников исследовательского отдела.

Если вы не присоединитесь к Dno к Dnumber, вы получите декартово произведение.

1 голос
/ 04 мая 2011

Dno = Dnumber используется для моста JOIN между таблицами Employee и Department.Он необходим для определения взаимосвязи между таблицами, к которым вы присоединяетесь.

Существует множество способов написания JOIN операторов.

Это хороший учебник по объединениям - http://mysqljoin.com/

1 голос
/ 04 мая 2011

Я бы на самом деле написал что-то вроде этого.

SELECT 
   Ssn, FName, LName, Address
FROM 
   EMPLOYEE
LEFT JOIN 
   DEPARTMENT ON EMPLOYEE.Dno = DEPARTMENT.Dnumber
WHERE 
   Dname = "Research"
0 голосов
/ 04 мая 2011

Предложение Dno = Dnumber необходимо для объединения двух таблиц. Без этого вы получите то, что называется декартовым соединением, где вы получите n x m возвращенных строк, где n = # строк в таблице EMPLOYEE и m = # строк в таблице DEPARTMENT.

Хороший учебник по SQL-соединению можно найти на http://www.1keydata.com/sql/sqljoins.html.

0 голосов
/ 04 мая 2011

Строка "Dno = Dnumber" - это предложение объединения - оно указывает запросу только на включение записей в таблицу сотрудников, Dno которых соответствует номеру отдела в таблице отделов.

0 голосов
/ 04 мая 2011

Вы используете строку 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...