Базы данных Лекция №08 Основы SQL 1. Построение вычисляемых полей Операции с вычисляемыми полями: • Сложение • Вычитание • Умножение • Деление • Встроенные функции языка SQL • Скобки 2 1. Построение вычисляемых полей SELECT Товар.Название, Товар.Цена, Сделка.Количество, Товар.Цена*Сделка.Количество AS Стоимость FROM Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара SELECT Фирма, Фамилия + " " + LEFT(Имя,1) + "." + LEFT(Отчество,1) + "." AS ФИО FROM Клиент SELECT Товар.Название, Year(Сделка.Дата) AS Год, Month(Сделка.Дата) AS Месяц FROM Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара 3 2. Итоговые функции Итоговые (агрегатные) функции: • Count (Выражение) – количество записей • Min/Max (Выражение) – наименьшее и наибольшее из множества значений • Avg (Выражение) – среднее значение множества значений • Sum (Выражение) – сумма множества значений 4 2. Итоговые функции SELECT Min(Товар.Название) AS Min_Название FROM Товар SELECT Count(*) AS Количество_сделок FROM Сделка SELECT Sum(Сделка.Количество) AS Количество_товара FROM Сделка SELECT Avg(Товар.Цена) AS Avg_Цена FROM Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара SELECT Sum(Товар.Цена*Сделка.Количество) AS Стоимость FROM Товар INNER JOIN Сделка 5 ON Товар.КодТовара=Сделка.КодТовара 3. Предложение GROUP BY При наличии в SELECT фразы GROUP BY: • Каждый элемент – единственное значение для всей группы • SELECT может включать следующие типы элементов: – Имена полей – Итоговые функции – Константы и Выражения • Все имена полей должны присутствовать и во фразе GROUP BY • Во фразе GROUP BY могут быть имена столбцов, отсутствующие в списке предложения SELECT • Предложение WHERE обрабатывается первым 6 3. Предложение GROUP BY SELECT Клиент.Фамилия, Avg(Сделка.Количество) AS Среднее_количество FROM Клиент INNER JOIN Сделка ON Клиент.КодКлиента=Сделка.КодКлиента GROUP BY Клиент.Фамилия SELECT Товар.Название, Sum(Товар.Цена*Сделка.Количество) AS Стоимость FROM Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара GROUP BY Товар.Название 7 3. Предложение GROUP BY SELECT Клиент.Фирма, Count(Сделка.КодСделки) AS Количество_сделок FROM Клиент INNER JOIN Сделка ON Клиент.КодКлиента=Сделка.КодКлиента GROUP BY Клиент.Фирма SELECT Клиент.Фирма, Sum(Сделка.Количество) AS Общее_Количество, Sum(Товар.Цена*Сделка.Количество) AS Стоимость FROM Товар INNER JOIN (Клиент INNER JOIN Сделка ON Клиент.КодКлиента=Сделка.КодКлиента) ON Товар.КодТовара=Сделка.КодТовара 8 GROUP BY Клиент.Фирма 3. Предложение GROUP BY SELECT Товар.Название, Month(Сделка.Дата) AS Месяц, Sum(Товар.Цена*Сделка.Количество) AS Стоимость FROM Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара GROUP BY Товар.Название, Month(Сделка.Дата) SELECT Товар.Название, Month(Сделка.Дата) AS Месяц, Sum(Товар.Цена*Сделка.Количество) AS Стоимость FROM Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара WHERE Товар.Сорт="Первый" GROUP BY Товар.Название, Month(Сделка.Дата) 9 4. Предложение HAVING HAVING фильтрует по своему условию предварительно сгруппированные GROUP BY блоки данных Условия в HAVING отличаются от условий в WHERE: • HAVING исключает из результирующего набора данных группы с результатами агрегированных значений • WHERE исключает из расчета агрегатных значений записи, не удовлетворяющие условию • В условии WHERE нельзя задавать агрегатные 10 функции 4. Предложение HAVING SELECT Клиент.Фирма, Count(Сделка.Количество) AS Количество_сделок FROM Клиент INNER JOIN Сделка ON Клиент.КодКлиента=Сделка.КодКлиента GROUP BY Клиент.Фирма HAVING Count(Сделка.Количество) > 3 SELECT Товар.Название, Sum(Товар.Цена*Сделка.Количество) AS Стоимость FROM Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара GROUP BY Товар.Название HAVING Sum(Товар.Цена*Сделка.Количество) > 10000 11 4. Предложение HAVING SELECT Товар.Название FROM Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара GROUP BY Товар.Название HAVING Sum(Товар.Цена*Сделка.Количество) > 10000 12 5. Скрипты для таблиц примеров Таблица ТОВАРОВ: CREATE TABLE ARTICLE ( ID_ARTICLE INTEGER NOT NULL, NAM_ARTICLE VARCHAR(50) NOT NULL, COST NUMERIC(15,2) NOT NULL, KIND VARCHAR(50) ); ALTER TABLE ARTICLE ADD CONSTRAINT PK_ARTICLE PRIMARY KEY (ID_ARTICLE); COMMENT ON COLUMN ARTICLE.ID_ARTICLE IS 'Код товара'; COMMENT ON COLUMN ARTICLE.NAM_ARTICLE IS 'Наименование товара'; COMMENT ON COLUMN ARTICLE.COST IS 'Цена'; COMMENT ON COLUMN ARTICLE.KIND IS 'Сорт'; 13 5. Скрипты для таблиц примеров Таблица КЛИЕНТОВ: CREATE TABLE CLIENT ( ID_CLIENT INTEGER NOT NULL, FAMALY VARCHAR(50) NOT NULL, NAM_CLIENT VARCHAR(50) NOT NULL, FATHER VARCHAR(50) NOT NULL, FIRMA VARCHAR(50) NOT NULL ); ALTER TABLE CLIENT ADD CONSTRAINT PK_CLIENT PRIMARY KEY (ID_CLIENT); COMMENT ON COLUMN CLIENT.ID_CLIENT IS 'Код клиента'; COMMENT ON COLUMN CLIENT.FAMALY IS 'Фамилия'; COMMENT ON COLUMN CLIENT.NAM_CLIENT IS 'Имя'; COMMENT ON COLUMN CLIENT.FATHER IS 'Отчество'; COMMENT ON COLUMN CLIENT.FIRMA IS 'Фирма'; 14 5. Скрипты для таблиц примеров Таблица СДЕЛОК: CREATE TABLE TRAID ( ID_TRAID INTEGER NOT NULL, ID_CLIENT INTEGER NOT NULL, ID_ARTICLE INTEGER NOT NULL, AMOUNT NUMERIC(15,2) NOT NULL, DAT DATE NOT NULL ); ALTER TABLE TRAID ADD CONSTRAINT PK_TRAID PRIMARY KEY (ID_TRAID), ADD CONSTRAINT FK_TRAID_1 FOREIGN KEY (ID_CLIENT) REFERENCES CLIENT (ID_CLIENT), ADD CONSTRAINT FK_TRAID_2 FOREIGN KEY (ID_ARTICLE) REFERENCES ARTICLE (ID_ARTICLE); COMMENT ON COLUMN TRAID.ID_TRAID IS 'Код сделки'; COMMENT ON COLUMN TRAID.ID_CLIENT IS 'Код клиента'; COMMENT ON COLUMN TRAID.ID_ARTICLE IS 'Код товара'; COMMENT ON COLUMN TRAID.AMOUNT IS 'Количество'; 15 COMMENT ON COLUMN TRAID.DAT IS 'Дата'; Спасибо за внимание 16