DB_l18

advertisement
Лекция 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)
Download