Основные операторы 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 — в результате дублирующиеся значения не повторяются.
- AND ,
- или NOT
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
Предикаты (условия) могут состоять как из одного выражения, так и из любой комбинации выражений, построенных с помощью булевых операторов:
Пример БД «Институт»: вывести код преподавателя, зарплата которого составляет 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 можно опустить. В таком случае имя будет сгенерировано автоматически.