Рассмотрим основные операции над отношениями, которые могут представлять интерес с точки зрения извлечения данных из реляционных таблиц. Это
Для иллюстрации
Отношение R | |
|---|---|
R.a1 |
R.a2 |
A |
1 |
A |
2 |
B |
1 |
B |
3 |
B |
4 |
CREATE TABLE R (a1 CHAR(1), a2 INT, PRIMARY KEY(a1,a2))
Отношение S | |
|---|---|
S.b1 |
S.b2 |
1 |
h |
2 |
g |
3 |
h |
CREATE TABLE S (b1 INT PRIMARY KEY, b2 CHAR(1))
Операции
Операция R и определяет результирующее отношение, которое содержит только те кортежи (строки) отношения R, которые удовлетворяют заданному условию F (предикату).
$$\sigma_{F}(R)$$ или $$\sigma_{предикат}(R)$$.
Пример 5.1. Операция выборки в SQL.
SELECT a1, a2 FROM R WHERE a2=1
Операция
Пример 5.2.
SELECT DISTINCT b2 FROM S
К основным операциям над отношениями относится
RxS двух отношений (двух таблиц) определяет новое отношение - результат конкатенации (т.е. сцепления) каждого кортежа (каждой записи) из отношения R с каждым кортежем (каждой записью) из отношения S
RxS={(a, 1, 1, h), (a, 2, 1, h),
(b, 1, 1, h), ... }
SELECT R.a1, R.a2, S.b1, S.b2 FROM R, S
Результат
R x S | |||
|---|---|---|---|
R.a1 |
R.a2 |
S.b1 |
S.b2 |
a |
1 |
1 |
h |
a |
1 |
2 |
g |
a |
1 |
3 |
h |
a |
2 |
1 |
h |
a |
2 |
2 |
g |
a |
2 |
3 |
h |
b |
1 |
1 |
h |
b |
1 |
2 |
g |
b |
1 |
3 |
h |
b |
3 |
1 |
h |
b |
3 |
2 |
g |
b |
3 |
3 |
h |
b |
4 |
1 |
h |
b |
4 |
2 |
g |
b |
4 |
3 |
h |
Если одно отношение имеет N записей и K полей, а другое M записей и L полей, то отношение с их NxM записей и K+L полей. Исходные отношения могут содержать поля с одинаковыми именами, тогда имена полей будут содержать названия таблиц в виде префиксов для обеспечения уникальности имен полей в отношении, полученном как результат выполнения
Однако в таком виде (пример 5.3.) отношение содержит больше информации, чем обычно необходимо пользователю. Как правило, пользователей интересует лишь некоторая часть всех комбинаций записей в
В языке SQL для задания типа JOIN в предложении FROM.
Формат операции:
FROM имя_таблицы_1 {INNER | LEFT | RIGHT}
JOIN имя_таблицы_2
ON условие_соединения
Существуют различные типы операций
Операция тета-соединения $$R \triangleright \triangleleft _{F} S$$ определяет отношение, которое содержит кортежи из R и S, удовлетворяющие предикату F. Предикат F имеет вид $$R.ai \Theta S.bj$$, где вместо $$\Theta$$ может быть указан один из операторов сравнения ( >, >=, <, <=, =, <> ).
Если предикат F содержит только оператор равенства ( = ), то
| $$R \triangleright \triangleleft _{F} S, F=(R.a2=S.b1)$$ | |||
|---|---|---|---|
R.a1 |
R.a2 |
S.b1 |
S.b2 |
a |
1 |
1 |
h |
a |
2 |
2 |
g |
b |
3 |
3 |
h |
b |
1 |
1 |
h |
Операция тета-соединения в языке SQL называется INNER JOIN (внутреннее WHERE сравниваются значения полей из разных таблиц. В этом случае строится
В условиях объединения могут участвовать поля, относящиеся к одному и тому же типу данных и содержащие один и тот же вид данных, но они не обязательно должны иметь одинаковые имена.
Блоки данных из двух таблиц объединяются, как только в указанных полях будут найдены совпадающие значения.
Если в предложении FROM перечислено несколько таблиц и при этом не употребляется спецификация JOIN, а для указания соответствия полей из таблиц используется условие в предложении WHERE, то некоторые реляционные СУБД (например, Access) оптимизируют выполнение запроса, интерпретируя его как
Если перечислять ряд таблиц или запросов и не указывать условия объединения, в качестве результирующей таблицы будет выбрано
SELECT R.a1, R.a2, S.b1, S.b2
FROM R, S
WHERE R.a2=S.b1
или
SELECT R.a1, R.a2, S.b1, S.b2
FROM R INNER JOIN S ON R.a2=S.b1
Естественным R и S, выполненное по всем общим атрибутам, из результатов которого исключается по одному экземпляру каждого общего атрибута.
| $$R \triangleright \triangleleft S, F=(R.a2=S.b1)$$ | ||
|---|---|---|
R.a1 |
R.a2 или S.b1 |
S.b2 |
a |
1 |
h |
a |
2 |
g |
b |
3 |
h |
b |
1 |
h |
SELECT R.a1, R.a2, S.b2
FROM R, S
WHERE R.a2=S.b1
или
SELECT R.a1, S.b1, S.b2
FROM R INNER JOIN S ON R.a2=S.b1
Пример 5.6. Вывести информацию о проданных товарах.
SELECT *
FROM Сделка, Товар
WHERE Сделка.КодТовара=Товар.КодТовара
Или (что эквивалентно)
SELECT *
FROM Товар INNER JOIN Сделка
ON Товар.КодТовара=Сделка.КодТовара
Можно создать вложенные объединения, добавив третью таблицу к результату объединения двух других таблиц.
Пример 5.7. Получить сведения о товарах, дате сделок, количестве проданного товара и покупателях.
SELECT Товар.Название, Сделка.Количество, Сделка.
Дата, Клиент.Фирма
FROM Клиент INNER JOIN
(Товар INNER JOIN Сделка
ON Товар.КодТовара=Сделка.КодТовара)
ON Клиент.КодКлиента=Сделка.КодКлиента
Использование общих имен таблиц для идентификации столбцов неудобно из-за их громоздкости. Каждой таблице можно присвоить какое-нибудь краткое обозначение, псевдоним.
Пример 5.8. Получить сведения о товарах, дате сделок, количестве проданного товара и покупателях. В запросе используются псевдонимы таблиц.
SELECT Т.Название, С.Количество,
С.Дата, К.Фирма
FROM Клиент AS К INNER JOIN
(Товар AS Т INNER JOIN
Сделка AS С
ON Т.КодТовара=С.КодТовара)
ON К.КодКлиента=С.КодКлиента;
Какая из таблиц будет ведущей, определяет вид LEFT - левое RIGHT - правое
Левым R, не имеющие совпадающих значений в общих столбцах отношения S, также включаются в результирующее отношение.
| $$R \supset \triangleleft S$$ | |||
|---|---|---|---|
R.a1 |
R.a2 |
S.b1 |
S.b2 |
a |
1 |
1 |
h |
a |
2 |
2 |
g |
b |
1 |
1 |
h |
b |
3 |
3 |
h |
b |
4 |
null |
null |
SELECT R.a1, R.a2, S.b1, S.b2 FROM R LEFT JOIN S ON R.a2=S.b1
Существует и правое NULL.
SELECT R.a1, R.a2, S.b1, S.b2 FROM R RIGHT JOIN S ON R.a2=S.b1
Пример 5.11. Вывести информацию о всех товарах. Для проданных товаров будет указана дата сделки и количество. Для непроданных эти поля останутся пустыми.
SELECT Товар.*, Сделка.* FROM Товар LEFT JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара;
R, которые входят в R и S
| $$R \triangleleft _F S, F=(R.a2=S.b1)$$ | |
|---|---|
R.a1 |
R.a2 |
a |
1 |
a |
2 |
b |
3 |
b |
1 |
SELECT R.a1, R.a2
FROM R, S
WHERE R.a2=S.b1
или
SELECT R.a1, R.a2
FROM R INNER JOIN S ON R.a2=S.b1
UNION ) $$R \cup S$$ отношений R и S можно получить в результате их конкатенации с образованием одного отношения с исключением кортежей-дубликатов. При этом отношения R и S должны быть совместимы, т.е. иметь одинаковое количество полей с совпадающими типами данных. Иначе говоря, отношения должны быть совместимы по
R и S является таблица, содержащая все строки, которые имеются в первой таблице R, во второй таблице S или в обеих таблицах сразу
SELECT R.a1, R.a2 FROM R UNION SELECT S.b2, S.b1 FROM S
INTERSECT ) $$R \cap S=R-(R-S)$$ определяет отношение, которое содержит кортежи, присутствующие как в отношении R, так и в отношении S. Отношения R и S должны быть совместимы по
R и S является таблица, содержащая все строки, присутствующие в обеих исходных таблицах одновременно
SELECT R.a1, R.a2
FROM R,S
WHERE R.a1=S.b1 AND R.a2=S.b2
или
SELECT R.a1, R.a2
FROM R
WHERE R.a1 IN
(SELECT S.b1 FROM S
WHERE S.b1=R.a1) AND R.a2 IN
(SELECT S.b2
FROM S
WHERE S.b2=R.a2)
EXCEPT ) R-S двух отношений R и S состоит из кортежей, которые имеются в отношении R, но отсутствуют в отношении S. Причем отношения R и S должны быть совместимы по
R и S является таблица, содержащая все строки, которые присутствуют в таблице R, но отсутствуют в таблице S.
SELECT R.a1, R.a2
FROM R
WHERE NOT EXISTS
(SELECT S.b1,S.b2
FROM S
WHERE S.b1=R.a2 AND S.b2=R.a1)
R:S - набор R, определенных на множестве атрибутов C, которые соответствуют комбинации всех S
T1=ПC( R ); T2=ПC( (S X T1) -R ); T=T1 - T2.
Отношение R определено на множестве атрибутов A, а отношение S - на множестве атрибутов B, причем $$A \supseteq B$$ и C=A - B.
Пусть A ={имя, пол, рост, возраст, вес}; B ={имя, пол, возраст}; C ={рост, вес}.
Отношение R | ||||
|---|---|---|---|---|
имя |
пол |
рост |
возраст |
вес |
a |
ж |
160 |
20 |
60 |
b |
м |
180 |
30 |
70 |
c |
ж |
150 |
16 |
40 |
Отношение S | ||
|---|---|---|
имя |
пол |
возраст |
a |
ж |
20 |
T1=ПC(R) | |
|---|---|
рост |
вес |
160 |
60 |
180 |
70 |
150 |
40 |
TT=(S X T1)-R | ||||
|---|---|---|---|---|
имя |
пол |
возраст |
рост |
вес |
a |
ж |
20 |
180 |
70 |
a |
ж |
20 |
150 |
40 |
T2=ПC((S X T1)-R) | |
|---|---|
рост |
вес |
180 |
70 |
150 |
40 |
T=T1-T2 | |
|---|---|
рост |
вес |
160 |
60 |
Пример 5.16. Деление отношений в SQL.
CREATE TABLE R (i int primary key, имя varchar(3), пол varchar(3), рост int, возраст int, вес int)
CREATE TABLE S (i int primary key, имя varchar(3), пол varchar(3), возраст int)
CREATE VIEW T1 AS SELECT рост,вес FROM R
CREATE VIEW TT AS
SELECT S.имя, S.пол, S.возраст,
T1.рост, T1.вес
FROM S, T1
CREATE VIEW T2
AS
SELECT TT.рост, TT.вес
FROM TT
WHERE NOT EXISTS
(SELECT R.рост, R.вес
FROM R
WHERE TT.имя=R.имя AND TT.пол=R.пол
AND TT.возраст=R.возраст
AND TT.рост=R.рост
AND TT.вес=R.вес)
SELECT T1.рост, T1.вес
FROM T1
WHERE NOT EXISTS
(SELECT T2.рост,T2.вес
FROM T2
WHERE T1.рост=T2.рост AND T1.вес=T2.вес)
Рассмотрим основные операции над отношениями, которые могут представлять интерес с точки зрения извлечения данных из реляционных таблиц. Это
Для иллюстрации
Отношение R | |
|---|---|
R.a1 |
R.a2 |
A |
1 |
A |
2 |
B |
1 |
B |
3 |
B |
4 |
CREATE TABLE R (a1 CHAR(1), a2 INT, PRIMARY KEY(a1,a2))
Отношение S | |
|---|---|
S.b1 |
S.b2 |
1 |
h |
2 |
g |
3 |
h |
CREATE TABLE S (b1 INT PRIMARY KEY, b2 CHAR(1))
Операции
Операция R и определяет результирующее отношение, которое содержит только те кортежи (строки) отношения R, которые удовлетворяют заданному условию F (предикату).
$$\sigma_{F}(R)$$ или $$\sigma_{предикат}(R)$$.
Пример 5.1. Операция выборки в SQL.
SELECT a1, a2 FROM R WHERE a2=1
Операция
Пример 5.2.
SELECT DISTINCT b2 FROM S
К основным операциям над отношениями относится
RxS двух отношений (двух таблиц) определяет новое отношение - результат конкатенации (т.е. сцепления) каждого кортежа (каждой записи) из отношения R с каждым кортежем (каждой записью) из отношения S
RxS={(a, 1, 1, h), (a, 2, 1, h),
(b, 1, 1, h), ... }
SELECT R.a1, R.a2, S.b1, S.b2 FROM R, S
Результат
R x S | |||
|---|---|---|---|
R.a1 |
R.a2 |
S.b1 |
S.b2 |
a |
1 |
1 |
h |
a |
1 |
2 |
g |
a |
1 |
3 |
h |
a |
2 |
1 |
h |
a |
2 |
2 |
g |
a |
2 |
3 |
h |
b |
1 |
1 |
h |
b |
1 |
2 |
g |
b |
1 |
3 |
h |
b |
3 |
1 |
h |
b |
3 |
2 |
g |
b |
3 |
3 |
h |
b |
4 |
1 |
h |
b |
4 |
2 |
g |
b |
4 |
3 |
h |
Если одно отношение имеет N записей и K полей, а другое M записей и L полей, то отношение с их NxM записей и K+L полей. Исходные отношения могут содержать поля с одинаковыми именами, тогда имена полей будут содержать названия таблиц в виде префиксов для обеспечения уникальности имен полей в отношении, полученном как результат выполнения
Однако в таком виде (пример 5.3.) отношение содержит больше информации, чем обычно необходимо пользователю. Как правило, пользователей интересует лишь некоторая часть всех комбинаций записей в
В языке SQL для задания типа JOIN в предложении FROM.
Формат операции:
FROM имя_таблицы_1 {INNER | LEFT | RIGHT}
JOIN имя_таблицы_2
ON условие_соединения
Существуют различные типы операций
Операция тета-соединения $$R \triangleright \triangleleft _{F} S$$ определяет отношение, которое содержит кортежи из R и S, удовлетворяющие предикату F. Предикат F имеет вид $$R.ai \Theta S.bj$$, где вместо $$\Theta$$ может быть указан один из операторов сравнения ( >, >=, <, <=, =, <> ).
Если предикат F содержит только оператор равенства ( = ), то
| $$R \triangleright \triangleleft _{F} S, F=(R.a2=S.b1)$$ | |||
|---|---|---|---|
R.a1 |
R.a2 |
S.b1 |
S.b2 |
a |
1 |
1 |
h |
a |
2 |
2 |
g |
b |
3 |
3 |
h |
b |
1 |
1 |
h |
Операция тета-соединения в языке SQL называется INNER JOIN (внутреннее WHERE сравниваются значения полей из разных таблиц. В этом случае строится
В условиях объединения могут участвовать поля, относящиеся к одному и тому же типу данных и содержащие один и тот же вид данных, но они не обязательно должны иметь одинаковые имена.
Блоки данных из двух таблиц объединяются, как только в указанных полях будут найдены совпадающие значения.
Если в предложении FROM перечислено несколько таблиц и при этом не употребляется спецификация JOIN, а для указания соответствия полей из таблиц используется условие в предложении WHERE, то некоторые реляционные СУБД (например, Access) оптимизируют выполнение запроса, интерпретируя его как
Если перечислять ряд таблиц или запросов и не указывать условия объединения, в качестве результирующей таблицы будет выбрано
SELECT R.a1, R.a2, S.b1, S.b2
FROM R, S
WHERE R.a2=S.b1
или
SELECT R.a1, R.a2, S.b1, S.b2
FROM R INNER JOIN S ON R.a2=S.b1
Естественным R и S, выполненное по всем общим атрибутам, из результатов которого исключается по одному экземпляру каждого общего атрибута.
| $$R \triangleright \triangleleft S, F=(R.a2=S.b1)$$ | ||
|---|---|---|
R.a1 |
R.a2 или S.b1 |
S.b2 |
a |
1 |
h |
a |
2 |
g |
b |
3 |
h |
b |
1 |
h |
SELECT R.a1, R.a2, S.b2
FROM R, S
WHERE R.a2=S.b1
или
SELECT R.a1, S.b1, S.b2
FROM R INNER JOIN S ON R.a2=S.b1
Пример 5.6. Вывести информацию о проданных товарах.
SELECT *
FROM Сделка, Товар
WHERE Сделка.КодТовара=Товар.КодТовара
Или (что эквивалентно)
SELECT *
FROM Товар INNER JOIN Сделка
ON Товар.КодТовара=Сделка.КодТовара
Можно создать вложенные объединения, добавив третью таблицу к результату объединения двух других таблиц.
Пример 5.7. Получить сведения о товарах, дате сделок, количестве проданного товара и покупателях.
SELECT Товар.Название, Сделка.Количество, Сделка.
Дата, Клиент.Фирма
FROM Клиент INNER JOIN
(Товар INNER JOIN Сделка
ON Товар.КодТовара=Сделка.КодТовара)
ON Клиент.КодКлиента=Сделка.КодКлиента
Использование общих имен таблиц для идентификации столбцов неудобно из-за их громоздкости. Каждой таблице можно присвоить какое-нибудь краткое обозначение, псевдоним.
Пример 5.8. Получить сведения о товарах, дате сделок, количестве проданного товара и покупателях. В запросе используются псевдонимы таблиц.
SELECT Т.Название, С.Количество,
С.Дата, К.Фирма
FROM Клиент AS К INNER JOIN
(Товар AS Т INNER JOIN
Сделка AS С
ON Т.КодТовара=С.КодТовара)
ON К.КодКлиента=С.КодКлиента;
Какая из таблиц будет ведущей, определяет вид LEFT - левое RIGHT - правое
Левым R, не имеющие совпадающих значений в общих столбцах отношения S, также включаются в результирующее отношение.
| $$R \supset \triangleleft S$$ | |||
|---|---|---|---|
R.a1 |
R.a2 |
S.b1 |
S.b2 |
a |
1 |
1 |
h |
a |
2 |
2 |
g |
b |
1 |
1 |
h |
b |
3 |
3 |
h |
b |
4 |
null |
null |
SELECT R.a1, R.a2, S.b1, S.b2 FROM R LEFT JOIN S ON R.a2=S.b1
Существует и правое NULL.
SELECT R.a1, R.a2, S.b1, S.b2 FROM R RIGHT JOIN S ON R.a2=S.b1
Пример 5.11. Вывести информацию о всех товарах. Для проданных товаров будет указана дата сделки и количество. Для непроданных эти поля останутся пустыми.
SELECT Товар.*, Сделка.* FROM Товар LEFT JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара;
R, которые входят в R и S
| $$R \triangleleft _F S, F=(R.a2=S.b1)$$ | |
|---|---|
R.a1 |
R.a2 |
a |
1 |
a |
2 |
b |
3 |
b |
1 |
SELECT R.a1, R.a2
FROM R, S
WHERE R.a2=S.b1
или
SELECT R.a1, R.a2
FROM R INNER JOIN S ON R.a2=S.b1
UNION ) $$R \cup S$$ отношений R и S можно получить в результате их конкатенации с образованием одного отношения с исключением кортежей-дубликатов. При этом отношения R и S должны быть совместимы, т.е. иметь одинаковое количество полей с совпадающими типами данных. Иначе говоря, отношения должны быть совместимы по
R и S является таблица, содержащая все строки, которые имеются в первой таблице R, во второй таблице S или в обеих таблицах сразу
SELECT R.a1, R.a2 FROM R UNION SELECT S.b2, S.b1 FROM S
INTERSECT ) $$R \cap S=R-(R-S)$$ определяет отношение, которое содержит кортежи, присутствующие как в отношении R, так и в отношении S. Отношения R и S должны быть совместимы по
R и S является таблица, содержащая все строки, присутствующие в обеих исходных таблицах одновременно
SELECT R.a1, R.a2
FROM R,S
WHERE R.a1=S.b1 AND R.a2=S.b2
или
SELECT R.a1, R.a2
FROM R
WHERE R.a1 IN
(SELECT S.b1 FROM S
WHERE S.b1=R.a1) AND R.a2 IN
(SELECT S.b2
FROM S
WHERE S.b2=R.a2)
EXCEPT ) R-S двух отношений R и S состоит из кортежей, которые имеются в отношении R, но отсутствуют в отношении S. Причем отношения R и S должны быть совместимы по
R и S является таблица, содержащая все строки, которые присутствуют в таблице R, но отсутствуют в таблице S.
SELECT R.a1, R.a2
FROM R
WHERE NOT EXISTS
(SELECT S.b1,S.b2
FROM S
WHERE S.b1=R.a2 AND S.b2=R.a1)
R:S - набор R, определенных на множестве атрибутов C, которые соответствуют комбинации всех S
T1=ПC( R ); T2=ПC( (S X T1) -R ); T=T1 - T2.
Отношение R определено на множестве атрибутов A, а отношение S - на множестве атрибутов B, причем $$A \supseteq B$$ и C=A - B.
Пусть A ={имя, пол, рост, возраст, вес}; B ={имя, пол, возраст}; C ={рост, вес}.
Отношение R | ||||
|---|---|---|---|---|
имя |
пол |
рост |
возраст |
вес |
a |
ж |
160 |
20 |
60 |
b |
м |
180 |
30 |
70 |
c |
ж |
150 |
16 |
40 |
Отношение S | ||
|---|---|---|
имя |
пол |
возраст |
a |
ж |
20 |
T1=ПC(R) | |
|---|---|
рост |
вес |
160 |
60 |
180 |
70 |
150 |
40 |
TT=(S X T1)-R | ||||
|---|---|---|---|---|
имя |
пол |
возраст |
рост |
вес |
a |
ж |
20 |
180 |
70 |
a |
ж |
20 |
150 |
40 |
T2=ПC((S X T1)-R) | |
|---|---|
рост |
вес |
180 |
70 |
150 |
40 |
T=T1-T2 | |
|---|---|
рост |
вес |
160 |
60 |
Пример 5.16. Деление отношений в SQL.
CREATE TABLE R (i int primary key, имя varchar(3), пол varchar(3), рост int, возраст int, вес int)
CREATE TABLE S (i int primary key, имя varchar(3), пол varchar(3), возраст int)
CREATE VIEW T1 AS SELECT рост,вес FROM R
CREATE VIEW TT AS
SELECT S.имя, S.пол, S.возраст,
T1.рост, T1.вес
FROM S, T1
CREATE VIEW T2
AS
SELECT TT.рост, TT.вес
FROM TT
WHERE NOT EXISTS
(SELECT R.рост, R.вес
FROM R
WHERE TT.имя=R.имя AND TT.пол=R.пол
AND TT.возраст=R.возраст
AND TT.рост=R.рост
AND TT.вес=R.вес)
SELECT T1.рост, T1.вес
FROM T1
WHERE NOT EXISTS
(SELECT T2.рост,T2.вес
FROM T2
WHERE T1.рост=T2.рост AND T1.вес=T2.вес)
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.