Bazy_dannykh_Uchebnik_novy
.pdfОператоры определения данных (язык DDL).
Соответствующие операторы предназначены для создания, удаления, изменения ос-
новых объектов модели данных реляционных СУБД: таблиц, представлений, индексов.
CREATE TABLE
<имя> - создание новой таблицы в базе данных.
DROP TABLE
<имя> - удаление таблицы из базы данных.
ALTER TABLE
<имя> - изменение структуры существующей таблицы или ограничений целостности, задаваемых для данной таблицы.
При выполнении аналогичных операций с представлениями или индексами в указанных операторах вместо служебного слова TABLE записывается слово VIEW (представление)
или слово INDEX (индекс).
Операторы манипулирования данными (язык DML).
Операторы DML работают с базой данных и используются для изменения данных и получения необходимых сведений.
SELECT
– выборка строк, удовлетворяющих заданным условиям. Оператор реализует, в
частности, такие операции реляционной алгебры как «селекция» и «проекция».
UPDATE
– изменение значений определенных полей в строках таблицы, удовлетворяющих заданным условиям.
INSERT
– вставка новых строк в таблицу.
DELETE
– удаление строк таблицы, удовлетворяющих заданным условиям. Примернение этого оператора учитывает принципы поддержки целостности, поэтому он не всегда может быть выполнен корректно.
Все разделы являются составными частями SQL в ANSI.
Операторы управления транзакциями
SET TRANSACTION
– установить точку начала транзакцию.
COMMIT
– завершать транзакцию и сделать любые выполненные в ней изменения постоянными. Сбросить все блокировки.
71
ROLLBACK (ОТКАТИТЬ)
– завершить транзакцию и отменить все выполненные в ней и незафиксированные
изменения. Сбросить блокировки.
Исходные данные для примеров
Отношение ПРОДАВЦЫ.
ПРОДАВЦЫ
Код |
|
|
ФИО |
|
|
Город |
|
Комиссия |
|||
1001 |
|
Иванов |
|
|
Москва |
0.12 |
|||||
1002 |
|
Петров |
|
|
Екатеринбург |
0.13 |
|||||
1004 |
|
Сидоров |
|
|
Москва |
0.11 |
|||||
1007 |
|
Плеханов |
|
|
Н.Тагил |
0.15 |
|||||
1003 |
|
Аксельрод |
|
|
Первоуральск |
0.10 |
|||||
|
|
|
|
Отношение ПОКУПАТЕЛИ |
|
|
|||||
|
|
|
|
|
ПОКУПАТЕЛИ |
|
|
||||
Код |
|
ФИО |
|
Город |
|
Рейтинг |
|
Продавец |
|||
2001 |
Чернышевский |
|
Москва |
|
100 |
|
1001 |
||||
2002 |
Добролюбов |
|
В.Пышма |
|
200 |
|
1003 |
||||
2003 |
Белинский |
|
Екатеринбург |
|
200 |
|
1002 |
||||
2004 |
Михайловский |
|
Среднеуральск |
|
300 |
|
1002 |
||||
2006 |
Кривенко |
|
Москва |
|
100 |
|
1001 |
||||
2008 |
Данилевский |
|
Екатеринбург |
|
300 |
|
1007 |
||||
2007 |
Ткачев |
|
В.Пышма |
|
100 |
|
1004 |
||||
|
|
|
|
Отношение ЗАКАЗЫ |
|
|
|||||
|
|
|
|
|
ЗАКАЗЫ |
|
|
|
|
||
Код |
|
Стоимость |
|
Дата |
|
Покупатель |
|
Продавец |
|||
3001 |
18.69 |
|
10.03.1990 |
|
|
2008 |
|
1007 |
|||
3003 |
767.19 |
|
10.03.1990 |
|
|
2001 |
|
1001 |
|||
3002 |
1900.10 |
|
10.03.1990 |
|
|
2007 |
|
1004 |
|||
3005 |
5160.45 |
|
10.03.1990 |
|
|
2003 |
|
1002 |
|||
3006 |
1098.16 |
|
10.03.1990 |
|
|
2008 |
|
1007 |
|||
3009 |
1713.23 |
|
10.04.1990 |
|
|
2002 |
|
1003 |
|||
3007 |
75.75 |
|
10.04.1990 |
|
|
2004 |
|
1002 |
|||
3008 |
4723.00 |
|
10.05.1990 |
|
|
2006 |
|
1001 |
|||
3010 |
1309.95 |
|
10.06.1990 |
|
|
2004 |
|
1002 |
|||
3011 |
9891.88 |
|
10.06.1990 |
|
|
2006 |
|
1001 |
Команда SELECT (ВЫБРАТЬ)
Команда SELECT начинается с ключевого слова SELECT, сопровождаемого пробелом. После этого должен следовать список имен столбцов, которые вы хотите видеть, отделяемые запятыми. Если вы хотите видеть все столбцы таблицы, вы можете заменить этот список звездочкой (*). Ключевое слово
FROM следующее далее, сопровождается пробелом и именем таблицы, запрос к которой делается. В конце команды должна стоять точка с запятой (;), чтобы закончить запрос и указать, что команда готова к выполнению. Содержимое
72
столбцов выводится в том, порядке, в котором перечислены столбцы в
запросе.
Пример 26:
просмотр определенного столбца таблицы. Формулировка на языке реляционной
алгебры – с помощью операции «Проекция» ПРОДАВЦЫ[ФИО, Комиссия]
SELECT ФИО, Комиссия
FROM ПРОДАВЦЫ;
ФИО Комиссия
-----------------------------------------------------------------------
Иванов |
0.12 |
Петров |
0.13 |
Сидоров |
0.11 |
Плеханов |
0.15 |
Аксельрод |
0.10 |
Ключевое слово DISTINCT
DISTINCT (ОТЛИЧИЕ) - аргумент, который устраняет дублированные
значения из вашего предложения SELECT. |
|
Действие показано ниже. |
|
SELECT Код |
SELECT DISTINCT Код |
FROM ПРОДАВЦЫ; |
FROM ПРОДАВЦЫ; |
Код |
Код |
------- |
------- |
1007 |
1001 |
1001 |
1002 |
1004 |
1003 |
1002 |
1004 |
1007 |
1007 |
1003
1002
1001
1002
1001
Противоположным действием к слову DISTINCT обладает слово ALL – оно
действует по умолчанию или отменяет Distinct. Аналогов в реляционной алгебре нет.
Ключевое слово WHERE (УСЛОВИЕ)
WHERE — предложение команды SELECT, которое позволяет вам задавать условие истинности которое может быть или верным или неверным для любой строки таблицы. Соответствует оператору «выборка» реляционной алгебры.
73
Пример 27:
Выбрать покупателей, у которых Рейтинг = 100, (на языке реляционной алгебры)
Продавцы WHERE Рейтинг = 100
SELECT *
FROM ПРОДАВЦЫ
WHERE Рейтинг = 100;
---------------------------------------------------------------------------------------------------------
Код ФИО Город Рейтинг Продавец
---------------------------------------------------------------------------------------------------------
2001 |
Чернышевский |
Москва |
100 |
1001 |
2006 |
Кривенко |
Москва |
100 |
1001 |
2007 |
Ткачев |
В.Пышма |
100 |
1004 |
Реляционные операторы в условиях WHERE
Реляционные операторы, которыми располагает SQL:
=Равно
> Больше чем
<Меньше чем
>= Больше чем или равно <= Меньше чем или равно <> Не равно
В предидущем примере можно заменить rating = 100 на rating >= 200
Булевы операторы в условии WHERE
AND берет два Буля (в форме A AND B) как аргументы и оценивает их по отношению к истине, верны ли они оба.
OR берет два Буля (в форме A OR B) как аргументы и оценивает на правильность, верен ли один из них.
NOT берет одиночный Булев (в форме NOT A) как аргументы и заменяет его значение с неверного на верное или верное на неверное.
Пример 28:
Предположим, вы хотите видеть всех покупателей в Екатеринбурге, которые
имеют оценку (рейтинг) выше 200.
SELECT *
FROM ПОКУПАТЕЛИ WHERE Город = 'Екатеринбург' AND Рейтинг > 200;
---------------------------------------------------------------------------------------------------------
Код ФИО Город Рейтинг Продавец
---------------------------------------------------------------------------------------------------------
2003 |
Белинский |
Екатеринбург |
200 |
1002 |
2008 |
Данилевский |
Екатеринбург |
300 |
1007 |
Пример 29:
74
запрос для выборки всех покупателей из Москвы или Екатеринбурга
SELECT *
FROM ПОКУПАТЕЛИ
WHERE Город = 'Москва'
OR city = 'Екатеринбург';
Пример 30:
SELECT *
FROM ПОКУПАТЕЛИ
WHERE Город = 'Екатеринбург' OR NOT Рейтинг > 200;
----------------------------------------------------------------------------------------------------------
Код ФИО Город Рейтинг Продавец
----------------------------------------------------------------------------------------------------------
2001 |
Чернышевский |
Москва |
100 |
1001 |
2002 |
Добролюбов |
В.Пышма |
200 |
1003 |
2003 |
Белинский |
Екатеринбург |
200 |
1002 |
2004 |
Михайловский |
Среднеуральск |
300 |
1002 |
2006 |
Кривенко |
Москва |
100 |
1001 |
2007 |
Ткачев |
В.Пышма |
100 |
1004 |
Правила применения инвертирования
SELECT *
FROM ПОКУПАТЕЛИ
WHERE NOT Город = 'Екатеринбург' OR Рейтинг > 200;
Выдаст тот же результат, что и раньше, т.к. инвертирование будет применено только к
первому оператору. Чтобы инвертировать все условие надо записать
SELECT *
FROM ПОКУПАТЕЛИ
WHERE NOT (Город = 'Екатеринбург' OR Рейтинг > 200);
Специальные операторы в условиях Оператор IN (В списке)
Оператор IN определяет набор значений, в который данное значение может или не может быть включено.
SELECT *
FROM ПОКУПАТЕЛИ
WHERE Город In ('Москва', 'Екатеринбург');
SELECT *
FROM ПОКУПАТЕЛИ
WHERE Покупатель IN (1001, 1007, 1004);
75
-----------------------------------------------------------------------------------------------------------
Код ФИО Город Рейтинг Продавец
-----------------------------------------------------------------------------------------------------------
2001 |
Чернышевский |
Москва |
100 |
1001 |
2008 |
Данилевский |
Екатеринбург |
300 |
1007 |
2007 |
Ткачев |
В.Пышма |
100 |
1004 |
Оператор BETWEEN (МЕЖДУ)
Оператор BETWEEN похож на оператор IN. В отличие от определения по номерам из набора, как это делает IN, BETWEEN определяет диапазон,
значения которого должны уменьшаться, что делает предикат верным. Вы должны ввести ключевое слово BETWEEN с начальным значением, ключевое
AND и конечное значение. В отличие от IN, BETWEEN чувствителен к порядку, и первое значение в предложении должно быть первым в алфавитном или числовом порядке.
SELECT *
FROM ПРОДАВЦЫ
WHERE Комиссия BETWEEN .10 AND .12;
----------------------------------------------------------------------------------------------------------
Код ФИО Город Комиссия
----------------------------------------------------------------------------------------------------------
1001 |
Иванов |
Москва |
0.12 |
1004 |
Сидоров |
Москва |
0.11 |
1003 |
Аксельрод |
Первоуральск |
0.10 |
Оператор LIKE (ПОХОЖИЙ)
LIKE применим только к полям типа CHAR или VARCHAR, с которыми он используется, чтобы находить подстроки. То есть, он ищет поле символа,
чтобы видеть, совпадает ли с условием часть его строки. В качестве условия он использует групповые символы (wildcards) - специальные символы которые могут соответствовать чему-нибудь.
Имеются два типа групповых символов используемых с LIKE:
символ подчеркивания _ замещает любой одиночный символ. Например, 'b_t'
будет соответствовать словам 'bat' или 'bit', но не будет соответствовать 'brat'.
знак процента (%) замещает последовательность любого числа символов
(включая символы нуля). Например '%p%t' будет соответствовать словам 'put', 'posit', или 'opt', но не 'spite'.
Пример 31:
Давайте найдем всех покупателей, чьи имена начинаются с буквы «Д».
76
SELECT
FROM ПОКУПАТЕЛИ
WHERE ФИО LIKE 'Д%';
----------------------------------------------------------------------------------------------------------
Код ФИО Город Рейтинг Продавец
----------------------------------------------------------------------------------------------------------
2002 Добролюбов В.Пышма 200 1003
Пример 32:
Предположим, что вы хотите узнать фамилии ваших покупателей, которые заканчиваются на «…ский». Для поиска выполняем нижеследующий запрос.
SELECT *
FROM ПОКУПАТЕЛИ
WHERE ФИО LIKE '%ский';
----------------------------------------------------------------------------------------------------------
Код |
ФИО |
Город |
Рейтинг |
Продавец |
---------------------------------------------------------------------------------------------------------- |
||||
2001 |
Чернышевский |
Москва |
100 |
1001 |
2003 |
Белинский |
Екатеринбург |
200 |
1002 |
2004 |
Михайловский |
Среднеуральск |
300 |
1002 |
2008 |
Данилевский |
Екатеринбург |
300 |
1007 |
Такой оператор выбирает любую последовательность символов, которая заканчивается на «..ский». А что делать, если нужно искать знак процента или знак подчеркивания в строке? В предикате LIKE вы можете определить любой одиночный символ как символ ESC. Символ ESC используется сразу перед процентом или подчеркиванием в предикате, и означает, что процент или подчеркивание будет интерпретироваться как символ, а не как групповой символ. Предложение ESCAPE
определяет '/' как символ ESC. Символ ESC используемый в LIKE строке, сопровождается знаком процента, знаком подчеркивания, или знаком ESCAPE, который будет искаться в столбце, а не обрабатываться как групповой символ. Символ ESC должен быть одиночным символом и применяться только к одиночному символу сразу после него.
Например, мы могли бы найти наш ФИО столбец, где присутствует подчеркивание,
следующим образом:
SELECT *
FROM ПОКУПАТЕЛИ
WHERE ФИО LIKE '%/_%'ESCAPE'/';
----------------------------------------------------------------------------------------------------------
ФИО
----------------------------------------------------------------------------------------------------------
Вместо строк вывода получаем пустой список, т.к фамилии, которые требуется подобрать
по условию, отсутствуют.
77
Неопределенное значение NULL (ПУСТО)
Так как NULL указывает на отсутствие значения, вы не можете знать, каков будет результат любого сравнения с использованием NULL. Когда NULL сравнивается с любым значением, даже с другим таким же NULL, результат будет ни верным, ни неверным, он
— неизвестен. Следовательно, выражение типа 'Город = NULL' или 'Город IN (NULL)'
будет неизвестно, независимо от значения Город.
Оператор IS (ЕСТЬ)
Найдем все записи в нашей таблице Заказчиков с NULL значениями в столбце «Город»:
SELECT *
FROM ПОКУПАТЕЛИ
WHERE Город IS NULL;
Если нужна выборка, у которой поле «Город», наоборот, непустое, то используются
условия вида
NOT Город IS NULL
Город IS NOT NULL
Агрегатные функции Агрегатные функции производят одиночное значение для всей группы таблицы.
Имеется список этих функций:
COUNT производит номера строк или не NULL значения полей, которые выбрал запрос.
SUM производит арифметическую сумму всех выбранных значений данного поля.
AVG производит усреднение всех выбранных значений данного поля.
MAX производит наибольшее из всех выбранных значений данного поля.
MIN производит наименьшее из всех выбранных значений данного поля.
COUNT, MAX, и MIN, могут использоваться и числовые или символьные поля.
Пример 33:
Чтобы найти сумму всех покупок в таблице «Заказы» надо выполнить следующий
запрос
SELECT SUM (Стоимость) FROM ЗАКАЗЫ;
----------------------------------------------------------------------------------------------------------
SUM (Стоимость)
----------------------------------------------------------------------------------------------------------
26658.4
78
Обратите внимание, что при выполнении запроса, его колонки, в которой содержатся данные, называется или по названию поля, или по названию псевдонима. Псевдонимы
(алиасы) будут рассмотрены ниже.
Агрегатная функция COUNT
Функция COUNT несколько отличается от всех. Она считает число значений
в данном столбце, или число строк в таблице.
Когда она считает значения столбца, она используется с DISTINCT, чтобы производить счет чисел различных значений в данном поле.
Пример 34:
Подсчитать количество продавцов в настоящее время описанных в таблице Заказы.
SELECT COUNT (DISTINCT Продавцы) FROM ЗАКАЗЫ;
----------------------------------------------------------------------------------------------------------
COUNT (DISTINCT Продавцы)
----------------------------------------------------------------------------------------------------------
5
Обратите внимание в вышеупомянутом примере, что DISTINCT, сопровождаемый именем поля с которым он применяется, помещен в круглые скобки, но не сразу после SELECT,
как раньше.
Пример 35:
Чтобы подсчитать общее число строк в таблице, используйте функцию COUNT со звездочкой вместо имени поля
SELECT COUNT (*)
FROM ПОКУПАТЕЛИ;
----------------------------------------------------------------------------------------------------------
COUNT (*)
----------------------------------------------------------------------------------------------------------
7
Предложение GROUP BY (ГРУППИРОВАТЬ)
Предложение GROUP BY позволяет вам определять подмножество значений в особом поле в терминах другого поля, и применять функцию агрегата к подмножеству.
Это дает вам возможность объединять поля и агрегатные функции в едином предложении
SELECT. GROUP BY применяет агрегатные функции независимо от серий групп, которые определяются с помощью значения поля в целом. В этом случае, каждая группа состоит из
79
всех строк с тем же самым значением поля «ФИО», и функция MAX применяется отдельно для каждой такой группы. Это значение поля, к которому применяется GROUP BY, имеет, по определению, только одно значение на группу вывода, также как это делает агрегатная функция. Результатом является совместимость, которая позволяет агрегатам и полям объединяться таким образом. Вы можете также использовать GROUP BY с
многочисленными полями.
Пример 36:
Например, вы хотите найти наибольшую сумму приобретений, полученную
каждым покупателем.
SELECT Покупатель, MAX (Стоимость) FROM ЗАКАЗЫ
GROUP BY Покупатель;
----------------------------------------------------------------------------------------------------------
Продавец MAX(Стоимость)
----------------------------------------------------------------------------------------------------------
2001 |
767.19 |
2002 |
1713.23 |
2004 |
1309.95 |
2008 |
1098.16 |
Пример 37:
Для того, чтобы увидеть наибольшую сумму приобретений, получаемую каждым
покупателем каждый день выполняем запрос
SELECT Покупатель, Дата, MAX (Стоимость)
FROM ЗАКАЗЫ
GROUP BY Покупатель, Дата;
----------------------------------------------------------------------------------------------------------
Продавец |
Дата |
MAX (Стоимость) |
---------------------------------------------------------------------------------------------------------- |
||
2001 |
10/03/1990 |
767.19 |
2006 |
10/05/1990 |
4723.00 |
2006 |
10/06/1990 |
9891.88 |
2003 |
10/03/1990 |
5160.45 |
2004 |
10/04/1990 |
75.75 |
2004 |
10/06/1990 |
1309.95 |
2002 |
10/04/1990 |
1713.23 |
2007 |
10/03/1990 |
1900.10 |
2008 |
10/03/1990 |
1098.16 |
Предложение HAVING (ИМЕЮЩИЙ) |
|
|
Предложение |
HAVING выполняет |
функцию условия WHERE для |
предложения GROUP BY. Предложение HAVING определяет критерии,
80