Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Bazy_dannykh_Uchebnik_novy

.pdf
Скачиваний:
132
Добавлен:
02.05.2015
Размер:
4.02 Mб
Скачать

Операторы определения данных (язык 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]