2_04 - МиСПИСТ (УД SQL)

73
Инструментально-программный методический комплекс Методы и средства проектирования информационных систем и технологий Управление данными Часть 4. Язык SQL

description

 

Transcript of 2_04 - МиСПИСТ (УД SQL)

Page 1: 2_04 - МиСПИСТ (УД SQL)

Инструментально-программный

методический комплекс

Методы и средства проектирования информационных систем и технологий

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

Часть 4.

Язык SQL

Page 2: 2_04 - МиСПИСТ (УД SQL)

2

4.1. История развития SQLSQL (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

Page 3: 2_04 - МиСПИСТ (УД SQL)

3

1986 – компания Sybase создает реляционную СУБД для обработки транзакций1987 – ISO одобряет стандарт SQL-11988 – компании Ashton-Tate и Microsoft объявляют о выпуске СУБД SQL Server

для операционной системы OS/21989 – опубликован первый тест производительности TPC (TPC-A)1990 – опубликован тест производительности TPC-B1991 – консорциум SQL Access Group публикует спецификацию доступа к базам данных1991 – компания Microsoft публикует спецификация протокола ODBC (Open DataBase

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

Processing).1993 – первые поставки систем обслуживания хранилищ данных1993 – первые поставки программных продуктов, поддерживающих протокол ODBC1994 – опубликован тест производительности TPC-D (для систем поддержки принятия

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

обработку

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

Page 4: 2_04 - МиСПИСТ (УД 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 (продолжение)

Page 5: 2_04 - МиСПИСТ (УД SQL)

5

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

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

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

Формы языка SQL

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

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

и так далее ) в базе данныхDML (Data Manipulation Language, Язык Манипулирования Данными)

– это набор команд, которые определяют какие значения представлены в таблицах в любой момент времени, а также позволяют помещать, изменять и удалять данные из таблиц БД;

DCL (Data Control Language, Язык Управления Данными) – состоит из средств, которые управляют выполнением транзакций, а также определяют разрешить ли пользователю выполнять определенные действия или нет.

Page 6: 2_04 - МиСПИСТ (УД SQL)

6

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

Page 7: 2_04 - МиСПИСТ (УД SQL)

7

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

Page 8: 2_04 - МиСПИСТ (УД SQL)

8

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

Page 9: 2_04 - МиСПИСТ (УД SQL)

9

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

Page 10: 2_04 - МиСПИСТ (УД SQL)

10

4.3. Основные возможности SQL• предложения определения данных;

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

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

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

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

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

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

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

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

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

Page 11: 2_04 - МиСПИСТ (УД SQL)

11

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

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

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

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

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

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

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

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

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

Page 12: 2_04 - МиСПИСТ (УД SQL)

12

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

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

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

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

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

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

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

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

Page 13: 2_04 - МиСПИСТ (УД SQL)

13

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

CHARACTER(n), CHAR(n) (n – число символов 0 < n < 254)

Строки символов постоянной длины

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

INTEGER, INTSMALLINT

Целые числа

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

(0 < p < 16, q < p)

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

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

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

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

Page 14: 2_04 - МиСПИСТ (УД SQL)

14

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

DATE дата в формате, определяемомспециальной командой (по умолчанию mm/dd/yy)

TIME время в формате, определяемомспециальной командой(по умолчанию hh.mm.ss)

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

MONEY деньги

Page 15: 2_04 - МиСПИСТ (УД SQL)

15

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

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

SQL-запрос

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

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

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

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

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

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

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

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

Page 16: 2_04 - МиСПИСТ (УД 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 тип данных)

Page 17: 2_04 - МиСПИСТ (УД 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>, ... )] [( имя столбца) ] )

Page 18: 2_04 - МиСПИСТ (УД SQL)

18

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

РАБОТНИКИ

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

ФИО

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

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

Бригадир

ОБЪЕКТЫ

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

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

Тип_объекта

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

РАБОТА

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

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

Дата_начала

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

1 1

¥¥

Page 19: 2_04 - МиСПИСТ (УД 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 )

