73
1 Управление данными. Часть 4. Язык SQL (©) Владислав Лавров, vlavrov.professorjournal.ru

Управление данными (sql)

Embed Size (px)

Citation preview

Page 1: Управление данными (sql)

1

Управление данными.

Часть 4.

Язык SQL

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 2: Управление данными (sql)

2

4.1. История развития SQL

SQL (Structured Query Language) - это сокращенное название структурированного языка запросов, предоставляющего средства создания и обработки данных в реляционных БД

1970 – доктор Эдгар Кодд создаёт модель реляционной базы данных (опубликована

статья «Реляционная модель для больших банков совместно используемых

данных» («A Relational Model of Data for Large Shared Data Banks»))

1974 – начинается разработка проекта System/R компании IBM

1974 – первая статья с описанием языка SEQUEL (Structured English Query Language)

1978 – опытная эксплуатация проекта System/R

1979 – появляется первая коммерческая реляционная СУБД компании Oracle

1981 – компания Relation Technology выпускает СУБД Ingres

1981 – компания IBM создает СУБД SQL/DS

1982 – ANSI формирует комитет по стандартизации языка SQL

1983 – компания IBM объявляет о создании СУБД DB2

1986 – ANSI принимает стандарт SQL-1

Этапы развития языка SQL

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 3: Управление данными (sql)

3

1986 – компания Sybase создает реляционную СУБД для обработки транзакций

1987 – ISO одобряет стандарт SQL-1

1988 – компании Ashton-Tate и Microsoft объявляют о выпуске СУБД SQL Server

для операционной системы OS/2

1989 – опубликован первый тест производительности TPC (TPC-A)

1990 – опубликован тест производительности TPC-B

1991 – консорциум SQL Access Group публикует спецификацию доступа к базам данных

1991 – компания Microsoft публикует спецификация протокола ODBC (Open DataBase

Connectivity)

1992 – ANSI принимает стандарт SQL-2

1992 – опубликован тест производительности TPC-C (для OLTP-систем, Online Transaction

Processing).

1993 – первые поставки систем обслуживания хранилищ данных

1993 – первые поставки программных продуктов, поддерживающих протокол ODBC

1994 – опубликован тест производительности TPC-D (для систем поддержки принятия

решений)

1994 – коммерческие поставки серверов баз данных, поддерживающих параллельную

обработку

Этапы развития языка SQL (продолжение)

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 4: Управление данными (sql)

4

1996 – опубликован стандарт API-функций для доступа к базам данных OLAP и тест

производительности OLAP-систем (OnLine Analytical Processing)

1997 – компания IBM выпускает СУБД DB2 Universal Database, унифицировав ее

архитектуру для работы на платформах других поставщиков

1998 – компания Microsoft выпустила СУБД SQL Server 7, обеспечив поддержку

корпоративных баз данных для платформы Windows NT

1998 – выпущена СУБД Oracle 8i, ознаменовавшая отход от архитектуры клиент/сервер и

обеспечивающая интеграцию баз данных с Internet

1999 – ANSI/ISO опубликовали стандарт SQL-3

Этапы развития языка SQL (продолжение)

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 5: Управление данными (sql)

5

4.2. Функциональные категории команд SQL

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

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

Формы языка SQL

Функциональные категории команд языка SQL

DDL (Data Definition Language, Язык Определения Данных) – состоит из команд которые создают объекты (таблицы, индексы, представления

и так далее ) в базе данныхDML (Data Manipulation Language, Язык Манипулирования Данными) – это набор команд, которые определяют какие значения представлены в таблицах в любой момент времени, а также позволяют помещать, изменять и удалять данные из таблиц БД;DCL (Data Control Language, Язык Управления Данными) – состоит из средств, которые управляют выполнением транзакций, а также определяют разрешить ли пользователю выполнять определенные действия или нет.

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 6: Управление данными (sql)

6

Операторы определения данных DDL

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 7: Управление данными (sql)

7

Операторы манипулирования данными DML

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 8: Управление данными (sql)

8

Операторы управления данными DCL

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 9: Управление данными (sql)

9

Операторы управления данными DCL (продолжение)

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 10: Управление данными (sql)

10

4.3. Основные возможности SQL

• предложения определения данных;

• запросы на выбор данных;

• предложения модификации данных;

• предложения управления данными

Кроме того, он предоставляет возможность выполнять в этих предложениях:

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

• упорядочение строк и (или) столбцов при выводе содержимого таблиц на печать или экран дисплея;

• создание представлений (виртуальных таблиц), позволяющих пользователям иметь свой взгляд на данные без увеличения их объема в базе данных;

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

• группирование (агрегатирование) данных и применение к этим группам таких операций, как среднее, сумма, максимум, минимум, число элементов и т.п.

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 11: Управление данными (sql)

11

4.4. Достоинства языка SQL

• стандартность языка SQL

• возможность переноса с одной вычислительной системы на другую

• реляционная основа языка

• возможность создания интерактивных запросов

• возможность программного доступа к БД

• обеспечение различного представления данных

• возможность динамического изменения и расширения структуры БД

• поддержка архитектуры клиент/сервер

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 12: Управление данными (sql)

12

4.5. Управление базами данных с помощью SQL

• всякому столбцу таблицы присвоено имя, которое должно быть уникальным для этой таблицы;

• столбцы таблицы упорядочиваются слева направо, т.е. столбец 1, столбец 2, ..., столбец n.

