Лекция 9. Предложение SELECT Вопрос 1. Простая выборка Все запросы на получение практически любого количества данных из одной или нескольких таблиц выполняются с помощью единственного предложения SELECT. В общем случае результатом реализации предложения SELECT является другая таблица. К этой новой таблице может быть снова применена операция SELECT и т.д., т.е. такие операции могут быть вложены друг в друга. Представляет исторический интерес тот факт, что именно возможность включения одного предложения SELECT внутрь другого послужила мотивировкой использования прилагательного "структуризированный" в названии языка SQL. Предложение SELECT может использоваться как: самостоятельная команда на получение и вывод строк таблицы, сформированной из столбцов и строк одной или нескольких таблиц (представлений); элемент WHERE- или HAVING - условия (сокращенный вариант предложения, называемый "вложенный запрос"); фраза выбора в командах CREAT VIEW, DECLARE CURSOR или INSERT; средство присвоения глобальным переменным значений из строк сформированной таблицы (INTO-фраза). Оператор SELECT состоит из 3 основных элементов: SELECT, FROM, WHERE. Первый элемент оператора определяет столбцы, которые вы хотите получить. Директива FROM определяет таблицы, из которых извлекаются столбцы, a WHERE - условие, задающее ограничение на отображение данных. Эти элементы представляют собой основу любого запроса. Ниже приведен полный синтаксис оператора SELECT: SELECT [ALL | DISTINCT] список_столбцов [INTO имя_новой_таблицы] СИНТАКСИС [FROM таблицы_источники] [WHERE условие_поиска] [GROUP BY [ALL] выражение группирования] [HAVING условие_поиска] [ORDER BY имя_столбца [ASC |DESC]] [COMPUTE {{ AVG|COUNT|MAX|MINISUM} (выражение)} [ , ...n] [BY выражение [ ,...n ]]] [FOR BROWSE] [OPTION (параметр_запроса [ ,...n])] Запрос SELECT * FROM имя_таблицы составляет основу любого запроса. Оператор SELECT со (*) введенной вместо параметра список_столбцов возвращает все столбцы таблицы СИНТАКСИС SELECT имя_столбца [, имя_столбца...] FROM список_таблиц СИНТАКСИС SELECT имя_столбца AS ' заголовок_столбца' FROM имя_таблицы Исключение дубликатов Для исключения дубликатов и одновременного упорядочения перечня необходимо дополнить запрос ключевым словом DISTINCT (различный, различные), как показано в следующем примере: Код SELECT DISTINCT customer FROM Sales; Вопрос 2. Выборка вычисляемых значений Из синтаксиса фразы SELECT видно, что в ней может содержаться не только перечень столбцов таблицы или символ *, но и выражения. Например, если нужно получить стоимость каждой книги с учетом 10% скидки для всех книг по зарубежной прозе из таблицы Books, то необходимо выдать следующий запрос: код SELECT id, publishers, title, author, (price - price*0.1)AS price, style FROM Books WHERE style='Заруб. проза'; Фраза SELECT может включать не только выражения, но и отдельные числовые или текстовые константы. Следует отметить, что текстовые константы должны заключаться в апострофы ('). код SELECT 'Книга', title, 'автора', author, 'с учетом скидки', (price - price*0.1), 'p' FROM Books; А что произойдет, если какой-либо член выражения не определен, т.е. имеет значение NULL и каким образом появилось такое значение? Если при загрузке строк таблицы в какой-либо из вводимых строк отсутствует значение для какого-либо столбца, то СУБД введет в такое поле NULL-значение. NULL- значение "придумано" для того, чтобы представить единым образом "неизвестные значения" для любых типов данных. Действительно, так как при вводе данных в столбец или их изменении СУБД запрещает ввод значений не соответствующих описанию данных этого столбца, то, например, нельзя использовать пробел для отсутствующего значения числа. Нельзя для этих целей использовать и ноль: нет месяца или дня недели равного нулю, да и для чисел ноль не может рассматриваться как неизвестное значение в одном месте и как известное - в другом. При выводе же NULL-значения на экран или печатающее устройство его код воспроизводится каким-либо специально заданным символом или набором символов: например, пробелом (если его нельзя перепутать с текстовым значением пробела) или сочетанием -0-. Вопрос 3. Выборка с использованием фразы WHERE 3.1. Использование операторов сравнения>> Для задания условий поиска используются операторы сравнения, приведенные в нижеследующей таблице: Оператор Описание = Равно > < >= <= <> Больше Меньше Больше или равно Меньше или равно Не равно СИНТАКСИС SELECT имя_столбца [, имя_столбца...] FROM имя_таблицы WHERE имя_столбца оператор сравнения выражение Следующий запрос возвращает названия и цены книг, продающихся в магазине автором которых является Шекспир код SELECT id, publishers, title, author, price, style FROM Books WHERE author = 'Шекспир'; Возможность использования нескольких условий, соединенных логическими операторами AND, OR, AND NOT и OR NOT, позволяет осуществить более детальный отбор строк. Так, для получения перечня книг, опубликованными издательствами ACT и Центрполиграф , можно сформировать запрос: код SELECT id, publishers, title, author, price, style FROM Books WHERE publishers='ACT' OR publishers='Центрполиграф' 3.2. Использование BETWEEN Пример рассмотренный выше можно выполнить совершенно по-другому, хотя результат запроса будет одинаков. С помощью BETWEEN ... AND ... (находится в интервале от ... до ...) можно отобрать строки, в которых значение какого-либо столбца находятся в заданном диапазоне. Так, для получения перечня книг, со стоимостью от 150 до 300 рублей, можно сформировать запрос: код SELECT id, publishers, title, author, price, style FROM Books WHERE price BETWEEN 150 AND 300 WHERE price NOT BETWEEN 150 AND 300 3.3. Использование IN С помощью ключевого слова IN указываются строки, значения которых совпадают с одним из значений в заданном списке. Даты и символьные данные необходимо заключать в одинарные кавычки. СИНТАКСИС SELECT имя_столбца [, имя_столбца...] FROM имя_таблицы WHERE имя_столбца [NOT] IN (список_значений) Используя оператор NOT, можно прочесть строки не входящие в список. Следующий запрос возвращает данные об остальных книгах в магазине: 3.4. Использование LIKE Ключевое слово LIKE позволяет в качестве условия поиска сравнить часть указанной строки с имеющимися в таблице строками. Директива LIKE используется со следующими типами данных: char, varchar, text, datetime. В сравниваемой строке можно использовать 4 вида символов. 3.5. Вовлечение неопределенного значения (NULL-значения) Если при загрузке данных не введено значение в какое-либо поле таблицы, то СУБД поместит в него NULL-значение. Аналогичное значение можно ввести в поле таблицы, выполняя операцию изменения данных. Значение NULL не равносильно пробелу в символьной строке или нулю в данных числового типа. Поле данных имеет значение NULL, если ему не было присвоено значение. Если один из операндов имеет значение NULL, то и результат будет неопределенный. Как же в таком случае найти строки, содержащие неопределенные значения? Это можно сделать с помощью ключевых слов IS NULL и IS NOT NULL. SELECT имя_столбца [, имя_столбца...] СИНТАКСИС FROM имя_таблицы WHERE имя столбца IS [ NOT ] NULL NULL 3.6. Выборка с использованием фразы ORDER BY С помощью директивы ORDER BY оператора SELECT сортируются строки в наборе, возвращаемом запросом. Базовый синтаксис директивы ORDER BY имеет вид: SELECT имя_столбца [, имя_столбца...] СИНТАКСИС FROM список_строк [ORDER BY имя_столбца | список_номеров_столбцов [ A S C | D E S C ] ] Список директивы содержит произвольное количество столбцов, однако их общая длина не должна превышать 900 байт. Вместо имен столбцов можно использовать их порядковые номера в таблице. Следующие два запроса возвращают одинаковые результаты: код SELECT id, title FROM Books ORDER BY id, title SELECT id, title FROM Books 1. 2 В директиве ORDER ORDER BY BY имена и порядковые номера столбцов используются совместно. Вы можете также указать порядок сортировки строк: восходящий ASC и нисходящий DESC. Если порядок сортировки не указать то строки выводятся в восходящем порядке. Если в упорядоченном столбце присутствуют значения NULL и применяется порядок сортировки ASC, то строки с NULL располагаются первыми.