Основы языка SQL

Содержание

Слайд 2

Первый стандарт по языку SQL вышел в США (1986 г.), что

Первый стандарт по языку SQL вышел в США (1986 г.), что

способствовало достижению совместимости разных СУБД.

В 1989 г. этот документ получил статус международного стандарта.
Затем с участием ANSI и ISO были приняты и опубликованы стандарты SQL:1992, SQL:1999 и SQL:2003.
Для каждого нового стандарта характерно:
улучшение синтаксиса;
расширение типов данных;
появление дополнительных возможностей языка.

Слайд 3

Подавляющее большинство существующих СУБД поддерживают эти стандарты, однако с разной степенью

Подавляющее большинство существующих СУБД поддерживают эти стандарты, однако с разной степенью

соответствия.

Здесь важно понимать, что в стандартах фиксируются только основные концепции языка после их признания большинством специалистов.
Параллельно существует большое количество диалектов этого языка.
Причем дополнительные возможности (расширения) языка SQL первоначально появляются именно в диалектах, развиваемых отдельными разработчиками коммерческих СУБД.

Слайд 4

II. Язык запросов по образцу (QBE) Язык QBE (Query-By-Example) – это

II. Язык запросов по образцу (QBE)

Язык QBE (Query-By-Example) – это визуальное

средство, которое помогает непрофессиональным пользователям при работе с БД.
Средства QBE позволяют на экране компьютера заполнить бланк (шаблон) запроса, в т.ч. путем перетаскивания (Drag-and-Drop) отдельных элементов графического интерфейса.
При этом эквивалентная директива языка SQL генерируется автоматически.
Есть возможность просмотреть ее и даже исправить.
Средства QBE присутствуют во многих современных СУБД: MS Access, Oracle и др.
Обычно возможности QBE существенно ниже полных возможностей языка SQL.
Слайд 5

III. Возможности современного языка SQL a) Средства определения данных (DDL) b)

III. Возможности современного языка SQL

a) Средства определения данных (DDL)

b) Средства манипулирования

данными (DML)

VIEW – представление (виртуальная таблицa)

SELECT, DELETE, INSERT, UPDATE

с) Средства управления транзакциями

COMMIT – завершить транзакцию, т.е. зафиксировать ее результаты
ROLLBACK – откатить транзакцию
SAVEPOINT – сохранить промежуточную точку (на случай отката транзакции)

Слайд 6

d) Средства административного управления е) Процедурные расширения языка DBAREA – область

d) Средства административного управления

е) Процедурные расширения языка

DBAREA – область хранения данных

GRANT

– предоставить права
REVOKE – отменить права

Поддерживают средства программирования для построения сложных процедур работы с БД (например, хранимые процедуры).
Здесь пока не достигнут высокий уровень стандартизации.
Поэтому практически каждая СУБД использует свой процедурный язык.

Слайд 7

IV. Создание таблиц БД с помощью языка SQL В простейшем виде

IV. Создание таблиц БД с помощью языка SQL

В простейшем виде команда

CREATE TABLE имеет следующий синтаксис:

CREATE TABLE tab_name ( { col_def ⎟ tab_cnstr } [, …] )

В этой синтаксической формуле применяются следующие обозначения:
фигурные скобки { } определяют обязательный элемент;
вертикальная черта ⏐ означает выбор одного из приведенных вариантов;
квадратные скобки [ ] определяют необязательный элемент;
многоточие … указывает возможность неоднократного повторения конструкции.

Слайд 8

