Учебно-справочное пособие по СУБД Informix

         

Снова Оператор SELECT.



5. Снова Оператор SELECT.

Предложения INTO, INTO TEMP, FROM.

Выбрать все строки (нет предложения WHERE) из таблицы kadry, взять в них все столбцы (вместо перечисления столбцов стоит *), оставить только различные строки (ключевое слово UNIQUE) и поместить результат во временную таблицу (INTO TEMP) x, которая будет при этом создана с такими же столбцами, что и у kadry. SELECT UNIQUE * FROM kadry INTO TEMP x
Выбирать можно из нескольких таблиц. При этом берутся все возможные комбинации строк из первой таблицы со второй. Предположим, что таблице tab1 6 строк а в tab2 - 7 строк. Результат нижеприведенного примера - таблица, содержащая три столбца и 7*6=42 строки. SELECT tab1.a-tab2.b, tab1.a, tab2.b FROM tab1, tab2
Мы сейчас не будем уточнять, куда именно результирующая таблица помещается. Но использовать ее можно по разному: ее можно перегнать (INTO TEMP) во временную таблицу, ее можно отдать на обработку другому оператору (если выборку осуществлял подзапрос), для нее можно создать курсор ("буфер" с указателем на текущую строку), а можно положить ее (INTO) в простую программную переменную (если выбрано не более одной строки).
Выбранные строки можно упорядочить по возрастанию (убыванию) значения в столбце (столбцах) SELECT a,b,c,d+e FROM tabl ORDER BY b,c SELECT a,b,c,d+e FROM tabl ORDER BY 2,3
В ORDER BY предложении вместо имени столбца можно указывать его порядковый номер в списке выборки (select-list). Вышеприведенные операторы эквивалентны.
Поместить значения из столбцов в переменные: (Поскольку lname используется и как имя переменной, и как имя столбца, то имя столбца предваряется знаком (@) SELECT customer_num, @lname,city INTO cnum,lname,town FROM customer

Агрегатные функции.

К выбранным строкам можно применять агрегатные функции COUNT(*) - количество, MAX(column) и MIN(column) - максимальное и минимальное значение в столбце, SUM(column) - сумма всех значений в столбце, AVG(column) - среднее значение в столбце.
Поместить в переменную num количество строк в таблице orders, в которых столбец customer_num равен 101: SELECT COUNT(*) INTO num FROM orders WHERE customer_num=101


Пример с использованием соединения таблиц. Находится среднее значение зарплаты превосходящей 300 (столбец zarplata принадлежит одной из таблиц), при условии совпадения столбцов dolvnost в двух таблицах. SELECT AVG (zarplata) FROM table1,table2 WHERE table1.dolvnost=table2.dolvnost and zarplata>300
Группировка GROUP BY.
Группировка используется для для "сплющивания" группы (строк) в одну. Результат запроса содержит одну строку для каждого множества строк, удовлетворяющих WHERE предложению и содержащих одно и то же значение в указанном столбце. SELECT dolvnostx, COUNT(*), AVG(zarplata) FROM kadry GROUP BY dolvnostx
Получить количество работающих и их среднюю зарплату по каждой должности из штатного расписания. SELECT dolvnostx, COUNT(*), AVG(zarplata) FROM kadry GROUP BY 1
Эквивалентная запись.
Предложение HAVING накладывает дополнительные условия на группу. SELECT order_num, AVG(total_priece) FROM items GROUP BY order_num HAVING COUNT(*) > 2
Этот запрос возвращает номера ордеров и среднее значение total_price в заявках для всех ордеров, имеющих не менее двух заявок.
Внешнее соединение таблиц.
Строки из таблицы, присоединенной внешним образом (на внешнее соединение указывает ключевое слово OUTER) будут выбираться не смотря на то, удовлетворяют они условиям WHERE предложения или нет. В некоторых случаях это полезно, когда у вас есть главная таблица и есть вспомогательная, и данные из главной таблицы вам нужно получить в любом случае. Пример внешнего соединения: SELECT company, order_num FROM customer c, OUTER orders o WHERE c.customer_num=o.customer_num
Запрос находит названия компаний и номера ордеров, которые они послали. Если же компания ордеров не присылала, то ее название все равно будет выбрано, а номер ордера в этой строке будет равен NULL. (А если бы мы запустили запрос без параметра OUTER, то названия этих компаний вообще бы не попали в выборку.)

Содержание раздела