292.52K
Category: databasedatabase

Структурированный язык запросов

1.

Структурированный язык
запросов

2.

SQL
SQL (Structured Query Language) – символизирует
собой Структурированный Язык Запросов.
SQL – это язык, который дает Вам возможность
создавать и работать в реляционных базах данных.

3.

Состав языка SQL
• DDL – язык определения данных;
• DML – язык манипулирования данными;
• DQL – язык запросов;
• DCL – язык управления данными;
• команды администрирования данных;
• команды управления транзакциями;
• процедурный SQL.

4.

Команда
Объект
Описание
DDL (определение данных)
create
Table (таблица)
View (представление)
Создание
alter
Изменение структуры
drop
Удаление
DML (манипулирование данными внутри одного объекта)
Update
Вставка одной строки в
таблицу
Обновление значений таблицы
Delete
Удаление кортежа из таблицы
Insert

5.

Команда
Объект
Описание
DQL (язык запросов к данным – выборка данных в соответствии с
критериями)
Select
Конструирование
запросов
любой
сложности
DCL (язык управления данными – контроль над возможностью доступа к
данным внутри БД, назначение пользователю подходящих привилегий – прав доступа)
Alter
Database
Изменение набора основных объектов и
Dbarea
ограничений всей БД
Password
Изменение области хранения
Изменение пароля для всей БД
Create
Drop
Database
Dbarea
Создать БД/область хранения
Удалить …
Grant
Предоставление прав доступа
Revoke
Лишение прав доступа

6.

Команда
Объект
Описание
Команды администрирования БД
Start audit
Начало анализа операций внутри БД
Stop audit
Завершение анализа операций внутри БД
Команды управления транзакциями
Commit
Сохранение транзакции
RollBack
Отмена транзакции
Save point
Set translation
Создание точки отката внутри групп
транзакций
Назначение имени транзакции

7.

DDL – язык определения
данных

8.

Задача
Создание таблиц и объектов в базе данных, в которых будет
храниться информация о сущностях предметной области.
Вход: логическая модель базы данных
Выход: скрипт для создания таблиц на языке определения данных
DDL (Data Definition Language).

9.

Числовые типы данных
• BIT: хранит значение от 0 до 16. Может выступать аналогом булевого типа в
языках программирования.
• TINYINT: хранит числа от 0 до 255.
• SMALLINT: хранит числа от –32 768 до 32 767.
• INT: хранит числа от –2 147 483 648 до 2 147 483 647.
• BIGINT: хранит очень большие числа от -9 223 372 036 854 775 808 до 9 223
372 036 854 775 807.
• DECIMAL: хранит числа c фиксированной точностью. Может принимать два
параметра precision и scale: DECIMAL(precision, scale).
Precision представляет максимальное количество цифр, которые может
хранить число. Это значение должно находиться в диапазоне от 1 до 38. По
умолчанию оно равно 18.
Scale представляет максимальное количество цифр, которые может
содержать число после запятой. Это значение должно находиться в
диапазоне от 0 до значения параметра precision. По умолчанию оно равно 0.

10.

Числовые типы данных
• NUMERIC: данный тип аналогичен типу DECIMAL.
• SMALLMONEY: хранит дробные значения от -214 748.3648 до 214 748.3647.
Предназначено для хранения денежных величин.
• MONEY: хранит дробные значения от -922 337 203 685 477.5808 до 922 337
203 685 477.5807.
• FLOAT: хранит числа от –1.79E+308 до 1.79E+308.
Может иметь форму определения в виде FLOAT(n), где n представляет число
бит, которые используются для хранения десятичной части числа. По
умолчанию n = 53.
• REAL: хранит числа от –3.40E+38 до 3.40E+38.

11.