Элемент col_def обозначает определение отдельной колонки таблицы. col_def ::= { col_name

Элемент col_def обозначает определение отдельной колонки таблицы.

col_def ::= { col_name data_type

} [ DEFAULT const_expr ] [ col_cnstr ] [, …]

Прежде всего, нужно обязательно определить имя колонки (col_name), а также тип данных (data_type) для этой колонки.

Этот элемент имеет следующий синтаксис:

Слайд 9

Современные СУБД позволяют обрабатывать данные разных типов: INT, SMALLINT — целые

Современные СУБД позволяют обрабатывать данные разных типов:

INT, SMALLINT — целые числа;
NUMERIC,

DECIMAL — числа с фиксированной точкой;
REAL, FLOAT — числа с плавающей точкой;
CHAR, VARCHAR — строки символов постоянной и переменной длины;
MONEY, SMALLMONEY — денежные значения;
DATE, DATETIME — дата и время;
BIT — логические значения.
Слайд 10

Необязательное ключевое слово DEFAULT определяет значение по умолчанию – const_expr. Это

Необязательное ключевое слово DEFAULT определяет значение по умолчанию – const_expr.

Это значение

будет использовано, если при вводе записи явно не указано другое значение.
Кроме того, для колонки можно определить набор ограничений – col_cnstr.
Эти ограничения повышают качество данных, которые хранятся в БД, а также поддерживают ссылочную целостность для взаимосвязанных таблиц.
Может использоваться несколько видов ограничений.
Слайд 11

а) Обязательные значения Это ограничение применяется в случае, если для некоторого

а) Обязательные значения

Это ограничение применяется в случае, если для некоторого столбца

в каждой строке таблицы требуется наличие конкретного значения (NOT NULL).
Например, каждый сотрудник обязательно занимает ту или иную должность (Position).
Тогда столбец Position должен определяться следующим образом:
 Position VARCHAR(10) NOT NULL
При установке такого ограничения СУБД препятствует появлению в этом столбце пустых значений (NULL).
Слайд 12

b) Простой первичный ключ Определяется с помощью спецификатора PRIMARY KEY. Например:

b) Простой первичный ключ

Определяется с помощью спецификатора PRIMARY KEY. Например:
Object_ID INTEGER

PRIMARY KEY
При этом для столбца Sub_ID автоматически гарантируется уникальность значений, а также становятся запрещенными неопределенные значения (NULL).
В таблице можно определить только один первичный ключ.
Слайд 13

c) Простой альтернативный ключ Иногда в дополнение к первичному ключу необходимо

c) Простой альтернативный ключ

Иногда в дополнение к первичному ключу необходимо иметь

альтернативные ключи, которые обеспечивают уникальность значений для других столбцов.
В этом случае применяется спецификатор UNIQUE. Например:
Object_name VARCHAR(20) NOT NULL UNIQUE
Слайд 14

d) Проверочные ограничения С помощью спецификатора CHECK(log_expr) можно задать ограниченный диапазон

d) Проверочные ограничения

С помощью спецификатора CHECK(log_expr) можно задать ограниченный диапазон возможных

значений для некоторого столбца.
Логическое выражение log_expr может объединять несколько условий контроля при вводе данных. Например:
Kurs INTEGER NOT NULL CHECK ((Kurs >= 1) OR (Kurs <= 5))
Слайд 15

e) Простой внешний ключ Объявляется в дочерней (подчиненной) таблице с помощью

e) Простой внешний ключ

Объявляется в дочерней (подчиненной) таблице с помощью конструкции
[

FOREIGN KEY ] REFERENCES ref_table [ (ref_col) ]
Если в родительской таблице ref_table ссылка осуществляется на первичный ключ, то параметр ref_col можно не указывать.
Этот параметр является обязательным при ссылке на альтернативный ключ (столбец с атрибутом UNIQUE).
Слайд 16

Ограничения на уровне всей таблицы В директиве CREATE TABLE такие ограничения

Ограничения на уровне всей таблицы

В директиве CREATE TABLE такие ограничения объявляются

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

