Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

БД / 1

.docx
Скачиваний:
37
Добавлен:
18.02.2017
Размер:
124.07 Кб
Скачать

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);

База данных — совокупность данных, хранимых в соответствии со схемой данных, манипулирование которыми выполняют в соответствии с правилами средств моделирования данных.

Первичный ключ – выбранный для идентификации отношения потенциальный ключ (остальные – альтернативные ключи).

Внешний ключ – средство связи отношений внутри БД

Нормализация – преобразование исходного отношения к приемлемому набору отношений методом последовательных приближений.

Блокировка – отметка о захвате объекта транзакцией в ограниченный или исключительный доступ с целью предотвращения коллизий и поддержания целостности данных.

Транзакция – набор операций (изменений), который должен быть выполнен полностью или не выполнен совсем (единый логический блок).

Индекс – вспомогательная структура данных, используемая для доступа к данным. Хранит указатели на места хранения записей. Создается для столбцов таблицы.

Целостность БД – соответствие имеющейся в базе данных информации её внутренней логике, структуре и всем явно заданным правилам.

Триггер – хранимая процедура специального типа, автоматически запускаемая при выполнении заданного оператора.

Нормальная форма – Разделение отношения на два и более новых отношения. При этом утрачивается одна функциональная зависимость.

Домен – ограниченное подмножество значений типа данных (данные сравнимы, если относятся к одному домену).

Аудит БД – контроль над выполняемыми операциями в БД

Соседние файлы в папке БД