Типы данных, представляющие дату и время
• DATE: хранит даты от 0001-01-01 (1 января 0001 года) до 9999-12-31 (31 декабря 9999 года).
• TIME: хранит время в диапазоне от 00:00:00.0000000 до 23:59:59.9999999.
Может иметь форму TIME(n), где n представляет количество цифр от 0 до 7 в дробной части
секунд.
• DATETIME: хранит даты и время от 01/01/1753 до 31/12/9999.
• DATETIME2: хранит даты и время в диапазоне от 01/01/0001 00:00:00.0000000 до 31/12/9999
23:59:59.9999999.
Может иметь форму DATETIME2(n), где n представляет количество цифр от 0 до 7 в
дробной части секунд.
• SMALLDATETIME: хранит даты и время в диапазоне от 01/01/1900 до 06/06/2079, то есть
ближайшие даты.
• DATETIMEOFFSET: хранит даты и время в диапазоне от 0001-01-01 до 9999-12-31.
Сохраняет детальную информацию о времени с точностью до 100 наносекунд.

12.

Строковые типы данных
• CHAR: хранит строку длиной от 1 до 8 000 символов. Количество символов,
которое может хранить столбец, передается в скобках. Например, для
столбца с типом CHAR(10) будет выделено 10 байт. И если мы сохраним в
столбце строку менее 10 символов, то она будет дополнена пробелами.
• VARCHAR: хранит строку. Не подходит для многих языков, так как хранит
символы не в кодировке Unicode. В отличие от типа CHAR если в столбец с
типом VARCHAR(10) будет сохранена строка в 5 символов, то в столбце
будет сохранено именно пять символов.
• NCHAR: хранит строку в кодировке Unicode длиной от 1 до 4 000 символов.
• NVARCHAR: хранит строку в кодировке Unicode. На каждый символ
выделяется 2 байта. Можно задать конкретный размер от 1 до 4 000
символов. Если строка должна иметь больше 4000 символов, то задается
размер MAX, а на хранение строки может выделяться до 2 Гб.

13.

Определение таблиц

14.

Создание таблицы
CREATE TABLE имя_таблицы (
имя_столбца тип_данных [,
имя_столбца тип_данных] …
);

15.

Создание таблицы заказов
CREATE TABLE [Order]
[id_order] INT,
[o_date] DATE,
[o_cost] MONEY,
[o_status] NVARCHAR(30)
);

16.

Создать таблицу products
• id_product,
• id_category,
• p_name,
• p_price

17.

Клонирование таблиц
SELECT клонируемые_столбцы
INTO название_новой_таблицы
FROM название_исходной_таблицы;
SELECT *
INTO [New_products]
FROM [Products];

18.

Модификация таблиц

19.

Переименование таблиц
MySQL:
ALTER TABLE Order RENAME Orders
RENAME TABLE Order TO Orders
TSQL:
EXEC sp_rename 'Order', 'Orders’;
Переименование столбцов таблицы:
EXEC sp_rename 'Orders.o_date', 'order_date', 'COLUMN';

20.

Добавление столбцов
ALTER TABLE имя_таблицы
ADD имя_столбца тип_данных [,
имя_столбца тип_данных]…;
ALTER TABLE [Products]
ADD [id_buyer] INT, [id_seller] INT;

21.

Удаление столбцов
ALTER TABLE имя_таблицы
DROP COLUMN имя_столбца[,
имя_столбца]…;
ALTER TABLE [Products]
DROP COLUMN [id_buyer], [id_seller];

22.

Изменение определения столбца
ALTER TABLE имя_таблицы
ALTER COLUMN имя_столбца тип_данных;
ALTER TABLE [New_products]
ALTER COLUMN [p_price] INT;

23.

Удаление таблиц
DROP TABLE имя_таблицы [, имя_таблицы]…;
DROP TABLE [New_products], [New_Orders];

24.

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

25.

Типы ограничений целостности
1. PRIMARY KEY
2. [NOT] NULL
3. DEFAULT
4. UNIQUE
5. FOREIGN KEY
6. CHECK

26.

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

27.

Ограничения первичных ключей
имя_столбца тип_данных PRIMARY KEY;
имя_столбца тип_данных PRIMARY KEY IDENTITY(1, 1);
CREATE TABLE [Customers] (
[id_customer] INT PRIMARY KEY IDENTITY(1, 1),
[c_age] INT,
[c_first_name] NVARCHAR(30),
[c_last_name] NVARCHAR(30),
[c_email] VARCHAR(30),
[c_phone] VARCHAR(18)
);

