Создание приложений для работы с базами данных в сети 551

Отдел	Всегосотрудников
Бухгалтерия	3
Цех 1	4
Цех 2	4

При группировании записей с помощью GROUP BY можно вводить условия
отбора записей с помощью ключевого слова HAVING. Например, если переписать
приведенный выше оператор следующим образом:

SELECT Dep Отдел, count (•*) Всего сотрудников FROM Pers
GROUP BY Dep HAVING Dep о 'Бухгалтерия'

то первая строка в приведенной выше таблице должна исчезнуть. Впрочем, компо-
нент Query, с помощью которого вы тестируете запросы SQL, синтаксиса HAVING
не поддерживает. Это не страшно, поскольку вообще лучше всегда использовать
WHERE вместо HAVING. Различие между этими возможностями заключается в
том, что HAVING учитывает заданное условие после группирования записей, а
WHERE — до группирования. Поэтому HAVING менее эффективен. Так что луч-
ше приведенный выше оператор переписать в виде

SELECT Dep Отдел, count!*) Всего_сотруднмков FROM Pers
WHERE Dep <> 'Бухгалтерия'GROUP BY Dep

что даст тот же самый результат.

10.1.2.3 Вложенные запросы

Результаты, возвращаемые оператором Select, можно использовать в другом
операторе Select. Причем это относится и к операторам, возвращающим совокуп-
ные характеристики, и к операторам, возвращающим множество значений. На-
пример, в предыдущем разделе нам не удалось узнать фамилию самого молодого
сотрудника. Теперь это можно сделать с помощью вложенных запросов:

SELECT Fam,Year_b FROM Pers WHERE Year_b=(SELECT max(Year_b) FROM Pers)

В этом операторе второй вложенный оператор SELECT max(Year_b) FROM
Pers возвращает максимальный год рождения, который используется в элементе
WHERE основного оператора Select для поиска сотрудника (или сотрудников),
чей год рождения совпадает с максимальным.

Вложенные запросы могут обращаться к разным таблицам. Пусть, например,
мы имеем две аналогичных по структуре таблицы Pers и Persi, относящиеся к
разным организациям, и хотим в таблице Pers найти всех однофамильцев сотруд-
ников другой организации. Чтобы проверить работу с несколькими таблицами, вы
можете открыть в Database Desktop свою таблицу Pers, выполнить команду Tab-
le | Restructure, ничего не меняя в структуре, щелкнуть на кнопке Save as и сохра-
нить ту же таблицу в том же каталоге, где была исходная таблица Pers, но под но-
вым именем Persi. Если хотите, можно в ней внести записи, отличные от таблицы
Pers, чтобы эти таблицы чем-то различались. Впрочем, можно все это и не делать,
заменив в приведенных ниже примерах таблицу Persi таблицей Pers, т.е. работая
с одной таблицей. Смысл операторов все равно будет понятен.

Итак, вернемся к задаче определения всех однофамильцев в этих двух табли-
цах. Это можно сделать оператором

Select * FROM Pers WHERE Fam IN (SELECT Fam FROM Persi)

Вложенный оператор Select Fam from Persi возвращает множество фамилий
из таблицы Persi, а конструкция WHERE основного оператора Select отбирает из
фамилий в таблице Pers те, которые имеются в множестве фамилий из Persi.