|
Программирование >> Программный интерфейс приложений
Но в выборке пустых столбцов нет необходимости. Единственное, что действительно может интересовать в выборках такого рода, - это строки из левой таблицы, не нашедшие соответствия во второй таблице. SELECT tl.* FROM tl LEFT JOIN t2 ON tl.xl = t2.i2 WHERE t2.i2 IS NULL +-+-+ I xl I cl I +-+-+ В этой ситуации нужно следить, чтобы столбцы, по которым производится объединение, не были объявлены как NOT NULL, в противном случае может быть получен неадекватный результат. Объединение LEFT JOIN имеет несколько синонимов и вариантов. Один из них - объединение LEFT OUTER JOIN. Сушествует также нотация для ODBC (Open DataBase Connectivity) СУБД MySQL (здесь oj обозначает outer join - внешнее объединение ): ( О] tbl name LEFT OUTER JOIN tbl name ON ]oin expr } Объединение NATURAL LEFT JOIN тоже ведет себя подобно объединению LEFT JOIN. Оно осуществляет левое объединение, выбирая по критерию совпадения все столбцы, которые имеют одинаковое имя в правой и левой таблицах. Некоторые базы данных имеют соответствующее объединение right join, но СУБД MySQL объединения такого типа в своем арсенале пока еще не имеет. Комментарии SQL-код можно сопровождать комментариями. Эта возможность может пригодиться при сохранении текстов запросов в файлы. В СУБД MySQL есть два способа комментирования. Комментарием считается любая строка, начинающаяся с символа #. Кроме того, можно производить комментирование в стиле языка профаммирования С. Это значит, что в качестве комментария рассмафиваются все сфоки, расположенные между символами /* и */. Действие комментария такого типа распросфаняется на несколько строк. # это однострочный комментарий /* это тоже однострочный комментарий */ /* это многострочный комментарий В СУБД MySQL есть интересная возможность прятать ключевые слова, присущие только ей, за символы /*!. СУБД MySQL заглядывает за такие офаничители, в то время когда любая другая СУБД их просто проигнорирует как любой комментарий. Это позволяет создавать запросы, которые можно применить как для работы с СУБД MySQL, извлекая при этом все преимущества применения дополнительных возможностей MySQL, так и для работы с другими базами данных. Вот пример двух абсолютно идентичных для обычных СУБД запросов. Но MySQL во втором случае выполнит операцию insert delayed: INSERT INTO absence (student id, date) VALUES(13, 1999-09-28 INSERT /*! DELAYED */ INTO absence (student id, date) VALUES(13, 1999-09-28 Начиная с версии 3.23 комментарий можно начинать с двух тире и пробела между ними; все символы, что стоят между такими тире и концом строки, рассматриваются как комментарий, т.е. не будут анализироваться интерпретатором. Некоторые другие базы данных тоже считают двойное тире началом комментария СУБД MySQL это тоже позволяет, но для снятия неопределенности требует дополнительного пробела. Операторы, содержащие выражения наподобие 5 7, могут быть распознаны как начало комментария. А выражение наподобие 5 7 вряд ли будет выражением. Но все же лучше будет воспользоваться одним из традиционных комментирующих символов и обращаться к помощи двойного тире только в кодах, заимствованных из других баз данных. Разные решения Этот раздел можно рассматривать как нечто вроде медицинской аптечки первой помощи. Большей частью это решения проблем, которые пришли к автору по почте (благодарю всех тех, кто присьшал мне ответьг) Преобразование вложенных выборок в объединения Возможность создавать вложенные выборки появится в СУБД MySQL 3.24. Отсутствие этой возможности в предыдущих версиях вызвало много нареканий в адрес СУБД MySQL. Но запросы, использующие вложенные выборки, можно переписать с применением объединения. Более того, использование объединения всегда эффективнее использования вложенных выборок. Перезапись вложенных выборок, делающих выборку по совпадению Вот пример запроса, содержащего вложенную выборку. Он выбирает результаты всех тестов из таблицы score (т.е. игнорирует результаты викторин): SELECT * FROM score WHERE event id IN (SELECT event id FROM event WHERE type = T ) Аналогичный запрос можно написать без вложенного запроса с помощью простого объединения: SELECT score.* FROM score, event WHERE score . event ici = event. event id AND type = T Вот другой пример. Это выборка результатов, полученных учащимися женского пола: SELECT * FROM score WHERE student id IN (SELECT student id FROM student WHERE sex = F ) Его можно преобразовать в следующее объединение: SELECT score.* FROM score, student WHERE score.student id = student.student id AND student.sex = F Здесь просматривается простая закономерность. Вложенный запрос типа: SELECT * FROM tablel WHERE colunral IN (SELECT colunra2 FROM table2a WHERE colunm2b = value) можно заменить объединением: SELECT tablel.* FROM tablel, table2 WHERE tablel. colunml = table2. colunm2a AND table2. colunm2b = value Перезапись вложенных выборок, делающих выборку по несовпадению Вот пример запроса, содержащего вложенную выборку другого рода. Он выбирает значения из одной таблицы, которые не представлены в другой таблице. Ранее мы уже увидели, что при рещении задач типа поиск отсутствующих значений подходит объединение типа left join. Вот запрос с вложенным запросом, который проверяет отсутствие значений в таблице absence (учащиеся с отличной посещаемостью): SELECT * FROM student WHERE student id NOT IN (SELECT student id FROM absence) Этот запрос можно переписать, применив конструкцию left join. SELECT student.* FROM student LEFT JOIN absence ON student.student id = absence.student id WHERE absence.student id IS NULL Здесь просматривается закономерность. Вложенный запрос типа: SELECT * FROM tablel WHERE colunml NOT EXISTS (SELECT colunm2 FROM table2) можно заменить объединением: SELECT tablel.* FROM tablel LEFT JOIN table2 ON tablel.columnl = table2.column2 WHERE table2.colunm2 IS NULL Здесь предполагается, что столбец table2. column2 был объявлен как not null.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |