Основные операторы SQL. Синтаксис и примеры использования оператора SELECT

Основу языка SQL составляют операторы, условно разбитые не несколько групп по выполняемым функциям.

Можно выделить следующие группы операторов (перечислены не все операторы SQL):

Операторы DDL (Data Definition Language) - операторы определения объектов базы данных

· CREATE SCHEMA - создать схему базы данных

· DROP SHEMA - удалить схему базы данных

· CREATE TABLE - создать таблицу

· ALTER TABLE - изменить таблицу

· DROP TABLE - удалить таблицу

· CREATE DOMAIN - создать домен

· ALTER DOMAIN - изменить домен

· DROP DOMAIN - удалить домен

· CREATE COLLATION - создать последовательность

· DROP COLLATION - удалить последовательность

· CREATE VIEW - создать представление

· DROP VIEW - удалить представление

Операторы DML (Data Manipulation Language) - операторы манипулирования данными

· SELECT - отобрать строки из таблиц

· INSERT - добавить строки в таблицу

· UPDATE - изменить строки в таблице

· DELETE - удалить строки в таблице

· COMMIT - зафиксировать внесенные изменения

· ROLLBACK - откатить внесенные изменения

Операторы защиты и управления данными

· CREATE ASSERTION - создать ограничение

· DROP ASSERTION - удалить ограничение

· GRANT - предоставить привилегии пользователю или приложению на манипулирование объектами

· REVOKE - отменить привилегии пользователя или приложения

Кроме того, есть группы операторов установки параметров сеанса, получения информации о базе данных, операторы статического SQL, операторы динамического SQL.

Наиболее важными для пользователя являются операторы манипулирования данными (DML).

Примеры использования операторов манипулирования данными

INSERT - вставка строк в таблицу

Пример 1 . Вставка одной строки в таблицу:

VALUES (4, "Иванов");

UPDATE - обновление строк в таблице

Пример 3 . Обновление нескольких строк в таблице:

SET PNAME = "Пушников"

WHERE P.PNUM = 1;

DELETE - удаление строк в таблице

Пример 4 . Удаление нескольких строк в таблице:

WHERE P.PNUM = 1;

Примеры использования оператора SELECT

Оператор SELECT является фактически самым важным для пользователя и самым сложным оператором SQL. Он предназначен для выборки данных из таблиц, т.е. он, собственно, и реализует одно их основных назначение базы данных - предоставлять информацию пользователю.

Оператор SELECT всегда выполняется над некоторыми таблицами, входящими в базу данных.

Замечание . На самом деле в базах данных могут быть не только постоянно хранимые таблицы, а также временные таблицы и так называемые представления. Представления - это просто хранящиеся в базе данные SELECT-выражения. С точки зрения пользователей представления - это таблица, которая не хранится постоянно в базе данных, а "возникает" в момент обращения к ней. С точки зрения оператора SELECT и постоянно хранимые таблицы, и временные таблицы и представления выглядят совершенно одинаково. Конечно, при реальном выполнении оператора SELECT системой учитываются различия между хранимыми таблицами и представлениями, но эти различия скрыты от пользователя.


Результатом выполнения оператора SELECT всегда является таблица. Таким образом, по результатам действий оператор SELECT похож на операторы реляционной алгебры. Любой оператор реляционной алгебры может быть выражен подходящим образом сформулированным оператором SELECT. Сложность оператора SELECT определяется тем, что он содержит в себе все возможности реляционной алгебры, а также дополнительные возможности, которых в реляционной алгебре нет.

Порядок выполнения оператора SELECT

Для того чтобы понять, как получается результат выполнения оператора SELECT, рассмотрим концептуальную схему его выполнения. Эта схема является именно концептуальной, т.к. гарантируется, что результат будет таким, как если бы он выполнялся шаг за шагом в соответствии с этой схемой. На самом деле, реально результат получается более изощренными алгоритмами, которыми "владеет" конкретная СУБД.

Стадия 1. Выполнение одиночного оператора SELECT

Если в операторе присутствуют ключевые слова UNION, EXCEPT и INTERSECT, то запрос разбивается на несколько независимых запросов, каждый из которых выполняется отдельно:

Шаг 1 (FROM) . Вычисляется прямое декартовое произведение всех таблиц, указанных в обязательном разделе FROM. В результате шага 1 получаем таблицу A.

