Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 [ 71 ] 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

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 "И*"



И наконец, оператор IS NULL позволяет обнаружить значения типа NULL в указанном поле и соответственно определить, выводить проверенную запись в итоговый курсор или нет. Оператор IS NULL нельзя непосредственно использовать в Visual FoxPro и Microsoft Access. Но в этих языках есть функция ISNULL(). Поэтому можно написать команду следующим образом:

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 isnull(country.country name)

В случае если вам необходимо отсортировать ваши данные по какому-то полю, вы можете воспользоваться предложением ORDER BY. Например, для сортировки данных в предыдущем запросе по названиям фирм воспользуйтесь следующим запросом.

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 isnull(country.country name)

ORDER BY firm.name firm

При этом по умолчанию данные будут отсортированы в порядке возрастания. Если необходим противоположный порядок следования записей в итоговом курсоре, то используйте ключевое слово DESC, например:

ORDER BY firm.name firm DESC

Если бы SQL-запросы позволяли нам выполнять только то, что мы успели рассмотреть, то и этого было бы достаточно много, но это еще не все. Мы можем использовать набор агрегатных функций.

Этот набор может различаться в отдельных продуктах. В ANSI SQL присутствуют следующие функции агрегирования:

• COUNT(*) - возвращает число выбранных записей;

• COUNT(ALL Expression) - возвращает количество непустых значений;

• COUNT(DISTINCT Expression) - возвращает количество неповторяющихся значений по указанному в Expression выражению;

• MAK(Expression) - максимальное значение по указанному выражению;

• MIN(Expression) - минимальное значение по указанному выражению;

• SUM(ALL/DISTINCT Expression) - сумма по всем или только по неповторяющимся значениям;

• AVG(ALL/DISTINCT Expression) - среднее по всем или только по неповторяющимся значениям.

В Microsoft Access и Visual FoxPro, в дополнение к вышеприведенным функциям, вы можете вычислить еще и стандартное отклонение, дисперсию и т. д.

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

SELECT DISTINCTROW Sum(account.sum) AS Sum sum, model.name model FROM model INNER JOIN (account INNER JOIN [automobile passenger car] ON account.key auto = [automobile passenger car].key auto) ON model.key model = [automobile passenger car].key model GROUP BY model.name model

Полученный результат приведен в следующей таблице:

Сумма Наименование

20500 145 1.4

10500 146 1.9

25000 740i 4.0

60000 840Ci 4.0 37000 M3 3.0



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 [ 71 ] 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146