• строки таблицы не упорядочены (их последовательность определяется лишь последовательностью ввода в таблицу);

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

• всем строкам таблицы соответствует одно и то же множество столбцов, хотя в определённых столбцах любая строка может содержать пустые значения (NULL-значения), т.е. может не иметь значений для этих столбцов;

• все строки таблицы обязательно отличаются друг от друга хотя бы единственным значением, что позволяет однозначно идентифицировать любую строку такой таблицы;

• при выполнении операций с таблицей ее строки и столбцы можно обрабатывать в любом порядке безотносительно к их информационному содержанию.

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 13: Управление данными (sql)

13

4.6. Типы данных в SQL

CHARACTER(n), CHAR(n)

(n – число символов 0 < n < 254)Строки символов постоянной длины

VARCHAR(n) Строки символов переменной длины

INTEGER, INT

SMALLINT

Целые числа

Десятичные числаDECIMAL(p,q), DEC(p,q)

(0 < p < 16, q < p)

Малые целые числа

FLOAT (n) (n – число байтов ) Вещественное число с плавающей запятой

REAL Вещественное число с плавающей запятой

низкой точности

DOUBLE PRECISION Вещественное число с плавающей запятой

высокой точности

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 14: Управление данными (sql)

14

Типы данных в SQL (продолжение)

DATE дата в формате, определяемом

специальной командой

(по умолчанию mm/dd/yy)

TIME время в формате, определяемом

специальной командой

(по умолчанию hh.mm.ss)

DATETIME комбинация даты и времени

MONEY деньги

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 15: Управление данными (sql)

15

4.7. Определение таблиц в SQL

Пользователь (запрос с терминала или прикладной программы)

SQL-запрос

Виртуальная таблица

Рабочая Представление

Базовая таблица

Базовая таблица

Базовая таблица

Сервер базы данных

Реальная таблица

Хранимая таблица

База данных в восприятии пользователя

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 16: Управление данными (sql)

16

4.7.1. Команда создания таблицыCREATE TABLE < table name > (

{ < column name > < data type > [ < size > ] [ < colconstr > ... ] } , ... ) ; [ < tabconstr > ] , ... ) ;< table name > - имя таблицы создаваемой этой командой< column name > - имя столбца таблицы

< data type > - тип данных, который может содержаться в столбце.Может быть любым из следующих:INTEGER (ЦЕЛОЕ ЧИСЛО),CHARACTER (СИМВОЛЬНОЕ),DECIMAL (ДЕСЯТИЧНОЕ),NUMERIC (ЧИСЛОВОЕ),SMALLINT (НАИМЕНЬШЕЕ ЦЕЛОЕ)FLOAT (С ПЛАВАЮЩЕЙ ТОЧКОЙ)REAL (РЕАЛЬНОЕ),DOUBLE PRECISION (УДВОЕННАЯ ТОЧНОСТЬ

С ПЛАВАЮЩЕЙ ТОЧКОЙ), LONG * (ДЛИННОЕ *),VARCHAR * (ПЕРЕМЕННОЕ СИМВОЛЬНОЕ) *, DATE (ДАТА *),TIME (ВРЕМЯ) ( * - указывает на нестандартный для SQL тип данных)

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 17: Управление данными (sql)

17

Команда создания таблицы (продолжение)

< size > - размер поля. Его значение зависит от <data type>

< colconstr > - ограничение столбца. Может быть любым из следующих:

NOT NULL (НЕ НУЛЕВОЙ),

UNIQUE (УНИКАЛЬНЫЙ),

PRIMARY KEY (ПЕРВИЧНЫЙ КЛЮЧ),

CHECK(<predicate>) (ПРОВЕРКА предиката),

DEFAULT = (ПО УМОЛЧАНИЮ =

<value expression> значимому выражению)

REFERENCES <table name> (ССЫЛКА НА имя таблицы

[(<column name>, ... )] [( имя столбца) ] )

< tabconstr > - ограничение таблицы. Может быть любым из следующих:

UNIQUE (УНИКАЛЬНЫЙ),

PRIMARY KEY (ПЕРВИЧНЫЙ КЛЮЧ),

CHECK(<predicate>) (ПРОВЕРКА предиката),

FOREIGN KEY(<column name>) (ВНЕШНИЙ КЛЮЧ)

REFERENCES <table name> (ССЫЛКА НА имя таблицы

[(<column name>, ... )] [( имя столбца) ] )

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 18: Управление данными (sql)

18

Информационные сущности БД «Рембригада»

РАБОТНИКИ

Табельный_номер

ФИО

Специальность

Почасовая_ставка

Бригадир

ОБЪЕКТЫ

Номер_объекта

Адрес_объекта

Тип_объекта

Уровень_сложности

РАБОТА

Табельный_номер

Номер_объекта

Дата_начала

Количество_дней

1 1

¥¥

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 19: Управление данными (sql)

19

Пример определения таблиц для БД «Рембригада»CREATE TABLE РАБОТНИКИ (

ТАБЕЛЬНЫЙ_НОМЕР INTEGER NOT NULL PRIMARY KEY,ФИО CHARACTER (15),СПЕЦИАЛЬНОСТЬ CHARACTER (15),ПОЧАСОВАЯ_СТАВКА DECIMAL (6,1),БРИГАДИР INTEGER )

