БД / 1
.docx
1.Вывести список сотрудников по алфавиту.
SELECT*
FROM EMP
ORDER BY Name DESC;
2.Вывести всех инженеров, (имя, зарплату и дату рождения) в порядке убывания стажа.
SELECT Name,Salary,Born_date,Hire_date
FROM EMP
WHERE ID_Job = (SELECT ID_Job FROM JOB WHERE Job = 'инженер')
ORDER BY YEAR (Hire_date) Asc;
3.Вывести общий список всех инженеров (из всех отделов), зарплата которых не ниже 3000, и сотрудников отдела 2.
SELECT Name,Salary,Born_date,ID_Dep
FROM EMP
WHERE (ID_JOB = (SELECT ID_Job FROM JOB WHERE Job = 'инженер')And Salary >= 3000)
And EMP.ID_Dep=2;
4.Вывести номера отделов и количество сотрудников, которые в них работают.
SELECT ID_DEP ,COUNT (*)
FROM EMP
GROUP BY ID_Dep;
5.Вывести имя сотрудника, его должность и имя руководителя, за которым он закреплен.
SELECT Name,
(SELECT Job FROM JOB WHERE ID_Job=r.ID_Job),
(SELECT Name FROM EMP WHERE ID_Emp=r.ID_man) FROM EMP AS r;
6.Вывести названия отделов, в которых минимальная зарплата сотрудников превышает 1000.
SELECT Department
FROM DEP
WHERE (SELECT min(Salary)FROM EMP WHERE ID_Dep = DEP.ID_Dep)>500;
7.Вывести список сотрудников, получающих надбавки.
SELECT *
FROM EMP
WHERE ID_Emp = ANY (SELECT ID_Emp FROM BONUS);
8.Вывести имя сотрудника, который получает максимальную надбавку.
SELECT *
FROM EMP
WHERE ID_Emp = (SELECT ID_Emp FROM BONUS WHERE Bonus= (SELECT max (Bonus) FROM BONUS ));
9.Вывести список сотрудников, участвующих в проектах и получающих надбавки
SELECT * FROM EMP
WHERE ID_Emp = ANY (SELECT ID_Emp FROM BONUS) And
ID_Emp=ANY( SELECT ID_Emp FROM PROJECT_EMP);
10.Вывести имена всех сотрудников, сумму их надбавок и общий доход (зарплату и надбавки).
SELECT Name, Salary,
(SELECT Sum(Bonus) FROM BONUS WHERE ID_Emp = EMP.ID_Emp)
Bonus ,isnull ((SELECT Sum(Bonus) FROM BONUS WHERE ID_Emp=EMP.ID_Emp),0) + (SELECT Salary) FROM EMP;
11.Посчитать количество денег, которое тратится на выплату всем сотрудникам (на зарплату и надбавки).
SELECT (SELECT Sum(Salary)FROM EMP)+(SELECT SUM(Bonus)FROM BONUS);
12.Вывести имена сотрудников, получающих минимальную и максимальную
SELECT Name,Salary FROM EMP
WHERE Salary =(SELECT Min(Salary)FROM EMP )
Or Salary = (SELECT Max(Salary)FROM EMP ) ;
13.Вывести название проекта, в котором занято максимальное число сотрудников.
SELECT Project FROM
(SELECT ID_Project ,Project,(SELECT COUNT(*)
FROM PROJECT_EMP WHERE ID_Project=PROJECT.ID_Project)As New FROM PROJECT )As New_tab
WHERE New = (SELECT max(New1)FROM (SELECT ID_Project ,Project,
(SELECT COUNT(*)FROM PROJECT_EMP WHERE ID_Project=PROJECT.ID_Project)As New1 FROM PROJECT)As New_tab1);
Запрос 1 Вывести список отделов по алфавиту.
SELECT Department FROM DEP ORDER BY Department
Запрос 2 Вывести всех менеджеров (имя, номер отдела, зарплату), отсортировав их по возрасту.
SELECT Name, ID_Dep, Job, Salary, Born_date
FROM dbo.EMP E inner Join
(SELECT * FROM dbo.JOB WHERE ID_Job = 2) J
On E.ID_Job = J.ID_Job
ORDER BY Born_date DESC
Запрос 3 Вывести одновременно всех менеджеров, работающих в отделе 3, и сотрудников (из всех отделов) с зарплатой выше 2000.
SELECT EMP.Name, JOB.Job, DEP.Department, EMP.Salary
FROM EMP INNER JOIN
JOB ON EMP.ID_Job = JOB.ID_Job INNER JOIN
DEP ON EMP.ID_Dep = DEP.ID_Dep
WHERE (EMP.Salary > 2000) OR
(JOB.Job = N'Менеджер') and (DEP.ID_Dep = N'3')
Запрос 4 Вывести должности и количество сотрудников, их занимающих.
/*SELECT Job, count(*)
FROM dbo.EMP E inner Join
(SELECT * FROM dbo.JOB ) J
On E.ID_Job = J.ID_Job
group by (Job)
Запрос 5 Вывести имена сотрудников, их зарплату и названия отделов, в котором они работают.
SELECT Name, Department, Salary
FROM dbo.EMP E inner Join
(SELECT * FROM dbo. DEP ) J
On E.ID_Dep = J.ID_Dep
Запрос 6 Вывести названия отделов, суммарная зарплата, в которых не превышает 3000.
Select Department
FROM DEP
WHERE (SELECT SUM(Salary) FROM EMP WHERE ID_Dep=DEP.ID_Dep)<30000
Запрос 7 Вывести список сотрудников, не получающих надбавок.
SELECT Name, Bonus FROM dbo.EMP, dbo.Bonus
WHERE Bonus =0
Запрос 8 Вывести сотрудников, работающих в Техническом отделе, участвующих в проектах и получающих надбавки.
SELECT EMP.Name, BONUS.Bonus, DEP.Department, ID_Project
FROM EMP INNER JOIN
BONUS ON EMP.ID_Job = BONUS.ID_Emp INNER JOIN
DEP ON EMP.ID_Dep = DEP.ID_Dep INNER JOIN
PROJECT_EMP ON EMP.ID_Job = BONUS.ID_Emp
WHERE
(DEP.ID_Dep = N'2')
1.Вывести сетку зарплат, отсортированную по категориям.
SELECT EMP.Salary, SALGRADE.Grade
FROM EMP CROSS JOIN
SALGRADE
ORDER BY SALGRADE.Grade, EMP.Salary DESC
2.Вывести всех водителей (имя, должность и номер отдела), отсортировав их по стажу.
SELECT EMP.Name, JOB.Job, DEP.Department, EMP.Hire_date
FROM EMP INNER JOIN
JOB ON EMP.ID_Job = JOB.ID_Job INNER JOIN
DEP ON EMP.ID_Dep = DEP.ID_Dep
WHERE (JOB.Job = N'Водитель')
ORDER BY EMP.Hire_date
3.Вывести одновременно всех менеджеров (из всех отделов) и всех сотрудников отдела 3, получающих зарплату выше 1000.
SELECT EMP.Name, JOB.Job, DEP.Department, EMP.Salary
FROM EMP INNER JOIN
JOB ON EMP.ID_Job = JOB.ID_Job INNER JOIN
DEP ON EMP.ID_Dep = DEP.ID_Dep
WHERE (JOB.Job = N'Менеджер') OR
(DEP.ID_Dep = N'3') AND (EMP.Salary > 1000)
4.Вывести годы рождения и количество сотрудников каждого года рождения.
SELECT YEAR(Born_date), Count(*)
FROM EMP GROUP BY YEAR(Born_date)
5.Вывести имя сотрудника, его зарплату и максимальную зарплату сотрудника его категории.
SELECT EMP.Name, EMP.Salary, SALGRADE.Hisal
FROM EMP CROSS JOIN
SALGRADE
ORDER BY EMP.Name
6.Вывести должности, суммарная зарплата которых превышают 1500.
Select JOB
FROM JOB
WHERE (SELECT SUM(Salary) FROM EMP WHERE ID_Job=JOB.ID_Job)>1500
7.Вывести список сотрудников 3-ей категории.
SELECT EMP.Name
FROM EMP INNER JOIN
JOB ON EMP.ID_Job = JOB.ID_Job
WHERE (JOB.Grade = 3)
8.Вывести список сотрудников, у которых есть надбавки, превышающие оклад.
SELECT EMP.Name, BONUS.Bonus, EMP.Salary
FROM EMP INNER JOIN
BONUS ON EMP.ID_Emp = BONUS.ID_Emp AND EMP.Salary < BONUS.Bonus
9.Вывести имя сотрудника, получающего максимальную зарплату из тех, кто не получает надбавки.
SELECT DISTINCT Name, Salary
FROM emp AS e LEFT JOIN bonus AS b ON e.ID_Emp=b.ID_Emp
WHERE bonus IS NULL and Salary = (SELECT DISTINCT max(Salary) FROM emp as e LEFT JOIN bonus as b on e.ID_Emp = b.ID_Emp where bonus is null);
10.Вывести должности, сумму надбавок, получаемых сотрудниками в этих должностях и суммарные доходы (зарплата и надбавки) по этим должностям.
SELECT job, ISNULL(sum(bonus), 0) as bonus, sum(salary) + ISNULL(sum(bonus), 0) as total
FROM (emp LEFT JOIN bonus ON emp.ID_Emp=bonus.ID_Emp) LEFT JOIN job ON emp.ID_Job=job.ID_Job
GROUP BY job;
11.Посчитать количество денег, которое тратится на выплату надбавок отделам 2 и 3.
SELECT ID_Dep, sum(bonus)
FROM (emp LEFT JOIN bonus ON emp.ID_Emp=bonus.ID_Emp) LEFT JOIN job ON emp.ID_Job=job.ID_Job
WHERE ID_Dep in (2,3)
GROUP BY ID_Dep;
12.Вывести названия отделов, в которых сотрудники получают минимальную зарплату без учета стажеров
SELECT Department, Salary
FROM (emp AS e LEFT JOIN job AS j ON e.ID_Job=j.ID_Job) LEFT JOIN dep AS d ON e.ID_Dep=d.ID_Dep
WHERE salary =(select min(salary) from EMP where ID_Job<>7);
13.Вывести название отдела, сотрудники которого больше всех задействованы в проектах.
SELECT top 1 department AS Отдел, count(e.ID_Emp) AS Количество
FROM (emp AS e LEFT JOIN project_emp AS p ON e.ID_Emp=p.ID_Emp) LEFT JOIN dep AS d ON e.ID_Dep=d.id_dep
WHERE p.ID_Emp is not null
GROUP BY department order by count(e.ID_Emp) desc;
1.Вывести список сотрудников в порядке обратном алфавитному.
SELECT Name
FROM EMP
ORDER BY Name DESC
2.Вывести всех инженеров (имя, должность и номер отдела), отсортировав их по возрасту.
SELECT Name, ID_Dep, Job, Born_date
FROM EMP, JOB
WHERE EMP.ID_Job=JOB.ID_Job And JOB.Job='Инженер'
ORDER BY Born_date
3.Вывести сотрудников, не работающих в отделе 1, зарплата которых находится в интервале от 1000 до 2000.
SELECT Name, ID_Dep, Salary FROM dbo.EMP WHERE ID_Dep != 1
AND Salary > 1000 AND Salary < 2000
4.Вывести годы поступления на работу и количество сотрудников, поступивших на работу в каждом году.
SELECT YEAR(Hire_date), count(*) FROM dbo.EMP
group by YEAR(Hire_date)
5.Вывести имя сотрудника, его зарплату и минимальную зарплату сотрудника его уровня.
SELECT Name, Salary, Losal From dbo.EMP E inner join
(SELECT *FROM dbo.JOB) J
On E.ID_Job = J.ID_Job inner join
(SELECT *FROM dbo.SALGRADE) S
On J.Grade = S.Grade
6.Вывести название отдела, в котором работает старейший сотрудник.
SELECT Department
FROM dbo.DEP D inner join (SELECT *FROM dbo.EMP) E
On D.ID_Dep = E.ID_Dep
WHERE Hire_date <= All(SELECT Hire_date FROM dbo.EMP)
7.Вывести названия отделов, в которых максимальная зарплата превышает 2000.
SELECT Department, Hisal FROM dbo.DEP, dbo.SALGRADE
WHERE Hisal > 2000
8.Вывести список отделов, сотрудники из которых работают в самом большом проекте (по количеству участников).
SELECT Department
FROM dbo.DEP D inner join (SELECT *FROM dbo.EMP) E
On D.ID_Dep = E.ID_Dep inner join
(SELECT *FROM dbo.PROJECT_EMP) P
On E.ID_Emp = P.ID_Emp
WHERE (SELECT COUNT(ID_Project) FROM dbo.PROJECT_EMP) >= All(SELECT COUNT(ID_Project) FROM dbo.PROJECT_EMP)
1.Вывести отсортированный список проектов.
SELECT*
FROM PROJECT
ORDER BY ID_PROJECT
2.Вывести всех сотрудников отделов 1 и 2, не являющихся стажерами, отсортировав их по возрасту.
SELECT EMP.*, DEP.ID_Dep, JOB.Job
FROM JOB INNER JOIN (DEP INNER JOIN EMP ON DEP.ID_Dep = EMP.ID_Dep) ON JOB.ID_Job = EMP.ID_Job
WHERE (((DEP.ID_Dep)=1 Or (DEP.ID_Dep)=2) AND ((JOB.Job)!='стажер'));
3.Вывести сотрудников, работающих в техническом отделе, участвующих в проектах и получающих зарплату выше 2000.
SELECT EMP.*, EMP.Salary, DEP.Department, PROJECT.Project
FROM PROJECT, DEP INNER JOIN EMP ON DEP.ID_Dep = EMP.ID_Dep
WHERE (((EMP.Salary)>2000) AND ((DEP.Department)=технический отдел') AND ((PROJECT.Project)!='NULL'));
4.Вывести список проектов и количество сотрудников, в них занятых.
SELECT PROJECT.Project, Count (*)
FROM PROJECT INNER JOIN PROJECT_EMP ON PROJECT_EMP.ID_Project=Project.ID_Project
GROUP BY PROJECT_EMP.ID_Project,PROJECT.Project;
5.Вывести имена сотрудников, зарплата которых не соответствует категориям их должностей.
SELECT EMP.*, EMP.Salary
FROM SALGRADE INNER JOIN (JOB INNER JOIN EMP ON JOB.ID_Job = EMP.ID_Job) ON SALGRADE.Grade = JOB.Grade
WHERE (("Salary"<"Losal")) OR (("Salary">"Hisal"));
6.Вывести название отдела, в котором работает сотрудник с минимальным стажем.
SELECT Department
FROM DEP
WHERE ID_Dep = (SELECT ID_Dep FROM EMP WHERE ID_Emp= (SELECT ID_Emp FROM EMP WHERE Hire_date =(SELECT min(Hire_date) FROM EMP)));
7.Вывести названия проектов, в которых занят самый высокооплачиваемый сотрудник.
SELECT PROJECT
FROM Project
WHERE ID_Project = (SELECT ID_Project FROM EMP WHERE ID_Emp= (SELECT ID_Emp FROM EMP WHERE SALARY =(SELECT max(SALARY) FROM EMP)));
8.Вывести должность, которую занимает максимальное количество сотрудников, и их среднюю зарплату.
SELECT*
FROM (SELECT JOB.ID_Job,JOB.JOB,AVG(EMP.Salary) AS A , Count (*) AS C
FROM JOB INNER JOIN EMP ON JOB.ID_JOB=EMP.ID_Job
GROUP BY JOB.ID_Job,JOB.Job) AS t1
WHERE t1.C =
(SELECT MAX(t.C)
From
(SELECT JOB.ID_Job, JOB.JOB, Count (*) AS C
FROM JOB INNER JOIN EMP ON JOB.ID_JOB=EMP.ID_Job
GROUP BY JOB.ID_Job,JOB.Job) AS t);
База данных — совокупность данных, хранимых в соответствии со схемой данных, манипулирование которыми выполняют в соответствии с правилами средств моделирования данных.
Первичный ключ – выбранный для идентификации отношения потенциальный ключ (остальные – альтернативные ключи).
Внешний ключ – средство связи отношений внутри БД
Нормализация – преобразование исходного отношения к приемлемому набору отношений методом последовательных приближений.
Блокировка – отметка о захвате объекта транзакцией в ограниченный или исключительный доступ с целью предотвращения коллизий и поддержания целостности данных.
Транзакция – набор операций (изменений), который должен быть выполнен полностью или не выполнен совсем (единый логический блок).
Индекс – вспомогательная структура данных, используемая для доступа к данным. Хранит указатели на места хранения записей. Создается для столбцов таблицы.
Целостность БД – соответствие имеющейся в базе данных информации её внутренней логике, структуре и всем явно заданным правилам.
Триггер – хранимая процедура специального типа, автоматически запускаемая при выполнении заданного оператора.
Нормальная форма – Разделение отношения на два и более новых отношения. При этом утрачивается одна функциональная зависимость.
Домен – ограниченное подмножество значений типа данных (данные сравнимы, если относятся к одному домену).
Аудит БД – контроль над выполняемыми операциями в БД