Объявление составного первичного или альтернативного ключа: FOREIGN KEY ( col_name [,

Объявление составного первичного или альтернативного ключа:

FOREIGN KEY ( col_name [, …]

) REFERENCES ref_tab [ ( ref_col [, …] ) ]

{ PRIMARY KEY ⎜ UNIQUE } { ( col_name [, …] ) }

Объявление составного внешнего ключа:

Пример создания таблицы с составным первичным ключом:

CREATE TABLE Рецепты (
Код_блюда INTEGER, Код_продукта INTEGER,
Вес_брутто REAL, Вес_нетто REAL,
PRIMARY KEY (Код_блюда, Код_продукта) )

Слайд 18

V. Выборка данных с помощью языка SQL Команда SELECT позволяет извлечь

V. Выборка данных с помощью языка SQL

Команда SELECT позволяет извлечь данные

из одной или нескольких таблиц, а также (в случае необходимости) вычислить по этим данным производные значения.
При формировании этой команды описывается только необходимый результат, т.е. набор выходных данных в виде таблицы.
Когда СУБД начинает выполнять конкретную команду SELECT, с помощью оптимизатора запросов строится определенная последовательность операций РА, которая приведет к получению требуемого результата.
Слайд 19

В структуре этой мощной команды, которая имеет достаточно сложный синтаксис, можно

В структуре этой мощной команды, которая имеет достаточно сложный синтаксис, можно

выделить несколько основных разделов:

SELECT 〈 Список_выбора 〉
[ INTO 〈 Новая_таблица 〉 ]
FROM 〈 Набор_источников_данных 〉
[ WHERE 〈 Условия_отбора_записей 〉 ]
[ GROUP BY 〈 Ключи_группировки 〉 ]
[ HAVING 〈 Условия_отбора_групп 〉 ]
[ ORDER BY 〈 Ключи_сортировки 〉 ]
Обязательными являются только два раздела:
SELECT, где указываются столбцы, которые должны присутствовать в выходной таблице;
FROM, где задается перечень таблиц и других источников данных запроса

Слайд 20

1) Полное отображение таблицы SELECT * FROM 〈 имя_исх_таб 〉 Рассмотрим

1) Полное отображение таблицы

SELECT * FROM 〈 имя_исх_таб 〉

Рассмотрим наиболее распространенные

варианты применения команды SELECT.

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

Здесь символ * означает «все столбцы».

2) Отображение конкретных столбцов таблицы

SELECT 〈 список_столбцов 〉 FROM 〈 имя_исх_таб 〉

Слайд 21

3) Выборка записей по заданному условию В эти выражения обычно входят

3) Выборка записей по заданному условию

В эти выражения обычно входят константы

и названия полей (только числовых типов), а также арифметические операции.

SELECT 〈 список_столбцов 〉 FROM 〈 имя_исх_таб 〉 WHERE 〈 условие_отбора 〉

Для построения сложных выражений разрешено применять круглые скобки.

В условие отбора могут входить простые операции сравнения: =, <, > и т.п.
Более сложные условия строятся с помощью логических операций AND, OR или NOT.

Слайд 22

4) Сортировка результатов запроса Кроме того, в условии отбора можно: SELECT

4) Сортировка результатов запроса

Кроме того, в условии отбора можно:

SELECT 〈 список_столбцов

〉 FROM 〈 имя_исх_таб 〉 ORDER BY 〈 Ключи_сортировки 〉

указать шаблон поиска (LIKE);
проверить принадлежность к диапазону (BETWEEN) или множеству (IN).

Каждый ключ сортировки содержит название столбца выходной таблицы (обязательно), а также указатель порядка сортировки:
ASC – возрастающий порядок (по умолчанию);
DESC – убывающий порядок.

Слайд 23

5) Применение агрегатных (итоговых) функций При выборке данных из таблиц БД

5) Применение агрегатных (итоговых) функций

При выборке данных из таблиц БД агрегатные

функции позволяют произвести статистическую обработку, что важно для подсчета итогов.

Кроме специального случая COUNT(*), каждая из этих функций работает с отдельным столбцом, указанным в аргументе функции.

Слайд 24

Пример 1. Усреднение значений для заданного столбца: SELECT COUNT(*) FROM 〈

Пример 1. Усреднение значений для заданного столбца:

SELECT COUNT(*) FROM 〈 имя_исх_таб 〉 WHERE

〈 условия_отбора 〉

Пример 3. Подсчет неповторяющихся значений в заданном столбце:

SELECT COUNT( DISTINCT 〈имя_столбца〉 ) FROM 〈 имя_исх_таб 〉

Пример 2. Подсчет общего числа записей в выходной таблице:

SELECT AVG( 〈имя_столбца〉 ) FROM 〈 имя_исх_таб 〉

Слайд 25