Шаг 2 (WHERE) . Если в операторе SELECT присутствует раздел WHERE, то сканируется таблица A, полученная при выполнении шага 1. При этом для каждой строки из таблицы A вычисляется условное выражение, приведенное в разделе WHERE. Только те строки, для которых условное выражение возвращает значение TRUE, включаются в результат. Если раздел WHERE опущен, то сразу переходим к шагу 3. Если в условном выражении участвуют вложенные подзапросы, то они вычисляются в соответствии с данной концептуальной схемой. В результате шага 2 получаем таблицу B.

Шаг 3 (GROUP BY) . Если в операторе SELECT присутствует раздел GROUP BY, то строки таблицы B, полученной на втором шаге, группируются в соответствии со списком группировки, приведенным в разделе GROUP BY. Если раздел GROUP BY опущен, то сразу переходим к шагу 4. В результате шага 3 получаем таблицу С.

Шаг 4 (HAVING) . Если в операторе SELECT присутствует раздел HAVING, то группы, не удовлетворяющие условному выражению, приведенному в разделе HAVING, исключаются. Если раздел HAVING опущен, то сразу переходим к шагу 5. В результате шага 4 получаем таблицу D.

Шаг 5 (SELECT) . Каждая группа, полученная на шаге 4, генерирует одну строку результата следующим образом. Вычисляются все скалярные выражения, указанные в разделе SELECT. По правилам использования раздела GROUP BY, такие скалярные выражения должны быть одинаковыми для всех строк внутри каждой группы. Для каждой группы вычисляются значения агрегатных функций, приведенных в разделе SELECT. Если раздел GROUP BY отсутствовал, но в разделе SELECT есть агрегатные функции, то считается, что имеется всего одна группа. Если нет ни раздела GROUP BY, ни агрегатных функций, то считается, что имеется столько групп, сколько строк отобрано к данному моменту. В результате шага 5 получаем таблицу E, содержащую столько колонок, сколько элементов приведено в разделе SELECT и столько строк, сколько отобрано групп.

Стадия 2. Выполнение операций UNION, EXCEPT, INTERSECT

Если в операторе SELECT присутствовали ключевые слова UNION, EXCEPT и INTERSECT, то таблицы, полученные в результате выполнения 1-й стадии, объединяются, вычитаются или пересекаются.

Стадия 3. Упорядочение результата

Если в операторе SELECT присутствует раздел ORDER BY, то строки полученной на предыдущих шагах таблицы упорядочиваются в соответствии со списком упорядочения, приведенном в разделе ORDER BY.

Оператор языка SQL SELECT предназначен для запросов на выборку данных из базы данных. Он может быть использован как без условий (выбор всех строк во всех столбцах или всех строк в определённых столбцах), так и с многочисленными условиями (выбор определённых строк), которые заданы в секции WHERE. Ознакомимся со средствами SQL, которыми можно задавать эти условия на выборку данных, а также узнаем, как использовать оператор SELECT в подзапросах.

SELECT для выбора столбцов таблицы

Запрос с оператором SELECT для выбора всех столбцов таблицы имеет следующий синтаксис:

SELECT * FROM ИМЯ_ТАБЛИЦЫ

То есть для выбора всех столбцов таблицы после слова SELECT нужно ставить звёздочку.

Пример 1. Есть база данных фирмы - Company. В ней есть таблица Org (Структура фирмы) и Staff (Сотрудники). Требуется выбрать из таблиц все столбцы. Соответствующий запрос для выбора всех столбцов из таблицы Org выглядит следующим образом:

SELECT * FROM ORG

Этот запрос вернёт следующее (для увеличения картинки щёлкнуть по ней левой кнопкой мыши):

Запрос для выбора всех столбцов из таблицы Staff выглядит следующим образом:

SELECT * FROM STAFF

Этот запрос вернёт следующее:


Для выбора определённых столбцов таблицы нам потребуется вместо звёздочки перечислить через запятую названия всех столбцов, которые требуется выбрать:

SELECT ВЫБИРАЕМЫЕ_СТОЛБЦЫ FROM ИМЯ_ТАБЛИЦЫ

Пример 2. Пусть требуется из таблицы Org выбрать столбцы Depnumb и Deptname, в которых содержатся данные соответственно о номерах отделов фирмы и об их названиях. Запрос для получения такой выборки будет следующим:

SELECT DEPNUMB, DEPTNAME FROM ORG

