Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Самообъединение таблиц
Аналогично объединению таблицы с другой таблицей, можно объединить таблицу саму с собой. Предположим, что вы хотите выяснить имена служащих отдела, в котором работает Нора Эдварде. Для этого необходимо найти в таблице employee номер отдела (departmentID), в котором работает Нора, а затем посмотреть в таблице employee, кто еще работает в том же отделе. Это можно сделать так: select e2.name from employee el, employee e2 where el.name = 'Нора Эдварде' and el.departmentID = e2.departmentID; В этом запросе для таблицы employee мы определили два разных псевдонима. По сути мы сообщили системе MySQL, что хотели бы иметь две отдельных таблицы, el и е2, которые должны содержать одни и те же данные. После этого мы объединяем их так же, как любые другие таблицы. Теперь сначала находим строку Норы в таблице el (el. name=' Нора Эдварде '), а затем в таблице е2 ищем строки с тем же значением номера отдела, что и у Норы (el.departmentID = e2. departmentID). Ниже приведены результаты предыдущего запроса Здесь представлены все служащие, работающие в одном отделе с Норой, включая и саму Нору Эдварде. Очень просто добавить условие, которое исключит ее из результирующего списка: select e2.name from employee el, employee e2 where el.name = 'Нора Эдварде' and el.departmentID = e2.departmentID and e2.name!= 'Nora Edwards';
Типы объединений Существуют различные типы объединений, варианты которых могут использоваться в MySQL. Основное объединение В предыдущей теме мы упомянули понятие декартова произведения. В данном контексте его иногда называют полным или перекрестным объединением, но, независимо от терминологии, такое объединение возвращает полный набор комбинаций. При добавлении к объединению некоторого условного выражения (типа employee. departmentID = department. departmentID) мы превращаем его в нечто, называемое объединением по эквивалентности, которое ограничивает число возвращаемых запросом строк. До сих пор мы использовали набор таблиц, перечисленных в выражении FROM и разделенных запятыми. Это определяло, как было показано выше, перекрестное объединение, которое превращалось в объединение по эквивалентности с помощью выражения WHERE. MySQL предлагает различные формы синтаксиса для объединений такого типа. Рассмотрим наш оригинальный запрос: select employee.name, department.name from employee, department where employee.departmentID = department.departmentID; Вместо запятой в выражении FROM можно использовать ключевое слово JOIN: select employee.name, department.name from employee join department where employee.departmentID = department.departmentID; Вместо JOIN точно так же можно использовать CROSS JOIN (перекрестное объединение) или INNER JOIN (внутреннее объединение). При использовании этого типа объединения MySQL находит связываемые таблицы и пытается объединить их оптимальным образом, не обязательно в том порядке, в котором их перечислите вы. Если вы хотите отменить оптимизацию и заставить MySQL связать таблицы в указанном вами порядке, замените слово JOIN выражением STRAIGHT JOIN (непосредственное объединение). Левые и правые объединения Рассмотрим, например, ситуацию, когда требуется выяснить имена служащих, еще не получавших внешних заданий, т.е. служащих, коды которых (emp1оуееID) отсутствуют в таблице (assignment). Решить такую задачу можно с помощью LEFT JOIN, как показано ниже. select employee.name from employee left join assignment on employee.employeelD = assignment.employeelD where clientID is null; Легко подтвердить правильность полученного результата с помощью непосредственной проверки таблиц, но почему и как этот запрос работает Левое объединение заставляет взять левую таблицу в объединении (в данном случае это таблица employee) и попытаться найти соответствия среди строк правой таблицы (здесь это таблица assignment). Соответствующие строки размещаются рядом с левой таблицей. Для строк левой таблицы, не имеющих соответствующих строк в правой таблице, LEFT JOIN создает строки, состоящие из значений NULL. Строки левой таблицы, не имеющие соответствующих строк в правой таблице, можно найти с помощью поиска по ключу NULL. Давайте снова вернемся к нашему примеру. В указанном объединении для каждого служащего, имеющего задание, мы получим строку с информацией о служащем и задании. Если служащий не имеет соответствующей строки в таблице заданий, левое объединение добавит "фиктивную строку", состоящую из одних значений NULL. Такие фиктивные строки можно найти с помощью поиска служащих, для которых полученные задания имеют значение NULL в поле clientID. (Поле clientID является ключевым полем, поэтому в самой таблице assignment такое просто невозможно.) В данном примере мы использовали LEFT JOIN, но точно так же можно использовать RIGHT JOIN, которое работает аналогично, но использует в качестве основной правую таблицу, а вместо отсутствующих строк левой таблицы создает строки значений NULL.
Date: 2016-07-25; view: 454; Нарушение авторских прав |