2014-01-22 3 views
-2

В чем разница между следующими запросами? Они дают мне тот же результат.Различие между моими SQL-запросами

SELECT student. * , 
department.department_name, 
semester.semester_name 
FROM (
student 
LEFT JOIN department ON student.student_id = department.department_id 
LEFT JOIN semester ON student.student_id = semester.semester_id 
) 

SELECT student. * , 
department.department_name, 
semester.semester_name 
FROM (
student 
LEFT JOIN department ON student.department_id = department.department_id 
LEFT JOIN semester ON student.semester_id = semester.semester_id 
) 

SELECT student. * , 
department.department_name, 
semester.semester_name 
FROM (
student 
LEFT JOIN department ON student.student_id = student.student_id 
LEFT JOIN semester ON student.student_id = student.student_id 
) 

SELECT student. * , department.department_name, semester.semester_name 
FROM (
student 
LEFT JOIN department ON student.department_id = student.student_id 
LEFT JOIN semester ON student.semester_id = student.student_id 
) 
+1

ok thanks @halfer – user3215780

ответ

0

2) (если у вас нет странной схемы) было бы правильно, поскольку оно дало бы список учеников и их курсы и семестры.

3) даст список студентов против всех курсов и всех семестров начиная student.student_id = student.student_id всегда будет истинным.

1 и 4) Будет давать случайные совпадения между учащимися и курсами и семестрами в зависимости от того, какие идентификаторы происходят между ними (то есть, где идентификатор студента совпадает с идентификатором семестра или отдела).

3

Вы не можете соответствовать этому:

student.student_id = department.department_id 

Это не имеет смысла - вы говорите, что студент ID и номер отдела являются взаимозаменяемыми, но они не являются. В этом конкретном случае у вас, вероятно, есть «студент 1» и «отдел 1», и поэтому в случае, когда вы тестируете, он работает. Но это не будет вообще.

Равным образом, нет никакого значения в этом:

student.student_id = student.student_id 

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

Только запрос (2) представляется правильным.

+0

NULL = NULL в MySQL, кажется, возвращает NULL, а не True: dev.mysql.com/doc/refman/5.0/en/comparison-operators.html – BLaZuRE

+0

@BLaZuRE, это хороший момент для общий случай сравнения, но я должен представить, что эти первичные/внешние ключи будут определяться как «NOT NULL»? – halfer

+0

Поскольку вопрос настолько базовый, я не буду рассчитывать на то, что эти таблицы имеют первичные/внешние ключи, как ожидалось, и не будут рассчитывать на то, что они определены как «NOT NULL». Я также хотел подчеркнуть, что * не все вещи равны самим себе. Точно так же, если вы попробуете предложение where 'SELECT ... WHERE colX = значение UNION SELECT ... WHERE colX <> value', вы можете не получить все строки, потому что вам также нужно' WHERE colX IS NULL'. Я нашел это трудным путем, но новички должны быть в курсе. – BLaZuRE

Смежные вопросы