А из таблицы Staff нужно выбрать столбцы DEPT, NAME, JOB, в которых содержатся соответственно данные о номере отдела, в котором трудится сотрудник, его имени и должности:

SELECT DEPT, NAME, JOB FROM STAFF

Для выбора определённых строк таблицы вместе с оператором SELECT уже потребуется ключевое слово WHERE, указывающее на некоторое значение или несколько значений, содержащиеся в интересующих нас строках. Наиболее простые условия задаются при помощи операторов сравнения и равенства (, =), а также ключевого слова IS. Условий может быть несколько, тогда они перечисляются с использованием ключевого слова AND. Запросы для выбора строк имеют следующий синтаксис:

Пример 4. В предыдущем примере мы выбирали строки из таблицы только по значению одного столбца - DEPT. Пусть теперь нужно выбрать данные о сотрудниках, которые работают в 38-м отделе и должность которых - служащий (Clerk). Для этого в секции WHERE соответствующие значения нужно перечислить с использованием слова AND:


Пример 5. Пусть нужно выбрать из таблицы Staff идентификаторы и имена тех сотрудников, размер комиссии которых - неопределённый. Для этого в секции WHERE перед указанием значения столбца COMM - NULL нужно ставить не знак равенства, а слово IS:

Этот запрос вернёт следующие данные:


Для указания значений в строках, которые требуется выбрать, используются и знаки сравнения.

Использование SELECT и предикатов IN, OR, BETWEEN, LIKE

Предикаты - слова IN, OR, BETWEEN, LIKE в секции WHERE - также позволяют выбрать определённые диапазоны значений (IN, OR, BETWEEN) или значения в строках (LIKE), которые требуется выбрать из таблицы. Запросы с предикатами IN, OR, BETWEEN имеют следующий синтаксис:

Запросы с предикатом LIKE имеют следующий синтаксис:

Пример 7. Пусть требуется выбрать из таблицы Staff имена, должности и число отработанных лет сотрудников, работающих в отделах с номерами 20 или 84. Это можно сделать следующим запросом:

Результат выполнения запроса:


Пример 8. Пусть теперь требуется выбрать из таблицы Staff те же данные, что и в предыдущем примере. Запрос со словом OR аналогичен запросу со словом IN и перечислением интересующих значений в скобках. Запрос будет следующим:

Пример 9. Выберем из той же таблицы имена, должности и число отработанных лет сотрудников, зарплата которых между 15000 и 17000 включительно:

Результат выполнения запроса:


