Scala-библиотека Slick прекрасно зарекомендовала себя как развитый и удобный инструмент работы с базами данных. Поддерживаются и простейшие текстовые SQL-запросы, и строго типизированные join’ы нескольких таблиц. Для построения запросов Slick предоставляет DSL, код на котором выглядит как обработка коллекций. Причем простые подзапросы могут использоваться для конструирования более сложных.
Slick имеет весьма любопытную внутреннюю архитектуру, которая делает возможным не только продвинутое использование, но и расширение библиотеки несколькими способами, о которых и пойдет речь в докладе.
(see also video: https://youtu.be/9n1zzwOGado)
Web-программирование
Лекция #7. Django ORM
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
Web-программирование
Лекция #5. Введение в язык программирования Python 3
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Scala-библиотека Slick прекрасно зарекомендовала себя как развитый и удобный инструмент работы с базами данных. Поддерживаются и простейшие текстовые SQL-запросы, и строго типизированные join’ы нескольких таблиц. Для построения запросов Slick предоставляет DSL, код на котором выглядит как обработка коллекций. Причем простые подзапросы могут использоваться для конструирования более сложных.
Slick имеет весьма любопытную внутреннюю архитектуру, которая делает возможным не только продвинутое использование, но и расширение библиотеки несколькими способами, о которых и пойдет речь в докладе.
(see also video: https://youtu.be/9n1zzwOGado)
Web-программирование
Лекция #7. Django ORM
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
Web-программирование
Лекция #5. Введение в язык программирования Python 3
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных". Лекция №4 "Расширенные возможности работы с базами данных. Триггеры и хранимые процедуры"
Лектор - Павел Щербинин.
Первая часть лекции посвящена хранимым процедурам (использование, примеры кода, аспекты безопасности при использовании хранимых процедур): LOOP, REPEAT, WHILE, HANDLER, курсоры, EXECUTE. Во второй части рассказывается о триггерах: BEFORE, AFTER, INSTEAD OF, о специальных таблицах inserted, updated и deleted, об использовании триггеров для поддержания целостности и бизнес-логики, о проблемах при использовании триггеров, приводятся примеры кода. В завершающей части лекции обсуждаются вопросы, связанные с транзакциями: концепция A.C.I.D.; уровни изоляции ANSI/ISO (SET TRANSACTION ISOLATION LEVEL); взаимовлияние транзакций и проблемы lost update, dirty read, non-repeatable read и phantom read; технология MVCC (контроль версионирования конкуренции); конкуренция; параллельность и согласованность.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №7 "Оптимизация запросов и индексирование". Лектор - Павел Щербинин.
Вначале рассказывается об оптимизации доступа к данным, о декомпозиции соединения и состоянии запроса. Далее идёт большой блок, посвящённый оптимизатору запросов (изменение порядка соединения, применение алгебраических правил эквивалентности, оптимизации COUNT(), MIN(), MAX(), вычисление и свертка константных выражений, покрывающие индексы, оптимизация подзапросов, раннее завершение, сравнение по списку IN() и распространение равенства). Затем последовательно рассматриваются такие вещи, как соединение (JOIN) в MySQL, оптимизатор сортировки, коррелированные подзапросы, слияние и непоследовательный просмотр индексов, функции SELECT & UPDATE, COUNT(). После этого рассказывается об оптимизации запросов с помощью JOIN, GROUP BY, DISTINCT и LIMIT со смещением. В конце лекции даётся информация о кэшировании запросов, объединённых таблицах и секционировании.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Доклад рассматривает тонкости nodejs, а так же преимущества Evented I/O для серверных приложений. Будет предоставлен ряд рекоммендаций по правильному построению архитектуры, модульности, масштабированию, дизайну кода. Краткое введение в технологию программирования "волокнами" (fibers) и ряд других эффективных практик.
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьTanya Denisyuk
После этого доклада вы будете знать, что такое Handlersocket, нужен ли он вам и «как его готовить».
Все как обычно — грабли, шишки, слезы из реальной жизни, направления «куда копать», примеры из практики. Вместе с докладом Сергей выложит код самописного php-клиента для HS, который мы используем в Badoo.
InterBase XE7: Применение Change Views для синхронизации данныхAndrew Sovtsov
В последней версии СУБД Interbase XE7 появилась технология ChangeViews, которая резко упрощает и ускоряет синхронизацию изменений в базах данных Interbase. Как с помощью этой технологии упростить и оптимизировать процессы обеспечения целостности и согласованности данных, расскажет эксперт Дмитрий Кузьменко (iBase.ru). На русском языке.
Запись трансляции: http://youtu.be/0PAY8HohwWc
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-запросы". Лектор - Павел Щербинин.
Лекция открывается рассказом о том, что такое профилирование запроса, каковы его этапы выполнения в MySQL. Рассказывается о том, как планировать запрос, как осуществляется протоколирование запросов, как собирается статистика. Объясняются основы индексирования, подробно обсуждаются стратегии индексирования для достижения высокой производительности: изоляция столбца, кластерные индексы (преимущества и недостатки), размещение данных в MyISAM и InnoDB, покрывающие индексы. Далее затрагивается тема нормализации и денормализации, а также таблиц счётчиков. В завершении рассказывается о версионировании схемы БД: о методах инкрементных изменений, идемпотентных изменений, уподобления структуры БД исходному коду.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №9 "Безопасность баз данных". Лектор - Павел Щербинин.
Открывается лекция рассказом о резервном копировании (о логических и физических резервных копиях, о выборе данных для копирования). Затем определяется терминология для обсуждения дальнейших вопросов. После этого рассматриваются основы учётных записей: таблицы доступа, привилегии, виды записей. Обсуждаются SQL-injection, список смежных вершин (Adjacency Set), вложенное множество (Nested Set), материализованный путь (Materialized Path) и комбинированный подход.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №5 "Определение узких мест". Лектор - Павел Щербинин.
Вначале рассказывается о подсистемах хранения: MyISAM, InnoDB, Memory, о критериях выбора подсистем хранения, приводятся практические примеры. Затем обсуждается тема индексирования (B-tree, хеш-индексы) и EXPLAIN (столбцы id, table, possible_keys, key, key_len).
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных". Лекция №4 "Расширенные возможности работы с базами данных. Триггеры и хранимые процедуры"
Лектор - Павел Щербинин.
Первая часть лекции посвящена хранимым процедурам (использование, примеры кода, аспекты безопасности при использовании хранимых процедур): LOOP, REPEAT, WHILE, HANDLER, курсоры, EXECUTE. Во второй части рассказывается о триггерах: BEFORE, AFTER, INSTEAD OF, о специальных таблицах inserted, updated и deleted, об использовании триггеров для поддержания целостности и бизнес-логики, о проблемах при использовании триггеров, приводятся примеры кода. В завершающей части лекции обсуждаются вопросы, связанные с транзакциями: концепция A.C.I.D.; уровни изоляции ANSI/ISO (SET TRANSACTION ISOLATION LEVEL); взаимовлияние транзакций и проблемы lost update, dirty read, non-repeatable read и phantom read; технология MVCC (контроль версионирования конкуренции); конкуренция; параллельность и согласованность.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №7 "Оптимизация запросов и индексирование". Лектор - Павел Щербинин.
Вначале рассказывается об оптимизации доступа к данным, о декомпозиции соединения и состоянии запроса. Далее идёт большой блок, посвящённый оптимизатору запросов (изменение порядка соединения, применение алгебраических правил эквивалентности, оптимизации COUNT(), MIN(), MAX(), вычисление и свертка константных выражений, покрывающие индексы, оптимизация подзапросов, раннее завершение, сравнение по списку IN() и распространение равенства). Затем последовательно рассматриваются такие вещи, как соединение (JOIN) в MySQL, оптимизатор сортировки, коррелированные подзапросы, слияние и непоследовательный просмотр индексов, функции SELECT & UPDATE, COUNT(). После этого рассказывается об оптимизации запросов с помощью JOIN, GROUP BY, DISTINCT и LIMIT со смещением. В конце лекции даётся информация о кэшировании запросов, объединённых таблицах и секционировании.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Доклад рассматривает тонкости nodejs, а так же преимущества Evented I/O для серверных приложений. Будет предоставлен ряд рекоммендаций по правильному построению архитектуры, модульности, масштабированию, дизайну кода. Краткое введение в технологию программирования "волокнами" (fibers) и ряд других эффективных практик.
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьTanya Denisyuk
После этого доклада вы будете знать, что такое Handlersocket, нужен ли он вам и «как его готовить».
Все как обычно — грабли, шишки, слезы из реальной жизни, направления «куда копать», примеры из практики. Вместе с докладом Сергей выложит код самописного php-клиента для HS, который мы используем в Badoo.
InterBase XE7: Применение Change Views для синхронизации данныхAndrew Sovtsov
В последней версии СУБД Interbase XE7 появилась технология ChangeViews, которая резко упрощает и ускоряет синхронизацию изменений в базах данных Interbase. Как с помощью этой технологии упростить и оптимизировать процессы обеспечения целостности и согласованности данных, расскажет эксперт Дмитрий Кузьменко (iBase.ru). На русском языке.
Запись трансляции: http://youtu.be/0PAY8HohwWc
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-запросы". Лектор - Павел Щербинин.
Лекция открывается рассказом о том, что такое профилирование запроса, каковы его этапы выполнения в MySQL. Рассказывается о том, как планировать запрос, как осуществляется протоколирование запросов, как собирается статистика. Объясняются основы индексирования, подробно обсуждаются стратегии индексирования для достижения высокой производительности: изоляция столбца, кластерные индексы (преимущества и недостатки), размещение данных в MyISAM и InnoDB, покрывающие индексы. Далее затрагивается тема нормализации и денормализации, а также таблиц счётчиков. В завершении рассказывается о версионировании схемы БД: о методах инкрементных изменений, идемпотентных изменений, уподобления структуры БД исходному коду.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №9 "Безопасность баз данных". Лектор - Павел Щербинин.
Открывается лекция рассказом о резервном копировании (о логических и физических резервных копиях, о выборе данных для копирования). Затем определяется терминология для обсуждения дальнейших вопросов. После этого рассматриваются основы учётных записей: таблицы доступа, привилегии, виды записей. Обсуждаются SQL-injection, список смежных вершин (Adjacency Set), вложенное множество (Nested Set), материализованный путь (Materialized Path) и комбинированный подход.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №5 "Определение узких мест". Лектор - Павел Щербинин.
Вначале рассказывается о подсистемах хранения: MyISAM, InnoDB, Memory, о критериях выбора подсистем хранения, приводятся практические примеры. Затем обсуждается тема индексирования (B-tree, хеш-индексы) и EXPLAIN (столбцы id, table, possible_keys, key, key_len).
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...pgdayrussia
Доклад был представлен на официальной российской конференции PG Day'14 Russia, посвященной вопросам разработки и эксплуатации PostgreSQL.
Уникальный семинар от опытного "базиста" Ивана Фролкова призван наглядно пояснить слушателям адекватность применения реляционных СУБД на задачах веба. В рамках доклада Иван рассмотрит типичные "грабли", на которые натыкаются разработчики, и субоптимальные решения, изобретаемые с целью побороть возникшие проблемы. В качестве альтернативы, коллега Фролков наглядно пояснит, как эти же задачи решаются штатными средствами PostgreSQL.
В качестве бонуса Иван — "ветеран" промышленной разработки ПО для реляционных СУБД — проведет краткий ликбез по рекомендуемым практикам построения SQL-запросов и программирования на языке PL/PGSQL.
1. Язык SQL
Современное состояние дел в области создания и поддержки ИС характеризуется наличием пока единственного
стандартного языка для работы с БД. Практически все крупнейшие разработчики СУБД создают свои продукты
с использованием языка SQL.
Язык SQL был разработан фирмой IBM в конце 1970-х годов.
Развитие языка определяется и контролируется стандартом ISO/ANSI.
Существует несколько стандартов языка: SQL1 (1987г.), SQL2 (1992г), SQL3 (1999г -
содержит некоторые объектно-ориентированные расширения. Эта версия не привлекла особого
внимания со стороны фирм-разработчиков СУБД.).
Компании, поставляющие СУБД, предлагают свои реализации SQL, все они в большей или
меньшей степени отличаются от стандарта. Существует три уровня соответствия стандарту
ANSI: начальный, промежуточный и полный.
1. Типы данных
В разных реализациях SQL поддерживаются различные типы данных. Например, в SQL2:
числовой, строковый, логический, даты-времени, интервальный.
Внутри каждого из этих типов может быть несколько подтипов.
Точные числовые типы - позволяют точно выразить значение числа. Точность -это
максимально возможное количество цифр.
INTEGER или INT (целый) - точность зависит от конкретной реализации SQL (например, 32
битовое двоичное число), и соответственно не может быть установлена разработчиком БД.
SMALLINT (малый целый) - его точность не может быть больше точности типа INTEGER
(например, 16 битовое двоичное число).
NUMERIC [(n,m)] (числовой) - кроме целого компонента может быть и дробный. n - общее кол-во
цифр в числе, m - кол-во цифр слева от десятичной точки.?
Например, для числа 567,56 тип данных NUMERIC(5,2). Точность равна 5, а масштаб 2. Для
этого типа нельзя поместить числа, большие 999,99).
DECIMAL[(n,m)] или DEC[(n,m)] (десятичный)
Приблизительные числовые типы - для чисел с плавающей запятой. Для чисел с большим
диапазоном возможных значений, когда компьютер с данным размером регистра (32, 64, 128 бита) не может в
точности представить их.
REAL (действительное число) - точность определяется используемым оборудованием
DOUBLE PRECISION (двойная точность) - точность зависит от аппаратуры
FLOAT [(n)] (плавающий) - дает возможность указывать точность, n - число байтов,
резервируемое под хранение одного числа.
Строковые данные
CHARACTER [(n)] или CHAR[(n)] - символьные строки постоянной длины в n символов.
Если символов вводится меньше, чем может поместиться в поле, то свободные позиции
заполняются пробелами.
CHARACTER VARYING или VARCHAR(n) - строки символов переменной длины, n -
максимально разрешенное кол-во символов. Дает возможность сохранять то количество
символов, которое ввел пользователь (нет заполнения пробелами).
Логические данные - BOOLEAN (булев) - имеет значения true (истина), false (ложь),
unknown (неизвестное) .
Интервалы - INTERVAL - это разница между двумя значениями даты-времени.
2. 2. Операторы языка SQL
Операторы SQL подразделяются на несколько категорий.
1) Операторы определения данных (DDL) - применяются для описания структур
используемых данных.
CREATE (создать) TABLE CREATE VIEW
ALTER (изменить) TABLE ALTER VIEW
DROP(прекратить) TABLE DROP VIEW
Не предусмотренные стандартом (дополнительные средства)
CREATE DOMAIN CREATE INDEX
ALTER DOMAIN DROP INDEX
DROP DOMAIN
2) Операторы манипулирования данными (DML) - предназначены для заполнения
таблиц данными и для обновления загруженной в них информации.
DELETE - удаляет из таблицы одну или несколько строк, соответствующих условиям
фильтрации.
INSERT - вставляет одну строку в таблицу
UPDATE - обновляет значения одного или нескольких столбцов в одной или нескольких
строках, соответствующих условиям фильтрации
3) Оператор запросов - SELECT - для выборки информации из БД.
4) Операторы управления транзакциями
COMMIT - завершить транзакцию
ROLLBACK - откатить транзакцию
SAVEPOINT- сохранить промежуточную точку выполнения транзакции.
5) Средства администрирования данных
CREATE DATABASE - создать новую БД
ALTER DATABASE - изменить набор основных объектов в БД, ограничений, касающихся
всей БД.
DROP DATABASE - удалить существующую БД
CREATE DBAREA - создать новую область хранения и сделать ее доступной для
размещения данных.
ALTER DBAREA - изменить ранее созданную область хранения
DROP DBAREA - удалить существующую область хранения
ALTER PASSWORD - изменить пароль для всей БД
GRANT - предоставить права доступа на ряд действий над некоторым объектом БД
REVOKE - лишить права доступа к некоторому объекту или некоторым действиям над
объектом.
Соглашения, применяемые для записи операторов:
− прописные буквы используются для записи зарезервированных слов;
− строчные буквы - для записи определяемых пользователем слов;
− вертикальная черта "|" указывает на необходимость выбора одного из нескольких
значений;
− { } - определяют обязательный элемент;
− [ ] - определяют необязательный элемент
− многоточие "…" используется для указания необязательной возможности повторения
конструкции.
3. 3. Операторы определения данных
Создание таблиц
- создавать таблицы необходимо в определенным порядке: вначале родительские, затем
дочерние.
Формат оператора:
CREATE TABLE ИмяТаблицы (
{ИмяСтолбца ТипДанных [NOT NULL] [UNIQUE]
[DEFAULT значение по умолчанию]
[CHECK (условие проверки на допустимость),]
[…] }
[PRIMARY KEY (список столбцов),]
[UNIQUE (список столбцов), […] ]
[FOREIGN KEY (список столбцов внешних ключей)
REFERENCES имя род таб [(список столбцов первичных ключей)],
[ON UPDATE правило ссылочной целостности]
[ON DELETE правило ссылочной целостности] ,]
[CHECK (условие проверки на допустимость)] [, …]} );
Ключевое слово:
1. NULL означает, что столбец может содержать неопределенные значения.
2. CHECK(ограничение) задает ограничения для доменов атрибутов.
3. PRIMARY KEY обеспечивает смысловую целостность данных.
4. UNIQUE обеспечивает уникальность альтернативных ключей.
5. FOREIGN KEY - для определения внешних ключей.
Поддержка ссылочной целостности предполагает определение поведения системы в случае попытки обновить
или удалить значение первичного ключа в родительской таблице, если с ним связана хотя бы одна строка
дочерней таблицы.
Поддержка ссылочной целостности осуществляется фразами ON UPDATE и ON DELETE
предложения FOREIGN KEY, где необходимо выбрать один из возможных квалификаторов:
− NO ACTION - удаление или изменение строки из родительской таблицы отменяется;
используется по умолчанию также и в том случае, когда фраза ON DELETE или ON UPDATE опущена.
− CASCADE - удаление или изменение строки из родительской таблицы приводит к
автоматическому удалению или изменению всех ссылающихся на нее строк дочерней
таблицы; если дочерняя таблица связана с другими таблицами, то изменения распространяются далее
аналогичным образом:
− SET NULL - удаление строки из родительской таблицы приводит к автоматическому
присвоению внешним ключам ссылающихся строк дочерней таблицы NULL-значений;
этот вариант может использоваться только в том случае, если в определении столбца внешнего ключа
отсутствует ключевое слово NOT NULL.
− SET DEFAULT - удаление строки из родительской таблицы приводит к автоматическому
присвоению внешним ключам ссылающихся строк дочерней таблицы значений,
принимаемых по умолчанию; этот вариант может использоваться только в том случае, если в
определении столбца внешнего ключа присутствует ключевое слово DEFAULT и задано значение,
используемое по умолчанию.
4. Удаление таблиц
Формат оператора:
DROP TABLE имя_таблицы [RISTRICT | CASCADE]
Ключевые слова RISTRICT и CASCADE определяют условия удаления таблицы в том
случае, если в БД присутствуют ее дочерние таблицы.
− RISTRICT вызовет отмену удаления;
− CASCADE вызывает автоматическое удаление всех объектов БД, существование
которых зависит отданной таблицы.
Обновление таблиц
В уже созданную таблицу изменения могут быть внесены с помощью оператора ALTER TABLE.
Формат оператора:
ALTER TABLE имя_таблицы
[ADD [COLUMN] имя_столбца тип_данных [NOT NULL] [UNIQUE]
[DEFAULT значение по умолчанию]
[CHECK (условие проверки на допустимость)]]
[DROP [COLUMN] имя_столбца [RISTRICT | CASCADE]]
[ADD [CONSTRAINT [имя ограничения]]ограничение]
[DROP CONSTRAINT имя ограничения [RISTRICT | CASCADE]]
[ALTER [COLUMN] SET DEFAULT значение по умолчанию]
[ALTER [COLUMN] DROP DEFAULT]
В данном формате предусмотрены возможности для выполнения ряда действий:
− ADD (DROP) COLUMN - добавить (удалить) новый столбец.
− ADD (DROP) CONSTRAINT - добавить (удалить) новое ограничение
− ALTER [COLUMN] SET (DROP) DEFAULT - задать (отменить) для существующего
столбца значение по умолчанию
Фразы, связанные с удалением компонентов таблиц (столбца или ограничения), содержат
дополнительное кл. слово, позволяющее уточнить порядок удаления:
− CASCADE - удаление осуществляется каскадным образом с удалением ссылок на
удаляемый компонент;
− RISTRICT (используется по умолчанию) - удаление отменяется, если существуют
ссылки на удаляемый компонент.
Одним оператором ALTER TABLE можно провести только одно изменение таблицы,
например, за один раз можно добавить один столбец. Чтобы добавить два столбца в
таблицу, необходимо использовать два оператора.
5. 4. Операторы манипулирования данными
Оператор ввода данных
Формат оператора для ввода одиночной строки:
INSERT INTO имя_таблицы [(список столбцов)]
VALUES (список значений);
Между списком имен столбцов и списком значений должно быть строгое соответствие:
− Кол-во элементов в обоих списках должно быть одинаковым
− Между положением элементов в списках должно быть строгое соответствие, которое определяется слева
направо: первый элемент одного списка соответствует первому элементу второго и т.д.
− Типы данных соответствующих элементов списков должны быть одинаковые и принадлежать к одному м
тому же домену.
Например, дана таблица: СОТРУДНИКИ (ТабN, ФИО, Стаж_работы, Дата_рождения, Адрес)
Пример 1 INSERT INTO Сотрудники (ТабN, ФИО, Стаж)
VALUES (101,'Сидоров П.П.', 15,);
Если вводится строка с заданием значений для всех столбцов, то задание списка столбцов
необязательно.
Пример 2 INSERT INTO Сотрудники
VALUES (101,'Сидоров П.П.', 15, '05.04.1978', 'Омск');
Формат оператора ввода сразу нескольких строк, при копировании их из другой таблицы:
INSERT INTO имя_таблицы [(список столбцов)]
SELECT …
Пример 3 INSERT INTO Сотрудники1 (ТабN, ФИО)
SELECT ТабN, ФИО
FROM Сотрудники;
Оператор удаления данных
Формат оператора:
DELETE FROM имя_таблицы
[WHERE условия_отбора]
Пример DELETE FROM Сотрудники
WHERE ТабN =101
Если условия отбора не задаются, то из таблицы удаляются все существующие в ней строки.
Таблица при этом остается пустой, незаполненной.
Оператор обновления данных
Имеет следующий формат:
UPDATE имя_таблицы
SET имя_столбца1 = новое_значение, [имя столбца2 = новое_значение2…]
[WHERE условие_отбора]
Новые данные должны быть совместимы с теми данными, которые они заменяют.
Если условие отбора не задается, то операция модификации будет применена ко всем
строкам таблицы.
Например, для таблицы ДОЛЖОКЛАД (Должность, Оклад)
Пример 1 UPDATE ДолжОклад
SET Оклад = Оклад*1,3
Пример2 UPDATE ДолжОклад
SET Оклад = Оклад*1,3
6. WHERE Должность='Лаборант' AND Должность = 'Ст.лаборант';
5. Оператор выбора SELECT
Назначение оператора в выборке и отображении данных одной или нескольких таблиц БД. Этот исключительно
мощный (и самый сложный), часто используемый оператор.… реализует все операции реляционной
алгебры.
Формат оператора:
SELECT [DISTINCT | ALL] {* | [список столбцов] }
FROM СписокТаблиц
[WHERE условие выборки или соединения]
[GROUP BY список столбцов группировки]
[HAVING условие для группы]
[ORDER BY список столбцов и условие упорядочивания]
Указанный порядок следования предложений в операторе SELECT не может быть изменен.
В предложении SELECT:
1) кл. слово ALL (используется по умолчанию) - в результирующую таблицу включаются
все строки, удовлетворяющие условиям запроса, что может привести к появлению
одинаковых строк;
2) кл. слово DISTINCT (отличающийся) устраняет дублирование строк;
3) "*" - символ-маска означает "все", в результирующую таблицу включаются все столбцы
из исходной.
Уточняющие предложение:
1) FROM (из) задает перечень исходных таблиц запроса.
2) WHERE (где) фильтрует строки, удовлетворяющие условию поиска, и отбрасывает все
остальные.
В качестве условий отбора могут быть использованы следующие предикаты (предикаты -
это используемые в SQL эквиваленты логических высказываний. Предикат - это выражение,
которое утверждает факт, относящийся к значениям из этого выражения):
− сравнения "=, <>, <, >, >=, <= - для сравнения результатов вычисления двух выражений; более
сложные выражения строятся с помощью логических операторов AND, OR, NOT;
− BETWEEN (между) A AND B (NOT BETWEEN A AND B) - предикат истинен, когда
вычисленное значение выражения попадает (не попадает) в заданный диапазон;
− IN(в) (NOT IN (не в) ) - предикат истинен тогда, когда сравниваемое значение входит (не входит) в
множество заданных значений;
− LIKE (похожий) (NOT LIKE (не похожий) ) предикат истинен тогда, когда сравниваемое
значение соответствует шаблону, и ложен в противном случае (и наоборот);
− IS NULL - предикат, применяющийся для выявления равенства значения некоторого атрибута
неопределенному значению:
3. GROUP BY (группировать по) группирует строки в соответствии со значениями в
столбцах группирования.
4. HAVING (при условии) задаются предикаты-условия, накладываемые на каждую группу.
5. ORDER BY (упорядочивать по) задается список полей упорядочения результата, ASC
-по возрастанию, DESC - по убыванию.
Порядок выполнения этих предложений: FROM, WHERE, GROUP BY, HAVING, SELECT и
ORDER BY.
7. Предложения работают по принципу конвейера, когда каждое из них получает результат выполнения
предыдущего предложения, обрабатывает этот результат и передает то, что получилось, следующему
предложению.
SELECT(HEVING(GROUR BY(WHERE(FROM…))))
Чтение заданных столбцов и строк из одиночной таблицы
Например, дана таблица: СОТРУДНИКИ (ТабN, ФИО, Стаж_работы, Дата_рождения, Адрес)
Запрос 1: Вывести все сведения о всех сотрудниках
SELECT *
FROM Сотрудники;
Результатом выполнения запроса будет вся таблица сотрудники.
Запрос 2: Вывести адреса сотрудников
SELECT Фамилия, Адрес
FROM Сотрудники;
В сформированных выше запросах требовалось вывести все строки таблицы. Если при выборке требуется
ограничить количество выводимых строк в соответствии с каким-то условием, то этого можно достичь,
используя в запросе предложение WHERE. В предложение WHERE можно включать одно или несколько
условий отбора.
Запрос 3: Вывести сведения о конкретном сотруднике
SELECT *
FROM Сотрудники
WHERE Фамилия = 'Иванов';
Запрос 4: Вывести сведения о сотрудниках, ТабN которых лежит в диапазоне от 12 до 44.
SELECT *
FROM Сотрудники
WHERE ТабN BETWEEN 12 and 44;
Сортировка результатов
По умолчанию сортировка производится в порядке возрастания.
Запрос 5: Cведения о сотрудниках, отсортированные по столбцу ФИО в порядке
возрастания.
SELECT *
FROM Сотрудники
ORDER BY ФИО;
Сортировать можно и более чем по одному столбцу.
Запрос 6: Сортировка столбец ФИО - по возрастанию, стаж - по убыванию.
SELECT ФИО, Стаж
FROM Сотрудники
ORDER BY Фамилия ASC, Стаж DESC;
Итоговые функции SQL
Итоговые функции: SUM, AVG, MIN, MAX, COUNT - применяются к наборам строк из
таблицы. В набор могут входить все строки или только те из них, которые определяются
предложением WHERE.
COUNT(счет) - подсчитывает кол-во значений в указанном столбце
В качестве операнда итоговых функций может использоваться наименование только одного
столбца, и все они возвращают единственное значение.
8. С ф-ями SUM и AVG могут использоваться только числовые поля. С ф-ями COUNT, MIN,
MAX - как числовые так и символьные поля.
Стандарт языка не позволяет применять итоговые функции в предложении WHERE, потому
что предикаты оцениваются в терминах одиночной строки, а итоговые функции - в терминах
групп строк.
Запрос 7: Подсчитать и вывести общее число сотрудников
SELECT COUNT(*) AS Всего_сотрудников
FROM Сотрудники;
Аргумент представлен символом "*", определяющим подсчет всех строк.
Результат запроса:
Всего_сотрудников
55
Запрос 8: Вывести средний стаж работы сотрудников
SELECT AVG(Стаж_работы) AS Средний_стаж
FROM Сотрудники;
Результат запроса:
Средний_стаж
9
Итоговые функции и группировка
В приведенных выше запросах агрегатные функции применялись ко всей таблице и выдавали сводные данные
на основании обработки значений всего выделенного столбца.
Однако часто встречаются ситуации, когда в отчет необходимо поместить и промежуточные результаты,
опирающиеся на вычисления обобщенных групповых значений. Для применения итоговых функций в
подобных случаях предполагается предварительная операция группировки.
Суть группировки - все множество строк таблицы разбивается на группы, в каждой из
которых собираются строки, имеющие одинаковые значения атрибутов. Обработка такой
информации реализуется применением итоговых функций к каждой отдельной группе.
Если в запросе должна использоваться группировка, то каждый элемент списка в
предложении SELECT должен иметь единственное значение для всей группы.
Например, дана таблица СЕССИЯ.
Код ФИО Дисциплина Оценка
1 И И 4
2 П И 3
3 С И 5
4 И Ф 4
5 С Ф 5
6 И М 3
7 К М 3
Запрос 9: Для каждого студента определить количество сданных им экзаменов
SELECT ФИО, COUNT(Оценка) AS Сдано_экз
FROM Сессия
GROUP BY ФИО;
Результат запроса:
ФИО Сдано_экз
И 3
К 1
П 1
С 2
9. Совместно с фразой GROUP BY может быть использована фраза HAVING, предназначенная для задания
ограничений отбора групп, которые будут помещены в результирующую таблицу запроса. Стандарт языка
требует, чтобы имена столбцов во фразе HAVING обязательно присутствовали в списке фразы GROUP BY или
применялись в агрегатных функциях.
Агрегатные функции могут применяться не только в выражении вывода результатов строки SELECT, но и в
выражении условия обработки сформированных групп HAVING. В этом случае каждая агрегатная функция
вычисляется для каждой выделенной группы.
В результат можно включить значение поля группировки и несколько агрегатных функций, а в условиях
группировки можно использовать несколько полей. При этом группы образуются по набору заданных полей
группировки. Операции с агрегатными функциями могут быть применены к объединению множества исходных
таблиц.
Запрос 10: Вывести ФИО студентов, сдавших все три экзамена.
SELECT ФИО, COUNT(Оценка) AS сдано_экз
FROM Сессия
GROUP BY ФИО
HAVING COUNT(ФИО) = 3;
Результат запроса:
ФИО Сдано_экз
И 3
Вложенные запросы (подзапросы)
… создаются, когда в тело одного оператора SELECT (внешнего), внедряют другой оператор
SELECT (внутренний).
Обычно внутренний запрос генерирует значение, которое проверяется в предикате внешнего
запроса (в предложении WHERE или HAVING), определяющего верно оно или нет.
Подзапросы могут быть нескольких видов:
− Скалярный подзапрос, возвращающий единственное значение
− Строковый подзапрос, возвращающий несколько значений в виде одной строки
− Табличный подзапрос, возвращающий данные в виде таблицы.
Подзапрос может указываться непосредственно после операторов сравнения (<,>,=, <=, >=).
Правила организации вложенных запросов:
− подзапрос, участвующий в операции, может быть только правым операндом.
− текст запроса должен быть заключен в скобки
− по умолчанию имена столбцов в подзапросе относятся к таблице, указанной во фразе
FROM
− в подзапросе не должна использоваться фраза ORDER BY
Запрос 11. Вывести фамилии студентов и дисциплины по которым у них оценки выше
средней за сессию. (3,7)
SELECT ФИО, Дисциплина, Оценка
FROM Сессия
WHERE Оценка > (SELECT AVG(Оценка) FROM Сессия);
Стандарт языка не позволяет применять агрегатные функции в предложении WHERE, поэтому оценки
необходимо сравнивать с результатом подзапроса, вычисляющего среднее значение начислений всех строк
таблицы. Данный скалярный подзапрос вернет значение, равное 3,85, и уже с этим значением будут
сравниваться все начисления и отбираться для помещения в таблицу вывода.
Результат запроса
ФИО Дисциплина Оценка
И И 4
С И 5
И Ф 4
С Ф 5
10. Многотабличные запросы
Все запросы, рассмотренные нами до сих пор, считывали данные из одиночной таблицы. Во многих случаях
для получения ответа на запрос необходимо объединить информацию из нескольких исходных таблиц.
Чтение данных из нескольких таблиц осуществляется с помощью операторов реляционной
алгебры JOIN (соединение), UNION (объединение), INTERSECT (пересечение) и EXCEPT
(разность), а также возможно с помощью вложенных запросов (в том случае, если
результаты, т.е. столбцы в предложении SELECT относятся к одной и той же таблице).
1. Использование операции соединения (JOIN).
Использование операции соединения позволяет получать данные из таблиц, имеющих
разную структуру.
Самый простой оператор соединения - это оператор SELECT, выполняемый с двумя
таблицами не имеющий никаких ограничителей из предложения WHERE. Результат
соединения - это декартово произведение исходных таблиц (каждая строка из первой
таблицы объединяется с каждой строкой из второй).
Запрос 12. Получить экзаменационную ведомость
СТУДЕНТЫ ЭКЗАМЕНЫ
Nзачкн ФИО
В-02 И
В-03 П
В-04 С
SELECT *
FROM Студенты, Экзамены;
Результат запроса
(соответствует декартову произведению таблиц СТУДЕНТЫ и ЭКЗАМЕНЫ.)
Nзачкн ФИО КодДис Дисциплина Дата Оценка
В-02 И 01 Ф 01.05.05
В-02 И 02 М 15.05.05
В-03 П 01 Ф 01.05.05
В-03 П 02 М 15.05.05
В-04 С 01 Ф 01.05.05
В-04 С 02 М 15.05.05
Часто таблица, получаемая простым соединением (декартово произведение) имеет
значительный излишек данных и не имеет особого смысла. Получить более содержательный
результат можно, отфильтровав из объединения ненужные строки с помощью ограничений
предложения WHERE.
Запрос 13. В ведомость СЕССИЯ добавить сведения о группе студентов.
СЕССИЯ
Код ФИО Дисциплина Оценка
1 И И 4
2 П И 4
4 И Ф 4
5 С Ф 5
6 И М 3
SELECT Сессия.ФИО, Дисциплина, Оценка, Группа
ГРУППА
ФИО Группа
И В-443
П В-443
С В-442
КодДис Дисциплина Дата Оценка
01 Ф 01.05.05
02 М 15.05.05
11. FROM Сессия,Группа
WHERE Сессия.ФИО=Группа.ФИО;
Результат запроса:
ФИО Дисциплина Оценка Группа
И И 4 В-443
П И 4 В-443
И Ф 4 В-443
С Ф 5 В-442
И М 3 В-443
Для облегчения ввода и чтения кода SQL используют псевдонимы таблиц. Псевдоним - это
другое, более короткое имя таблицы.
Предыдущий запрос с использованием псевдонимов:
SELECT С.ФИО, Дисциплина, Оценка, Группа
FROM Сессия AS С, Группа AS Г
WHERE С.ФИО=Г.ФИО;
Ключевое слово AS можно опустить:
SELECT С.ФИО, Дисциплина, Оценка, Группа
FROM Сессия С, Группа Г
WHERE С.ФИО=Г.ФИО;
В стандарте SQL2 введен альтернативный синтаксис соединения. Здесь вместо WHERE
используются ключевые слова JOIN и ON.
SELECT С.ФИО, Дисциплина, Оценка, Группа
FROM Сессия С JION Группа Г
ON С.ФИО=Г.ФИО;
Таблицу, получившуюся в результате соединения можно обрабатывать, как и любую другую.
Запрос 14. Вывести группы, в которых на экзаменах получены четверки.
SELECT Группа
FROM Сессия С, Группа Г
WHERE С.ФИО=Г.ФИО AND Оценка=4
GROUP BY Группа;
Группа
В-443
2. Использование операторов UNION, INTERSECT, EXCEPT.
Перечисленные операторы дают возможность получать информацию из таблиц, имеющих
одинаковую структуру.
Одинаковая структура означает:
1. Во всех таблицах имеется одинаковое количество столбцов.
2. У всех соответствующих столбцов должны быть идентичный тип данных и одинаковая
длина.
Схема построения всех указанных операторов одинакова:
(SELECT - запрос)
Оператор
12. (SELECT - запрос)
Оператор
(SELECT - запрос)
Запрос 15. Какие типы деталей входят в состав обоих изделий?
ИЗДЕЛИЕ1 ИЗДЕЛИЕ2
Код_д Назв. Вес
1 A 1
3 B 2
4 C 3
(SELECT * FROM Изделие1)
UNION
(SELECT * FROM Изделие2);
Результат запроса:
Код_д Назв. Вес
1 A 1
2 D 2
3 В 2
4 С 3
Операция UNION убирает любые повторяющиеся строки. В большинстве случает это
желаемый результат. Но иногда повторяющиеся строки требуется сохранять. В таких
случаях используется ключевое слово ALL (UNION ALL).
(SELECT * FROM Изделие1)
UNION ALL
(SELECT * FROM Изделие2);
Результат запроса:
Код_д Назв. Вес
1 A 1
2 D 2
3 В 2
4 С 3
3 B 2
4 C 3
Аналогично используются операторы INTERSECT, EXCEPT.
3. Использование вложенных запросов.
Код_д Назв. Вес
2 D 2
3 В 2
4 С 3