28.

Добавление первичного ключа
ALTER TABLE имя_таблицы
ADD PRIMARY KEY(имя_столбца);
CREATE TABLE [Orders] (
[id_order] INT IDENTITY(1, 1),
[customer_id] INT,
[o_date] DATE
);
ALTER TABLE [Orders]
ADD PRIMARY KEY([id_order]);

29.

Добавление ограничений с именами
ALTER TABLE имя_таблицы
ADD CONSTRAINT имя_ограничения PRIMARY KEY (имя_столбца);
CREATE TABLE [Products] (
[id_product] INT IDENTITY(1, 1),
[p_price] INT,
);
ALTER TABLE [Products]
ADD CONSTRAINT [PK_Products_Id] PRIMARY KEY ([id_product]);

30.

Ограничение на отсутствие значений
имя_столбца тип_данных [NOT] NULL;
CREATE TABLE [Categories] (
[id_category] INT PRIMARY KEY IDENTITY(1, 1),
[c_name] NVARCHAR(25) NOT NULL,
[c_description] NVARCHAR(25) NULL
);

31.

Определение значений по умолчанию
имя_столбца тип_данных
DEFAULT значение_по_умолчанию;
ALTER TABLE [Orders]
ADD [o_status] NVARCHAR(25) NOT NULL
DEFAULT N'В обработке’;
ALTER TABLE [Categories]
ADD DEFAULT N'Описание' FOR [c_description];

32.

Ограничение уникальности
имя_столбца тип_данных UNIQUE;
ALTER TABLE [Customers]
ADD UNIQUE([c_email], [c_phone]);

33.

Свойства внешних ключей
• Внешний ключ должен содержать такое же число колонок,
такого же типа и в том же порядке следования, что и
соответствующий первичный ключ.
• Имена колонок внешнего ключа и их значения по
умолчанию могут отличаться от используемых в
соответствующем первичном ключе (в том числе иметь
NULL-значения).
• Таблица может иметь любое число внешних ключей.

34.

Ограничения внешних ключей
FOREIGN KEY REFERENCES имя_родительской_таблицы
(имя_столбца)
CREATE TABLE [Orders] (
[id_order] INT PRIMARY KEY IDENTITY(1, 1),
[customer_id] INT FOREIGN KEY REFERENCES
[Customers]([id_customer]),
[product_id] INT,
[o_date] DATE NOT NULL
);

35.

Добавление внешнего ключа
FOREIGN KEY(имя_столбца_дочерней_таблицы)
REFERENCES имя_родительской_таблицы (имя_столбца);
ALTER TABLE [Orders]
ADD FOREIGN KEY([product_id])
REFERENCES [Products]([id_product]);

36.

Добавление ограничений с именами
ALTER TABLE имя_таблицы
ADD CONSTRAINT имя_ограничения
FOREIGN KEY(имя_столбца_дочерней_таблицы)
REFERENCES имя_родительской_таблицы (имя_столбца);
ALTER TABLE [Products]
ADD CONSTRAINT [FK_Category_Id]
FOREIGN KEY ([id_category])
REFERENCES [Categories]([id_category]);

37.

Ограничение на значение
имя_столбца тип_данных CHECK (условие);
CREATE TABLE [Users] (
[id_user] INT PRIMARY KEY IDENTITY(1, 1),
[u_name] NVARCHAR(25) NOT NULL,
[u_phone] NVARCHAR(18) CHECK([u_phone] LIKE '+_ (___) ___-__-__')
);
ALTER TABLE [Customers]
ADD [c_age] INT
CONSTRAINT CHK_Age CHECK([c_age] >= 18);

38.

Удаление ограничений
ALTER TABLE имя_таблицы
DROP ограничение_целостности;
ALTER TABLE [Customers]
DROP [CHK_Age];

39.

DQL – язык запросов к
данным

40.

Создать базу данных
Products(id_product, p_name, p_description, p_price,
p_photo, category_id)
Characteristic(id_feature, f_name, f_type)
Values(id_value, product_id, feature_id, value)
Categories(id_category, c_name, c_description,
id_parent)

