ІП12 Піонтківський

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 7

1.

Рекурсивний зв’язок – зв'язок, що виникає в БД, коли таблиця має зв'язок з


собою через одне або кілька полів. Корисний для ієрархій.
Наприклад існує таблиця Employees з атрибутами EmployeeID – PK, Name та
ManagerID – FK.
ManagerID міститиме посилання на колонку EmployeeID цієї ж таблиці, адже
менеджером кожного працівника теж є працівник.
Скрипт для створення таблиці:
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
Name VARCHAR(100),
ManagerID INT REFERENCES Employees(EmployeeID)
);

Отримати працівників та їх менеджерів:

SELECT EmployeeID, Name, ManagerID


FROM Employees
WHERE ManagerID IS NULL
UNION ALL
SELECT e.EmployeeID, e.Name, e.ManagerID
FROM Employees e
INNER JOIN RecursiveHierarchy r ON e.ManagerID = r.EmployeeID;
2.
Задіяні сутності – Students, Professors.
Зв’язків між сутностями немає.
Поєдную по полю first_name.
ER діаграма

DDL скрипти
CREATE DATABASE Deanery;

Use Deanery;

CREATE TABLE Professors (


id INT PRIMARY KEY IDENTITY(1, 1),
last_name VARCHAR(255) NOT NULL,
first_name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE
);

CREATE TABLE Students (


id INT PRIMARY KEY IDENTITY(1, 1),
last_name VARCHAR(255) NOT NULL,
first_name VARCHAR(255) NOT NULL,
group_name VARCHAR(10),
email VARCHAR(255) UNIQUE
);

CREATE TABLE Subjects (


id INT PRIMARY KEY IDENTITY(1, 1),
name VARCHAR(255) NOT NULL,
professor_id INT,
CONSTRAINT FK_ProfessorSubject FOREIGN KEY (professor_id) REFERENCES Professors(id)
);

CREATE TABLE Student_Subject (


student_id INT,
subject_id INT,
PRIMARY KEY (student_id, subject_id),
FOREIGN KEY (student_id) REFERENCES Students(id),
FOREIGN KEY (subject_id) REFERENCES Subjects(id)
);

Вставка даних.
INSERT INTO Professors (last_name, first_name, email) VALUES
('Smith', 'John', 'john.smith@example.com'),
('Johnson', 'Emily', 'emily.johnson@example.com'),
('Garcia', 'Michael', 'michael.garcia@example.com');

INSERT INTO Students (last_name, first_name, group_name, email) VALUES


('Brown', 'Emma', 'Group A', 'emma.brown@example.com'),
('Davis', 'John', 'Group B', 'liam.davis@example.com'),
('Martinez', 'Sophia', 'Group C', 'sophia.martinez@example.com'),
('Anderson', 'Ethan', 'Group A', 'ethan.anderson@example.com'),
('Taylor', 'Olivia', 'Group B', 'olivia.taylor@example.com'),
('Thomas', 'Noah', 'Group C', 'noah.thomas@example.com'),
('Hernandez', 'Isabella', 'Group A', 'isabella.hernandez@example.com'),
('Moore', 'John', 'Group B', 'mason.moore@example.com'),
('Allen', 'Ava', 'Group C', 'ava.allen@example.com'),
('Young', 'Michael', 'Group A', 'logan.young@example.com'),
('Clark', 'James', 'Group B', 'james.clark@example.com'),
('Lewis', 'Charlotte', 'Group C', 'charlotte.lewis@example.com'),
('Walker', 'Amelia', 'Group A', 'amelia.walker@example.com'),
('White', 'Benjamin', 'Group B', 'benjamin.white@example.com'),
('Scott', 'Michael', 'Group C', 'harper.scott@example.com');

INSERT INTO Subjects (name, professor_id) VALUES


('Mathematics', 1),
('Physics', 2),
('Biology', 3);

--припустимо, що кожен студент вивчає всі 3 предмети


INSERT INTO Student_Subject (student_id, subject_id)
SELECT s.id, sub.id
FROM Students s
CROSS JOIN Subjects sub;

SELECT скрипти
--join
SELECT
Students.first_name,
Students.last_name,
'student' as role
FROM Students
JOIN Professors
ON Students.first_name = Professors.first_name
UNION ALL
SELECT DISTINCT
Professors.first_name,
Professors.last_name,
'professor' as role
FROM Students
JOIN Professors
ON Students.first_name = Professors.first_name

--in
SELECT
Students.first_name,
Students.last_name,
'student' as role
FROM Students
WHERE Students.first_name IN (SELECT Professors.first_name FROM Professors)
UNION ALL
SELECT
Professors.first_name,
Professors.last_name,
'professor' as role
FROM Professors
WHERE Professors.first_name IN (SELECT Students.first_name FROM Students)

--exists
SELECT
Students.first_name,
Students.last_name,
'student' as role
FROM Students
WHERE EXISTS (SELECT 1 FROM Professors WHERE Professors.first_name = Students.first_name)
UNION ALL
SELECT
Professors.first_name,
Professors.last_name,
'professor' as role
FROM Professors
WHERE EXISTS (SELECT 1 FROM Students WHERE Students.first_name = Professors.first_name)

--intersect
WITH first_names(name) AS
(
SELECT
Students.first_name
FROM Students
INTERSECT
SELECT
Professors.first_name
FROM Professors
)

SELECT
Students.first_name,
Students.last_name,
'student' as role
FROM Students
WHERE first_name in (SELECT name FROM first_names)
UNION ALL
SELECT
Professors.first_name,
Professors.last_name,
'professor' as role
FROM Professors
WHERE first_name in (SELECT name FROM first_names)
Результати роботи SELECT скриптів.
JOIN

IN
EXISTS
INTERSECT

You might also like