Разделы

Авто
Бизнес
Болезни
Дом
Защита
Здоровье
Интернет
Компьютеры
Медицина
Науки
Обучение
Общество
Питание
Политика
Производство
Промышленность
Спорт
Техника
Экономика

Формирование запросов SQL

Команда выборки данных SELECT является мощным средством обработки запросов. С ее помощью из таблицы-источника выделяются необходимые данные и пересылаются на экран, в файл, массив, таблицу, курсор, принтер. Можно с помощью команды SELECT получать данные из нескольких таблиц, логически связанных между собой. Команда имеет массу опций - возможностей.  Ввиду этого ниже приведен сначала ее предварительный синтаксис с основными операторами:
SELECT <что выводится> FROM <откуда (источник)>
INTO <куда (получатель)> WHERE <каким условиям должны отвечать выбираемые данные>  GROUP BY <колонки, по которым выполняется группирование>
HAVING <условие отбора группируемых записей>
ORDER BY <в каком порядке выводить данные>.

Термин "колонка" здесь очень близок к понятию "поле" таблицы данных, но может быть и выражением. Кроме того, вследствие выборки можно получить как новую таблицу данных, так и текстовый файл или только отображение на экране, т.е. колонки. Команда SELECT допускает включение в себя других внутренних команд SELECT (формирование подзапросов).

Более полный формат команды SELECT включает дополнительные опции:
SELECT [DISTINCT] [<псевдоним>.]<выражение> [AS <колонка>][, [<псевдоним>]<выражение> [AS <колонка>]..]
FROM<имя_таблицы1>[<псевдоним1>][,<имя_таблицы2> [<псевдоним2>].]
[[INTO <получатель>]/[TO FILE < имя_файла> [ADDITIVE]/TO PRINTER]]
[NOCONSOLE] [PLAIN] [NOWAIT]
[WHERE <условие_связи>  [AND <условие_связи>]
[AND/OR <условие_связи >  ]]
[GROUP BY <колонка> [, <колонка>...]] [HAVING <условие_отбора>]
[ORDER BY <колонка> [ASC/DESC] [,<колонка> [ASC/DESC]...]]

Включение опции DISTINCT исключает возможность вывода одинаковых строк в выборке. Перед словом FROM перечисляются отбираемые <выражения>, а после - имена таблиц, из которых берутся данные. <Выражение> может быть полем записи из таблицы, константой (выводимой в каждой строке выборки), функцией от переменных (полей) и т.п. Если <выражение> является именем поля, то оно может быть составным (с включением имени таблицы данных или псевдонима), в особенности если выборка делается из нескольких таблиц, где имена полей совпадают. Псевдонимом может быть не только официальный псевдоним (ALIAS) таблицы данных, но и любое другое имя, которое присваивается в команде SELECT. Это задаваемое временное имя указывается в опции <псевдоним> после слова FROM за именем таблицы и используется только в данной команде SELECT в других ее опциях (локальный псевдоним). Если необходимо построить выборку из всех полей таблицы данных, вместо их перечня можно указать символ *. В результате выполненной выборки получается совокупность колонок,  заголовками которых могут быть имена исходных полей.

Например, для вывода всех записей из таблицы STUD используется команда:
SELECT * FROM STUD
Для вывода  названий  всех лабораторий организации (поле LAB) из таблицы данных KADR с предотвращением вывода дублирующих значений, используется команда:
SELECT DISTINCT LAB FROM KADR

Команду SELECT можно использовать для одновременной выборки данных из нескольких таблиц. Если имена полей, выбираемых из разных таблиц совпадают, то такие колонки получают совпадающие имена, к которым присоединяется одна из букв (по алфавиту), например, FAM_A,  FAM_B и т.д. Аналогичным образом даются имена колонкам, полученным в результате вычисления выражений. Их имена состоят из слова EXP и последовательных чисел (EXP_1,  EXP_2 и т.д.). Исключения составляют выражения,  использующие собственные функции SQL: AVG, MIN, MAX, SUM, COUNT. Последняя функция может иметь в качестве аргумента здездочку (COUNT(*)), что означает подсчет всех записей, попавших в выборку. Имена колонок в этом случае будут включать имена функций. Вместо имен, формируемых по умолчанию, можно назначить колонкам другие имена, указав их после слова AS в виде <выражение> AS <новое_имя_колонки>.

