Лекция 18 Многотабличные запросы. Группировка данных. Запросы на создание и обновление данных Связывание таблиц <связка_таблиц> ::= <левая_таблица><тип_связывания><правая_таблица> ON <условие_связывания> <тип_связывания> ::= [INNER | {{LEFT | RIGHT | FULL } [OUTER] } ] JOIN <условие_связывания> =, <, >, <=, >=, !-, <> ON Учебный_план.ID_Дисциплина = Дисциплины.ID_Дисциплина Выборка данных из таблиц «Дисциплины» и «Учебный_план» (таблицы связаны по ключевому полю ID_Дисциплина) SELECT Наименование, Семестр, Количество_часов FROM Учебный_план INNER JOIN Дисциплины ON Учебный_план.ID_Дисциплина = Дисциплины.ID_Дисциплина WHERE Количество_часов > 60 Использование ключевого слова LEFT [OUTER] SELECT Наименование, Семестр, Отчетность FROM Дисциплины LEFT OUTER JOIN Учебный_план ON Учебный_план.ID_Дисциплина = Дисциплины.ID_Дисциплина WHERE (Наименование LIKE '%информатик%') Использование ключевого слова RIGHT [OUTER] SELECT Отчетность, Семестр, Наименование FROM Учебный_план RIGHT OUTER JOIN Дисциплины ON Учебный_план.ID_Дисциплина = Дисциплины.ID_Дисциплина WHERE (Наименование LIKE '%информатик%') Использование раздела WHERE для связывания таблиц SELECT Наименование, Семестр, Количество_часов FROM Учебный_план INNER JOIN Дисциплины ON Учебный_план.ID_Дисциплина = Дисциплины.ID_Дисциплина WHERE (Количество_часов > 60) AND (Семестр = 1) SELECT Наименование, Семестр, Количество_часов FROM Учебный_план, Дисциплины WHERE (Учебный_план.ID_Дисциплина = Дисциплины.ID_Дисциплина) AND (Количество_часов > 60) AND (Семестр = 1) LEFT OUTER JOIN RIGHT OUTER JOIN *= =* Раздел GROUP BY GROUP BY [ALL] <условие_группировки> [,...,n] AVG() - вычисляет среднее значение для указанного столбца COUNT() - подсчитывает количество строк в группе (при выполнении группировки) или количество строк результата запроса МАХ() - возвращает максимальное значение в указанном диапазоне MIN() - возвращает минимальное значение в указанном диапазоне SUM() - выполняет обычное суммирование значений в казанном диапазоне AVG ф у н к ц и я COUNT ф у н к ц и я МАХ MIN ф у н к ц и я SUM ф у н к ц и я Примеры запросов с группировкой SELECT Семестр, SUM(Количество_часов) AS 'Нагрузка' FROM [Учебный_план] GROUP BY Семестр SELECT Семестр, COUNT(*) AS 'Экзамены' FROM [Учебный_план] WHERE Отчетность = 'э' GROUP BY Семестр Ключевое слово ALL в разделе GROUP BY SELECT Семестр, COUNT(*) AS 'Количество часов > 60' FROM [Учебный_план] WHERE Количество_часов > 60 GROUP BY Семестр SELECT Семестр, COUNT(*) AS 'Количество часов > 60' FROM [Учебный_план] WHERE Количество_часов > 60 GROUP BY ALL Семестр Раздел COMPUTE COMPUTE <Функция_агрегирования> (<столбец_агрегирования>)}[,..., n] [ BY <столбец_группировки> [,...,n ] ] SELECT Наименование, Семестр, Количество_часов FROM Учебный_план, Дисциплины WHERE (Учебный_план.ID_Дисциплина = Дисциплины.ID_Дисциплина) AND (Семестр = 2) COMPUTE SUM(Количество_часов), COUNT(Семестр) Использование команды SELECT...INTO INTO <имя_новой_таблицы> SELECT {<имя_столбца> [[AS] <псевдоним_столбца>] [, ..., n] } INTO <имя_новой_таблицы> FROM {<имя_исходной_таблицы> [,..., n]} SELECT ID_Студент, Адрес, Телефон INTO Контакты FROM Студенты Работа с таблицей «Контакты» SELECT * FROM Контакты WHERE Телефон LIKE '120%' ALTER TABLE Контакта ADD CONSTRAINT FK_Контакт FOREIGN KEY (ID_Студент) REFERENCES Студенты SELECT * FROM Студенты INNER JOIN Контакты ON Студенты.ID_Студент = Контакты.ID_Студент WHERE Телефон LIKE '120%' Вставка одной строки INSERT [INTO] <имя_таблицы> [(<список_колонок>)] VALUES (<список_значений>) INSERT Сводная_ведомость VALUES (10, 3, 5) INSERT INTO Сводная_ведомость (ID_Дисциплина, ID_Студент) VALUES (3, 10) Команда INSERT INSERT [ INTO] <имя_таблицы> { [ (<список_колонок>) ] { VALUES ( { DEFAULT | NULL | <выражение> } [, ..., n] ) | <результирующая_таблица> } } | DEFAULT VALUES Вставка результата запроса INSERT INTO <имя_таблицы> SELECT <выражение_запроса> CREATE TABLE (ID_Студент_2000 Фамилия Имя Отчество Адрес Телефон PRIMARY KEY Студент_2000 INTEGER NOT NULL, CHAR(30) NOT NULL, CHAR(15) NOT NULL, CHAR(20) NOT NULL, CHAR(30), CHAR(8), (ID_Студент_2000)) INSERT INTO Студент_2000 SELECT ID_Студент, Фамилия, Имя, Отчество, Адрес, Телефон FROM Студенты WHERE Год_поступления = 2000 Вставка результата запроса CREATE TABLE Преподаватель_дисциплина (ID_Дисциплина INTEGER NOT NULL, ID_ПреподавательINTEGER NOT NULL, Наименование CHAR(20) NOT NULL, Фамилия CHAR(30) NOT NULL, Имя CHAR(15) NOT NULL, Отчество CHAR(20) NOT NULL, Должность CHAR(20) NOT NULL) INSERT INTO Преподаватель_дисциплина SELECT DISTINCT Дисциплины.ID_Дисциплина, Кадровый_состав.ID_Преподаватель, Наименование, Фамилия, Имя, Отчество, Должность FROM Кадровый_состав, Учебный_план, Дисциплины WHERE Кадровый_состав.ID_Преподаватель = Учебный_план.ID_Преподаватель AND Дисциплины.ID_Дисциплина = Учебный_план.ID_Дисциплина Изменение данных – команда UPDATE UPDATE <имя_таблицы> SET { <имя_колонки> = { <выражение> | DEFAULT | NULL }}[,...,n] { [ FROM { <имя_исходной_таблицы> } [,...,n] ] [ WHERE <условие_отбора> ] } UPDATE Учебный_план SET Количество_часов = Количество_часов + 2 WHERE (Отчетность= ‘э’) SELECT * FROM Учебный_план WHERE (Отчетность= ‘э’) AND (Семестр = 1) Удаление данных – команда DELETE DELETE <Имя_таблицы> [WHERE <Условие_отбора> ] DELETE Учебный_план WHERE (Отчетность = ‘э') AND (Семестр = 1)