Page 20: 2_04 - МиСПИСТ (УД SQL)

20

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

ALTER TABLE < table name > ADD < column name > < data type > < size > ;

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

таблицы.

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

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

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

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

Page 21: 2_04 - МиСПИСТ (УД SQL)

21

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

DROP TABLE < table name >;

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

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

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

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

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

Page 22: 2_04 - МиСПИСТ (УД SQL)

22

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

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

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

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

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

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

Page 23: 2_04 - МиСПИСТ (УД 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

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

Page 24: 2_04 - МиСПИСТ (УД SQL)

24

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

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

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

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

Page 25: 2_04 - МиСПИСТ (УД 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 > } , ... ]

Page 26: 2_04 - МиСПИСТ (УД SQL)

26

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

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

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

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

< alias > - временный синоним для <table name>, определенныйв этой таблице и используемый только в этой команде

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

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

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

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

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

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

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

Page 27: 2_04 - МиСПИСТ (УД SQL)

27

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

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

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

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

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

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

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

Page 28: 2_04 - МиСПИСТ (УД SQL)

28

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

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

SELECT ФИО

FROM РАБОТНИКИ

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

БД

Результат

Запрос

Page 29: 2_04 - МиСПИСТ (УД SQL)

29

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

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

SELECT * FROM ОБЪЕКТЫ

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

Результат

Запрос

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

Page 30: 2_04 - МиСПИСТ (УД SQL)

30

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

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

неделя)?

SELECT ФИО,

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

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

FROM РАБОТНИКИ

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

ORDER BY ФИО

БД

Результат

Запрос

Page 31: 2_04 - МиСПИСТ (УД SQL)

31

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

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

SELECT *

FROM РАБОТНИКИ

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

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

Результат

Запрос

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

Page 32: 2_04 - МиСПИСТ (УД SQL)

32

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

– используется для сравнения некоторой величины с двумя другими, первая из которых меньше второй, если сравниваемая величина может быть равна каждой из данных величин или любому значению между ними. Существует и противоположный предикат NOT BETWEEN, который истинен тогда, когда сравниваемое значение не попадает в заданный интервал, включая его границы.

БД

Результат

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

SELECT *

FROM РАБОТНИКИ

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

Page 33: 2_04 - МиСПИСТ (УД SQL)

33

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

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

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

БД

Результат

Запрос Перечислить штукатуров и кровельщиков.SELECT * FROM РАБОТНИКИ WHERE Специальность IN (‘штукатур’, ‘кровельщик’)

Page 34: 2_04 - МиСПИСТ (УД SQL)

34

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

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

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

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

БД

Результат

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

SELECT * FROM РАБОТНИКИ WHERE Специальность LIKE ( ‘элек%’ )

Page 35: 2_04 - МиСПИСТ (УД SQL)

35

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

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

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

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

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

значение.

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

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

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

NULL1 ≠ NULL2

Page 36: 2_04 - МиСПИСТ (УД SQL)

36

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

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

OR (или)

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

AND NOT (и не)

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

OR NOT (или не)

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

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

Page 37: 2_04 - МиСПИСТ (УД SQL)

37

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

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

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

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

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

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

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

БД

Результат

Запрос

Page 38: 2_04 - МиСПИСТ (УД SQL)

38

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

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

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

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

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

Результат

Запрос

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

Page 39: 2_04 - МиСПИСТ (УД SQL)

39

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

SELECT ФИО

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

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

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

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

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

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

БД

Результат

Запрос

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

Page 40: 2_04 - МиСПИСТ (УД SQL)

40

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

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

SELECT DISTINCT ФИО

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

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

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

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

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

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

БД

Результат

Запрос

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

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

Page 41: 2_04 - МиСПИСТ (УД SQL)

41

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

использующих WHERE фразу. Другими словами, это запрос внутри запроса.

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

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

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

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

SELECT СПЕЦИАЛЬНОСТЬ FROM РАБОТНИКИ WHERE ТАБЕЛЬНЫЙ_НОМЕР IN

