
- •Sql на практике введение
- •1. История развития языка sql
- •Sql в коммерческих реализациях
- •Стандартизация sql
- •Международный стандарт 1989 г.
- •Международный стандарт 1992 г. (sql2)
- •Стандарт sql:1999 (sql3)
- •Стандарт sql:2003
- •2. Sql в примерах
- •I. Простые запросы на языке sql
- •Примеры
- •II. Использование функций
- •1. Агрегатные функции
- •2. Строковые функции
- •III. Запросы, использующие соединения
- •IV. Группирование
- •V. Построение внешнего соединения и представления
- •VI. Подзапросы
- •Некоррелированные подзапросы
- •Коррелированный подзапросы
- •VIII. Обьеденение
- •IX. Оператора манипулирования данными. Удаление данных
- •X. Оператора манипулирования данными. Вставка данных
- •XI. Операторы манипулирования данными. Обновление данных
- •3. Практические советы
- •1. Хорошо знайте свои данные и бизнес-приложение
- •2. Тестируйте свои запросы на реалистических данных
- •3. Внимательно относитесь к использованию индексов на таблицах
- •4. Для фильтрации записей используйте where, а не having.
- •5. Минимизируйте число просмотров таблиц
- •6. Избыточность полезна
- •7. Где возможно, избегайте использования соединений
- •8. Если это неизбежно, соединяйте таблицы в правильном порядке
- •9. Старайтесь писать как можно более простые и «тупые» операторы sql
XI. Операторы манипулирования данными. Обновление данных
Общая форма оператора обновления
Update таблица
set поле=выражение [,поле=выражение]...[where предикат]
1. Обновление единственной записи.
Изменить цвет детали P2 на желтый, увеличить ее вес на 5 и установить значение города "неопределен".
Update P set цвет='желтый',
вес=вес+5,
город=NULL
where номер_детали='P2'
Результат: Таблица S c внесенными изменениями.
2. Обновление множества записей.
Удвоить рейтинг всех поставщиков в Лондоне.
Update S set рейтинг=2*рейтинг
where город='Лондон'
Результат: Таблица S с увеличенным рейтингом для поставщиков из Лондона.
3. Обновление с подзапросом.
Установить объем поставок, равный нулю для поставщиков из Лондона.
update SP set количество=0
where 'Лондон'=
(Select город
from S
where S.номер_поставщика=SP.номер_поставщика)
Результат: Таблица SP с внесенными изменениями.
3. Практические советы
1. Хорошо знайте свои данные и бизнес-приложение
Знание источников и объемов получения данных является обязательным. Вы также должны иметь полное понимание используемой модели данных (равно как и связей между разными бизнес-объектами) до написания требуемых операторов SQL.
2. Тестируйте свои запросы на реалистических данных
3. Внимательно относитесь к использованию индексов на таблицах
Постарайтесь создать все необходимые индексы. Создание индекса:
Create index <имя_индекса> on <имя_таблицы> (<имя_поля>,.. имя_поля>,..)
Создание индекса сводится к созданию набора данных, в котором указанные поля таблицы сортируются в соответствии с физическим расположением записи (rowid), что позволяет в последствии при поиске использовать бинарные и другие методы поиска.
Запрос
Select . . . from Persons where company_id=105
потребует незначительного времени, поскольку значения индексов в наборе данных будут искаться как минимум двоичным поиском.
Однако слишком большое число индексов может привести к снижению эффективности. Основные правила:
Создавайте индексы только в тех случаях, когда число строк > 200.
Создавайте индексы на столбцах, которые часто используются в разделе WHERE.
Индексируйте столбцы, часто используемые в операторах SQL для соединения таблиц.
Используйте для индексирования только те столбцы, в которые входит небольшой процент строк с одним и тем же значением.
Не индексируйте столбцы, которые используются только в функциях.
Не индексируйте часто изменяемые столбцы.
Не применяйте индексацию в тех случаях, когда повышение эффективности за счет создания индекса приводит к снижению эффективности при выполнении операций INSERT, UPDATE и DELETE, поскольку при выполнении каждой из отмеченных операций набор индексов будет перестраиваться.
4. Для фильтрации записей используйте where, а не having.
При использовании having вместе с group by на индексированных столбцах индекс не используется. Фильтруйте строки с помощью раздела where. Если для таблицы EMP существует индекс на столбце DEPTID, при выполнении следующего запроса этот индекс использоваться не будет:
Select deptid, sum(salary)
From emp
Group by deptid
Having deptid = 100;
Однако этот запрос можно переписать так, чтобы индекс применялся:
Select deptid, sum(salary)
From emp
Where deptid = 100
Group by deptid;