Например, для вывода минимального, максимального и среднего значений зарплаты (поле ZARP) из таблицы KADR необходимо использовать команду:
SELECT MIN(ZARP), MAX(ZARP), AVG(ZARP)
FROM KADR
Для вывода из таблицы KADR фамилий (поле FAM) и табельных номеров (поле TAB) с другими именами колонок (Фамилии и Таб_номер) используется команда:
SELECT FAM AS Фамилии, TAB AS Таб_номер
FROM KADR
Для вывода всех фамилий из двух таблиц данных KADR и STUD с использованием локальных псевдонимов P и T, а также с заменой при выводе имен колонок FAM_A и FAM_B на KFIO и STFIO соответственно, используется команда:
SELECT P.FAM AS KFIO, T.FAM AS STFIO
FROM KADR P, STUD T

В команде SELECT можно задать достаточно сложные условия для выборки данных в запрос. Условие связи применяется в случае, если выборка делается более, чем из одной таблицы данных, и определяет критерий объединения данных из разных таблиц.  В условии связи указываются поля из разных таблиц с псевдонимами и используются знаки отношений  =,  #, = =, >, >=, <, <=. Допускается задание нескольких критериев, соединенных знаком AND. Условие выборки строится аналогично, но из выражений только для одной таблицы, и допускается использование логических операторов OR, AND и NOT.
Условия могут содержать следующие операторы SQL: LIKE, BETWEEN, IN. Эти операторы можно комбинировать с помощью связок  OR, AND, NOT и скобок.

Оператор LIKE позволяет построить условие сравнения по шаблону, где символ "_" указывает единичный неопределенный символ в строке, а символ "%" - любое их количество. Формат оператора LIKE:
<выражение> LIKE <шаблон>.

Оператор BETWEEN задает начальное и конечное значение диапазона и проверяет, находится ли выражение, стоящее слева от оператора, в указанном диапазоне. Формат оператора BETWEEN:
<выражение> BETWEEN <нижнее значение> AND <верхнее значение>.
Оператор IN проверяет, находится ли выражение, стоящее слева от слова IN, среди перечисленных справа от него. Формат оператора IN:
<выражение> IN (<выражение1>, <выражение2>,...)
Например, для выборки фамилий (поле FAM), начинающихся на букву “А”, всех мужчин (поле POL=”М”) из таблицы KADR. DBF используется команда:
SELECT FAM FROM KADR WHERE POL=”М” AND
FAM LIKE “A”

Для вывода из таблицы STUD фамилий студентов (поле FAM), получающих стипендии (поле STIP) от 1500 до 2000 тенге, используется команда:
SELECT FAM FROM STUD WHERE STIP
BETWEEN 1500 AND 2000

Для вывода на экран из таблицы KADR фамилий сотрудников (поле FAM), а из таблицы TABEL - соответствующего количества рабочих дней (поле WD) для записей, у которых совпадают табельные номера, необходимо использовать команду с условием связи (в качестве псевдонимов таблиц указаны имена таблиц):
SELECT KADR.FAM, TABEL.WD FROM KADR, TABEL WHERE KADR.TAB=TABEL.TAB
Для упорядочения по заданной колонке или колонкам используется опция ORDER BY. По умолчанию сортировка выполняется по возрастанию (ASC), но может быть задана и по убыванию (DESC).
Сокращенный вариант команды SELECT с использованием опции ORDER BY выглядит следующим образом:
SELECT <выражение> FROM <имя_таблицы>
ORDER BY <колонка1> [ASC/DESC] [,<колонка2>..]

Указание колонки упорядочения может выполняться именем или номером колонки. Например, для вывода фамилий (поле FAM) и зарплаты (поле ZARP) из таблицы данных KADR в порядке убывания размера заработной платы используется команда:
SELECT FAM, ZARP FROM KADR ORDER BY ZARP DESC
Для вывода фамилий (поле FAM) и группы (поле GRUPPA) из таблицы данных STUD в порядке возрастания групп и фамилий необходимо использовать команду:
SELECT FAM, GRUPPA FROM STUD
ORDER BY GRUPPA, FAM

В опции ORDER BY обычно нельзя использовать вычисляемые выражения. В случае необходимости упорядочения по колонке с вычисляемыми значениями указывается номер колонки. Например, для вывода фамилий (поле FAM) и премии, равной половине зарплаты (величина премии вычисляется по значению поля ZARP) из таблицы данных KADR в порядке возрастания премии используется команда:
SELECT FAM AS Фамилия, ZARP AS Премия
FROM KADR ORDER BY 2,1
В этой команде фамилии сотрудников, имеющих одинаковую премию выводятся в алфавитном порядке, так как упорядочение данных выполняется сначала по второй колонке (премия), затем по первой колонке (фамилия).
Опция GROUP BY команды SELECT позволяет сгруппировать записи с одинаковым значением указанной колонки (или колонок):
SELECT <выражение> FROM <имя_таблицы>
GROUP BY <колонка1> [,<колонка2>...] [HAVING <условие_отбора>]