41.

Типы операций
• Выборка (Restriction)
• Проекция (Projection)
• Соединение (Join)
• Объединение (Union)

42.

Операции выборки
Операция выборки позволяет получить все строки
(записи) либо часть строк одной таблицы.
SELECT *
FROM имя_таблицы;
SELECT *
FROM имя_таблицы
WHERE условие_выборки;
SELECT *
FROM [Products];
SELECT *
FROM [Products]
WHERE [p_price]=1000;

43.

Операции проекции
Операция проекции позволяет выделить
подмножество столбцов таблицы.
SELECT название_столбца, …
FROM имя_таблицы;
SELECT [p_name]
FROM [Products];
SELECT [p_name], [p_price]
FROM [Products];

44.

Операция выборки и проекции
SELECT название_столбца, …
FROM имя_таблицы;
WHERE условие_выборки;
SELECT [p_name], [p_description], [p_price]
FROM [Products]
WHERE [p_price]=250;

45.

Использование квалификатора AS
SELECT название_столбца AS псевдоним, …
FROM имя_таблицы;
WHERE условие_выборки;
SELECT [f_name] AS [Название характеристики],
[f_type] AS [Тип характеристики]
FROM [Characteristic]
WHERE [f_name]=N'Характеристика 4';

46.

Агрегирующие функции
К агрегирующим функциям относятся:
1. функции вычисления суммы (SUM);
2. максимального (МАХ) и минимального (MIN)
значений столбцов;
3. арифметического среднего (AVG);
4. количества строк, удовлетворяющих заданному
условию (COUNT).

47.

Правила работы агрегатных функций
• Если в результате выполнения запроса не получено ни одной
строки, то исходные данные для вычисления любой из агрегатных
функций отсутствуют. В этом случае результатом выполнения
функций COUNT будет нуль, а результатом всех других функций NULL.
• Аргумент агрегатной функции не может сам содержать
агрегатные функции (функция от функции). Т.е. в одном запросе
нельзя, скажем, получить максимум средних значений.
• Результат выполнения функции COUNT есть целое
число (INTEGER). Другие агрегатные функции наследуют типы
данных обрабатываемых значений.
• Если при выполнении функции SUM был получен результат,
превышающий максимальное значение используемого типа
данных, возникает ошибка.

48.

Агрегирующие функции
SELECT COUNT(*) AS [Количество строк в таблице],
SUM([p_price]) AS [Суммарная цена продуктов],
MIN([p_price]) AS [Минимальная цена продуктов],
MAX([p_price]) AS [Максимальная цена продуктов],
AVG([p_price]) AS [Средняя цена продуктов]
FROM [Products];

49.

Оператор WHERE
• сравнение с использованием реляционных операторов
=
равно
<> не равно
!=
не равно
>
больше
<
меньше
>= больше или равно
<= меньше или равно
• BETWEEN
• IN
• LIKE
• IS NULL

50.

Операторы сравнения
Продукты, которые стоят 200 рублей.
SELECT [p_name] AS [Название продукта], [p_price] AS [Цена продукта]
FROM [Products]
WHERE [p_price]=200;
Продукты, которые стоят больше 200 рублей.
SELECT [p_name] AS [Название продукта], [p_price] AS [Цена продукта]
FROM [Products]
WHERE [p_price]>200;
Описание и цена продукта, с названием ‘название 1’
SELECT [p_price] AS [Цена продукта], [p_description] AS [Описание продукта]
FROM [Products]
WHERE [p_name]=N'название 1';

51.

Операторы сравнения
Продукты, относящиеся к категории ‘Категория 5’.
SELECT [p_name] AS [Название продукта],
[p_description] AS [Описание продукта]
FROM [Products]
WHERE [category_id] = (
SELECT [id_category]
FROM [Categories]
WHERE [c_name] = N'Категория 5'
);

52.