Предикат LIKE используется для выборки тех строк, в значениях которых встречаются символы, указанные после предиката между апострофами (").

Пример 10. Выберем из той же таблицы имена, должности и число отработанных лет сотрудников, имена которых начинаются с буквы S и состоят из 7 символов:

Символ подчёркивания (_) означает любой символ. Результат выполнения запроса:


Пример 11. Выберем из той же таблицы имена, должности и число отработанных лет сотрудников, имена которых начинаются с буквы S и содержат любые другие буквы в любом количестве:

Символ процентов (%) означает любое количество символов. Результат выполнения запроса:


Значения, указанные с использованием предикатов IN, OR, BETWEEN, LIKE можно инвертировать при помощи слова NOT. Тогда запрашиваемые данные будут иметь противоположный смысл. Если мы используем NOT IN (20, 84), то будут выведены данные сотрудников, которые работают во всех отделах, кроме имеющих номера 20 и 84. С использованием NOT BETWEEN 15000 AND 17000 можно получить данные сотрудников, зарплата которых не входит в интервал от 15000 до 17000. Запрос с NOT LIKE выведет данные сотрудников, чьи имена не начинаются или не содержат символов, указанных с NOT LIKE.

Написать SQL запросы с SELECT и предикатами IN, NOT IN, BETWEEN самостоятельно, а затем посмотреть решения

Есть база данных "Театр". Таблица Play содержит данные о постановках. Таблица Team - о ролях актёров. Таблица Actor - об актёрах. Таблица Director - о режиссёрах. Поля таблиц, первичные и внешние ключи можно увидеть на рисунке ниже (для увеличения нажать левой кнопкой мыши).


Пример 12. Вывести список актёров, которые не разу не были утверждены на главную роль. В таблице team данные о главных ролях содержатся в столбце mainteam. Если роль - главная, то в соответствующей строке отмечено "Y".

SELECT и ORDER BY - сортировка (упорядочение) строк

Разобранные до сих пор запросы SQL SELECT возвращали строки, которые могли быть расположены в любой последовательности. Однако часто требуется отсортировать строки по порядку номеров, алфавиту и другим признакам. Для этого служит ключевое словосочетание ORDER BY. Такие запросы имеют следующий синтаксис:

Пример 15. Пусть требуетя выбрать из таблицы Staff сотрудников, работающих в отделе с номером 84 и отсортировать (упорядочить) записи по числу отработанных лет в возрастающем порядке:

Слово ASC указывает, что порядок сортировки - возрастающий. Это слово не обязательно, так как возрастающий порядок сортировки применяется по умолчанию. Результат выполнения запроса:


Пример 16. Пусть требуетя выбрать те же данные, что и в предыдущем примере, но отсортировать (упорядочить) записи по числу отработанных лет в убывающем порядке:

Слово DESC указывает, что порядок сортировки - убывающий. Результат выполнения запроса:


SELECT и DISTINCT - удаление дубликатов строк

Когда для значений строк таблицы не задано условие уникальности, в результатах запроса могут встретиться одинаковые строки. Часто требуется вывести лишь уникальные строки. Это делается при помощи выражения DISTINCT после оператора SELECT.

Пример 17. Пусть требуетcя узнать, какие существуют отделы и какие должности среди отделов, номера которых меньше 30. Это можно сделать при помощи следующего запроса:

Результат выполнения запроса:


Оператор SELECT в подзапросах SQL

До сих пор мы разбирали конструкции SQL с оператором SELECT, в которых условия, по котором выбираются данные, и сами выбираемые данные содержатся в одной и той же таблице базы данных. На практике часто бывает, что данные, которые надо выбрать, содержатся в одной таблице, а условия - в другой. Здесь на помощь приходят подзапросы: значения условия отбора возвращаются из другого запроса (вложенного запроса), начинающегося также с SELECT. Запросы с подзапросами могут выдавать как одну, так и несколько строк.

Пример 18. Все те же таблицы ORG и STAFF. Пусть требуетcя узнать, в каком подразделении работает сотрудник с идентификационным номером 280, и где это подразделение расположено. Но информация о подразделениях хранится в таблице ORG, а информация о сотрудниках - в таблице STAFF. Это можно сделать при помощи следующего запроса с подзапросом, в котором внешний SELECT обращается к таблице ORG, а внутренний SELECT - к таблице STAFF:

Результат выполнения запроса:


Пример 19. Пусть теперь требуетcя узнать, в каких подразделениях (без дублирования) работают сотрудники с заработной платой менее 13000. Для этого в секции WHERE внешнего SELECT (запрос к таблице ORG) задаётся условие, принимающее диапазон значений (IN), а внутренний SELECT (к таблице STAFF) как раз возвращает требуемый диапазон значений:

Реляционные базы данных и язык SQL

На уроке будет рассмотрен язык запросов: оператор SELECT sql — на выборку данных

SQL-запрос Select предназначен для обычной выборки из базы данных. Т.е. если нам необходимо просто получить данные, не делая с ними никакой обработки и не внося изменений в базу данных, то можно смело использовать данный запмагарос.

Синтаксис оператора SELECT

SELECT * FROM имя_таблицы;

Это самый простой вариант работы с оператором, когда мы выбираем все записи из таблицы БД.

Символ * обозначает выборку всех записей из таблицы . При этом столбцы и строки результирующего набора не упорядочены.

Рассмотрим примеры sql запросов select:

Пример : если вы создали локальную базу данных и заполнили таблицы, как в рассмотренном ранее (или же воспользовались сервисом sqlFiddle), то выполним следующий пример.
Необходимо выбрать все записи из таблицы teachers

SELECT * FROM имя_таблицы LIMIT 2,3;

В примере происходит выборка 3 записей из таблицы, начиная со 2 записи.
Этот запрос особо необходим при создании блока страниц навигации.

Чтобы упорядочить поля результирующего набора , их следует перечислить через запятую в нужном порядке после слова SELECT:

SELECT name, zarplata, premia FROM teachers ORDER BY name;

Выберет значения полей name , zarplata , premia и отсортирует по полю name (по алфавиту)


Пример: БД «Компьютерный магазин». Выбрать данные о скорости и памяти компьютеров. Требуется упорядочить результирующий набор по скорости процессора в порядке возрастания.

SELECT `Скорость`,`Память` FROM `pc` ORDER BY 1 ASC

Результат:

Сортировку можно выполнять по двум полям:

SELECT name, zarplata, premia FROM teachers ORDER BY name DESC;

Выберет значения полей name , zarplata , premia и отсортирует по полю name по убыванию


Удаление повторяющихся значений в SQL

В случае когда необходимо получить уникальные строки, можно использовать ключевое слово DISTINCT .

DISTINCT (в переводе с английского ОТЛИЧИЕ) - аргумент, который устраняет двойные значения :

Пример БД «Институт»: требуется узнать возможные варианты размера премий. Если не использовать Distinct , в результате будет выдаваться два одинаковых значения. Удалить в sql повторяющиеся значения можно при введении Distinct — в результате дублирующиеся значения не повторяются.

    SELECT Скорость, Память FROM PC;

    Результат:

    В таблице PC первичным ключом является поле code . Поскольку это поле отсутствует в запросе, в приведенном выше результирующем наборе имеются дубликаты строк.

    Когда требуется получить уникальные строки (например, нас интересуют только различные комбинации скорости процессора и объема памяти, а не характеристики всех имеющихся компьютеров), то нужно использовать Distinct:

    SELECT DISTINCT Скорость, Память FROM PC;

    SELECT DISTINCT Скорость, Память FROM PC;

    Результат:

    Задание sql select 1_1. БД «Институт» Выполните запрос на выборку id и name из таблицы учителей. Отсортируйте фамилии учителей по убыванию

    Язык sql: where условие

    Условие выполняется предложением
    WHERE
    которое записывается после предложения FROM .

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

    Пример БД «Институт»: Выводить данные преподавателя из таблицы teachers , фамилия которого Иванов

    Несколько условий в SQL

    Предикаты (условия) могут состоять как из одного выражения, так и из любой комбинации выражений, построенных с помощью булевых операторов:

  1. AND ,
  2. или NOT
  3. Пример БД «Институт»: вывести код преподавателя, зарплата которого составляет 10000 , а премия 500

    Реляционные операторы, встречающиеся в условиях:
    = Равный
    > Больше чем
    >= Больше чем или равно
    Не равно

    Between в SQL (между)

    Предикат BETWEEN проверяет, попадают ли значения проверяемого выражения в диапазон, задаваемый пограничными выражениями, соединяемыми служебным словом AND .

    Синтаксис:

    <Проверяемое выражение> BETWEEN <Начальное выражение> AND <Конечное выражение>

    Пример БД "Институт": Вывести фамилию и зарплату преподавателя, зарплата которого между 5000 и 10000.

    Пример БД "Институт": Вывести фамилию и зарплату преподавателя, зарплата которого не находится в диапазоне от 5000 до 10000.

    Предикат IN

    Предикат IN определяет, будет ли значение проверяемого выражения обнаружено в наборе значений, который явно определен.

    Синтаксис:

    < Проверяемое выражение> [ NOT ] IN (< набор значений> )

    <Проверяемое выражение> IN (<набор значений>)

    Пример БД "Институт": вывести имена преподавателей, зарплата которых составляет 5000 , 10000 или 11000

    Пример БД "Институт": вывести имена преподавателей, зарплата которых не находится среди значений: 5000 , 10000 или 11000

    Задание sql select 1_3. БД "Институт" Вывести фамилию, зарплату и премию учителей, премия которых от 2000 до 5000 рублей.

Дисциплина: Базы данных

Операторы языка SQL

Язык SQL включает в себя операторы разных катего­рий. Любой SQL-оператор состоит из зарезервированных слов и слов, опре­деляемых пользователем в соответствии с установленными синтаксическими правилами. Как и во многих языках программирования, большинство ком­понентов операторов языка не чувствительны к регистру. Исключение из этого правила как обычно составляют символьные данные, при задании ко­торых необходимо помнить о регистре и использовать тот, который необхо­дим для представления данных.

Для записи операторов в языке принят свободный формат, позволяющий посредством отступов и выравниваний придать SQL-программе более чита­бельный вид.

    каждая фраза в операторе должна начинаться с новой строки;

    начало каждой фразы должно быть выровнено с началом остальных фраз оператора;

    каждая часть фразы должна начинаться с новой строки с некоторым от­ступом относительно начала всей фразы, что позволит выделить подчи­ненные части;

    для записи операторов применяются некоторые соглашения:

    для записи зарезервированных слов используются прописные буквы;

    для записи определяемых пользователем слов используются строчные буквы;

    вертикальная черта "|"" указывает на необходимость выбора одного из не­скольких значений;

    фигурные скобки определяют обязательный элемент;

    квадратные скобки определяют необязательный элемент;

    многоточие "..." используется для указания необязательной возможности повторения конструкции, от нуля до нескольких раз.

Операторы определения данных (табл.1) применяются для описания структур используемых данных. В состав этой категории входят следующие операторы: create table, drop table, alter table, create view, ALTER VIEW, DROP VIEW.

Таблица 1 . Операторы определения данных

Оператор Пояснение

create table Создать таблицу

DROP table Удалить таблицу

alter table Изменить таблицу

CREATE VIEW Создать представление

alter view Изменить представление

drop view Удалить представление

Операторы манипулирования данными, образующие следующую категорию операторов, предназначены для заполнения таблиц данными и для обновле­ния загруженной в них информации. К данной категории относятся сле­дующие операторы: delete, insert, update (табл.2).

Таблица 2 . Операторы манипулирования данными

Оператор Пояснение

Delete Удаляет одну или несколько строк, соответствующих условиям

фильтрации, из базовой таблицы

INSERT Вставляет одну строку в базовую таблицу

update Обновляет значения одного или нескольких столбцов в одной или

нескольких строках, соответствующих условиям фильтрации

Для выборки информации из базы данных предназначен язык запросов, ко­торый в языке SQL представлен одним оператором select (табл.3).

Таблица 3. Язык запросов

Оператор Пояснение

select Выбирает строки; оператор, позволяющий сформировать результирующую

таблицу, соответствующую запросу

Кроме указанных категорий операторов, назначение которых не сложно представить, прочитав пояснения в таблицах, необходимо выделить еще две: операторы управления транзакциями (табл. 4) и средства администриро­вания данных (табл. 5).

Таблиц 4. Управление транзакциями

Оператор Пояснение

commit Завершить транзакцию- завершить обработку информации,

объединенную в транзакцию

rollback Откатить транзакцию- отменить изменения, проведенные в ходе выполнения

состояние БД, пометить его для то­го, чтобы можно было в дальнейшем к нему вернуться

Таблица 5 . Администрирование данных

Оператор Пояснение

ALTER DATABASE Изменить набор основных объектов в базе данных, ограниче­ний, касающихся

всей базы данных

ALTER DBAREA Изменить ранее созданную область хранения

ALTER PASSWORD Изменить пароль для всей базы данных

CREATE DATABASE Создать новую базу данных

CREATE DBAREA Создать новую область хранения и сделать ее доступной для размещения

DROP DATABASE Удалить существующую базу данных

DROP DBAREA Удалить существующую область хранения (если в ней на на­стоящий момент не

располагаются активные данные)

GRANT Предоставить права доступа на ряд действий над некоторым объектом БД

REVOKE Лишить прав доступа к некоторому объекту или некоторым действиям над

объектом

В коммерческих СУБД набор основных операторов расширен. В большин­ство СУБД включены операторы определения и удаления индекса запуска хранимых процедур и операторы определения триггеров.

Начинать знакомство с данным языком принято с рассмотрения возможно­стей языка запросов, который в языке SQL представлен одним оператором select, потому что этот мощный оператор, естественно, является и самым сложным. К тому же в дальнейшем интересно посмотреть, как его можно использовать совместно с операторами манипулирования данными.

    Оператор выбора SELECT . Формирование запросов к базе данных

Назначение оператора selecт состоит в выборке и отображении данных од­ной или нескольких таблиц БД. Этот исключительно мощный, наиболее часто используемый оператор реализует все операции реляционной алгебры. Один и тот же запрос может быть реализован несколькими способами, которые могут су­щественно отличаться по времени исполнения.

Формат оператора select:

SELECT *|<список полей> FROM <список таблиц>

Указанный порядок следования фраз в операторе select не может быть из­менен, но не все его части являются обязательными. К обязательным пред­ложениям относятся только фразы select и from. Все остальные части опе­ратора могут быть использованы по усмотрению программиста. Пояснение:

□ Фраза select :

Наличие ключевого слова all (по умолчанию) означает, что в резуль­тирующую таблицу включаются все строки, удовлетворяющие услови­ям запроса, что может привести к появлению в результирующей таб­лице одинаковых строк;

Ключевое слово distinct предназначено для приведения таблицы в соответствие с принципами теории отношений, где предполагается отсутствие дубликатов строк;

Символ "* " определяет очень часто встречаемую ситуацию, когда в ре­зультирующий набор включаются все столбцы из исходной таблицы запроса.

□ Во фразе from задается перечень исходных таблиц запроса.

□ Во фразе where определяются условия отбора строк результата или усло­вия соединения строк исходных таблиц, подобно операции условного со­единения в реляционной алгебре. В качестве условий отбора могут быть использованы следующие предикаты:

Сравнения "= , <>, >, <, >=, <=" - для сравнения результатов вы­числения двух выражений; более сложные выражения строятся с по­мощью логических операторов AND, OR, NOT; значения выражений вычисляются в порядке, который определяется приоритетом исполь­зуемых операторов и наличием скобок в выражении;

between А and В - предикат истинен, когда вычисленное значение выражения попадает в заданный диапазон (предикат not between a and В истинен тогда, когда сравниваемое значение не попадает в заданныйинтервал);

in - предикат истинен тогда, когда сравниваемое значение входит в множество заданных значений; при этом множество значений может быть задано простым перечислением или встроенным подзапросом (предикат not in истинен тогда, когда сравниваемое значение не вхо­дит в заданное множество);

like и not like - предикаты, смысл которых противоположен, тре­буют задания шаблона, с которым сравнивается заданное значение; предикат like истинен тогда, когда сравниваемое значение соответст­вует шаблону, и ложен в противном случае;

IS null - предикат, применяющийся для выявления равенства зна­чения некоторого атрибута неопределенному значению:

    <имя атрибута> IS null - принимает значение true, если в дан­ной строке указанный атрибут имеет неопределенное значение и значение false, в противном случае;

    <имя атрибута> IS NOT null - все происходит наоборот.

exist и not exist , используемые во встроенных подзапросах.

□ Во фразе group by задается список полей группировки.

□ Во фразе having задаются предикаты-условия, накладываемые на каждую группу.

□ Во фразе order by задается список полей упорядочения результата, то есть список полей, который определяет порядок сортировки в результи­рующей таблице.

В стандарте SQL определено понятие NULL-значения, которое вызвало необхо­димость применения трехзначной логики, где все логические операции выпол­няются в соответствии с приведенной ниже таблицей истинности (табл.6).

Таблица 6 . Таблица истинности

A AND B

Т RUE

1.1. Простые запросы

Запрос 1

Вывести сведения о кафедрах университета.

Данная задача сводится к выборке и выводу информации из одной таблицы, причем выводу подлежат все ее строки и все ее столбцы:

SELECT * FROM kafedra

Результатом выполнения такого запроса будет являться таблица, содержащая сведения обо всех кафедрах университета:

Kod kaf

Name kaf

Nom_telef

Nom_Auditoria

Col_sotr

Иванов Т.М.

Общей математики

Махов К Л.

Росс Л.Т.

Фирсов С.С.

Прикладной математики

Ляхова И.Т.

Запрос 2

Вывести номера телефонов кафедр университета.

Результат такого запроса должен содержать только два столбца: Name _ kaf и Nom _ telef , поэтому сам запрос должен выглядеть следующим образом:

SELECT Name_kaf, Nom_telef FROM kafedra

Результирующая таблица:

Name kaf Nomjelef

Физики 23-34-24

Общей математики 23-65-43

Истории 23-78-72

Графики 23-99-77

Прикладной математики 23-66-62

В сформированных выше запросах требовалось вывести все строки таблицы, указанной в предложении from. Если при выборке требуется ограничить ко­личество выводимых строк в соответствии с каким-то условием, то этого можно достичь, используя в запросе предложение where. В предложение where можно включить одно или несколько условий отбора строк.

Запрос 3

Вывести сведения о кафедре графики.

SELECT * FROM kafedra WHERE Name_kaf = "Графики"

Ответ на такой запрос будет содержать только одну строку:

Kod.kaf Name_kaf Nomjelef Nom_Auditoria Col_sotr Zav_kaf

004 Графики 23-99-77 385 18 Фирсов C.C.

Запрос 4

Вывести сведения о кафедрах университета, находящихся на первом этаже, учитывая тот факт, что номера аудиторий первого этажа лежат в диапазо­не от 1 до 99.

Запрос будет выглядеть следующим образом:

SELECT * FROM kafedra WHERE Nom_Auditoria BETWEEN 1 AND 99

Результат запроса:

Kodjcaf Name_kaf Norn lelef Norn Audit oria Coi_sotr Zavkaf

002 Общей мате- 23-65-43 003 22 Махов К.Л.

математики

В общем случае строки в результирующей таблице выводятся в неупорядоченном каким-либо образом состоянии. Просматривать и анализировать такой материал не всегда удобно. Для сортировки строк по какому-либо столбцу применяется фраза order by. Она включает список разделенных запятыми наименований столбцов, по которым требуется упорядочить вы­водимую информацию. Данная фраза должна всегда располагаться последней в операторе select и при ее наличии появляется возможность отсортировать строки по возрастанию (asc) или убыванию (desc) значений указанного столбца или комбинации указанных столбцов, независимо о" того, присутствуют эти столбцы в результирующей таблице или нет.

Запрос 5

Вывести сведения о кафедрах университета в виде, отсортированном т столбцу Name _ kaf в порядке возрастания.

Запрос будет выглядеть следующим образом:

SELECT * FROM kafedra ORDER BY Name_caf ASC

Результат данного запроса:

Kod_kaf Name_kaf Nomjelef Nom_Auditoria Col_sotr Zav kaf

004 Графики 23-Э9-77 385 18 ФирсовС.С.

003 Истории 23-78-72 465 16 Росс Л.Т.

002 Общей ма- 23-65-43 003 22 Махов К.Л.

тематики

005 Прикладной 23-66-62 028 24 Ляхова И.Т.

математики

001 Физики 23-34-24 132 25 Иванов Т.М.

Часто для улучшения наглядности выводимую информацию полезно отсор­тировать по нескольким столбцам. Для этого имена столбцов сортировки необходимо перечислить через запятую во фразе order by. При этом выво­димая таблица будет содержать строки, упорядоченные по первому указан­ному во фразе order by столбцу, а строки, имеющие равные значения в этом столбце, будут упорядочены по значениям второго столбца и т. д. слева направо.

Как уже говорилось, в 1970-х годах Эдгар Кодд предложил использовать реляционную модель. Помимо самой модели, он так же предложил язык для работы с данными в рамках этой модели, названный DSL/Alpha. Впоследствии, на основе DSL/Alpha появился язык SQUARE, а на его основе, в свою очередь, язык SEQUEL, который (ввиду некоторой путаницы в торговых марках) был переименован позже в SQL.

Здесь constraint_* может иметь следующие значения (или их комбинации):

  • NOT NULL – не может быть “пустым”
  • UNIQUE – значение уникально
  • PRIMARY KEY – комбинация первых двух
  • FOREIGN KEY – указание внешнего ключа
  • CHECK – значение должно удовлетворять условию
  • DEFAULT – значение по умолчанию

Присутствуют некоторые разночтения в разных реализациях.

Если первичный ключ состоит из нескольких столбцов, необходимо выносить его после объявления столбцов в виде

CONSTRAINT pk_table PRIMARY KEY (col1, col2, .. .)

где pk_table – уникальное название ограничения.

Во многих реализациях, часть CONSTRAINT pk_table можно опустить. В таком случае имя будет сгенерировано автоматически.

Внешний ключ в любом случае объявляется после объявления колонок.

Синтаксис:

CONSTRAINT fk_table FOREIGN KEY (col1, .. .) REFERENCES tbl_name (ref_col1, .. .) ON UPDATE upd_action ON DELETE del_action;

где fk_table – уникальное название ограничения, col1, ... – названия колонок данной таблицы, входящих во внешний ключ, tbl_name – таблица, для которой указанный внешний ключ является первичным, ref_col1, ... – названия соответствующих колонок в tbl_name . upd_action и del_action определяют, как БД реагирует на изменение и удаление записей из tbl_name , и могут принимать одно из значений:

  • SET NULL – ссылающиеся колонки col1, ... устанавливается в NULL
  • RESTRICT – если есть записи, ссылающиеся на обновляемое/удаляемое значение, обновление/удаление завершается ошибкой
  • CASCADE – обновляет/удаляет все ссылающиеся записи
  • NO ACTION – ничего не делать

Во многих реализациях, часть CONSTRAINT fk_table можно опустить. В таком случае имя будет сгенерировано автоматически.