Лекция_3_Язык_SQL.pptx
- Количество слайдов: 47
Базы данных Язык запросов SQL.
Язык описания данных(DDL) Команды DDL CREATE – создание объекта. ALTER – изменение структуры объекта. DROP – удаление объекта. Общий вид синтаксиса команд DDL: CREATE ALTER DROP тип_объекта имя_объекта [параметры];
Создание и удаление базы данных Создать базу данных для проектной организации: CREATE DATABASE Projects_org; Удалить базу данных: DROP DATABASE Projects_org;
Создание таблиц CREATE TABLE [имя_схемы. ]имя_таблицы ( имя_поля тип_данных [(размер)] [NOT NULL] [DEFAULT выражение] [ограничения_целостности_поля…] ) [ параметры ]; Удаление таблиц DROP TABLE имя таблицы ;
Основные типы данных реляционных СУБД Целые типы данных Тип INT, INTEGER Разрядность 4 байта SMALLINT 2 байта Диапазон кодирования -231 до 231 -1 От 0 до 232 -1 -215 до 215 -1 От 0 до 216 -1 Вещественные типы данных Тип Разрядность Диапазон кодирования FLOAT[(M, D)] 4 байта Минимальное значение ± 1. 175494351× 10 -39 Максимальное значение ± 3. 402823466× 1038 DOUBLE[(M, D)], REAL[(M, D)] 8 байт Минимальное значение ± 2. 2250738585072014× 10 -308 Максимальное значение ± 1. 797693134862315× 10308 DECIMAL[(M, D)] M+2 байта Зависит от параметров M и D
Текстовые данные Тип Разрядность Диапазон кодирования CHAR(M) -строка фиксированной длины M символов VARCHAR(M) - M символов до 255 M символов До 65536 26 -1 строка переменной длины TEXT TINYTEXT L+1 символов до 255 Календарные даты и время Тип Разрядность Диапазон кодирования DATE 3 байта '1000 -01 -01' до '9999 -12 -31' TIME 3 байта от '-828: 59' ДО '828: 59' DATETIME 8 байт от'1000 -01 -01 00: 00' до'9999 -12 -31 00: 00'
Ограничения целостности Существуют следующие ограничения целостности: ü уникальность (значений атрибута или комбинации значений атрибутов): UNIQUE (имя_атрибута 1 [, имя_атрибута 2, . . . ]) ü обязательность / необязательность: NOT NULL / NULL ü первичный ключ: PRIMARY KEY(имя_атрибута 1 [, имя_атрибута 2, . . . ]) ü внешний ключ: FOREIGN KEY(имя_атрибута 1 [, имя_атрибута 2, . . . ]) REFERENCES имя_таблицы [(имя_атрибута 1 [, имя_атрибута 2, . . . ])] ü условие на значение поля: CHECK (условие) Например: check (salary>=4500), check (date 2 > date 1)
Пример БД: проектная организация Otdel– отделы, Proeкt – проекты, Sotrudnik – сотрудники, Ispol – участие в проектах
Пример БД: проектная организация Sotrudnik– сотрудники: sotrnom – табельный номер сотрудника, первичный ключ; familia - фамилия сотрудника, обязательное поле; imya – имя и отчество сотрудника, обязательное поле; dataroj – дата рождения сотрудника, обязательное поле; pol – пол сотрудника, обязательное поле; otdnom – номер отдела, обязательное поле, внешний ключ; post – должность сотрудника; zpl– оклад, больше МРОТ; pasport – серия и номер паспорта, уникальный обязательный атрибут; telefon– телефон сотрудника; adres – адрес сотрудника;
Пример БД: проектная организация Otdel – отделы: otdnom – номер отдела, первичный ключ; name – название отдела, обязательное поле. Proekt – проекты: pronom – номер проекта, первичный ключ; nazvanie – название проекта, обязательное уникальное поле; client – заказчик, обязательное поле; nachalo – дата начала выполнения проекта, обязательное поле; konec – дата завершения проекта, обязательное поле; stoimost – стоимость проекта, обязательное поле. Ispol – участие в проектах: pronom – краткое название проекта, внешний ключ; sotrnom – номер сотрудника, участвующего в проекте, внешний ключ; roll – роль сотрудника в проекте; может принимать одно из трех значений: 'исполнитель', 'руководитель', 'консультант'.
Создание таблиц БД проектной организации Таблица «Отделы» (Otdel): CREATE TABLE Otdel (otdnom int(3) not null PRIMARY KEY, name varchar(50) not null ); Таблица «Сотрудники» (Sotrudnik): CREATE TABLE sotrudnik ( sotrnom int(3) not null PRIMARY KEY, familia varchar(20) not null, imya varchar(20) not null, dataroj date not null, pol char not null, otdnom int(3) not null REFERENCES otdel, pos varchar(50) not null, zpl decimal(8, 2) not null check (zpl > 8630), pasport char(10) not null UNIQUE, telefon varchar(20), adres varchar(80) );
Создание таблиц БД проектной организации Таблица «Проекты» (Proekt): CREATE TABLE proekt (pronom int(5) not null auto_increment primary key, nazvanie varchar(100) not null unique, client varchar(200) not null, nachalo date not null, konec date not null, stoimost int(9) not null ); Таблица «Участие в проектах» (Ispol): CREATE TABLE ispol (pronom int(3) not null references proekt , sotrnom int(3) not null references sotrudnik, roll varchar(20) default 'исполнитель', primary key (sotrnom, pronom), check ( roll IN ('исполнитель', 'руководитель', 'консультант') ) );
Команда ALTER – изменение структуры объекта Переименование таблицы: ALTER TABLE старое_имя RENAME новое_имя; Создание нового поля: ALTER TABLE имя_таблицы ADD COLUMN имя_поля Type; Добавление поля в начало: ALTER TABLE имя_таблицы ADD поле Type FIRST; ALTER TABLE имя_таблицы ADD поле Type AFTER поле; Если нужно дописать к таблице не один, а несколько столбцов, то для каждого столбца нужно ADD поле Type записать через запятую. Изменение типа поля и его переименование: ALTER TABLE имя_таблицы CHANGE поле Type; ALTER TABLE имя_таблицы CHANGE старое_имя новое_имя type; Уничтожение поля из таблицы: ALTER TABLE имя_таблицы DROP COLUMN имя_поля Просмотр созданной структуры таблицы : DESCRIBE имя_таблицы;
Подмножество команд DML INSERT – добавление строк в таблицу. ü Добавляет одну или несколько строк в указанную таблицу. UPDATE – изменение данных. Изменяет значения одного или нескольких полей в записях указанной таблицы. ü Можно указать условие, по которому выбираются обновляемые строки. ü Если условие не указано, обновляются все строки таблицы. ü Если ни одна строка не удовлетворяет условию, ни одна строка не будет обновлена. ü DELETE – удаление строк из таблицы. ü ü Удаляет одну или несколько строк из таблицы. Можно указать условие, по которому выбираются удаляемые строки. Если условие не указано, удаляются все строки таблицы. Если ни одна строка не удовлетворяет условию, ни одна строка не будет удалена.
Добавление(вставка) данных INSERT – добавление строк в таблицу: INSERT INTO имя_таблицы [(список_полей_таблицы)] { VALUES (список_выражений) | запрос }; Примеры: -- Добавить в таблицу "Отделы" новую запись (все поля): INSERT INTO otdel VALUES (7, 'Договорной отдел'); -- Добавить в таблицу "Сотрудники" новую запись (не все поля): INSERT INTO sotrudnik (sotrnom, familia, name, dataroj, pol, otdnom, pasport, post, salary) values( 534, 'САВИН ‘, ’АНДРЕЙ ПАВЛОВИЧ', '11. 07. 1969', 'М', 5, '4405092876', 'программист', 38500); Замечание: значение по умолчанию используется только тогда, когда значение поля не вводится в явном виде.
Изменение данных UPDATE – изменение данных: UPDATE имя_таблицы SET имя_поля 1 = выражение 1 [, имя_поля 2 = выражение 2, …] [WHERE условие]; Примеры: -- Изменить статус сотрудника Журавлева Л. П. , табельный номер 74, по отношению к проекту 30. "Система автоматизированного управления предприятием": UPDATE ispol SET roll = 'консультант' WHERE sotrnom = 74 and pronom = 30; -- Перевести сотрудника Петрикова А. В. , табельный номер 68, на должность ведущего программиста и повысить оклад на три тысячи рублей: UPDATE sotrudnik SET pos = 'ведущий программист', zpl = zpl+3000 WHERE sotrnom = 68;
Удаление данных DELETE – удаление строк из таблицы: DELETE FROM имя_таблицы [ WHERE условие ]; Примеры. -- Удалить сведения о том, что сотрудник Афанасьев В. Н. , табельный номер 147, участвует в проектах: DELETE FROM ispol WHERE sotrnom=147; -- Удалить сведения о сотруднике Афанасьеве В. Н. , табельный номер 147: DELETE FROM sotrudnik WHERE sotrnom = 147;
Базы данных Язык запросов SQL. Команда SELECT
Команда SELECT – выборка данных Общий синтаксис: SELECT [{ ALL | DISTINCT }] { список_вывода | * } FROM имя_таблицы1 [ поле 1 ] [, имя_таблицы2 [ поле 2 ]. , . . ] [ WHERE условие_отбора_записей ] [ GROUP BY { имя_поля | выражение }. , . . [ HAVING условие_отбора_групп ] [ ORDER BY имя_поля 1 [ ASC | DESC ] [, имя_поля 2 [ ASC | DESC ]. , . . ]];
Общий алгоритм выполнения операции SELECT 1. Выбор записей из указанной таблицы (FROM). 2. Проверка для каждой записи условия отбора (WHERE). 3. Группировка полученных в результате отбора записей (GROUP BY) и вычисление для этих групп значений агрегирующих функций. 4. Выбор тех групп, которые удовлетворяют условию отбора групп (HAVING). 5. Сортировка полученных записей в указанном порядке (ORDER BY). 6. Извлечение из полученных записей тех полей, которые заданы в списке вывода, и формирование результирующего отношения. Если в части FROM указывается 2 и более таблицы, то приведенный алгоритм выполняется для декартова произведения этих таблиц.
Таблица Sotrno Fam Name Pol Post Zpl Adres 1 Иванов Иван М Менеджер 24000 Москва, Арбат, 12 2 Иванова Мария Ж Менеджер 24000 Москва, Арбат, 12 3 Иванов Петр М Рабочий 12000 Москва, нижняя, 7 4 Петров Иван М Начальник 36000 москва, … 5 Петрова Ирина Ж Рабочий 12000 Уфа, … 6 Петров Василий М Начальник 36000 Киев 7 Попов Володя М Грузчик 6000 Петербург 8 Сидоров Иван М Бригадир 24000 Киев 9 Ким Ир М Рабочий 12000 Сеул 10 Чен Мао М Рабочий 12000 Пекин
Формирование списка вывода (проекция) Общий синтаксис списка вывода: [{all | distinct}] { * | выражение 1 [, выражение 2 ]. , . . ]} Список вывода находится между ключевыми словами SELECT и FROM. 1. Вывести данные о всех сотрудников : SELECT * FROM sotr; 2. Вывести список сотрудников с указанием их должности : SELECT sotrno, fam, name, post FROM sotr; 3. Вывести список сотрудников с указанием их должности и зарплаты: SELECT sotrno, fam, name, post , zpl FROM sotr;
Формирование списка вывода (проекция) 1. Вывести должности и оклады сотрудников: SELECT post , zpl FROM sotr; 2. Вывести должности и оклады сотрудников без повторов: SELECT DISTINCT post , zpl FROM sotr; 3. Задание: вывести список сотрудников с указанием фамилии, имени и адреса. SELECT fam as ‘Фамилия’, name as ‘Имя’, adres as ‘Адрес’ FROM sotr;
Упорядочение результата 1. Вывести данные из таблицы Проекты в порядке даты начала проекта: select * from Projekt order by nachalo; 2. Упорядочить список сотрудников по отделам и по ФИО: select otdnom, fam, post from sotr order by otdnom, fam; -- order by 1, 2; 3. Упорядочить сотрудников по зарплате (от большей к меньшей): select fam+ name as 'ФИО', post as 'Должность', zpl as 'Зарплата' from sotr order by 3 DESC; 4. Упорядочить данные об отделах, должностях и зарплатах: select otdnom as 'Номер отдела', post as 'Должность', zpl as 'Зарплата' from sotr order by 1, 3 DESC, 2;
Выбор данных из таблицы (селекция) WHERE – содержит условия выбора отдельных записей. Условие является логическим выражением и может принимать одно из 3 -х значений: • TRUE – истина, • FALSE – ложь, • NULL – неизвестное, неопределённое значение (интерпретируется как ложь). Условие формируется путём применения различных операторов и предикатов. Операторы сравнения: = – равно, <>, != – не равно, > – больше, < – меньше, >= – больше или равно, <= – меньше или равно. 1. Вывести список сотрудников 2 -го отдела: select * from sotr where otdnom = 2; 2. Вывести список текущих проектов: select * from project where konec > sysdate; -- sysdate – функция, возвращающая текущую дату
Логические операторы Для формирования условий используются следующие логические операторы: AND – логическое произведение (И), OR – логическая сумма (ИЛИ), NOT – отрицание (НЕ). Операция И: Операция ИЛИ: a b a AND b a OR b 0 0 0 0 1 1 1 0 0 1 1 1 1 Операция НЕ: a NOT a 0 1 1 0
Выбор данных из таблицы по условию 1. Вывести список сотрудников 2 -го отдела с зарплатой больше 30000 рублей: select * from sotr where otdnom = 2 AND zpl > 30000 ; 2. Вывести список сотрудников-мужчин, родившихся после 1979 года: select * from sotr where dataroj > '31/12/1979' AND pol = 'м'; 3. Вывести список сотрудников 2 -го и 5 -го отделов: select * from sotr where otdnom =2 OR otdnom = 5; 4. Вывести список сотрудников 2 -го и 5 -го отделов в зарплатой не менее 30000: select * from sotr where (otdnom =2 OR otdnom = 5) AND zpl >= 30000 ; 5. Вывести список всех сотрудников, кроме сотрудников 2 -го и 5 -го: select * from sotr where NOT (otdnom =2 OR otdnom = 5);
Выбор данных из таблицы по условию Задание 1: вывести список текущих проектов стоимостью более 2 млн. рублей. select * from project where konec > sysdate AND cost > 2000000; Задание 2: вывести список сотрудников, работающих в должностях 'инженер' и 'ведущий инженер'. select * from sotr where post = 'инженер' OR post = 'ведущий инженер' ; Задание 3: вывести список сотрудников, работающих в должности 'охранник', с зарплатой более 20000 рублей. select * from sotr where post = 'охранник' AND salary > 20000;
Предикаты формирования условия Предикат вхождения в список значений: имя_поля IN ( значение 1 [, значение 2, . . . ] ) выражение IN ( значение 1 [, значение 2, . . . ] ) Примеры: • Список сотрудников отделов 5, 8 и 9: select * from sotr where otdnom IN ( 5, 8, 9 ) ; • Список сотрудников, работающих в должностях 'инженер' и 'ведущий инженер' : select * from sotr where post IN ( 'инженер', 'ведущий инженер' );
Предикаты формирования условия Предикат вхождения в диапазон: имя_поля BETWEEN минимальное_значение AND максимальное_значение выражение BETWEEN минимальное_значение AND максимальное_значение Минимальное значение должно быть меньше либо равно максимальному. Примеры: • Список всех сотрудников со 2 -го по 5 -й отделы: select * from sotr where otdnom BETWEEN 2 AND 5 ; • Список сотрудников с чистой зарплатой от 20 до 30 тысяч рублей: select * from sotr where zpl*0. 87 BETWEEN 20000 AND 30000;
Предикаты формирования условия Предикат поиска подстроки: имя_поля LIKE 'шаблон' Этот предикат применяется только к полям типа CHAR и VARCHAR. Возможно использование шаблонов: '_' – один любой символ, '%' – произвольное количество символов любых символов (в т. ч. , ни одного). Примеры: • Список всех сотрудников-экономистов: select * from sotr where post LIKE '%экономист%' ; • Список всех инженеров-специалистов (кроме просто инженеров): select * from sotr where post LIKE 'инженер_%' ;
Предикаты формирования условия Предикат поиска неопределенного значения: значение IS [NOT] NULL Если значения является неопределенным (NULL), то предикат IS NULL выдаст истину, а предикат IS NOT NULL – ложь. Примеры: • Список всех сотрудников, у которых нет адреса (адрес неопределен): select * from sotr where adres IS NULL ; • Список все проекты, у которых определена стоимость: select * from project where stoimost IS NOT NULL ;
Использование предикатов Задание 1: вывести список сотрудников, которых зовут ‘Иван'. select * from sotr where name LIKE '%Иван%'; Задание 2: вывести список проектов стоимостью от 1 до 2 млн. рублей. select * from project where stoimost BETWEEN 1000000 AND 2000000; Задание 3: вывести список сотрудников, которые являются начальниками отделов. select * from sotr where post LIKE 'нач%отдел%';
Агрегирующие функции COUNT – подсчёт количества строк (значений). Применяется к записям и полям любого типа. Имеет 3 формата вызова: Ø count (*) – количество строк результата; Ø count (имя_поля) – количество значений указанного поля, не являющихся NULL-значениями. Ø count (distinct имя_поля) – количество разных не-NULL значений указанного поля. MAX, MIN – определяет максимальное (минимальное) значение указанного поля в результирующем множестве. Применяется к полям любого типа. SUM – определяет арифметическую сумму значений указанного числового поля в результирующем множестве записей. AVG – определяет среднее арифметическое значений указанного числового поля в результирующем множестве записей. Не учитывает NULLзначения, и сумма значений поля делится на количество определённых значений.
Таблица Sotrnom Fam Name Pol Pos 1 Иванов Иван М Менеджер 1 24000 Москва, Арбат, 12 2 Иванова Мария Ж Менеджер 2 24000 Москва, Арбат, 12 3 Иванов Петр М Рабочий 1 12000 Москва, нижняя, 7 4 Петров Иван М Начальник 3 36000 москва, … 5 Петрова Ирина Ж Рабочий 3 12000 Уфа, … 6 Петров Василий М Начальник 3 36000 Киев 7 Попов Володя М Грузчик 2 6000 Петербург 8 Сидоров Иван М Бригадир 2 24000 Киев 9 Ким Ир М Рабочий 1 12000 Сеул 10 Чен Мао М Рабочий 3 12000 Пекин otdnom Zpl Adres
Примеры использования функции COUNT 1. Вывести количество сотрудников: SELECT count(*) FROM sotr; 2. Вывести количество сотрудников с телефонами: SELECT count( phone ) FROM sotr; 3. Вывести количество разных должностей сотрудников: SELECT count (DISTINCT pos) FROM sotr; 4. Задание: вывести количество сотрудников -менеджеров. SELECT count(*) FROM sotr WHERE pos = ‘ Менеджер’;
Примеры использования агрегирующих функций 1. Вывести максимальную и минимальную заработную плату: SELECT max(zpl) as ‘Макс. зарплата’, min(zpl) as ‘Мин. зарплата’ FROM sotr; 2. Вывести сумму зарплаты менеджеров: SELECT sum(zpl) FROM sotr WHERE pos = ‘ менеджер’; 3. Вывести среднюю зарплату сотрудниц предприятия: SELECT avg(zpl) FROM sotr WHERE pol = ‘ ж ';
Группировка данных: предложение GROUP BY Агрегирующие функции обычно используются совместно с предложением GROUP BY, с помощью которого создаются промежуточные итоги данных по группам. Например, следующая команда считает количество сотрудников по отделам: SELECT otdnom as ‘Номер отдела’, count(*) as ‘Количество сотрудников’ FROM sotr GROUP BY otdnom; otdnom Fam 1 2 Иванова 1 3 3 3 2 2 1 3 Иванов Петрова Петров Попов Сидоров Ким Чен Номер отдела Количество сотрудников 1 3 2 3 3 4
Примеры использования GROUP BY 1. Вывести минимальную и максимальную зарплату в каждом отделе: SELECT otdnom, MIN(zpl) as minzpl, MAX(zpl) as maxzpl FROM sotr GROUP BY otdnom; 2. Вывести количество разных должностей в каждом отделе: SELECT otdnom as ’Отд’, COUNT(distinct pos) as ‘Кол. должностей’ FROM sotr GROUP BY otdnom; 3. Посчитать сумму зарплат в каждом отделе: SELECT otdnom as ‘Отдел’, SUM(zpl) as ‘Сумма з/платы’ FROM sotr GROUP BY otdnom; 4. Посчитать среднюю зарплату по каждой должности: SELECT pos, AVG(zpl) as ‘Средняя зарплата’ FROM sotr GROUP BY pos;
Использование GROUP BY Правило использования GROUP BY : В списке вывода(SELECT) при использовании GROUP BY могут быть указаны только функции агрегирования, константы и поля, перечисленные в GROUP BY. Если включить в список выбора поля, не указанные в GROUP BY, то СУБД не будет выполнять такой запрос и выдаст ошибку "нарушение условия группирования" (not a GROUP BY expression). Например, нельзя получить сведения о том, у каких сотрудников самая высокая зарплата в своём отделе с помощью такого запроса: select otdnom, name, max(zpl) as max_zpl from sotr group by otdnom; Этот запрос синтаксически неверен!
Группировка по нескольким полям 1. Сумма зарплаты по отделам и по должностям: SELECT otdnom, pos, count(*), sum(zpl) FROM sotr GROUP BY otdnom, pos; 2. Количество мужчин и женщин по отделам: SELECT otdnom, pol, count(*) FROM sotr GROUP BY otdnom, pol; 3. Задание: вывести информацию о зарплате и количестве сотрудников, которые получают такую зарплату. SELECT zpl, count(*) FROM sotr GROUP BY zpl;
Использование фразы HAVING Если необходимо вывести не все записи, полученные в результате группировки (GROUP BY), то условие на группы можно указать во фразе HAVING (но не во фразе WHERE). Пример 1. Список отделов, в которых работает больше пяти человек: SELECT otdnom as ‘Номер отдела’, count(*) as ‘Кол. сотр' FROM sotr GROUP BY otdnom HAVING count(*)>5; Правило: нельзя указывать агрегирующие функции в части WHERE – это синтаксическая ошибка! 2: Вывести список отделов, в которых средняя зарплата больше 30000 рублей. SELECT otdnom, avg(zpl) FROM sotr GROUP BY otdnom HAVING avg(zpl) > 30000;
Операции реляционной алгебры ü Язык SQL основан на операциях реляционной алгебры (РА). ü Операции РА применяются к отношениям и в результате применения операций РА получаются отношения (таблицы). ü Различают унарные и бинарные операции РА: унарные применяются к одному отношению (таблице), бинарные – к двум. Унарные операции: Ø селекция – выбор из таблицы подмножества строк по условию. Например, список сотрудников 5 -го отдела: SELECT * FROM sotr WHERE otdnom = 5; Ø проекция – выбор из таблицы подмножества столбцов. Например, сведения о должности и зарплате сотрудников: SELECT name, pos, zpl FROM sotr;
Операция объединения Объединение реализуется с помощью специального ключевого слова UNION (или UNION ALL, если не нужно удалять повторы). Примеры: • Список сотрудников с телефонами или адресами (если нет телефона): SELECT otdnom, name, PHONE FROM sotr WHERE phone is not null UNION ALL SELECT otdnom, name, ADR FROM sotr WHERE phone is null;
Разность отношений Разность реализуется с помощью специального ключевого слова MINUS. Примеры: • Список сотрудников 5 -го и 8 -го отделов, которые не являются инженерами: SELECT * FROM sotr WHERE otdnom IN (5, 8) MINUS (EXEPT) SELECT * FROM sotr WHERE pos LIKE '%инженер%' ORDER BY otdnom;
Пересечение отношений Переcечение реализуется с помощью специального ключевого слова INTERSECT. Примеры: • Список сотрудников 5 -го и 8 -го отделов, которые являются инженерами: SELECT * FROM sotr WHERE otdnom IN (5, 8) INTERSECT SELECT * FROM sotr WHERE pos LIKE '%инженер%' ORDER BY otdnom; • Список сотрудников, которые переводились на другие должности: SELECT sotrnom, name FROM sotr INTERSECT SELECT sotrnom, name FROM archive;
Применение односхемных операций РА Задание 1: вывести список должностей, которые занимают (или занимали) сотрудники. SELECT pos FROM sotr UNION ALL SELECT pos FROM archive; Задание 2: вывести список должностей, на которые переназначены другие сотрудники. SELECT pos FROM sotr INTERSECT SELECT pos FROM archive; Задание 3: вывести список должностей, которые в настоящее время не занимает ни один сотрудник. SELECT pos FROM archive MINUS SELECT pos FROM sotr;
Лекция_3_Язык_SQL.pptx