|
Программирование >> Разработка пользовательского интерфейса
Голодные лисы Германия 740i 4.0 BMW Голодные лисы Германия 840Ci 4.0 BMW Угрюмые слоны Германия 840Ci 4.0 BMW В этом запросе появилось предложение WHERE, о котором мы прежде не упоминали. Обратившись к теории, скажем, что это слово позволяет нам определить предикат, который будет обрабатывать каждую строку таблиц, и, в зависимости от его истинности, нужные нам поля из этих строк окажутся в итоговом запросе. В нашем конкретном случае мы просто определяли, есть ли соответствующие значения по связующему полю для таблицы в таблице, с которой мы ее связываем. Например, строчка Automobile passenger car.key auto = Account.key auto ограничит нашу выборку только теми записями, которые имеют одинаковые значения и в таблице Automobile passenger car, и в таблице Account по полю key auto. Проведя соответствующее исследование для других связующих пар, мы поймем, каким образом ограничивается набор выбранных данных. Вышеприведенный синтаксис правилен для любого диалекта SQL, используемого в рассматриваемых средствах разработки. Рассмотрим более простой пример. Нам хочется узнать для автомобиля название его фирмы-производителя. Запрос будет выглядеть так: SELECT model.name model,firm.name firm ; FROM model,firm ; WHERE model.key firm = firm.key firm Далее рассмотрим, как этот запрос будет выглядеть, если мы построим его с помощью Конструктора запросов Microsoft Access. SELECT DISTINCTROW firm.name firm, model.name model FROM firm INNER JOIN model ON firm.key firm = model.key firm; В предложении FROM появилась конструкция: firm INNER JOIN model ON firm.key firm = model.key firm что в дословном переводе означает: внутренняя связь таблицы Firm с таблицей Model по полю key firm. Почему нельзя просто все записать в предикат, составленный с помощью предложения WHERE? Можно. Но полученный запрос не будет модифицирующим, то есть вы не сможете изменять данные в запросе, а соответственно и редактировать данные в исходной таблице посредством запроса. Ядро базы данных Microsoft Jet - достаточно гибкое средство в отношении типов и форматов SQL выражений, используемых для создания связей между таблицами. В дополнение к связям, которые вы можете указать в предикате, составляемом с помощью предложения WHERE, Microsoft Jet SQL может использовать предложение JOIN, чтобы указать внутреннюю, левую внешнюю или правую внешнюю связь, а также неэквивалентные связи, в которых связующим критерием является не равенство значений в связующих полях двух таблиц, а выражение условия, которое должно возвращать истину. Внутренняя связь может быть сложная, когда вы связываете несколько таблиц, например: SELECT DISTINCTROW firm.name firm, model.name model, country.country name FROM model INNER JOIN (firm INNER JOIN country ON firm.key country = country.key country) ON model.key firm = firm.key firm ; В вышеприведенном примере мы ищем штаб-квартиру фирмы-производителя каждой модели. Помимо внутреннего (INNER JOIN) объединения, вы можете использовать внешние объединения, при этом различаются левые внешние и правые внешние объединения: LEFT JOIN и RIGHT JOIN. Используя левое внешнее объединение, вы получаете в итоговом запросе все записи из левой таблицы и только те записи из правой таблицы, которые имеют соответствующие значения по связующему полю в левой таблице. SELECT DISTINCTROW [automobile passenger car].date issue, account.account FROM [automobile passenger car] LEFT JOIN account ON [automobile passenger car].key auto = account.key auto; Какое объединение использовать, зависит только от того, где расположены сравниваемые поля в предложении объединения. Совершенно никакого различия в скорости выполнения или наборе полученных записей вы не получите. Предыдущий запрос мы можем переписать следующим образом без всякой потери производительности: SELECT DISTINCTROW [automobile passenger car].date issue, account.account FROM account LEFT JOIN [automobile passenger car] ON account.key auto = [automobile passenger car].key auto; Microsoft Jet возвращает специальное значение NULL во всех полях для записей внешней таблицы, не содержащих одинаковых значений. Вы можете использовать это свойство для проверки целостности связи в зависимости от присутствия значения типа NULL во внешней таблице. Если в итоговом запросе присутствуют значения типа NULL, вы можете быть уверены в наличии несвязанных записей в дочерней таблице, или, наоборот, есть значения в родительской таблице, для которых отсутствуют соответствующие значения в дочерней таблице. Если вы хотите узнать, с каким поставщиком у вас не было сделок, например, за последний месяц, то лучший и самый быстрый способ это сделать - использовать внешнее объединение. Для сокращения объема выборки, то есть для получения в итоговом курсоре только тех данных, которые вас интересуют в конкретный момент, вы должны использовать предикат, составляемый с помощью предложения WHERE, который служит не только для установления связей, но и для накладывания фильтров на выбираемые данные. Допустим, мы хотим выбрать все названия моделей и производящих их фирм в пределах для конкретной страны, например Италии: SELECT DISTINCTROW firm.name firm, model.name model, country.country name FROM model INNER JOIN (firm INNER JOIN country ON firm.key country = country.key country) ON model.key firm = firm.key firm WHERE country.country name= Италия ; В SQL вы можете использовать логические операторы AND, OR и логическое отрицание NOT. Добавив всего лишь один оператор NOT перед выражением country.country name = Италия мы получаем совершенно противоположную выборку, в которой будут присутствовать фирмы всех стран, кроме Италии. SELECT DISTINCTROW firm.name firm, model.name model, country.country name FROM model INNER JOIN (firm INNER JOIN country ON firm.key country = country.key country) ON model.key firm = firm.key firm WHERE NOT country.country name= Италия При необходимости получить данные для двух стран мы используем оператор OR. Если нам не нужны данные по автомобилям из Франции и Италии, мы используем следующий запрос: SELECT DISTINCTROW firm.name firm, model.name model, country.country name FROM model INNER JOIN (firm INNER JOIN country ON firm.key country = country.key country) ON model.key firm = firm.key firm WHERE NOT (country.country name= Италия OR country.country name = Франция ) В этом случае необходимо верно расставить скобки, чтобы оператор NOT относился и к Италии и к Франции. Пока мы использовали только один оператор сравнения - равно (=), - на самом деле их несколько больше: >> - больше; << - меньше; >>= - не меньше; <<= - не больше; <<>> - не равно. Еще раз вернемся к предыдущему запросу, оставив прежнюю цель - не выбирать модели из Франции и Италии, но при этом используя совсем другие операторы: SELECT DISTINCTROW firm.name firm, model.name model, country.country name FROM model INNER JOIN (firm INNER JOIN country ON firm.key country = country.key country) ON model.key firm = firm.key firm WHERE country.country name<<>> Италия AND country.country name <<>> Франция Обратите внимание, что мы используем AND вместо OR, иначе в итоговом курсоре были бы выбраны все записи. Операторы сравнения могут обрабатывать не только числовые значения, но и символьные. При этом обрабатывается ASCII-код символа. При необходимости выполнить запрос, в котором мы хотим выбрать страны, названия которых начинаются на букву И и последующие буквы в порядке алфавита, мы можем использовать следующие команды: SELECT DISTINCTROW firm.name firm, model.name model, country.country name FROM model INNER JOIN (firm INNER JOIN country ON firm.key country = country.key country) ON model.key firm = firm.key firm WHERE country.country name>>= И В предикате, который формируется с помощью предложения WHERE, можно и нужно использовать помимо вышеприведенных еще несколько операторов, а именно: IN, BETWEEN, LIKE и IS NULL. Использование оператора IN позволяет нам по-другому выполнить запрос по выборке данных по Италии и Франции. Вспомните запрос, в котором мы собирали данные для всех стран, кроме Италии и Франции. Теперь мы можем записать его с помощью оператора IN SELECT DISTINCTROW firm.name firm, model.name model, country.country name FROM model INNER JOIN (firm INNER JOIN country ON firm.key country = country.key country) ON model.key firm = firm.key firm WHERE country.country name NOT IN ( Италия , Франция ); Оператор BETWEEN, строго следуя своему дословному переводу, выводит нам данные в промежутке между значениями, которые мы укажем в качестве его аргументов. Если вам нужно выбрать информацию по странам, которые расположены в алфавитном порядке между Италией и Францией, то используйте запрос, подобный нижеприведенному. SELECT DISTINCTROW firm.name firm, model.name model, country.country name FROM model INNER JOIN (firm INNER JOIN country ON firm.key country = country.key country) ON model.key firm = firm.key firm WHERE country.country name BETWEEN Италия AND Франция При использовании этого оператора помните, что краевые значения также попадают в результаты запроса. Если вам это не нужно, то с помощью комбинации предикатов предложения WHERE двух последних запросов вы можете добиться необходимого для вашей работы результата. SELECT DISTINCTROW firm.name firm, model.name model, country.country name FROM model INNER JOIN (firm INNER JOIN country ON firm.key country = country.key country) ON model.key firm = firm.key firm WHERE country.country name NOT IN ( Италия , Франция ) AND (country.country name BETWEEN Италия AND Франция ) Оператор LIKE позволяет использовать в критерии поиска шаблоны. Если необходимо выбрать только модели из стран, названия которых начинаются на букву И , то можно использовать следующий запрос: SELECT DISTINCTROW firm.name firm, model.name model, country.country name FROM model INNER JOIN (firm INNER JOIN country ON firm.key country = country.key country) ON model.key firm = firm.key firm WHERE country.country name LIKE И*
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |