Для извлечения записей из таблиц в SQL определен оператор SELECT. С помощью этой команды осуществляется не только операция реляционной алгебры «выборка» (горизонтальное подмножество), но и предварительное соединение (join) двух и более таблиц. Это наиболее сложное и мощное средство SQL, полный синтаксис оператора SELECT имеет вид:
SELECT [ALL | DISTINCT] <список_выбора>
FROM <имя_таблицы>, ...
[ WHERE <условие> ]
[ GROUP BY <имя_столбца>,... ]
[ HAVING <условие> ]
[ORDER BY <имя_столбца> [ASC | DESC],... ]
Порядок предложений в операторе SELECT должен строго соблюдаться (например, GROUP BY должно всегда предшествовать ORDER BY), иначе это приведет к появлению ошибок.
Мы начнем рассмотрение SELECT с наиболее простых его форм. Этот оператор всегда начинается с ключевого слова SELECT. В конструкции <список_выбора> определяется столбец или столбцы, включаемые в результат. Он может состоять из имен одного или нескольких столбцов, или из одного символа * (звездочка), определяющего все столбцы. Элементы списка разделяются запятыми.
Пример: получить список всех студентов
SELECT FIO FROM students;
получить список всех полей таблицы students:
SELECT * FROM students;
В том случае, когда нас интересуют не все записи, а только те, которые удовлетворяют некому условию, это условие можно указать после ключевого слова WHERE. Например, найдем всех студентов, рожденных после 1979:
SELECT * FROM students WHERE God_rogdenia > 1979;
Допустим теперь, что нам надо найти всех студентов, рожденных в интервале 1979 - 1982 гг. Это условие можно записать в виде:
SELECT * FROM students WHERE (God_rogdenia >=1979) AND (God_rogdenia <= 1982);
Другой вариант этой команды можно получить с использованием логической операции проверки на вхождение в интервал:
SELECT * FROM students WHERE God_rogdenia BETWEEN 1979 AND 1982;
При использовании конструкции NOT BETWEEN находятся все строки, не входящие в указанный диапазон. Еще один вариант этой команды можно построить с помощью логической операции проверки на вхождение в список:
SELECT * FROM students WHERE God_rogdenia IN (1979,1980,1981, 1982);
Здесь мы задали в явном виде список интересующих нас значений. Конструкция NOT IN позволяет найти строки, не удовлетворяющие условиям, перечисленным в списке.
Наиболее полно преимущества ключевого слова IN проявляются во вложенных запросах, также называемых подзапросами. Предположим, нам нужно найти всех студентов, живущих в Нижегородской области. Наименования областей хранятся в таблице oblast, информация о студентах - в таблице students. Ключевое слово NOT IN позволяет объединить обе таблицы (без получения общего отношения) и извлечь при этом нужную информацию:
SELECT FIO FROM students WHERE id_oblast IN
(SELECT id_oblast FROM oblast
WHERE Obl_name = 'Нижегородская');
При выполнении этой команды СУБД вначале обрабатывает вложенный запрос по таблице oblast, а затем его результат передает на вход основного запроса по таблице students.
Некоторые задачи нельзя решить с использованием только операторов сравнения. Например, мы хоти найти студента, но не знаем его точного фамилии, знаем только, что она содержит “чинский”. Для решения этой задачи предназначено ключевое слово LIKE, его синтаксис имеет вид:
WHERE <имя_столбца> LIKE <образец>
[ESCAPE <ключевой_символ>]
Образец заключается в кавычки и должен содержать шаблон подстроки для поиска. Обычно в шаблонах используются два символа:
% (знак процента) - заменяет любое количество символов
_ (подчеркивание) - заменяет одиночный символ.
Попробуем найти искомого студента:
SELECT FIO FROM students WHERE FIO LIKE ‘%чинский%’;
В соответствии с шаблоном СУБД найдет все строки включающие в себя подстроку «чинский». Другой пример: найти всех студентов, ФИО которых начинается со слова «Фро»:
SELECT FIO FROM students WHERE FIO LIKE ‘Фро%’;
В том случае, когда надо найти значение, которое само содержит один из символов шаблона, используют ключевое слово ESCAPE и <ключевой_символ>. Литерал, следующий в шаблоне после ключевого символа, рассматривается как обычный символ, все последующие символы имеют обычное значение
В заключение заметим, что при выполнении оператора SELECT результирующее отношение может иметь несколько записей с одинаковыми значениями всех полей. Чтобы исключить повторяющиеся записи из выборки используется ключевое слово DISTINCT. Ключевое слово ALL указывает, что в результат необходимо включать все строки.