Оператор BETWEEN
Список продуктов с ценами от 200 до 300
SELECT [p_name] AS [Название продукта],
[p_price] AS [Цена продукта],
[p_description] AS [Описание продукта]
FROM [Products]
WHERE [p_price]>=200 AND [p_price]<=300;
SELECT [p_name] AS [Название продукта],
[p_price] AS [Цена продукта],
[p_description] AS [Описание продукта]
FROM [Products]
WHERE [p_price] BETWEEN 200 AND 300;

53.

Оператор BETWEEN
Список продуктов с ценами менее 200 и более 300
SELECT [p_name] AS [Название продукта],
[p_price] AS [Цена продукта],
[p_description] AS [Описание продукта]
FROM [Products]
WHERE [p_price] NOT BETWEEN 200 AND 300;

54.

Оператор LIKE
Список продуктов, названия которых начинается на букву ‘н’
SELECT [p_name] AS [Название продукта],
[p_price] AS [Цена продукта]
FROM [Products]
WHERE [p_name] LIKE N'н%’;
Список продуктов, названия которых начинается на любую букву кроме ‘к’
SELECT [p_name] AS [Название продукта],
[p_price] AS [Цена продукта]
FROM [Products]
WHERE [p_name] NOT LIKE N'к%';

55.

Оператор LIKE
Список продуктов, 2 и 4 буква которых ‘а’
SELECT [p_name] AS [Название продукта],
[p_price] AS [Цена продукта]
FROM [Products]
WHERE [p_name] LIKE N'_а__а%';

56.

Оператор IS NULL
Все корневые категории продуктов
SELECT [c_name] AS [Название категории]
FROM [Categories]
WHERE [id_parent] IS NULL;
Все категории с заполненным описанием
SELECT [c_name] AS [Название категории],
[c_description] AS [Описание категории]
FROM [Categories]
WHERE [c_description] IS NOT NULL;

57.

Комбинации операторов
Все продукты, которые стоят больше 200 рублей, имеют заполненное описание и 2 буква названия – ‘а’
SELECT [p_name]
[p_price]
AS [Название продукта],
AS [Цена продукта],
[p_description] AS [Описание продукта]
FROM [Products]
WHERE [p_price] > 200
AND
[p_description] IS NOT NULL
AND
[p_name] LIKE N'_а%’;
Все продукты, цена которых не равна 200 рублей, или описание которых заполнено
SELECT [p_name]
[p_price]
AS [Название продукта],
AS [Цена продукта],
[p_description] AS [Описание продукта]
FROM [Products]
WHERE [p_price] != 200 OR
[p_description] IS NOT NULL;

58.

Оператор IN
Все продукты относящиеся к 1, 3 или 5 категории
SELECT [p_name]
[p_price]
AS [Название продукта],
AS [Цена продукта],
[p_description] AS [Описание продукта]
FROM [Products]
WHERE [category_id] IN (1, 3, 5);
Все продукты не относящиеся к 1, 3 или 5 категории
SELECT [p_name]
[p_price]
AS [Название продукта],
AS [Цена продукта],
[p_description] AS [Описание продукта]
FROM [Products]
WHERE [category_id] NOT IN (1, 3, 5);

59.

Оператор IN
Все продукты относящиеся к категориям с заполненным описанием
[p].[p_name]
AS [Название продукта],
[p].[p_price]
AS [Цена продукта],
[p].[p_description] AS [Описание продукта],
[c].[c_name]
AS [Категория продукта]
FROM [Products] AS [p],
(
SELECT [id_category], [c_name]
FROM [Categories]
WHERE [c_description] IS NOT NULL
) AS [c]
WHERE [p].[category_id] IN ([c].[id_category]);
SELECT

60.

Оператор DISTINCT
Вывести все названия продуктов, исключив дублирование
SELECT DISTINCT [p_name] AS [Название продукта]
FROM [Products];
DISTINCT исключает дублирование всех атрибутов проекции
SELECT DISTINCT [p_name] AS [Название продукта],
[p_price] AS [Цена продукта]
FROM [Products];

61.