6) Запросы с группировкой Часто при анализе табличных данных требуется выполнить

6) Запросы с группировкой

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

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

SELECT 〈 список_столбцов 〉 FROM 〈 имя_исх_таб 〉 GROUP BY 〈 Ключи_группировки 〉

Логика работы запросов с группировкой требует тесной связи между разделами SELECT и GROUP BY.

Слайд 26

В частности, любой элемент списка столбцов в разделе SELECT должен иметь

В частности, любой элемент списка столбцов в разделе SELECT должен иметь

единственное значение для каждой группы.

Следовательно, в этом списке могут быть только:
имена столбцов, которые являются ключами группировки;
агрегатные функции;
выражения, состоящие из перечисленных выше элементов.

Пример. Пусть имеется таблица ПРЕПОДАВАТЕЛИ, где содержатся следующие данные: Таб_номер, ФИО, Должность, Зарплата, Кафедра.
С помощью этих данных требуется по каждой кафедре определить количество преподавателей и их суммарную зарплату.

Слайд 27

В разделе WHERE оператора SELECT может присутствовать вложенный запрос. Результат выполнения

В разделе WHERE оператора SELECT может присутствовать вложенный запрос.
Результат выполнения этого

внутреннего запроса (подзапроса) передается внешнему запросу.
Пример. Список преподавателей, которые получают зарплату выше средней, формируется с помощью следующего запроса:

Решение этой задачи дает следующий запрос:

SELECT Кафедра, COUNT(*), SUM(Зарплата)
FROM ПРЕПОДАВАТЕЛИ
GROUP BY Кафедра

7) Вложенные запросы (подзапросы)

Слайд 28

8) Многотабличные запросы SELECT ФИО, Должность FROM ПРЕПОДАВАТЕЛИ WHERE Зарплата >

8) Многотабличные запросы

SELECT ФИО, Должность
FROM ПРЕПОДАВАТЕЛИ
WHERE Зарплата >
( SELECT AVG(Зарплата)
FROM

ПРЕПОДАВАТЕЛИ )

Для выборки данных из нескольких таблиц применяется механизм соединения этих таблиц (операция JOIN).
При внутреннем соединении исходные таблицы можно через запятую указать в разделе FROM.
В дополнение к этому, раздел WHERE должен содержать условия для соединения строк из отдельных таблиц.

Слайд 29

В этом запросе для сокращенного обозначения таблиц используются их псевдонимы –

В этом запросе для сокращенного обозначения таблиц используются их псевдонимы –

а и b.

Пример 1.

SELECT ФИО, Название, Телефон
FROM ПРЕПОДАВАТЕЛИ a, КАФЕДРЫ b
WHERE a.Код_каф = b.Код_каф

По таблицам КАФЕДРЫ и ПРЕПОДАВАТЕЛИ нужно получить общий список преподавателей с указанием названия кафедры, на которой работает преподаватель, и телефона этой кафедры.
Выполняем следующий запрос:

Слайд 30

Эта конструкция применяется для соединения таблиц 〈left_tab〉 и 〈right_tab〉, причем условия

Эта конструкция применяется для соединения таблиц 〈left_tab〉 и 〈right_tab〉, причем условия

〈join_cond〉 для соединения строк переносятся внутрь раздела FROM.
Дополнительные условия для отбора записей по другим критериям остаются в разделе WHERE, что делает текст запроса более понятным.

Начиная с СУБД Oracle 9i и стандарта SQL:1992, стало возможным в разделе FROM оператора SELECT использовать следующую конструкцию:

〈left_tab〉 〈join_type〉 〈right_tab〉 ON 〈join_cond〉

Слайд 31

[ INNER ] JOIN — внутреннее соединение (применяется по умолчанию); LEFT

[ INNER ] JOIN — внутреннее соединение (применяется по умолчанию);
LEFT [

OUTER ] JOIN — левое внешнее соединение;
RIGHT [ OUTER ] JOIN — правое внешнее соединение;
FULL [ OUTER ] JOIN — полное внешнее соединение.

Синтаксический элемент 〈join_cond〉 может принимать следующие значения: