2016-06-10 3 views
0

Я использую MySQL. В качестве атрибутов есть таблица, называемая инструктором с идентификатором, именем, dept_name, зарплатой. Я написал запрос «найти все инструктор, чьи зарплата больше, чем по крайней мере, один преподавателю на кафедре физики», какКаково преимущество условий в том, где статья?

select t.name, t.dept_name, t.salary 
from instructor t, instructor s 
where t.salary > s.salary and s.dept_name='physics'; 

Теперь, которая будет применяться условие первым?

+0

Здесь нет вопроса о приоритете. Существует вопрос о порядке оценки, который не является одним и тем же. – EJP

+0

@EJP, Можете ли вы рассказать мне, как здесь будут сравниваться записи? Будь каждая запись в 't' с теми, кто находится в 's' или каким-то другим способом. – BabyboB

ответ

2

Применяется условие WHERE, что означает, что для того, чтобы запись появилась в результирующем наборе, она должна будет соответствовать как требованиям зарплаты, так и требованиям отдела.

Вы запрос выглядит почти правильно, за исключением того, что вы, вероятно, хотите включить DISTINCT, чтобы убедиться, что вы не сообщайте тот же инструктор более чем один раз в наборе результатов:

select distinct t.name, t.dept_name, t.salary 
from instructor t 
inner join instructor s 
    on t.salary > s.salary and s.dept_name='physics' 

Вы заметите, что у меня есть также заменил ваш неявный синтаксис соединения явным inner join. Вы не должны ставить запятые в пункт from, так как это очень старый школьный способ сделать соединение, которое считается устаревшим из современных РСУБД.

+0

", если первое условие (проверка зарплаты) терпит неудачу, тогда MySQL может пропустить проверку второго условия." --- Это просто неправильно. Нет понятия порядка предикатов в mysql (и любых других зрелых RDBMS) – zerkms

+0

@zerkms Я не знал этого, как на большинстве языков программирования, порядок логики сохраняется в таких вещах, как оператор 'if'. Знание того, что есть заказ на оценку, может быть полезным во многих случаях. –

+1

«Знание того, что есть оценка для оценки, может быть полезна во многих случаях» --- не в случае СУБД. База данных знает больше, чем вы, и может принять лучшее решение о том, как оценивать запрос. – zerkms

0

Как упоминал Тим в своем ответе, все, где рассматриваются критерии. Я также прокомментировал ему, что я думаю, что вы просите преподавателей из других отделов, которые имеют зарплату больше, чем кто-либо в физическом отделе. Если у вас 3 человека в физике, у всех есть разные зарплаты, тогда у двух человек зарплата больше, чем у самой низкооплачиваемой физики, но все 3 могут быть выше, чем все остальные в школе.

Это было бы лучше обращаться с подзапроса, чтобы найти самую низкую физическую DEPT зарплату первым, а затем посмотреть на тех, кто больше, чем это значение ...

Кроме того, как вы есть, вы собираетесь иметь Декартово сравнение, так как нет условия JOIN. Каждая запись в таблице инструктора сравнивается с каждой записью в таблице инструкторов SECOND (включая запись, которую она сравнивает).

Чтобы решить эту проблему, второй из нижеприведенного псевдонима является предварительным вычислением минимальной зарплаты ОДИН РАЗ для физического факультета , затем применяя этот ОДИН ответ на все другие зарплаты преподавателей, которые НЕ находятся в физическом отделе.

select 
     t.name, 
     t.dept_name, 
     t.salary 
    from 
     instructor t, 
     (select min(ps.salary) PhysicsLowest 
      from instructor ps 
      where ps.dept_name='physics') as Phys 
    where 
      t.salary > Phys.PhysicsLowest 
     AND NOT t.dept_name = 'physics' 
Смежные вопросы