Оператор ORDER BY
Все продукты отсортированные по возрастанию цены
SELECT [p_name] AS [Название продукта],
[p_price] AS [Цена продукта]
FROM [Products]
ORDER BY [p_price] ASC;
Все продукты отсортированные по убыванию цены
SELECT [p_name] AS [Название продукта],
[p_price] AS [Цена продукта]
FROM [Products]
ORDER BY [p_price] DESC;

62.

Оператор ORDER BY
Все продукты отсортированные с начала по цене, потом по названию
SELECT [p_name] AS [Название продукта],
[p_price] AS [Цена продукта]
FROM [Products]
ORDER BY [p_price] DESC, [p_name] ASC;
SELECT [p_name] AS [Название продукта],
[p_price] AS [Цена продукта]
FROM [Products]
ORDER BY [p_price] DESC, [p_name] DESC;

63.

Задание
Создайте в базе данных таблицу для хранения информации о пользователях.
Users (id_user, u_first_name, u_last_name, u_email, u_login,
u_password)
Ограничения:
1) Атрибут id_user является первичным ключом.
2) Атрибуты для хранения имени, логина и пароля должны быть
обязательно заполнены.
3) Атрибуты для хранения почты, логина и пароля не должны
содержать одинаковых значений
Заполните таблицу данными.

64.

Оператор CONCAT
Вывести полное имя пользователя и его почту.
SELECT CONCAT([u_first_name], [u_last_name], [u_middle_name]) AS [Полное имя],
[u_email] AS [Почта]
FROM [Users];
SELECT CONCAT([u_first_name], ' ', [u_last_name], ' ', [u_middle_name]) AS [Полное имя],
[u_email] AS [Почта]
FROM [Users];
SELECT [u_first_name] + ' ' + [u_last_name] + ' ' + [u_middle_name] AS [Полное имя],
[u_email] AS [Почта]
FROM [Users];

65.

Оператор GROUP BY
Вывести коды категорий продуктов, количество продуктов в категории и суммарную цену всех
продуктов в категории.
SELECT [category_id]
COUNT(*)
AS [Код категории],
AS [Количество продуктов в категории],
SUM([p_price]) AS [Суммарная цена продуктов в категории]
FROM [Products]
WHERE [category_id] IS NOT NULL
GROUP BY [category_id];
SELECT COUNT(*)
AS [Количество продуктов в категории],
SUM([p_price]) AS [Суммарная цена продуктов в категории]
FROM [Products]
WHERE [category_id] IS NOT NULL
GROUP BY [category_id];

66.

Оператор HAVING
Вывести коды категорий продуктов, количество продуктов в категории и
суммарную цену всех продуктов в категории, при условии что в категории
более 1 продукта.
SELECT [category_id]
AS [Код категории],
COUNT(*)
AS [Количество продуктов в категории],
SUM([p_price]) AS [Суммарная цена продуктов в категории]
FROM [Products]
WHERE [category_id] IS NOT NULL
GROUP BY [category_id]
HAVING COUNT(*)>1;

67.

Общая структура запроса
SELECT [DISTINCT | ALL] {* | [<выражение для столбца> [[AS]
<псевдоним>]] [,…]}
FROM <имя таблицы> [[AS] <псевдоним>] [,…]
[WHERE <предикат>]
[[GROUP BY <список столбцов>]
[HAVING <условие на агрегатные значения>] ]
[ORDER BY <список столбцов>]

68.

Задание
[c].[c_name]
AS [Название категории],
COUNT(*)
AS [Количество продуктов в категории],
AS [Средняя
продуктов вкатегорий,
категории]
Написать AVG([p].[p_price])
запрос, который
выводитценаназвания
FROM
[Products]продуктов
AS [p],
количество
в категории и среднюю цену
(
продуктов
в
категории,
при
условии,
что
в
категории
есть
SELECT [id_category], [c_name]
как минимум
2 товара, сгруппировать результат по
FROM [Categories]
названиям
) AS [c]категорий, отсортировать по средней цене по
WHERE [p].[category_id]=[c].[id_category]
возрастанию.
GROUP BY [c].[c_name]
HAVING COUNT(*) >= 2
ORDER BY [Средняя цена продуктов в категории] ASC;
SELECT

