
Тема 3: Язык sql.
Основные разделы языка SQL. Примеры операторов по каждому разделу.
Международный стандарт языка SQL реализован в наст.время в большинстве реляционных СУБД. Целью стандартизации является переносимость приложений между различными СУБД. Но во всех диалектах языка SQL существуют конструкции, не являющиеся стандартными. Использование таких конструкций с одной стороны расширяют возможности конкретных СУБД, а с другой затрудняют переносимость приложений. Язык SQL называют реляционно-полным, т.к. любая операция реляционной алгебры мб выражена через соответствующие операторы языка SQL. Хотя язык SQL и основан на реляционной теории, но в некоторых местах отходит от нее. Например, отношение в реляционной теории не может иметь одинаковых кортежей, а таблица в терминологии языка SQL может содержать одинаковые строки.
Язык SQL состоит из следующих подмножеств:
язык определения данных DDL (Data Definition Language): его основные операторы CREATE, ALTER, DROP.
язык манипулирования данными DML (Data Manipulation Language): SELECT, INSERT, UPDATE, DELETE.
язык управления данными DCL (Data Control Language): GRANT(разрешение), DENY(запрещение), REVOKE(отмена разрешения и запретов)
язык управления транзакциями TCL(Transaction Control Language): COMMIT, ROLLBACK
_____________________________________________________________________________
Синтаксис оператора SELECT. Пример.
Он позволяет производить выборки данных и упорядочить столбцы в результирующей таблице. Результатом вып-я оператора SELECT является таблица, к этой таблице мб опять применен оператор SELECT, таким образом, операторы мб вложенными.
SELECT <список столбцов> FROM <список таблиц> [WHERE <условие выбора строк>] [GROUP BY <условие группировки>] [HAVING <условие выбора групп>][ORDER BY <условие сортировки>]
В предложении SELECT перечисленные имена столбцов в указанном порядке. Если имя столбца содержит разделение, например, пробелы, то оно заключается в скобки: [N студента]. Если разные таблицы имеют одинаковые имена столбцов, то такие имена записывают как составные: <имя таблицы>.<имя столбца>.
_____________________________________________________________________________
Предложение SELECT и FROM оператора SELECT. Выборка. Исключение строк-дубликатов. Построение вычисляемых полей. Пример.
В предложении FROM перечисленные имена таблиц, которые содержат столбцы, указанные после слова SELECT. ПР., вывести всю информацию о деталях из таблицы D.
SELECT dnum, dname, dprice
FROM D.
Список всех столбцов заменяем символом *.
Чтобы удалить строки дубликаты используют оператор DISTINCT.
SELECT DISTINCT pnum
FROM PD.
DISTINCT можно задавать только 1 раз для одного оператора SELECT.
Сравнение значений в предложении WHERE. Операции IN, BETWEEN. Пример.
WHERE. В нем указываются условия выборки строк, помещаемые в результирующую таблицу. Основные типы условий: сравнение значений атрибутов со скалярными выражениями, др. атрибутами и результатами вычисления выражений: <,>,>=, <=, <>, =, OR, AND, NOT.
Пример: вывести информацию о деталях болт и гайка.
SELECT *
FROM D
WHERE dname= ‘болт’ OR dname=’гайка’
IN. Проверка на принадлежность множеству выполняется с помощью IN.
SELECT *
FROM D
WHERE dname IN (‘болт’,’гайка’).
BETWEEN. Проверка на принадлежность диапазону значений выполняется с помощью оператора BETWEEN. Оператор задает min и max границы диапазона, в которые должно попадать значение. Обе границы считываются принадлежащему диапазону. Пример: вывести информацию о деталях с ценой от 10 до 20 руб.
SELECT *
FROM D
WHERE dprice BETWEEN 10 AND 20
_____________________________________________________________________________
Операции LIKE, IS NULL в предложении WHERE. Пример.
LIKE. Проверка строкового значения на соответствие шаблону выполняется с помощью оператора LIKE. Операция использования для поиска подстрок… ПР. вывести информацию о поставщиках начин. с буквы «и»
SELECT *
FROM P
WHERE pname LIKE ‘и%’
Проверка на наличие NULL. ПР. вывести инф-ю о деталях для которых не указана цена.
SELECT *
FROM D
WHERE dprice IS NULL
_____________________________________________________________________________
Использование агрегатных функций в предложениях оператора SELECT. Пример.
Эти функции дают единственное значение для целой группы строк в таблице. С помощью их в рамках SQL-запроса можно получить ряд обобщающих статистических сведений о множестве отобранных значений выходного набора.
Доступны следующие основные итоговые функции:
Count определяет количество записей в выходном наборе SQL запроса;
Min/Max
Avg среднее значение
Sum
ПР. определить общ. объем пост. деталей
SELECT SUM (volume) AS SUM
FROM PD
_____________________________________________________________________________
Группировка с помощью предложения GROUP BY оператора SELECT. Пример.
Использование GROUP BY позволяет разбить табл. на логические группы и применять агрегатные функции к каждой из этих групп, в итоге получим единственное значение для каждой из групп. ПР. для кажд. поставщика вывести сумм. объем поставляемой детали
SELECT pnum, SUM (volume)
FROM PD
GROUP BY pnum
Использование предложений GROUP BY и HAVING оператора SELECT. Пример.
Использование GROUP BY позволяет разбить табл. на логические группы и применять агрегатные функции к каждой из этих групп, в итоге получим единственное значение для каждой из групп. ПР. для кажд. поставщика вывести сумм. объем поставляемой детали
SELECT pnum, SUM (volume)
FROM PD
GROUP BY pnum
HAVING определяет условие, согласно которому определенные группы, сформированные с помощью предложения GROUP BY, отбираются в результирующую таблицу.
ПР.: вывести номера поставщиков, которые в сумме поставляют > 500 деталей.
SELECT pnum, SUM (volume)
FROM PD
GROUP BY pnum
HAVING SUM (volume) > 500
_____________________________________________________________________________
Сортировка в операторе SELECT. Использование предложения TOP. Пример.
При выполнение запроса СУБД возвр. строки в случайно порядке, предложение ORDER BY позволяет упорядочить выходные данные. ПР.: отсортировать таблицу PD в порядке убывания номеров поставщиков.
SELECT *
FROM PD
ORDER BY pnum DESC, dnum ASC ASC – возрастающий порядок
HAVING SUM (volume) > 500 DESC – убывающий
Ограничивает число строк, возвращаемых в результирующем наборе запроса до заданного числа или процентного значения. Если предложение TOP используется совместно с предложением ORDER BY, то результирующий набор ограничен первыми N строками отсортированного результата. В противном случае возвращаются первые N строк в неопределенном порядке. ПР.: опр-ть номера первых двух деталей в таблице D.
SELECT TOP 2 dnum
FROM D
_____________________________________________________________________________
Декартово произведение с помощью оператора SELECT. Соединение с помощью предложения WHERE. Пример.
Для получения декартова произведения нескольких таблиц надо указать во фразе FROM перечень перемножаемых таблиц, а во фразе SELECT – все их столбцы.
SELECT *
FROM A, B
Чаще перечисление таблиц используется совместно с условием соединения записей из разных таблиц, указываемых в предложении WHERE (напр., соединение только тех строк таблиц, у которых в указанных полях находятся равные значения). ПР.:
a |
b |
1 |
2 |
2 |
1 |
c |
d |
2 |
4 |
3 |
3 |
a |
b |
c |
d |
1 |
2 |
2 |
4 |
1 |
2 |
3 |
3 |
2 |
1 |
2 |
4 |
2 |
1 |
3 |
3 |
SELECT *
FROM A, B
a
b
c
d
2
1
2
4
FROM A, B
WHERE a=c
Типы соединений в предложении FROM. Пример.
INNER JOIN – внутреннее. В результирующий набор попадут только те соединения строк 2х таблиц, для которых значение предиката = true.
LEFT/RIGHT JOIN – левое/правое внешнее. В результирующий набор попадут все строки из левой/правой таблицы, при этом отсутствующие значения полей из правой/левой таблицы буду заполнены NULL- значениями.
FULL – полное внешнее.
A |
b |
c |
d |
2 |
1 |
2 |
4 |
SELECT *
FROM A INNER JOIN B ON A.a=B.c
A
b
c
d
1
2
null
null
2
1
2
4
FROM A LEFT JOIN B ON A.a=B.c
A |
b |
c |
d |
2 |
1 |
2 |
4 |
null |
null |
3 |
3 |
SELECT *
FROM A RIGHT JOIN B ON A.a=B.c
A |
b |
c |
d |
1 |
2 |
null |
null |
2 |
1 |
2 |
4 |
null |
null |
3 |
3 |
SELECT *
FROM A FULL JOIN B ON A.a=B.c
_____________________________________________________________________________
Оператор объединения UNION. Пример.
Объед. запросы дб совместимы между собой, что в терминологии sql означает «они должны иметь одинаковое количество столбцов»
ПР.: вывести инф-ю о деталях. Для деталей, у кот-х не указана цена вывести: «цены нет».
Select dnum, dname, dprice
FROM D
WHERE dprice IS NOT NULL
UNION
SELECT dnum, dname, ‘цены нет’
FROM D
WHERE dprice IS NULL
ORDER BY dnum
_____________________________________________________________________________
Операторы вычитания EXCEPT и пересечения INTERSECT. Пример.
Вычит. запросы дб совместимы между собой, что в терминологии sql означает «они должны иметь одинаковое количество столбцов»
ПР.: вывести номера поставщиков, которые не поставляют детали в настоящее время.
Select pnum
FROM P
EXCEPT
SELECT pnum
SELECT dnum, dname, ‘цены нет’
FROM D
Пересек. запросы дб совместимы между собой, что в терминологии sql означает «они должны иметь одинаковое количество столбцов»
ПР.: вывести номера деталей, которые поставщики с номерами 1 и 2.
Select dnum
FROM PD
WHERE pnum=1
INTERSECT
SELECT dnum
FROM PD
WHERE pnum=2
Подзапросы. Классификация подзапросов. Пример простого скалярного подзапроса. Пример.
Подзапрос представляет собой оператор, вложенный в тело другого оператора.
По количеству возвращающих значений:
Скалярные – возвращают одно значение
Табличные – возвращают таблицу значений
По способу формирования:
Простые – может выполняться независимо от вн. запроса.
Сложные – не может рассм. независимо от вн. запроса
ПР.: определить наименование деталей, цена которых больше цены детали «болт»
SLECT dname
FROM D
WHERE dprice > (select dprice from D where dname=’болт’)
_____________________________________________________________________________
Простые табличные подзапросы. Пример.
Если подзапрос возвращает множество значений, то его результат следует обрабатывать специальным образом, для этого предназначены следующие операции:
IN осуществляет проверку на принадлежащие значения множеству
ПР.: опр-ь наименование поставщиков, которые поставляют детали в настоящее время.
SELECT pname
FROM P
WHERE pnum IN (select pnum FROM PD)
ANY условие сравн. счит. выполн., когда оно выполняется хотя бы для одного знач.
ПР.: опр-ь наименование поставщиков, которые поставляют детали в настоящее время.
SELECT pname
FROM P
WHERE pnum = ANY (select pnum FROM PD)
ALL условие сравнения счит. выполн. если оно выполняется для всех значений, которое получается после выполнения подзапроса.
ПР.: Определить наименование детали с max ценой
SELECT pname
FROM D
WHERE dprice>=ALL (SELECT dprice FROM D)
_____________________________________________________________________________
Сложные табличные подзапросы. Пример.
Результат выполнения таких операций – TRUE и FALSE. Для EXISTS – TRUE, если в возвращаемом подзапросе таблице есть хоть одна строка. Если таблица пуста то – FALSE.
Для NOT EXISTS используются обратные правила обработки.
ПР.: вывести наименование поставщиков, которые поставляют детали в наст. время
SELECT pname
FROM D
WHERE EXISTS (SELECT * FROM PD where PD.pnum=P.pnum)
_____________________________________________________________________________
Оператор INSERT INTO…VALUES. Оператор UPDATE. Пример.
INSERT INTO < имя таблицы>
VALUES <список значений>
Если вставленные в таблицу значение столбцов в строгом соответствии с описанием таблицы, то список столбцов можно не указывать.
ПР.:
INSERT INTO P
VALUES (5, ‘Бугаков’)
INSERT INTO D (dnum, dname)
VALUES (10, ‘8’)
Оператор INSERT INTO…SELECT. Оператор UPDATE. Пример.
INSERT INTO < имя таблицы>
<SELECT-оператор>
Данная форма оператора позволяет скопировать в существующую таблицу строки, которые отбирает оператор SELECT.
UPDATE < имя таблицы>
SET <стобец>
[WHERE <условие выбора строк>]
Данная форма оператора позволяет скопировать в существующую таблицу строки, которые отбирает оператор SELECT.
ПР.: увеличить цену детали «болт» на 10%
UPDATE D
SET dprice=dprice*1,1
WHERE dname= ‘болт’
_____________________________________________________________________________
Оператор UPDATE. Оператор DELETE. Пример.
UPDATE < имя таблицы>
SET <стобец>
[WHERE <условие выбора строк>]
Данная форма оператора позволяет скопировать в существующую таблицу строки, которые отбирает оператор SELECT.
ПР.: увеличить цену детали «болт» на 10%
UPDATE D
SET dprice=dprice*1,1
WHERE dname= ‘болт’
DELETE [<таблица>]
FROM <список таблиц>
[WHERE <условие выбора строк>]
ПР.: удалить всю информацию из таблицы PD
DELETE
FROM PD
___________________________________________________________________________