- •Лекции 6-7. Элементы языка sql
- •Update - обновление строк в таблице
- •Delete - удаление строк в таблице
- •Пример 16. Для каждой детали получить суммарное поставляемое количество (ключевое слово group by…):
- •Стадия 1. Выполнение одиночного оператора select
- •Стадия 2. Выполнение операций union, except, intersect
- •Стадия 3. Упорядочение результата
- •Как на самом деле выполняется оператор select
- •Оператор пересечения
- •Оператор деления
- •Оператор соединения
Update - обновление строк в таблице
Пример 3. Обновление нескольких строк в таблице:
Исх. Таблица P
PNUM |
PNAME |
1 |
Петров |
2 |
Сидоров |
3 |
Ванин |
4 |
Иванов |
UPDATE P
SET PNAME = "Пушников"
WHERE P.PNUM = 1;
Рез. Таблица P
PNUM |
PNAME |
1 |
Пушников |
2 |
Сидоров |
3 |
Ванин |
4 |
Иванов |
Delete - удаление строк в таблице
Пример 4. Удаление нескольких строк в таблице:
Исх. Таблица P
PNUM |
PNAME |
1 |
Петров |
2 |
Сидоров |
3 |
Ванин |
4 |
Иванов |
DELETE FROM P
WHERE P.PNUM = 1;
Рез. Таблица P
PNUM |
PNAME |
2 |
Сидоров |
3 |
Ванин |
4 |
Иванов |
Пример 5. Удаление всех строк в таблице:
Исх. Таблица P
PNUM |
PNAME |
1 |
Петров |
2 |
Сидоров |
3 |
Ванин |
4 |
Иванов |
DELETE FROM P;
Рез. Таблица P
PNUM |
PNAME |
6-7.3.3. ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ ОПЕРАТОРА SELECT
6-7.3.3.1 ОТБОР ДАННЫХ ИЗ ОДНОЙ ТАБЛИЦЫ
Пример 6. Выбрать все строки из таблицы поставщиков, удовлетворяющих некоторому условию (ключевое слово WHERE…):
Исх. Таблица P
PNUM |
PNAME |
1 |
Петров |
2 |
Сидоров |
3 |
Ванин |
4 |
Иванов |
SELECT *
FROM P
WHERE P.PNUM > 2;
Рез. Таблица
PNUM |
PNAME |
3 |
Ванин |
4 |
Иванов |
Замечание. В качестве условия в разделе WHERE можно использовать сложные логические выражения, использующие поля таблиц, константы, сравнения (>, <, = и т.д.), скобки, союзы AND и OR, отрицание NOT.
Пример 7. Выбрать некоторые колонки из исходной таблицы, удалив из результата повторяющиеся строки (ключевое слово DISTINCT):
Исх. Таблица P
PNUM |
PNAME |
1 |
Петров |
2 |
Сидоров |
3 |
Ванин |
4 |
Иванов |
5 |
Сидоров |
SELECT DISTINCT P.NAME
FROM P;
Рез. Таблица
PNAME |
Петров |
Сидоров |
Ванин |
Иванов |
Замечание. Использование ключевого слова DISTINCT приводит к тому, что в результирующей таблице будут удалены все повторяющиеся строки.
Пример 8. Использование скалярных выражений и переименований колонок в запросах (ключевое слово AS…):
Исх. Таблица TOVAR
TNAME |
KOL |
PRICE |
Болт |
10 |
100 |
Гайка |
20 |
200 |
Винт |
30 |
300 |
SELECT
TOVAR.TNAME,
TOVAR.KOL,
TOVAR.PRICE,
"=" AS EQU,
TOVAR.KOL*TOVAR.PRICE AS SUMMA
FROM TOVAR;
В результате получим таблицу с колонками, которых не было в исходной таблице TOVAR:
Рез. Таблица TOVAR
TNAME |
KOL |
PRICE |
EQU |
SUMMA |
Болт |
10 |
100 |
= |
1000 |
Гайка |
20 |
200 |
= |
4000 |
Винт |
30 |
300 |
= |
9000 |
Пример 9. Упорядочение результатов запроса (ключевое слово ORDER BY…) по нескольким полям с возрастанием или убыванием (ключевые слова ASC, DESC):
Исх. Таблица PD
PNUM |
DNUM |
VOLUME |
1 |
1 |
100 |
1 |
2 |
200 |
1 |
3 |
300 |
2 |
1 |
150 |
2 |
2 |
250 |
3 |
1 |
1000 |
SELECT
PD.PNUM,
PD.DNUM,
PD.VOLUME
FROM PD
ORDER BY
DNUM ASC,
VOLUME DESC;
В результате получим таблицу, в которой строки идут в порядке возрастания значения поля DNUM, а строки, с одинаковым значением DNUM идут в порядке убывания значения поля VOLUME:
Рез. Таблица
PNUM |
DNUM |
VOLUME |
3 |
1 |
1000 |
2 |
1 |
150 |
1 |
1 |
100 |
2 |
2 |
250 |
1 |
2 |
200 |
1 |
3 |
300 |
6-7.3.3.2 ОТБОР ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ
Пример 10. Естественное соединение таблиц:
а) - явное указание условий соединения,
б) - ключевые слова JOIN… USING… позволяют явно указать, по каким из общих колонок таблиц будет производиться соединение
в) - ключевое слово NATURAL JOIN - автоматически соединяет по всем одинаковым полям в таблицах
Таблица PD Таблица P
PNUM |
DNUM |
VOLUME |
1 |
1 |
100 |
1 |
2 |
200 |
1 |
3 |
300 |
2 |
1 |
150 |
2 |
2 |
250 |
3 |
1 |
1000 |
PNUM |
PNAME |
1 |
Иванов |
2 |
Петров |
3 |
Сидоров |
SELECT
P.PNUM,
P.PNAME,
PD.DNUM,
PD.VOLUME
а)FROM P, PD
WHERE P.PNUM = PD.PNUM;
б)FROM P JOIN PD USING PNUM;
в)FROM P NATURAL JOIN PD;
В результате получим новую таблицу, в которой строки с данными о поставщиках соединены со строками с данными о поставках деталей:
Рез. Таблица
PNUM |
PNAME |
DNUM |
VOLUME |
1 |
Иванов |
1 |
100 |
1 |
Иванов |
2 |
200 |
1 |
Иванов |
3 |
300 |
2 |
Петров |
1 |
150 |
2 |
Петров |
2 |
250 |
3 |
Сидоров |
1 |
1000 |
Замечания. а) Соединяемые таблицы перечислены в разделе FROM оператора, условие соединения приведено в разделе WHERE. Раздел WHERE, помимо условия соединения таблиц, может также содержать и условия отбора строк.
б) Ключевое слово USING позволяет явно указать, по каким из общих колонок таблиц будет производиться соединение.
в) В разделе FROM не указано, по каким полям производится соединение. NATURAL JOIN автоматически соединяет по всем одинаковым полям в таблицах.
Пример 11. Прямое произведение таблиц:
Исх. Таблица P Таблица D
PNUM |
PNAME |
|
DNUM |
DNAME |
1 |
Иванов |
1 |
Болт |
|
2 |
Петров |
2 |
Гайка |
|
3 |
Сидоров |
3 |
Винт |
SELECT
P.PNUM,
P.PNAME,
D.DNUM,
D.DNAME
FROM P, D;
В результате получим следующую таблицу:
Рез. Таблица
PNUM |
PNAME |
DNUM |
DNAME |
1 |
Иванов |
1 |
Болт |
1 |
Иванов |
2 |
Гайка |
1 |
Иванов |
3 |
Винт |
2 |
Петров |
1 |
Болт |
2 |
Петров |
2 |
Гайка |
2 |
Петров |
3 |
Винт |
3 |
Сидоров |
1 |
Болт |
3 |
Сидоров |
2 |
Гайка |
3 |
Сидоров |
3 |
Винт |
Замечание. Т.к. не указано условие соединения таблиц, то каждая строка первой таблицы соединится с каждой строкой второй таблицы.
Пример 12. Соединение таблиц по произвольному условию. Рассмотрим таблицы поставщиков и деталей, которыми присвоен некоторый статус:
Исх. Таблица P Таблица D
PNUM |
PNAME |
PSTATUS |
|
DNUM |
DNAME |
DSTATUS |
1 |
Иванов |
4 |
|
1 |
Болт |
3 |
2 |
Петров |
1 |
|
2 |
Гайка |
2 |
3 |
Сидоров |
2 |
|
3 |
Винт |
1 |
Ответ на вопрос "какие поставщики имеют право поставлять какие детали?" дает следующий запрос:
SELECT
P.PNUM,
P.PNAME,
P.PSTATUS,
D.DNUM,
D.DNAME,
D.DSTATUS
FROM P, D
WHERE P.PSTATUS >= D.DSTATUS;
В результате получим следующую таблицу:
Рез. Таблица
PNUM |
PNAME |
PSTATUS |
DNUM |
DNAME |
DSTATUS |
1 |
Иванов |
4 |
1 |
Болт |
3 |
1 |
Иванов |
4 |
2 |
Гайка |
2 |
1 |
Иванов |
4 |
3 |
Винт |
1 |
2 |
Петров |
1 |
3 |
Винт |
1 |
3 |
Сидоров |
2 |
2 |
Гайка |
2 |
3 |
Сидоров |
2 |
3 |
Винт |
1 |
6-7.3.3.3 ИСПОЛЬЗОВАНИЕ ИМЕН КОРРЕЛЯЦИИ (АЛИАСОВ, ПСЕВДОНИМОВ)
Пример 13. Отобрать все пары поставщиков таким образом, чтобы первый поставщик в паре имел статус, больший статуса второго поставщика:
Исх. Таблица P
PNUM |
PNAME |
PSTATUS |
1 |
Иванов |
4 |
2 |
Петров |
1 |
3 |
Сидоров |
2 |
SELECT
P1.PNAME AS PNAME1,
P1.PSTATUS AS PSTATUS1,
P2.PNAME AS PNAME2,
P2.PSTATUS AS PSTATUS2
FROM
P P1, P P2
WHERE P1.PSTATUS1 > P2.PSTATUS2;
В результате получим следующую таблицу:
Рез. Таблица
PNAME1 |
PSTATUS1 |
PNAME2 |
PSTATUS2 |
Иванов |
4 |
Петров |
1 |
Иванов |
4 |
Сидоров |
2 |
Сидоров |
2 |
Петров |
1 |
6-7.3.3.4 ИСПОЛЬЗОВАНИЕ АГРЕГАТНЫХ ФУНКЦИЙ В ЗАПРОСАХ
Пример 14. Получить общее количество поставщиков (ключевое слово COUNT):
Исх. Таблица P
PNUM |
PNAME |
PSTATUS |
1 |
Иванов |
4 |
2 |
Петров |
1 |
3 |
Сидоров |
2 |
SELECT COUNT(*) AS N
FROM P;
В результате получим таблицу с одним столбцом и одной строкой, содержащей количество строк из таблицы P:
Рез. Таблица
N |
3 |
Пример 15. Получить общее, максимальное, минимальное и среднее количества поставляемых деталей (ключевые слова SUM, MAX, MIN, AVG):
Исх. Таблица PD
PNUM |
DNUM |
VOLUME |
1 |
1 |
100 |
1 |
2 |
200 |
1 |
3 |
300 |
2 |
1 |
150 |
2 |
2 |
250 |
3 |
1 |
1000 |
SELECT
SUM(PD.VOLUME) AS SM,
MAX(PD.VOLUME) AS MX,
MIN(PD.VOLUME) AS MN,
AVG(PD.VOLUME) AS AV
FROM PD;
В результате получим следующую таблицу с одной строкой:
Рез. Таблица
SM |
MX |
MN |
AV |
2000 |
1000 |
100 |
333.33333333 |
6-7.3.3.5 ИСПОЛЬЗОВАНИЕ АГРЕГАТНЫХ ФУНКЦИЙ С ГРУППИРОВКАМИ
