В этой лекции мы рассмотрим фразы SELECT и FROM, в следующей лек-
ции рассмотрим фразу WHERE. Фразы GROUP BY, HAVING и ORDER BY
рассмотрим позднее.
В самой простой форме предложение SELECT инструктирует СУБД о необходимости извлечь информацию из таблицы базы данных. Например,
можно вывести всю таблицу FACULTY, сформулировав следующий запрос:
SELECT FacPK. Name. Dean. Building. Fund
FROM FACULTY;
Этот запрос содержит следующие компоненты.
SELECT — ключевое слово, сообщающее СУБД, что эта команда явля-
ется запросом. Все запросы начинаются этим словом. Указанные за ним FacPK, Name, Dean, Building, Fund являются списком столбцов, которые выбираются запросом из таблицы. Любые ее столбцы, не перечисленные здесь, не будут включены в вывод команды. Это не значит, что сами столбцы или их данные будут удалены – запрос не воздействует на информацию в таблицах; он только выводит ее.
FROM – ключевое слово, за которым следует указать имя таблицы, ис-
пользуемой в качестве источника. В данном случае это таблица FACULTY.
Запрос, указанный в примере, не будет упорядочивать выходные данные.
Тот же запрос, но выполненный повторно, может вывести те же данные в дру-
гом порядке. Строки обычно отбираются в том порядке, в котором они найдены в таблице. Поскольку этот порядок произволен, последовательность выведен-
ных строк необязательно будет соответствовать порядку их ввода. Упорядочи-
вать вывод можно фразой ORDER BY предложения SELECT, и позже мы по-
кажем, как это делать.
В общем случае результатом выполнения предложения SELECT является другая таблица. К этой новой (временной или промежуточной) таблице может быть снова применена команда SELECT и т. д., то есть такие операции могут быть вложены друг в друга. Представляет интерес тот факт, что именно благо-
11
даря возможности включения одного предложения SELECT внутрь другого в названии SQL использовали слово «структурированный».
1.2.3 Основные фразы – SELECT и FROM
В данном разделе мы рассмотрим самые простые возможности языка за-
просов, обеспечивающие выборку данных из одной таблицы без условия отбора и упорядочения результатов. Для этого используются фразы SELECT и FROM,
которые обязательны для всех запросов (все остальные фразы предложения
SELECT – необязательные). Обратите внимание, что по отношению к ключе-
вому слову SELECT мы употребляем термины и предложение, и фраза. Дело в том, что предложение, с помощью которого формулируется запрос, состоит из множества фраз, и первая из них — SELECT. В связи с этим и все предложение было названо SELECT.
Фраза FROM указывает, из какой таблицы следует выбрать данные, а фра-
за SELECT – какие именно столбцы из указанной таблицы должны быть вы-
браны. Следующий запрос приводит к выводу названий факультетов:
SELECT Name
FROM FACULTY;
Фраза FROM должна содержать имя хотя бы одной таблицы, а фраза
SELECT – указание на вывод хотя бы одного ее столбца.
1.2.4 Фраза SELECT
1.2.4.1 Синтаксис фразы SELECT
Рассмотрим, как можно воспользоваться фразой SELECT для организации выдачи данных. Эта фраза имеет две синтаксические формы:
SELECT *
и
SELECT [DISTINCT | ALL]
выр_выбора [[AS] алиас][, выр_выбора [[AS] алиас]]...
Далее на примерах покажем все возможные варианты использования этой
фразы.
12
1.2.4.2 Указание выводимых столбцов
Основное назначение фразы SELECT - указать, какие столбцы исходной
таблицы должны быть выведены.
Вывод значений определенных столбцов
Можно вывести определенные столбцы таблицы, для чего следует пере-
числить во фразе SELECT их имена, разделяя запятой с возможным последую-
щим пробелом. Столбцы выводятся в порядке их указания во фразе SELECT.
Запрос. Вывести из таблицы SGROUP столбцы номера группы, номера курса и количества студентов в группе.
SELECT Num, Year, Quantity
FROM SGROUP;
NUM |
YEAR |
QUANTITY |
505 |
5 |
27 |
504 |
5 |
31 |
307 |
3 |
33 |
408 |
4 |
27 |
201 |
2 |
35 |
Вывод всех столбцов
Также можно вывести все столбцы таблицы. Для этого следует либо все их перечислить во фразе SELECT, либо, если вас устраивает порядок расположе-
ния столбцов в исходной таблице, воспользоваться символом *.
Запрос. Вывести все столбцы таблицы DEPARTMENT.
SELECT DepPK, FacFK, Name, Head, Building, Fund
FROM DEPARTMENT;
либо
SELECT *
FROM DEPARTMENT;
DEPPK |
FACFK |
NAME |
HEAD |
BUILDING |
FUND |
|
|
|
|
|
|
1 |
1 |
базы данных |
Соколов |
6 |
26000 |
2 |
1 |
программирование |
Федоров |
б |
12000 |
3 |
1 |
интернет |
Стрельцов |
3 |
10000 |
4 |
2 |
теория языков |
Глущенко |
3 |
10000 |
5 |
2 |
лингвистика |
Коробов |
3 |
14100 |
6 |
2 |
базы данных |
Тараненко |
5 |
27000 |
|
|
|
13 |
|
|
В случае использования звездочки во фразе SELECT не могут быть указа-
ны никакие имена столбцов.
Уточнение имен
Имена столбцов являются уникальными в пределах одной таблицы, поэто-
му при использовании в запросе только одной таблицы никаких коллизий имен столбцов быть не может. Однако при вычислении запроса может использовать-
ся несколько таблиц, и если в них имеются столбцы с одинаковыми именами,
при обращении к ним возникает неоднозначность. В связи с этим в SQL дей-
ствует правило, согласно которому имя любого столбца в любом месте запроса может быть уточнено именем таблицы:
имя_таблицы.имя_столбца
Уточнять имена столбцов можно всегда, даже когда в этом нет необходимо-
сти. Так, например, рассмотренный выше запрос может иметь следующий вид:
SELECT SGROUP.Num, SGROUP.Year. SGROUP.Quantity
FROM SGROUP;
1.2.4.3 Исключение повторяющихся строк Когда вы выводите все столбцы таблицы, то можете быть уверены, что вы-
водимые строки будут уникальны — таблица не может содержать повторяю-
щихся строк. Однако если выводятся не все столбцы, повторяющиеся строки могут образоваться. Например, нас интересует список должностей в вузе.
Запрос. Вывести значения столбца Post таблицы TEACHER.
SELECT Post
FROM TEACHER;
POST
профессор
доцент
преподаватель
ассистент
ассистент
преподаватель
доцент
профессор
преподаватель
профессор
14
В результате будут выведены все строки таблицы. SQL сам по себе не ис-
ключает повторяющиеся строки при формировании результирующей таблицы.
Для того чтобы указать необходимость такого исключения, следует воспользо-
ваться ключевым словом DISTINCT.
Запрос. Вывести уникальные значения столбца Post таблицы TEACHER.
SELECT DISTINCT Post
FROM TEACHER;
POST
профессор
доцент
преподаватель
ассистент
1.2.4.4 Использование вычисляемых выражений
Фраза SELECT может содержать не только перечень столбцов таблицы или символ *, но и выражения. Выражения базируются на именах столбцов и могут быть любыми допустимыми в языке выражениями соответствующих ти-
пов. Приведем пример.
Запрос. Вывести фамилии преподавателей, их ставки, надбавки, сумму ставки с надбавкой и процент надбавки относительно ставки.
SELECT
Name,
Salary,
Rise,
Salary + Rise,
Rise * 100 / Salary
FROM TEACHER;
NAME |
SALARY |
RISE |
SALARY+RISE |
RISE*100/SALARY |
Сидоров |
1070 |
470 |
1540 |
43.93 |
Рамишевский |
830 |
370 |
1200 |
44.58 |
Хоренко |
670 |
230 |
900 |
34.33 |
Вибровский |
570 |
170 |
740 |
29.82 |
Воропаев |
570 |
150 |
720 |
26.32 |
Кузинцев |
630 |
270 |
900 |
42.86 |
Завратинский |
770 |
341 |
1111 |
44.29 |
Козлутин |
530 |
220 |
750 |
41.51 |
Лекарь |
890 |
440 |
1330 |
49.44 |
|
|
|
15 |
|
1.2.4.5 Переопределение имен результирующих столбцов Столбцы результирующей таблицы будут иметь те имена, которые указа-
ны во фразе SELECT. Однако имена столбцов в таблицах базы данных могут быть сжатыми, а подчас представлять собой сокращение – в этом случае их ис-
пользование в выводе может существенно понизить наглядность.
С другой стороны имена столбцов, указанные во фразе SELECT, исполь-
зуются также для ссылки на них в других фразах (например, GROUP BY, HAVING, ORDER BY) и запросах. Если результирующий столбец является вы-
числяющим выражением (например, Rise * 100 / Salary), сослаться на него не получится.
В этом случае можно использовать возможность переопределения имени столбца в результирующей таблице, для чего необходимо после имени столбца исходной таблицы или выражения указать ключевое слово AS и затем новое имя столбца.
Запрос. Вывести фамилии преподавателей, их ставки, надбавки, сумму став-
ки с надбавкой и процент надбавки относительно ставкипод новыми именами.
SELECT
Name as Имя,
Salary as Ставка,
Rise as Надбавка,
Salary + Rise as “Ставка с надбавкой”,
Rise * 100 / Salary as “Процент надбавки”
FROM TEACHER;
Имя |
Ставка |
Надбавка |
Ставка с надбавкой |
Процент надбавки |
|
|
|
|
|
Сидоров |
1070 |
470 |
1540 |
43.93 |
Рамишевский |
830 |
370 |
1200 |
44.58 |
Хоренко |
670 |
230 |
900 |
34.33 |
Вибровский |
570 |
170 |
740 |
29.82 |
Воропаев |
570 |
150 |
720 |
26.32 |
Кузинцев |
630 |
270 |
900 |
42.86 |
Завратинский |
770 |
341 |
1111 |
44.29 |
Козлутин |
530 |
220 |
750 |
41.51 |
Лекарь |
890 |
440 |
1330 |
49.44 |
16
1.2.4.6 Включение литералов в результат запроса
Во фразе SELECT кроме имен столбцов и выражений с ними можно ука-
зывать константы (и константные выражения). Это приведет к тому, что в ре-
зультирующей таблице будет создан столбец с одинаковыми значениями во всех строках. Такой константой может быть любой литерал, в том числе и сим-
вольный. Покажем это на примере.
Запрос. Вывести ставки преподавателей, оформив результат предложени-
ями на русском языке.
SELECT 'Преподаватель', Name, 'имеет ставку', Salary
FROM TEACHER;
ПРЕПОДАВАТЕЛЬ |
NAME |
ИМЕЕТСТАВКУ |
SALARY |
|
|
|
|
Преподаватель |
Сидоров |
имеет ставку |
1070 |
Преподаватель |
Рамишевский |
имеет ставку |
830 |
Преподаватель |
Хоренко |
имеет ставку |
670 |
В результирующей таблице данные выводятся в четырех столбцах. Одна-
ко, используя выражения над столбцами и константами, можно те же данные вывести в виде одного столбца, как это показано в следующем примере.
Запрос. Вывести зарплату преподавателей, оформив результат предложе-
ниями на русском языке без лишних пробелов.
SELECT 'Преподаватель ' || Name || ' имеет ставку ' || Salary
as “Сведения о зарплате”
FROM TEACHER;
или (MySQL)
SELECT CONCAT('Преподаватель ', Name, ' имеет ставку ', Salary)
as “Сведения о зарплате”
FROM TEACHER;
Сведения о зарплате
Преподаватель Сидоров имеет ставку 1070
Преподаватель Рамишевский имеет ставку 830
Преподаватель Хоренко имеет ставку 670
Фраза SELECT обладает ограниченными возможностями форматирования
результирующих данных. Обычно в таких случаях в дополнение к базовым
средствам СУБД используются сервисные программы, в частности так называ-
17
емые генераторы отчетов. Они, как правило, обладают широкими возможно-
стями визуального представления результатов запросов.
1.2.4.7 Вывод результатов в файл
Если необходимо вывести результаты запроса в файл в MySQL можно использовать фразу INTO OUTFILE. Ее синтаксис:
SELECT список_выбора
INTO OUTFILE имя_файла Например:
Запрос. Вывести имена преподавателей и ставки в текстовый файл.
SELECT Преподаватель, Salary
INTO OUTFILE “d:/salary.txt”
FROM TEACHER;
1.2.5 Фраза FROM
1.2.5.1 Синтаксис фразы FROM
Как мы уже отмечали, фраза FROM нужна для указания используемых в запросе таблиц. Синтаксис этой фразы следующий:
FROM
{имя_таблицы | (подзапрос)} [алиас][,
{имя_таблицы | (подзапрос)} [алиас]]...
В запросе могут использоваться несколько таблиц. В этом случае во фразе
FROM приводятся их имена, перечисленные через запятую. Например:
FROM FACULTY. DEPARTMENT. SGROUP
1.2.5.2 Синонимы таблиц Имена таблиц, как и столбцов, можно переопределить, например, чтобы
для ссылок на таблицу использовать короткий (вплоть до одной буквы) сино-
ним (его называют еще алиасом таблицы). Имя таблицы и ее синоним разделя-
ются пробелом:
FROM FACULTY F. DEPARTMENT D. SGROUP G
FROM FACULTY F. DEPARTMENT D. SGROUP G
В случае использования для имени таблицы синонима уточнять столбцы следует толь-
ко указанным синонимом, например:
F.Name, F.Building, F.Fund, D.Head, D.Fund, G.Year, G.Quantity
В следующем примере слева приведен правильный запрос, а справа – нет:
SELECT f.Name, |
f.Fund |
SELECT FACULTY.Name,f.Fund |
FROM FACULTY f |
|
FROM FACULTY f; |
18
В случае, когда в списке FROM одна и та же таблица указана более одного раза, пере-
определение имени этой таблицы синонимом является обязательным, и синонимы должны различаться. Например:
FROM TEACHER Tl. TEACHER T2
Теперь к первой копии таблицы можно обращаться с помощью синонима Т1, а ко вто-
рой — синонима Т2. Правила именования синонима таблицы те же, что и для имени табли-
цы, принятые в той или иной СУБД.
1.2.5.3 Запрос в качестве имени таблицы
Стандарт ANSI и многие СУБД, в частности Oracle, допускают возмож-
ность использования запроса во фразе FROM в качестве имени таблицы. Ведь результатом запроса является промежуточная таблица, которая может быть ис-
ходной для другого запроса. Для этого нужно только вместо имени таблицы указать во фразе FROM подзапрос, заключив его в круглые скобки.
Таблица, получаемая в результате вычисления подзапроса, не имеет имени.
Поэтому, если к ее столбцам необходимо будет обращаться из самого запроса,
обязательно нужно приписать подзапросу синоним. Например, в следующем выражении указано, что результирующие таблицы подзапросов именуются как
FD и DH:
FROM (SELECT Dean FROM FACULTY) FD,
(SELECT Head FROM DEPARTMENT) DH
Мы вернемся к использованию подзапросов в подразделе 1.7.
1.2.6 Итоги лекции
На лекции студенты научились:
указывать столбцы, отбирающиеся в результирующую таблицу;
уточнять имена столбцов;
исключать повторяющиеся строки в результирующей таблице;
использовать во фразе SELECT выражения;
переопределять имена результирующих столбцов;
помещать в результирующую таблицу константы;
указывать синонимы таблиц;
использовать во фразе FROM запросы в качестве источника данных.
19
1.3 Отбор строк по условию (5-6)
1.3.1 Аннотация к лекции
Таблицы базы данных имеют тенденцию становиться очень большими, по-
скольку с течением времени в них добавляется все большее и большее количе-
ство строк. Поэтому выборка всех строк таблиц используется довольно редко, в
основном при последовательном просмотре базы данных и для создания пол-
ных отчетов. Обычно пользователей интересуют только определенные строки таблиц.
SQL дает возможность определить критерии отбора необходимых строк во фразе WHERE предложения SELECT. В этом случае строки исходных таблиц будут включены в результирующую только если строка соответствует указан-
ным критериям.
Условие – это выражение, которое может быть истинным или ложным (ло-
гическое выражение или предикат), то есть принимать логические значения
TRUE или FALSE соответственно. В результирующую таблицу включаются только те строки, для которых указанное во фразе WHERE условие равно
TRUE (иными словами, которые удовлетворяют заданному условию).
В случае одной таблицы механизм работы предложения SELECT с фразой
WHERE следующий:
1.Из таблицы, указанной во фразе FROM, выбирается очередная строка.
2.Она проверяется на соответствие условию во фразе WHERE.
3.Если результат равен TRUE, строка включается в результирующую таб-
лицу и форматируется в соответствии с фразой SELECT, а если он равен
FALSE, строка пропускается.
Далее будут рассмотрены основные выражения, допустимые для условия
во фразе WHERE.
20