69.

DML – язык
манипулирования данными

70.

Вставка новых данных
INSERT таблица(перечень_полей) VALUES
(перечень_значений1),
(перечень_значений2),

(перечень_значенийN);
INSERT [Categories]([c_name], [c_description], [id_parent]) VALUES
(N'Категория 1', N'Описание 1', NULL),
(N'Категория 2', N'Описание 2', 1),
(N'Категория 3', NULL, 1),
(N'Категория 4', N'Описание 3', 2),
(N'Категория 5', NULL, NULL);

71.

Вставка значений со счетчиком
SET IDENTITY_INSERT имя_таблицы ON
SET IDENTITY_INSERT имя_таблицы OFF
SET IDENTITY_INSERT [Characteristic] ON
INSERT [Characteristic]([id_feature], [f_name], [f_type]) VALUES
(1, N'Характеристика 1', N'Тип 1'),
(2, N'Характеристика 2', N'Тип 2'),
(3, N'Характеристика 3', N'Тип 3'),
(4, N'Характеристика 4', NULL),
(5, N'Характеристика 5', NULL);
SET IDENTITY_INSERT [Characteristic] OFF

72.

Добавить таблицы
Orders(id_order, o_date, o_cost, o_status, buyer_id)
Order_history(id_history, order_id, o_date, o_cost)

73.

Вставка значений с условием
Добавить в архив все заказы со статусом ‘Закрыт’
SELECT * FROM [Order_history];
INSERT INTO [Order_history]([order_id], [o_date], [o_cost])
SELECT [id_order], [o_date], [o_cost]
FROM [Orders]
WHERE [o_status]=N'Закрыт’;
SELECT * FROM [Order_history];

74.

Обновление данных
UPDATE имя_таблицы
SET имя_столбца=новое_значение, имя_столбца=новое_значение, …
WHERE условие_выборки
SELECT * FROM [Products];
UPDATE [Products]
SET [p_price]=1000, [p_description]=N'Новое описание продукта'
WHERE [p_name]=N'название 3’;
SELECT * FROM [Products];

75.

Обновление данных
UPDATE псевдоним
SET имя_столбца=новое_значение
FROM имя_таблицы AS псевдоним;
SELECT * FROM [Values];
UPDATE [V]
SET
[feature_id]=(SELECT [id_feature] FROM [Characteristic] WHERE [f_name]=N'Характеристика 2'),
[value]=N'Новое значение характеристики'
FROM [Values] AS [V]
WHERE [id_value]=10;
SELECT * FROM [Values];

76.

Обновление данных
Добавить в таблицу новый столбец – цена продукта со скидкой.
Рассчитать стоимость всех продуктов со скидкой, если считать, что
стандартная скидка – 5%.
ALTER TABLE [Products]
ADD [p_cost_discount] MONEY;
UPDATE [Products]
SET [p_cost_discount]=[p_price]*0.95;

77.

Обновление данных
Добавить наценку в 15% на все продукты, принадлежащие категории – ‘Категория 1’.
SELECT * FROM [Products];
UPdATE [Products] SET
[p_price]=[p_price]*1.15
WHERE [category_id]=(
SELECT [id_category]
FROM [Categories]
WHERE [c_name]=N'Категория 1'
);
UPDATE [Products]
SET [p_cost_discount]=[p_price]*0.95;
SELECT * FROM [Products];

78.

Удаление данных
DELETE FROM имя_таблицы WHERE условие_выборки;
Удалить заказы из таблицы заказов, у которых статус заказа –
‘Закрыт’
SELECT * FROM [Orders];
DELETE FROM [Orders]
WHERE [o_status]=N'Закрыт’;
SELECT * FROM [Orders];
Запрос выдаст ошибку, потому что мы пытаемся удалить заказы, на
которые есть ссылка в таблице истории заказов.

79.

Удаление данных
Очищаем таблицу истории заказов.
SELECT * FROM [Order_history];
-- DELETE FROM [Order_history]; -TRUNCATE TABLE [Order_history];
SELECT * FROM [Order_history];
English     Русский Rules