( SELECT ТАБЕЛЬНЫЙ_НОМЕР FROM РАБОТА WHERE НОМЕР_ОБЪЕКТА = 435 )

1

2

3

Page 42: 2_04 - МиСПИСТ (УД SQL)

42

Простой (некоррелированный) подзапрос – подзапрос, значение которого не зависит ни от какого внешнего запроса.

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

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

FROM РАБОТНИКИ

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

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

FROM РАБОТА

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

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

FROM ОБЪЕКТЫ

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

БД

Результат

Запрос

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

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

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

Page 43: 2_04 - МиСПИСТ (УД SQL)

43

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

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

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

SELECT ФИО FROM РАБОТНИКИ А WHERE А.ПОЧАСОВАЯ_СТАВКА > ( SELECT B.ПОЧАСОВАЯ_СТАВКА

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

A.БРИГАДИР )

БД

Результат

Запрос

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

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

Page 44: 2_04 - МиСПИСТ (УД SQL)

44

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

БД

Результат

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

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

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

FROM РАБОТА

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

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

Page 45: 2_04 - МиСПИСТ (УД SQL)

45

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

БД

Результат

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

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

FROM РАБОТНИКИ

WHERE NOT EXISTS

( SELECT *

FROM РАБОТА

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

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

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

Page 46: 2_04 - МиСПИСТ (УД SQL)

46

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

БД

Результат

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

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

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

FROM РАБОТНИКИ

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

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

FROM РАБОТА

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

Page 47: 2_04 - МиСПИСТ (УД SQL)

47

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

БД

Результат

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

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

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

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

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

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

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

Page 48: 2_04 - МиСПИСТ (УД SQL)

48

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

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

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

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

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

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

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

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

•SUM (сумма),

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

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

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

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

Page 49: 2_04 - МиСПИСТ (УД SQL)

49

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

БД

Результат

Запрос Каковы максимальная и минимальная почасовые ставки?SELECT MAX ( ПОЧАСОВАЯ_СТАВКА ), MIN ( ПОЧАСОВАЯ_СТАВКА ) FROM РАБОТНИКИ

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

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

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

Page 50: 2_04 - МиСПИСТ (УД SQL)

50

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

БД

Результат

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

SELECT SUM ( КОЛИЧЕСТВО_ДНЕЙ ) FROM РАБОТА, РАБОТНИКИ WHERE РАБОТНИКИ.ТАБЕЛЬНЫЙ_НОМЕР =

РАБОТА.ТАБЕЛЬНЫЙ_НОМЕР ANDСПЕЦИАЛЬНОСТЬ = ‘штукатур’ AND НОМЕР_ОБЪЕКТА = 312

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

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

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

или денежные величины).

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

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

Page 51: 2_04 - МиСПИСТ (УД SQL)

51

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

БД

Результат

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

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

FROM РАБОТА

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

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

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

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

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

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

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

числом, либо числом с плавающей точкой, в зависимости от СУБД.

Page 52: 2_04 - МиСПИСТ (УД SQL)

52

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

БД

Результат

Запрос Сколько всего разных специальностей у работников?SELECT COUNT ( DISTINCT СПЕЦИАЛЬНОСТЬ ) FROM РАБОТНИКИ

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

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

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

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

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

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

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

Page 53: 2_04 - МиСПИСТ (УД SQL)

53

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

БД

Результат

Запрос Сколько всего работников зарегистрировано в базе данных?SELECT COUNT ( * ) FROM РАБОТНИКИ

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

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

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

Page 54: 2_04 - МиСПИСТ (УД SQL)

54

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

БД

Результат

Запрос Какова средняя недельная зарплата рабочих?SELECT AVG ( 40 * ПОЧАСОВАЯ_СТАВКА ) FROM РАБОТНИКИ

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

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

Page 55: 2_04 - МиСПИСТ (УД SQL)

55

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

БД

Результат