Опция GROUP BY задает колонки, по которым производится группирование выходных данных. Все записи таблицы, для которых значения колонок совпадают, отображаются в выборке единственной строкой. Группирование удобно для получения некоторых сводных характеристик группы (суммы, среднего значения, количества записей в группе и т.д.).
Опция HAVING <условие_отбора> задает критерий отбора данных в каждую сформированную в процессе выборки группу, т.е. выполняет роль опции WHERE, но для группируемых данных.
Например, для вывода названий всех групп (поле GRUPPA), количества студентов и суммы стипендий (поле STIP) для каждой группы из таблицы данных STUD используется команда:
SELECT GRUPPA, COUNT(FAM), SUM(STIP)
FROM STUD GROUP BY GRUPPA

Внутри групп можно создавать подгруппы. При группировании данных в опции HAVING можно использовать агрегатные функции SQL. Например, для вывода названий всех лабораторий (поле LAB), количества сотрудников и значения суммарной зарплаты (поле ZARP) из таблицы данных KADR используется следующая команда (информация выводится только для лабораторий, где количество сотрудников больше 5):
SELECT LAB, SUM(ZARP), COUNT(*) FROM KADR
GROUP BY LAB HAVING COUNT(*)>5
Для указания объекта получателя данных выборки используется опция INTO или TO.

Ниже приведен сокращенный вариант команды SELECT с опцией INTO/TO, используемый в Visual FoxPro:

SELECT <выражение> FROM <имя_таблицы>
[INTO TABLE <имя_таблицы>] / [INTO CURSOR <имя_курсора>] / [INTO ARRAY <имя_массива>] /
[TO FILE <имя_файла> [ADDITIVE]] /
[TO PRINTER]  [NOCONSOLE] [PLAIN] [NOWAIT]
Типы возможных получателей данных выборки в Visual FoxPro описаны ниже.
TABLE <имя_таблицы> - получателем является новая таблица с указанным именем.

CURSOR <имя_курсора> - результат запроса помещается в курсор с указанным именем. Курсор - это временный набор данных, который может быть областью памяти или временным файлом и имеет режим "только чтение". Данные курсора могут быть, например, предъявлены в команде BROWSE, напечатаны, из них может быть образовано меню и т.д.  Курсор может быть обработан другой командой SELECT. К колонкам курсора надо обращаться по имени этих колонок с префиксом - именем курсора (через точку).

ARRAY <имя_массива> - в качестве получателя результата запроса будет использован новый двумерный массив с указанным именем.
Кроме того, данные выборки можно переслать в файл или на принтер. Для этого в команде указывается получатель TO FILE <имя_файла> [ADDITIVE] / TO PRINTER  и выборка посылается в текстовый файл с указанным именем или на принтер. Если используется слово ADDITIVE, то выборка будет добавлена в конец существующего файла без его перезаписи.
Следующие опции имеют смысл только при выдаче на экран (команда используется без опций INTO или TO):
NOCONSOLE - выборка не выдается на экран,
PLAIN - заголовки колонок не выдаются,
NOWAIT - не делается пауза при заполнении экрана.
Например, для вывода фамилий (поле FAM) и зарплаты (поле ZARP) из таблицы KADR в таблицу FAMSZ необходимо использовать команду:
SELECT FAM, ZARP FROM KADR
INTO TABLE FAMSZ
Для вывода фамилий (поле FAM) и стипендий (поле STIP) из таблицы STUDENT  в курсор CURSTUD необходимо использовать команду:
SELECT FAM, STIP FROM STUDENT
INTO CURSOR CURSTUD
Для занесения в текстовый файл FIO.TXT всех фамилий из двух таблиц данных KADR и STUD с использованием локальных псевдонимов S и T и заменой при выводе имен колонок FAM_A и FAM_B на KADRFIO и STUDFIO, соответственно, используется команда:
SELECT  S.FAM AS KADRFIO, T.FAM AS STUDFIO
FROM KADR S, STUD T  TO  FILE FIO.TXT