CREATE TABLE ОБЪЕКТЫ (НОМЕР_ОБЪЕКТА INTEGER NOT NULL PRIMARY KEY,АДРЕС_ОБЪЕКТА CHARACTER (15),ТИП_ОБЪЕКТА CHARACTER (9) DEFAULT ‘офис’

CHECK (TYPE IN (‘офис’, ’склад’, ’магазин’, ’жилой дом’ ) ),УРОВЕНЬ_СЛОЖНОСТИ INTEGER DEFAULT 1

CHECK (УРОВЕНЬ_СЛОЖНОСТИ > 0 AND УРОВЕНЬ_СЛОЖНОСТИ < 5) )

CREATE TABLE РАБОТА (ТАБЕЛЬНЫЙ_НОМЕР INTEGER NOT NULL,НОМЕР_ОБЪЕКТА INTEGER NOT NULL,ДАТА_НАЧАЛА DATE,КОЛИЧЕСТВО_ДНЕЙ INTEGER,

PRIMARY KEY (ТАБЕЛЬНЫЙ_НОМЕР, НОМЕР_ОБЪЕКТА),FOREIGN KEY ТАБЕЛЬНЫЙ_НОМЕР REFERENCES РАБОТНИКИ

ON DELETE CASCADE,FOREIGN KEY НОМЕР_ОБЪЕКТА REFERENCES ОБЪЕКТЫ

ON DELETE CASCADE )(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 20: Управление данными (sql)

20

4.7.2. Изменение таблицы после того как она была создана

ALTER TABLE < table name >

ADD < column name > < data type > < size > ;

•Столбец будет добавлен со значением NULL для всех строк

таблицы.

•Новый столбец станет последним по порядку столбцом таблицы.

•Можно добавить сразу несколько новых столбцов,

отделив их запятыми, в одной команде.

•Имеется возможность удалять или изменять столбцы.

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 21: Управление данными (sql)

21

4.7.3. Удаление таблиц

DROP TABLE < table name >;

•Чтобы иметь возможность удалить таблицу,

пользователь должен иметь права владельца (т.е. быть

создателем) этой таблицы.

•Прежде, чем удалить таблицу из базы данных SQL

потребует очистить ее от данных.

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 22: Управление данными (sql)

22

4.7.4. Ограничение значений данных в таблицах

Виды ограничений

•Ограничение столбца

применяется только к индивидуальным столбцам

•Ограничение таблицы

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

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 23: Управление данными (sql)

23

Объявление ограничений

В таблице РАБОТНИКИ

ТАБЕЛЬНЫЙ_НОМЕР INTEGER NOT NULL PRIMARY KEY

ТИП_ОБЪЕКТА CHARACTER (9) DEFAULT ‘офис’CHECK (TYPE IN (‘офис’, ’склад’, ’магазин’, ’жилой дом’ ) ),

УРОВЕНЬ_СЛОЖНОСТИ INTEGER DEFAULT 1CHECK (УРОВЕНЬ_СЛОЖНОСТИ > 0 AND УРОВЕНЬ_СЛОЖНОСТИ < 5)

В таблице ОБЪЕКТЫ

PRIMARY KEY (ТАБЕЛЬНЫЙ_НОМЕР, НОМЕР_ОБЪЕКТА),

FOREIGN KEY ТАБЕЛЬНЫЙ_НОМЕР REFERENCES РАБОТНИКИ

ON DELETE CASCADE,

FOREIGN KEY НОМЕР_ОБЪЕКТА REFERENCES ОБЪЕКТЫ

ON DELETE CASCADE

В таблице РАБОТА

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 24: Управление данными (sql)

24

Опции команды ON DELETE

• CASCADE (распространить)

• SET NULL (установить пустое значение)

• SET DEFAULT (установить значение по умолчанию)

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 25: Управление данными (sql)

25

4.8. Манипуляция данными

4.8.1. Простые запросы

Простой запрос – запрос, который обращается только к одной таблице БД

SELECT * | { [ DISTINCT | ALL ] < value expression > , ... }

FROM { < table name > [ < alias > ] } , ...

[ WHERE < predicate > ]

[ GROUP BY { < column name > | < integer > } , ... ]

[ HAVING < predicate > ]

[ ORDER BY { < column name > | < integer > } , ... ]

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 26: Управление данными (sql)

26

Простые запросы (продолжение)

< value expression > - выражение которое производит значение.

Оно может включать в себя или содержать <column name>.

< table name > - имя или синоним таблицы или представления.

< alias > - временный синоним для <table name>, определенный

в этой таблице и используемый только в этой команде

< predicate > - условие, которое может быть верным или неверным

для каждой строки или комбинации строк таблицы

в предложении FROM.

< column name > - имя столбца в таблице

< integer > - число с десятичной точкой, которое показывает

<value expression> в предложении SELECT с помощью

идентификации его местоположения в этом предложении.

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 27: Управление данными (sql)

27

Некоторые пояснения по синтаксису запросаSELECT

(выбрать) данные из указанных столбцов и (если необходимо)выполнить перед выводом их преобразование в соответствиис указанными выражениями и (или) функциями

FROM (из) перечисленных таблиц, в которых расположены этистолбцы

WHERE (где) строки из указанных таблиц должны удовлетворять

указанному перечню условий отбора строк GROUP BY

(группируя по) указанному перечню столбцов с тем, чтобыполучить для каждой группы единственное агрегированноезначение, используя во фразе SELECT встроенные SQL-функции SUM (сумма), COUNT (количество), MIN (минимальное значение), MAX (максимальное значение)или AVG (среднее значение)

HAVING(имея) в результате лишь те группы, которые удовлетворяютуказанному перечню условий отбора групп

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 28: Управление данными (sql)

28

Примеры простых запросов

Кто работает штукатурами?

SELECT ФИО

FROM РАБОТНИКИ

WHERE СПЕЦИАЛЬНОСТЬ = ’штукатур’

БД

Результат

Запрос

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 29: Управление данными (sql)

29

Примеры простых запросов

Привести все данные об объектах типа «офис»

SELECT *

FROM ОБЪЕКТЫ

WHERE ТИП_ОБЪЕКТА = ’офис’БД

Результат

Запрос

Звездочка (*) в команде SELECT означает «строка целиком»

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 30: Управление данными (sql)

30

Примеры простых запросов

Какова недельная зарплата каждого электрика (40-часовая рабочая

неделя)?

SELECT ФИО,

‘ Недельная зарплата = ’,

40 * Почасовая_ставка

FROM РАБОТНИКИ

WHERE СПЕЦИАЛЬНОСТЬ = ’электрик ’

ORDER BY ФИО

БД

Результат

Запрос

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 31: Управление данными (sql)

31

Примеры простых запросов

У кого почасовая ставка составляет от 60 до 70 руб.?

SELECT *

FROM РАБОТНИКИ

WHERE Почасовая_ставка > = 60

AND Почасовая_ставка < = 70БД

Результат

Запрос

Для сравнения столбцов с другими столбцами или с константами могут использоваться операторы сравнения (= | <> | < | <= | > | >=)

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 32: Управление данными (sql)

32

Операторы условия в запросахBETWEEN (между)

– используется для сравнения некоторой величины с двумя другими, первая из

которых меньше второй, если сравниваемая величина может быть равна каждой из

данных величин или любому значению между ними.

Существует и противоположный предикат NOT BETWEEN, который истинен тогда,

когда сравниваемое значение не попадает в заданный интервал, включая его

границы.

БД

Результат

Запрос У кого почасовая ставка составляет от 60 до 70 руб.?

SELECT *

FROM РАБОТНИКИ

WHERE Почасовая_ставка BETWEEN 60 AND 70

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 33: Управление данными (sql)

33

Операторы условия в запросах (продолжение)

IN (принадлежит)

– условие фразы WHERE считается истинным, если значение принадлежит

множеству, состоящему из констант, перечисленных в скобках.

Одновременно существует противоположный предикат NOT IN, который истинен

тогда, когда сравниваемое значение не входит в заданное множество.

БД

Результат

Запрос Перечислить штукатуров и кровельщиков.

SELECT *

FROM РАБОТНИКИ

WHERE Специальность IN (‘штукатур’, ‘кровельщик’)

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 34: Управление данными (sql)

34

Операторы условия в запросах (продолжение)

LIKE (похоже на) – требуется для сравнения символьных переменных с константами. LIKE применим только к полям типа CHAR или VARCHAR, с которыми он

используется чтобы находить подстроки. Т.е. он ищет поле символа чтобы видеть, совпадает ли с условием часть его строки. В качестве условия он использует символы шаблона - специальные символы которые могут соответствовать чему-нибудь.

Имеются два типа символов шаблона, используемых с LIKE: _ (подчеркивание) – замещает ровно один неопределенный символ, % (процент) – замещает произвольное число символов, начиная с нуля.

БД

Результат

Запрос Перечислить работников, у которых название специальности

начинается с фразы «элек»

SELECT *

FROM РАБОТНИКИ

WHERE Специальность LIKE ( ‘элек%’ )

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 35: Управление данными (sql)

35

Операторы условия в запросах (продолжение)

IS NULL

– оператор сравнения с неопределенным значением

(неизвестным на данный момент времени)

Это значение при появлении дополнительной информации в любой

момент времени может быть заменено на некоторое конкретное

значение.

При сравнении неопределенных значений не действуют стандартные

правила сравнения: одно неопределенное значение никогда не

считается равным другому неопределенному значению.

NULL1 ≠ NULL2

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 36: Управление данными (sql)

36

Таблица истинности логических выраженийAND (и)

– когда должны удовлетворяться оба разделяемых с помощью AND условия;

OR (или)

– когда должно удовлетворяться одно из разделяемых с помощью OR условий;

AND NOT (и не)

– когда должно удовлетворяться первое условие и не должно второе;

OR NOT (или не)

– когда или должно удовлетворяться первое условие или не должно

удовлетворяться второе.

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 37: Управление данными (sql)

37

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

Рабочие каких специальностей назначены на объект № 435 ?

SELECT СПЕЦИАЛЬНОСТЬ

FROM РАБОТНИКИ, РАБОТА

WHERE РАБОТНИКИ.ТАБЕЛЬНЫЙ_НОМЕР =

РАБОТА.ТАБЕЛЬНЫЙ_НОМЕР

AND НОМЕР_ОБЪЕКТА = 435

БД

Результат

Запрос

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 38: Управление данными (sql)

38

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

Перечислить работников, указав имена их бригадиров.

SELECT A.ФИО, B.ФИО

FROM РАБОТНИКИ А, РАБОТНИКИ B

WHERE B.ТАБЕЛЬНЫЙ_НОМЕР = A.БРИГАДИР БД

Результат

Запрос

ФИО работника ФИО бригадира

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 39: Управление данными (sql)

39

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

Перечислить работников, назначенных на объекты типы «офис».

SELECT ФИО

FROM РАБОТНИКИ, РАБОТА, ОБЪЕКТЫ

WHERE РАБОТНИКИ.ТАБЕЛЬНЫЙ_НОМЕР =

РАБОТА.ТАБЕЛЬНЫЙ_НОМЕР AND

РАБОТА.НОМЕР_ОБЪЕКТА =

ОБЪЕКТЫ.НОМЕР_ОБЪЕКТА AND

ТИП_ОБЪЕКТА = ‘офис’

БД

Результат

Запрос

Пример дубликатов фамилий

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 40: Управление данными (sql)

40

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

Перечислить работников, назначенных на объекты типы «офис».

SELECT DISTINCT ФИО

FROM РАБОТНИКИ, РАБОТА, ОБЪЕКТЫ

WHERE РАБОТНИКИ.ТАБЕЛЬНЫЙ_НОМЕР =

РАБОТА.ТАБЕЛЬНЫЙ_НОМЕР AND

РАБОТА.НОМЕР_ОБЪЕКТА =

ОБЪЕКТЫ.НОМЕР_ОБЪЕКТА AND

ТИП_ОБЪЕКТА = ‘офис’

БД

Результат

Запрос

DISTINCT – оператор, исключающий повторяющиеся строки

Дубликаты строк отсутствуют

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 41: Управление данными (sql)

41

Вложенный подзапрос

– это подзапрос, заключенный в круглые скобки и вложенный

в WHERE фразу предложения SELECT или других предложений,

использующих WHERE фразу.

Другими словами, это запрос внутри запроса.

4.8.3. Подзапросы

Запрос: Рабочие каких специальностей назначены на объект № 435 ?

Вложенный подзапрос

Внешний запрос

SELECT СПЕЦИАЛЬНОСТЬ

FROM РАБОТНИКИ

WHERE ТАБЕЛЬНЫЙ_НОМЕР IN

( SELECT ТАБЕЛЬНЫЙ_НОМЕР

FROM РАБОТА

WHERE НОМЕР_ОБЪЕКТА = 435 )1

2

3

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 42: Управление данными (sql)

42

Простой (некоррелированный) подзапрос

– подзапрос, значение которого не зависит ни от какого

внешнего запроса.

Простые и коррелированные подзапросы

Перечислить работников, назначенных на объекты типа «офис».

SELECT ФИО

FROM РАБОТНИКИ

WHERE ТАБЕЛЬНЫЙ_НОМЕР IN

( SELECT ТАБЕЛЬНЫЙ_НОМЕР

FROM РАБОТА

WHERE НОМЕР_ОБЪЕКТА IN

( SELECT НОМЕР_ОБЪЕКТА

FROM ОБЪЕКТЫ

WHERE ТИП_ОБЪЕКТА = ‘офис’ ) )

БД

Результат

Запрос

Вложенный подзапрос № 2

Вложенный подзапрос № 1

Главный запрос

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 43: Управление данными (sql)

43

Коррелированный подзапрос

– подзапрос, результат которого зависит от строки,

рассматриваемой главным запросом.

Простые и коррелированные подзапросы (продолжение)

Перечислить работников, чьи почасовые ставки выше, чем

почасовые ставки их бригадиров.

SELECT ФИО

FROM РАБОТНИКИ А

WHERE А.ПОЧАСОВАЯ_СТАВКА >

( SELECT B.ПОЧАСОВАЯ_СТАВКА

FROM РАБОТНИКИ B

WHERE B.ТАБЕЛЬНЫЙ_НОМЕР =

A.БРИГАДИР )

БД

Результат

Запрос

Вложенный подзапрос

Главный запрос

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 44: Управление данными (sql)

44

4.8.4. Операторы EXISTS и NOT EXISTS

БД

Результат

Запрос Перечислить работников, не назначенных на объект 435.

Пример неправильного запроса

SELECT ТАБЕЛЬНЫЙ_НОМЕР

FROM РАБОТА

WHERE НОМЕР_ОБЪЕКТА <> 435

Работники, ошибочно попавшие в результат запроса

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 45: Управление данными (sql)

45

Операторы EXISTS и NOT EXISTS (продолжение)

БД

Результат

Запрос Перечислить работников, не назначенных на объект 435.

SELECT ТАБЕЛЬНЫЙ_НОМЕР

FROM РАБОТНИКИ

WHERE NOT EXISTS

( SELECT *

FROM РАБОТА

WHERE РАБОТА.ТАБЕЛЬНЫЙ_НОМЕР =

РАБОТНИКИ.ТАБЕЛЬНЫЙ_НОМЕР

AND НОМЕР_ОБЪЕКТА = 435 )

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 46: Управление данными (sql)

46

Операторы EXISTS и NOT EXISTS (продолжение)

БД

Результат

Запрос Перечислить работников, не назначенных на объект 435.

Другой способ (использование некоррелированного запроса)

SELECT ТАБЕЛЬНЫЙ_НОМЕР

FROM РАБОТНИКИ

WHERE ТАБЕЛЬНЫЙ_НОМЕР NOT IN

( SELECT ТАБЕЛЬНЫЙ_НОМЕР

FROM РАБОТА

WHERE НОМЕР_ОБЪЕКТА = 435 )

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 47: Управление данными (sql)

47

Операторы EXISTS и NOT EXISTS (продолжение)

БД

Результат

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

SELECT ТАБЕЛЬНЫЙ_НОМЕР FROM РАБОТНИКИ WHERE NOT EXISTS ( SELECT НОМЕР_ОБЪЕКТА

FROM ОБЪЕКТЫWHERE NOT EXISTS ( SELECT * FROM РАБОТА

WHERE РАБОТА.НОМЕР_ОБЪЕКТА = ОБЪЕКТЫ.НОМЕР_ОБЪЕКТА AND РАБОТА.ТАБЕЛЬНЫЙ_НОМЕР =

РАБОТНИКИ.ТАБЕЛЬНЫЙ_НОМЕР ) )

NOT EXISTS является единственным средством решения запросов,

содержащих в условии слово «каждый».

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 48: Управление данными (sql)

48

Примеры запросов

Каковы максимальная и минимальная почасовые ставки ?

Каково среднее число дней работы служащих на объекте 435 ?

Каково общее число дней, отведенных на штукатурные работы на объекте 312 ?

Сколько всего разных специальностей у работников?

4.8.5. Встроенные функции

Для реализации запросов надо использовать встроенные в SQL

статистические функции:

•SUM (сумма),

•AVG (среднее),

•COUNT (количество),

•MAX (максимум),

•MIN (минимум).

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 49: Управление данными (sql)

49

Встроенные функции (продолжение)

БД

Результат

Запрос Каковы максимальная и минимальная почасовые ставки?

SELECT MAX ( ПОЧАСОВАЯ_СТАВКА ),

MIN ( ПОЧАСОВАЯ_СТАВКА )

FROM РАБОТНИКИ

•Функции MAX и MIN оперируют одним столбцом таблицы. Они выбирают

максимальное или минимальное значение соответственно из этого столбца.

•Столбец может содержать числовые или строковые значения, либо

значения даты/времени.

•Результат, возвращаемый этими функциями, имеет точно такой же тип

данных, что и сам столбец.

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 50: Управление данными (sql)

50

Встроенные функции (продолжение)

БД

Результат

Запрос Каково общее число дней, отведенных на штукатурные работы

на объекте 312 ?

SELECT SUM ( КОЛИЧЕСТВО_ДНЕЙ )

FROM РАБОТА, РАБОТНИКИ

WHERE РАБОТНИКИ.ТАБЕЛЬНЫЙ_НОМЕР =

РАБОТА.ТАБЕЛЬНЫЙ_НОМЕР AND

СПЕЦИАЛЬНОСТЬ = ‘штукатур’ AND

НОМЕР_ОБЪЕКТА = 312

•Функция SUM вычисляет сумму всех значений столбца.

•Данные, содержащиеся в столбце, должны иметь числовой тип

(содержать целые числа, десятичные числа или числа с плавающей

запятой или денежные величины).

•Результат, возвращаемый функцией SUM, имеет тот же тип данных, что

и столбец, однако точность результата может быть выше

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 51: Управление данными (sql)

51

Встроенные функции (продолжение)

БД

Результат

Запрос Каково среднее число дней работы служащих на объекте 435?

SELECT AVG ( КОЛИЧЕСТВО_ДНЕЙ )

FROM РАБОТА

WHERE НОМЕР_ОБЪЕКТА = 435

•Функция AVG вычисляет среднее всех значений столбца. Вначале она

суммирует все значения, содержащиеся в столбце, а затем делит сумму на

число этих значений.

•Данные, содержащиеся в столбце, должны иметь числовой тип.

•Результат может иметь не такой же тип, как столбец. Например, если

AVG применить к столбцу целых чисел, то результат будет либо

десятичным числом, либо числом с плавающей точкой, в зависимости от

СУБД.

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 52: Управление данными (sql)

52

Встроенные функции (продолжение)

БД

Результат

Запрос Сколько всего разных специальностей у работников?

SELECT COUNT ( DISTINCT СПЕЦИАЛЬНОСТЬ )

FROM РАБОТНИКИ

•Функция COUNT подсчитывает число значений в данном столбце или

число строк в таблице.

•Когда она считает значения столбца, она используется с DISTINCT

чтобы производить подсчет различных числовых значений в данном поле.

•Тип данных в столбце может быть любым

•Функция COUNT всегда возвращает целый тип данных независимо от

типа данных столбцов

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 53: Управление данными (sql)

53

Встроенные функции (продолжение)

БД

Результат

Запрос Сколько всего работников зарегистрировано в базе данных?

SELECT COUNT ( * )

FROM РАБОТНИКИ

•Чтобы подсчитать общее число строк в таблице, надо использовать

функцию COUNT со звездочкой вместо имени поля, в частности COUNT (*)

•Функция COUNT со звездочкой включает и NULL, и дубликаты, по этой

причине DISTINCT не может быть использован.

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 54: Управление данными (sql)

54

Встроенные функции (продолжение)

БД

Результат

Запрос Какова средняя недельная зарплата рабочих?

SELECT AVG ( 40 * ПОЧАСОВАЯ_СТАВКА )

FROM РАБОТНИКИ

Все функции, кроме COUNT, можно использовать с вычисляемыми

выражениями.

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 55: Управление данными (sql)

55

Встроенные функции (продолжение)

БД

Результат

Запрос Сколько объектов имеют уровень сложности 3 ?

SELECT COUNT ( * )

FROM ОБЪЕКТЫ

WHERE УРОВЕНЬ_СЛОЖНОСТИ = 3

Функция COUNT может ссылаться на строку целиком, а не на отдельный

столбец.

Внимание ! Если в команде SELECT стоит встроенная функция, то больше

в этой команде SELECT ничего стоять не может !

Однако фраза SELECT, содержащая встроенную функцию, может

быть частью подзапроса.

Единственным исключением является команда GROUP BY.(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 56: Управление данными (sql)

56

4.8.6. Операторы GROUP BY и HAVING

БД

Результат

Запрос Для работников каждой специальности рассчитать максимальную

почасовую ставку.

SELECT СПЕЦИАЛЬНОСТЬ, MAX ( ПОЧАСОВАЯ_СТАВКА )

FROM РАБОТНИКИ

GROUP BY СПЕЦИАЛЬНОСТЬ

Фраза GROUP BY означает, что строки должны быть разбиты на группы

с общими значениями указанного столбца (столбцов).

Фраза GROUP BY используется на практике, когда требуется статистическая

информация не об отдельном объекте, а о каждой группе.

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 57: Управление данными (sql)

57

Операторы GROUP BY и HAVING (продолжение)

БД

Результат

Запрос Для каждого типа объектов вычислить среднюю продолжительность

работ, начиная с 20.10.2001 г.

SELECT НОМЕР_ОБЪЕКТА, AVG(КОЛИЧЕСТВО_ДНЕЙ)

FROM РАБОТА

WHERE ДАТА_НАЧАЛА >= 20/10/01

GROUP BY НОМЕР_ОБЪЕКТА

С фразой GROUP BY можно использовать команду WHERE

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 58: Управление данными (sql)

58

Операторы GROUP BY и HAVING (продолжение)

БД

Результат

Запрос Для каждого типа объектов, на которых работают более одного рабочего, вычислить максимальную продолжительность работ. Рассматривать только те объекты, работы на которых начались после 20.10.2001 г.

SELECT НОМЕР_ОБЪЕКТА, MAX(КОЛИЧЕСТВО_ДНЕЙ) FROM РАБОТА WHERE ДАТА_НАЧАЛА >= 20/10/01 GROUP BY НОМЕР_ОБЪЕКТА HAVING COUNT ( ТАБЕЛЬНЫЙ_НОМЕР ) >= 2

Фраза HAVING накладывает условия на группы.

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

но и к группам строк, созданным командой GROUP BY, используется фраза

HAVING.

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 59: Управление данными (sql)

59

4.8.7. Встроенные функции и подзапросы

БД

Результат

Запрос У кого из работников почасовая ставка выше средней?

SELECT ФИО

FROM РАБОТНИКИ

WHERE ПОЧАСОВАЯ_СТАВКА >

( SELECT AVG (ПОЧАСОВАЯ_СТАВКА)

FROM РАБОТНИКИ )

Встроенные функции могут использоваться только во фразе SELECT или

команде HAVING. Однако фраза SELECT, содержащая встроенную функцию,

может быть частью подзапроса.

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 60: Управление данными (sql)

60

Встроенные функции и подзапросы (продолжение)

БД

Результат

Запрос У кого из работников почасовая ставка выше средней почасовой

ставки среди подчиненных одного и того же менеджера?

SELECT А.ФИО

FROM РАБОТНИКИ А

WHERE А.ПОЧАСОВАЯ_СТАВКА >

( SELECT AVG ( B.ПОЧАСОВАЯ_СТАВКА )

FROM РАБОТНИКИ B

WHERE B.БРИГАДИР = A.БРИГАДИР )

В коррелированных запросах также могут использоваться встроенный функции

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 61: Управление данными (sql)

61

4.8.8. Операции изменения данных

Значения данных могут быть помещены, скорректированы и удалены

из полей тремя командами языка SQL из категории DML:

•INSERT (вставить),

•UPDATE (модифицировать),

•DELETE (удалить).

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 62: Управление данными (sql)

62

Команда INSERT

INSERT INTO < table name >

VALUES ( < value >, < value > . . . ) ;

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

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

формулировки запроса, определяющего вводимы строки.

Пример. Ввести строку в таблицу РАБОТА

INSERT INTO РАБОТА (

ТАБЕЛЬНЫЙ_НОМЕР, НОМЕР_ОБЪЕКТА, ДАТА_НАЧАЛА )

VALUES (

1284, 485, 13.11.2001 )

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 63: Управление данными (sql)

63

Команда INSERT (продолжение)

Пример.

Допустим, что мы создали новую таблицу с именем ОБЪЕКТЫ_2,

состоящую из столбцов НОМЕР_ОБЪЕКТА, ТИП_ОБЪЕКТА и

УРОВЕНЬ_СЛОЖНОСТИ, и хотим заполнить эту таблицу строками из

таблицы ОБЪЕКТЫ, имеющими УРОВЕНЬ_СЛОЖНСТИ = 3.

Реализация запроса.

INSERT INTO ОБЪЕКТЫ_2

SELECT НОМЕР_ОБЪЕКТА, ТИП_ОБЪЕКТА,

УРОВЕНЬ_СЛОЖНОСТИ

FROM ОБЪЕКТЫ

WHERE УРОВЕНЬ_СЛОЖНОСТИ = 3

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 64: Управление данными (sql)

64

Команда UPDATE

Всегда применяется ко всем строкам, удовлетворяющим условию

выражения WHERE.

Если фраза WHERE отсутствует, то операция применяется к каждой

строке таблицы.

Пример. Повысить на 5 процентов почасовую ставку каждого

штукатура.

UPDATE РАБОТНИКИ

SET ПОЧАСОВАЯ_СТАВКА = 1,05 * ПОЧАСОВАЯ_СТАВКА

WHERE СПЕЦИАЛЬНОСТЬ = ‘штукатур’

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 65: Управление данными (sql)

65

Команда DELETE

Всегда применяется ко всем строкам, удовлетворяющим условию

выражения WHERE.

Если фраза WHERE отсутствует, то удаляются все строки таблицы.

Пример. Допустим, что все рабочие, чей бригадир имеет табельный

номер 1520, были уволены, и необходимо удалить

соответствующие строки из базы данных.

DELETE FROM РАБОТНИКИ WHERE БРИГАДИР = 1520

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 66: Управление данными (sql)

66

4.8.9. Определение представлений данных

ПРЕДСТАВЛЕНИЕ (VIEW)

– объект данных, который не содержит никаких данных.

Это – тип таблицы, чье содержание выбирается из других таблиц с

помощью выполнения запроса. Они работают в запросах и

операторах DML точно также как и основные таблицы, но не

содержат никаких собственных данных.

Поскольку значения в этих таблицах меняются, то автоматически, их

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

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 67: Управление данными (sql)

67

Определение представлений данных (продолжение)

Пример. Создать представление данных, показывающее всю информацию

о работнике, кроме его почасовой ставки.

CREATE VIEW П_РАБОТНИКИ AS

SELECT ТАБЕЛЬНЫЙ_НОМЕР,

ФИО,

СПЕЦИАЛЬНОСТЬ,

БРИГАДИР

FROM РАБОТНИКИ

Спецификация запроса

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 68: Управление данными (sql)

68

Определение представлений данных (продолжение)

Пример. Создать представление с информацией об электриках: объекты, на

которые они назначены работать, и дата начала работы.

CREATE VIEW П_ЭЛЕКТРИКИ AS

SELECT ФИО, НОМЕР_ОБЪЕКТА, ДАТА_НАЧАЛА

FROM РАБОТНИКИ, РАБОТА

WHERE СПЕЦИАЛЬНОСТЬ = ‘электрик’ AND

РАБОТНИКИ.ТАБЕЛЬНЫЙ_НОМЕР =

РАБОТА.ТАБЕЛЬНЫЙ_НОМЕР

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 69: Управление данными (sql)

69

Примеры использования представлений

Пример 1. Показать все сведения об электриках и объектах, на которых

они поработали.

SELECT * FROM П_ЭЛЕКТРИКИ

Пример 2. Кто из электриков назначен работать на объект 435 ?

SELECT ФИО, ДАТА_НАЧАЛА

FROM П_ЭЛЕКТРИКИ

WHERE НОМЕР_ОБЪЕКТА = 435

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 70: Управление данными (sql)

70

Примеры использования представлений (продолжение)

Пример 3. Создать представление, в котором реализован запрос,

определяющий для работников каждой специальности величину

максимальной почасовой ставки.

CREATE VIEW П_МАКС_СТАВКА (

СПЕЦИАЛЬНОСТЬ, МАКС_СТАВКА ) AS

SELECT СПЕЦИАЛЬНОСТЬ, MAX ( ПОЧАСОВАЯ_СТАВКА )

FROM РАБОТНИКИ

GROUP BY СПЕЦИАЛЬНОСТЬ

При определении представления данных можно использовать

также операции группировки.

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 71: Управление данными (sql)

71

Примеры использования представлений (продолжение)

Пример 4. У работников какой специальности максимальная почасовая ставка

превышает 70 рублей ?

SELECT СПЕЦИАЛЬНОСТЬ

FROM П_МАКС_СТАВКА

WHERE МАКС_СТАВКА > 70

Этапы выполнения запроса:

1. Выполнить спецификацию запроса из представления

SELECT СПЕЦИАЛЬНОСТЬ, MAX ( ПОЧАСОВАЯ_СТАВКА ) FROM РАБОТНИКИ GROUP BY СПЕЦИАЛЬНОСТЬ

2. Выполнить запрос

1

2

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 72: Управление данными (sql)

72

4.8.10. Ограничения на обновления представлений данных

Внимание! Представление может изменяться командами модификации DML,

но модификация не будет воздействовать на само представление.

Команды будут на самом деле перенаправлены к базовой таблице.

Обновлять представления данных можно только тогда, когда его

спецификация запроса такова:

•В команде SELECT перечислены только имена столбцов, т.е. нет

вычислений и встроенных функций), отсутствует ключевое слово DISTINCT.

•В команде FROM стоит ссылка только на одну таблицу. Таблица, на

которую ссылается фраза FROM, должна быть либо базовой таблицей,

либо обновляемым представлением базы данных

•Отсутствуют команды GROUP BY, HAVING.

(©) Владислав Лавров, vlavrov.professorjournal.ru

Page 73: Управление данными (sql)

73

4.8.11. Удаление представлений данных

DROP VIEW < view name >

• нет необходимости сначала удалять всё содержание

представления данных как это делается с базовой

таблицей, потому что содержание представления не

является созданным и сохраняется в течении

определенной команды.

• пользователь должен являться владельцем (т.е. быть

создателем) представления, чтобы иметь возможность

удалить его.(©) Владислав Лавров, vlavrov.professorjournal.ru