Запрос Сколько объектов имеют уровень сложности 3 ?SELECT COUNT ( * ) FROM ОБЪЕКТЫ WHERE УРОВЕНЬ_СЛОЖНОСТИ = 3

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

столбец.

Внимание ! Если в команде SELECT стоит встроенная функция, то большев этой команде SELECT ничего стоять не может ! Однако фраза SELECT, содержащая встроенную функцию, может

быть частью подзапроса. Единственным исключением является команда GROUP BY.

Page 56: 2_04 - МиСПИСТ (УД SQL)

56

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

БД

Результат

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

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

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

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

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

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

Page 57: 2_04 - МиСПИСТ (УД SQL)

57

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

БД

Результат

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

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

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

Page 58: 2_04 - МиСПИСТ (УД SQL)

58

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

БД

Результат

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

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

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

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

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

HAVING.

Page 59: 2_04 - МиСПИСТ (УД SQL)

59

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

БД

Результат

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

SELECT ФИО FROM РАБОТНИКИ WHERE ПОЧАСОВАЯ_СТАВКА >

( SELECT AVG (ПОЧАСОВАЯ_СТАВКА) FROM РАБОТНИКИ )

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

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

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

Page 60: 2_04 - МиСПИСТ (УД SQL)

60

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

БД

Результат

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

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

SELECT А.ФИО

FROM РАБОТНИКИ А

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

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

FROM РАБОТНИКИ B

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

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

Page 61: 2_04 - МиСПИСТ (УД SQL)

61

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

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

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

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

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

Page 62: 2_04 - МиСПИСТ (УД SQL)

62

Команда INSERT

INSERT INTO < table name > VALUES ( < value >, < value > . . . ) ;

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

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

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

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

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

VALUES ( 1284, 485, 13.11.2001 )

Page 63: 2_04 - МиСПИСТ (УД SQL)

63

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

Пример.

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

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

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

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

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

INSERT INTO ОБЪЕКТЫ_2SELECT НОМЕР_ОБЪЕКТА, ТИП_ОБЪЕКТА,

УРОВЕНЬ_СЛОЖНОСТИ FROM ОБЪЕКТЫ WHERE УРОВЕНЬ_СЛОЖНОСТИ = 3

Page 64: 2_04 - МиСПИСТ (УД SQL)

64

Команда UPDATE

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

выражения WHERE.

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

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

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

штукатура.

UPDATE РАБОТНИКИ

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

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

Page 65: 2_04 - МиСПИСТ (УД SQL)

65

Команда DELETE

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

выражения WHERE.

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

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

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

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

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

Page 66: 2_04 - МиСПИСТ (УД SQL)

66

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

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

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

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

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

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

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

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

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

Page 67: 2_04 - МиСПИСТ (УД SQL)

67

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

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

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

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

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

ФИО,

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

БРИГАДИР

FROM РАБОТНИКИ

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

Page 68: 2_04 - МиСПИСТ (УД SQL)

68

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

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

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

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

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

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

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

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

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

Page 69: 2_04 - МиСПИСТ (УД SQL)

69

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

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

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

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

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

FROM П_ЭЛЕКТРИКИ WHERE НОМЕР_ОБЪЕКТА = 435

Page 70: 2_04 - МиСПИСТ (УД SQL)

70

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

Пример 3. Создать представление, в котором реализован запрос, определяющий для работников каждой специальности величину максимальной почасовой ставки.

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

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

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

Page 71: 2_04 - МиСПИСТ (УД SQL)

71

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

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

SELECT СПЕЦИАЛЬНОСТЬ FROM П_МАКС_СТАВКА WHERE МАКС_СТАВКА > 70

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

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

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

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

1

2

Page 72: 2_04 - МиСПИСТ (УД SQL)

72

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

Внимание! Представление может изменяться командами модификации DML, но модификация не будет воздействовать на само представление. Команды будут на самом деле перенаправлены к базовой таблице.

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

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

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

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

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

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

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

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

Page 73: 2_04 - МиСПИСТ (УД SQL)

73

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

DROP VIEW < view name >

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

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