Для вывода на принтер названий лабораторий (поле LAB), сумм зарплат и количества сотрудников, получающих зарплату (поле ZARP) больше 12000, сгруппированных по каждой лаборатории необходимо использовать следующую команду (вывод данных в порядке убывания сумм зарплат):
SELECT LAB, SUM(ZARP), COUNT(*) FROM KADR
TO PRINTER WHERE ZARP>12000 GROUP BY LAB ORDER BY ZARP DESC

Использование подзапросов в условиях команды SELECT позволяет создавать сложные запросы. Подзапрос заключается в круглые скобки и представляет собой вложенную команду SELECT, вложение подзапросов неограничено. Причем, основной запрос и используемый в нем подзапрос могут обращаться как к одним и тем же таблицам, так и к разным таблицам баз данных. В подзапросе нельзя использовать опции ORDER BY и INTO.
Запрос с подзапросом может быть некоррелирован или коррелирован. Некоррелированный подзапрос выполняется в первую очередь, затем полученный результат подставляется в условие и выполняется внешний запрос. Например, для выборки фамилий сотрудников (поле FAM) из таблицы KADR с заработной платой (поле ZARP) выше средней можно использовать запрос с подзапросом (для таблицы KADR используется локальный псевдоним S1):
SELECT S1.FAM FROM KADR S1 WHERE ZARP >
(SELECT AVG(ZARP) FROM KADR)
В коррелированном подзапросе внутренний запрос ссылается на внешний запрос и выполняется поочередно для каждой строки внешнего запроса (многократно). Выбирается первая строка во внешнем запросе, для нее выполняется внутренний запрос, затем вторая строка и так далее. Например, для выборки фамилий сотрудников (поле FAM) и зарплаты (поле ZARP) из таблицы KADR с заработной платой выше средней по каждой лаборатории можно использовать запрос с подзапросом (для таблицы KADR используются локальные псевдонимы S1 во внешнем запросе и S2 в подзапросе для обеспечения сравнения):
SELECT FAM, ZARP FROM KADR S1 WHERE ZARP >=
(SELECT AVG(ZARP) FROM KADR S2
WHERE S2.LAB=S1.LAB)

Результаты нескольких выборок можно объединить в одном запросе, используя оператор объединения UNION. Результатом будет множество, состоящее из всех строк, входящих в какую-либо выборку или в несколько выборок. Но при этом результаты исходных выборок должны иметь одинаковое число полей (столбцов), тип и ширина i-го поля одной выборки должны совпадать с типом и шириной i-го поля любой другой выборки. При использовании опции UNION часто оказывается полезным включение константы в получаемый результат выборки. Заголовки колонок в выборке определяются первым запросом. Например, текстовую константу можно использовать в качестве поясняющего текста при выборе из таблицы STUD фамилий студентов (поле FAM), получающих стипендию (поле STIP) больше 2000 или проживающих в городе Алматы (город проживания указывается в поле ADRESS):
SELECT FAM AS Фамилии, “стипендия больше 2000” AS Признак_выборки FROM STUD WHERE STIP> 2000 
UNION
SELECT FAM, “город Алматы” FROM STUD WHERE ADRESS LIKE “%Алматы”

Оператором UNION можно соединить любое число команд SELECT, но опция ORDER BY в запросе с использованием оператора UNION может входить только в последнее предложение SELECT. При указании критерия упорядочивания указываются номера полей в получаемой выборке. Например, при выборке из таблицы KADR фамилий сотрудников (поле FAM), имеющих заработную плату (поле ZARP) меньше 10000 или проживающих в городе Алматы (город проживания указывается в поле ADRESS), можно сначала упорядочить данные по второй колонке (признак выборки), а затем по первой колонке (фамилии в алфавитном порядке):
SELECT FAM , “заработная плата меньше 1000”
FROM KADR WHERE ZARP<10000
UNION
SELECT FAM , “ город Алматы ” FROM KADR
WHERE ADRESS LIKE “%Алматы” ORDER BY 2,1

По умолчанию оператор UNION устраняет из результата повторяющиеся строки. Чтобы отобразить все строки, необходимо использовать оператор UNION с опцией ALL (UNION ALL).

Источник: Айтхожаева Е.Ж. Структурированный язык запросов SQL. /Методические указания к лабораторным работам. / - Алматы: КазНТУ

Дата публикации:2012-10-30

Просмотров:2688

Вернуться в оглавление:

Комментария пока нет...


Имя* (по-русски):
Почта* (e-mail):Не публикуется
Ответить (до 1000 символов):







 

2012-2018 lekcion.ru. За поставленную ссылку спасибо.