КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Поддержание сущностной и ссылочной целостности данных
Упражнения с использованием операторов обработки данных SQL Пример базы данных Работа с базой данных в командах SQL
В качестве демонстрационной базы данных используем фрагмент, описывающий предметную область ‘Заработная плата’.
Представленная ниже структура БД позволяет вести учет сотрудников, работающих на предприятии, а также хранить все выданные заработные платы с их расшифровкой по доходным и расходным статьям (например: оклад, районный коэффициент, подоходный налог и т.д.). Рисунок 4.1 - Фрагмент базы данных «Заработная плата» Связь между таблицами осуществляется с помощью следующих пар полей с типом связи один-ко-многим соответственно: 1. Staff.T_number- Paies.T_number; 2. Paies.Code_pay - Items_pay.Code_pay. Таблица 4.1 Список сотрудников (таблица Staff)
Таблица 4.2 Таблица учета выданной зарплаты (таблица Paies)
Таблица 4.3 Таблица расшифровки каждой зарплаты по статьям (таблица Items_pay)
Оператор создания базы данных CREATE DATABASE
Оператор создания структуры таблицы CREATE TABLE Оператор создания хранимой процедуры CREATE PROCEDURE Оператор модификации структуры таблицы ALTER TABLE
Оператор удаления таблицы DROP TABLE Оператор удаления базы данных DROP DATABASE Сортировка 1. Вывести все сведения о сотрудниках из таблицы Staff и отсортировать результат по табельному номеру: SELECT * FROM Staff ORDER BY T_number
2. Вывести список фамилий И.О. сотрудников, их должности, отсортировать результат по названиям должностей по возрастанию и по фамилиям по убыванию: SELECT Surname, Name, Lastname, Post FROM Staff ORDER BY Post ASC, Surname DESC
Изменение порядка следования полей 3. Вывести все сведения о сотрудниках из таблицы Staff таким образом, чтобы в результате порядок столбцов был следующим: Name, Lastname, Surname, Post, Date_input, Phone, Birthday, T_number, Type_post: SELECT Name, Lastname, Surname, Post, Date_input, Phone, Birthday, T_number, Type_post FROM Staff
4. Выбрать все поля из таблицы Paies таким образом, чтобы в результате порядок столбцов был следующим: Sum_pay, Pay_day, T_number, Code_pay: SELECT Sum_pay, Pay_day, T_number, Code_pay FROM Paies Выбор некоторых полей из двух (трех) таблиц 5. Вывести список фамилий, имен, отчеств сотрудников (поля Surname, Name, Lastname), а также значения их заработных плат (поле Sum_pay) и даты получения (поле Sum_pay): SELECT Surname, Name, Lastname, Sum_pay, Pay_day FROM Staff, Paies WHERE Staff.T_number = Paies.T_number
6. Вывести табельные номера, даты получения зарплаты и ее расклад по статьям, результат отсортировать по табельному номеру сотрудника: SELECT T_number, Pay_day, Item_pay, Item_sum FROM Paies, Items_pay WHERE Paies.Code_pay = Items_pay.Code_pay ORDER BY T_number
7. Вывести список фамилий и табельных номеров сотрудников, а также значения их заработных плат и даты получения с раскладкой каждой зарплаты по статьям: SELECT Surname, Staff.T_number, Sum_pay, Pay_day, Item_pay, Item_sum FROM Staff, Paies, Items_pay WHERE (Staff.T_number = Paies.T_number) AND (Paies.Code_pay = Items_pay.Code_pay)
Точное несовпадение значений одного из полей 8. Вывести список сотрудников и их должности, которые не являются служащими: SELECT Surname, Name, Lastname, Post FROM Staff WHERE NOT(Type_post = ‘служащий’)
9. Вывести список сотрудников и их даты поступления на работу, которые не являются бухгалтерами: SELECT Name, Lastname, Surname, Date_input FROM Staff WHERE NOT(Post = ‘бухгалтер’) Выбор записей по диапазону значений (Between) 10. Вывести список сотрудников и размеры полученных зарплат за период 01.01.2003 по 01.03.2003: - на VFP: SELECT Name, Lastname, Surname, Sum_pay, Pay_day FROM Staff, Paies WHERE (Staff.T_number = Paies.T_number) AND Pay_day BETWEEN CTOD(‘01.01.2003’) AND CTOD(‘01.03.2003’)
- на MS SQL Server: SELECT Name, Lastname, Surname, Sum_pay FROM Staff, Paies WHERE (Staff.T_number = Paies.T_number) AND Pay_day BETWEEN ‘1-JAN-2003’ AND ‘1-MAR-2003’ - на Access: SELECT Name, Lastname, Surname, Sum_pay FROM Staff, Paies WHERE (Staff.T_number = Paies.T_number) AND Pay_day BETWEEN CDate(‘01.01.2003’) AND CDate(‘01.03.2003’)
11. Вывести список сотрудников и их телефоны, значения которых находятся в диапазоне с 111111 по 222222: SELECT Name, Lastname, Surname, Phone FROM Staff WHERE Phone BETWEEN 111111 AND 222222
12. Вывести список сотрудников, у которых фамилия начинается на одну из букв диапазона ‘Р’-‘У’: SELECT Name, Lastname, Surname FROM Staff WHERE Surname BETWEEN ‘Р’ AND ‘У’
Выбор записей по диапазону значений (In) 13. Вывести список сотрудников с должностями ‘начальник отдела кадров’, ‘специалист отдела кадров’, ‘операционист отдела кадров’: SELECT Name, Lastname, Surname FROM Staff WHERE Post IN(‘начальник отдела кадров’, ‘специалист отдела кадров’, ‘операционист отдела кадров’)
14. Вывести список сотрудников, получающих одну из следующих надбавок к зарплате ‘премия’, ‘оплата учебы’, ‘поощрение’: SELECT Name, Lastname, Surname FROM Staff, Paies, Items_pay WHERE (Staff.T_number = Paies.T_number) AND (Paies.Code_pay = Items_pay.Code_pay) AND (Item_pay IN(‘премия’, ‘оплата учебы’, ‘поощрение’))
15. Вывести список сотрудников с табельными номерами 4, 67, 45, 77: SELECT Name, Lastname, Surname FROM Staff WHERE T_Number IN(4, 67, 45, 77) Выбор записей с использованием Like 16. Вывести неповторяющийся список статей в зарплате, которые начинаются на букву ‘н’: - на VFP, MS SQL Server: SELECT DISTINCT Item_pay FROM Items_pay WHERE Item_pay LIKE ‘н%’ - на Access: SELECT DISTINCT Item_pay FROM Items_pay WHERE Item_pay LIKE(“н*”)
17. Вывести список сотрудников, отчества которых содержат сочетание букв ‘ва’: - на VFP, MS SQL Server: SELECT Name, Lastname, Surname FROM Staff WHERE Lastname LIKE ‘%ва%’ - на Access: SELECT Name, Lastname, Surname FROM Staff WHERE Lastname LIKE(“*ва*”) Выбор записей по нескольким условиям 18. Вывести неповторяющийся список табельных номеров и имен сотрудников с табельными номерами 12-30 или сотрудников, у которых зарплата превысила хотя бы один раз размер 5000 руб.: SELECT DISTINCT Name, Lastname, Surname, Staff.T_number FROM Staff, Paies WHERE (Staff.T_number = Paies.T_number) AND ((T_Number BETWEEN 12 AND 30) OR Sum_pay>5000)
Многотабличные запросы (выборка из двух таблиц, выборка из трех таблиц с использованием JOIN) 19. Вывести список сотрудников, получающих одну из следующих надбавок к зарплате ‘премия’, ‘оплата учебы’, ‘поощрение’: SELECT Name, Lastname, Surname FROM (Staff INNER JOIN Paies ON Staff.T_number = Paies.T_number) INNER JOIN Items_pay ON Paies.Code_pay = Items_pay.Code_pay WHERE Item_pay IN(‘премия’, ‘оплата учебы’, ‘поощрение’)
20. Вывести неповторяющийся список всех сотрудников, у которых размер зарплаты составил от 2000 до 3000 руб.: SELECT DISTINCT Name, Lastname, Surname FROM Staff INNER JOIN Paies ON Staff.T_number = Paies.T_number WHERE (Sum_pay>=2000) AND (Sum_pay<3000)
21. Вывести коды зарплат, в которых была статья вычетов ‘за бездетность’: SELECT Paies.Code_pay FROM Paies INNER JOIN Items_pay ON Paies.Code_pay = Items_pay.Code_pay WHERE Item_pay = ‘за бездетность’
22. Вывести неповторяющийся список всех сотрудников, в которых была в зарплате статья вычетов ‘за бездетность’: SELECT DISTINCT Name, Lastname, Surname FROM (Staff INNER JOIN Paies ON Staff.T_number = Paies.T_number) INNER JOIN Items_pay ON Paies.Code_pay = Items_pay.Code_pay WHERE Item_pay = ‘за бездетность’
Вычисления 23. Вывести список сотрудников, должности и срок их работы в годах с сортировкой по уменьшению стажа: - на MS SQL Server: SELECT Name, Lastname, Surname, Post, (cast((GetDate() - Date_input) as bigint))/365.25 FROM Staff ORDER BY Date_input
24. Вывести список сотрудников, у которых еще не было дня рождения в текущем году, а также вывести количество дней до их дней рождений в текущем году: - на vfp: set date to german &&необходима для установки даты в формате дд.мм.гг SELECT Name, Lastname, Surname, Post, Birthday, CTOD(str(day(Birthday))+'.'+str(month(Birthday))+'.'+str(YEAR(Date())))-DATE() FROM Staff Where CTOD (str(day(Birthday)) + '. ' + str (month(Birthday)) + '. ' + str (YEAR(Date())))-DATE()) >0
25. Вывести список всех сотрудников, их табельные номера, даты и суммы получения зарплаты на руки и зарплаты, если бы у них не брали налог ‘за бездетность’: SELECT Staff.T_number, Name, Surname, Pay_day, Sum_pay, (Sum_pay-Item_sum) FROM (Staff INNER JOIN Paies ON Staff.T_number = Paies.T_number) INNER JOIN Items_pay ON Paies.Code_pay = Items_pay.Code_pay WHERE Item_pay = 'за бездетность'
Вычисление итоговых значений с использованием агрегатных функций 26. Вывести среднюю зарплату, которая когда-либо выдавалась на предприятии: SELECT AVG(Sum_pay) FROM Paies
27. Вывести список табельных номеров сотрудников и суммарную зарплату каждого: SELECT Staff.T_number, SUM(Sum_pay) FROM Staff, Paies WHERE (Staff.T_number = Paies.T_number) Group by Staff.T_number
28. Вывести количество сотрудников по каждой должности: SELECT Post, Count(T_number) FROM Staff Group by Post
29. Вывести дату устройства на работу самого первого и последнего сотрудника: SELECT Min(Date_input), Max(Date_input) FROM Staff
Изменение наименований полей 30. Вывести список табельных номеров сотрудников и суммарную зарплату каждого, которую поместить в поле с названием Itog: SELECT Staff.T_number, SUM(Sum_pay) AS Itog FROM Staff, Paies WHERE (Staff.T_number = Paies.T_number) Group by Staff.T_number
31. Объединить данные фамилии, имени, отчества в одном столбце с названием FIO: SELECT (Surname + ‘ ’ + Name + ‘ ’+ Lastname) AS FIO FROM Staff Использование переменных в условии 32. Вывести список сотрудников, принятых на работу за последний месяц: - на VFP:
SELECT Name, Lastname, Surname FROM Staff WHERE Date_Input BETWEEN Perem_B AND Perem_E
33. Вывести список сотрудников, возраст которых меньше заданного: - на MS SQL Server:
SELECT Name, Lastname, Surname FROM Staff WHERE (Year(GETDATE())-Year(Birthday)+(Day(Birthday)+Month(Birthday)*30.5)/365.25)< @Perem
34. Вывести список сотрудников, с фамилиями начинающимися на ‘Ив’: - на VFP
SELECT Name, Lastname, Surname FROM Staff WHERE Surname = Perem
Использование переменных вместо названий таблиц 35. Вывести список всех сотрудников, их табельные номера, даты и суммы получения зарплаты на руки и зарплаты: SELECT a.T_number, Name, Surname, Pay_day, Sum_pay FROM Staff a, Paies b, Items_pay c WHERE b.Code_pay = c.Code_pay AND a.T_number = b.T_number
36. Вывести список сотрудников, получающих одну из следующих надбавок к зарплате: ‘премия’, ‘оплата учебы’, ‘поощрение’, и коды их зарплат: SELECT Name, Lastname, Surname, b.Code_pay FROM Staff a, Paies b, Items_pay c WHERE b.Code_pay = c.Code_pay AND a.T_number = b.T_number AND Item_pay IN('премия', 'оплата учебы', 'поощрение')
Использование совместно с подзапросом квантора существования 37. Вывести неповторяющийся список сотрудников, которые получали премию: SELECT DISTINCT Name, Lastname, Surname FROM Staff, Paies WHERE Staff.T_number = Paies.T_number AND EXISTS(SELECT * FROM Items_pay WHERE Items_pay.Code_pay = Paies.Code_pay AND Item_pay='премия')
38. Вывести список сотрудников, которые ни разу не получали зарплаты: SELECT Surname, Name, Lastname FROM Staff WHERE NOT EXISTS(SELECT * FROM Paies WHERE Staff.T_number = Paies.T_number)
39. Вывести список сотрудников, у которых размер зарплаты не меньше 3000 руб.: SELECT Surname, Name, Lastname FROM Staff WHERE EXISTS(SELECT * FROM Paies WHERE Staff.T_number = Paies.T_number AND Sum_pay >=3000)
Использование функций совместно с подзапросом 40. Вывести список сотрудников и даты с размерами полученных зарплат, которые превысили средний размер их же зарплат: SELECT Surname, Name, Lastname, Sum_pay, Pay_Day FROM Staff INNER JOIN PAIES ON Staff.T_number = Paies.T_number WHERE Paies.Sum_pay>(SELECT AVG(Sum_pay) FROM Paies) Оператор обработки данных Update 41. Перевести всех сотрудников в статус ‘ИТР’, у которых название должности начинается с ‘главный’: UPDATE Staff SET Type_post = ‘ИТР’ WHERE Post = ‘главный’
42. Перевести всех сотрудников в статус ‘почет.пенсионер’, а значение должности удалить, если стаж их работы больше 20 лет и возраст больше 60 лет: UPDATE Staff SET Type_post = ‘почет.пенсионер’, Post = ‘’ WHERE (Date()-Date_Input)/365.25>20 AND (Date()-Birthday)/365.25>60
43. Измените значение Post на ‘нет сведений’, если значение поля является пустым: UPDATE Staff SET Post = ‘нет сведений’ WHERE Post = ‘’ Оператор обработки данных Insert 44. Добавьте в таблицу сотрудников новую запись, причем так, чтобы табельный номер был автоматически увеличен на 1, а в должности стояло значение ‘нет сведений’: SELECT MAX(T_number) AS Max_ FROM Staff INTO CURSOR Temp
INSERT INTO Staff(T_number, Post)VALUES(Temp.Max_+1, ‘нет сведений’)
45. Добавьте в таблицу Paies новую запись, причем так, чтобы код зарплаты был автоматически увеличен на 1, табельный номер =23, дата зарплаты = текущей дате, а размер зарплаты = 5000: SELECT MAX(Code_pay) AS Max_ FROM Paies INTO CURSOR Temp INSERT INTO Paies(T_number, Code_pay, Pay_day, Sum_pay) VALUES(23, Temp.Max_+1, Date(), 5000)
Данная команда INSERT сработает, если в главной таблице Staff есть запись с T_number=23 или при отсутствии поддержки целостности БД.
46. Добавьте в таблицу Items_pay новую запись, причем так, чтобы код зарплаты был 45, название статьи зарплаты = ‘премия’, а размер премии = 1500 руб.: INSERT INTO Items_pay(Code_pay, Item_pay, Item_sum) VALUES(45, ‘премия’, 1500)
Данная команда INSERT сработает, если в главной таблице Paies есть запись с Code_pay=45 или при отсутствии поддержки целостности БД.
Оператор обработки данных Delete 47. Удалить из таблицы всех сотрудников, у которых возраст больше 80: DELETE FROM Staff WHERE (Date()-Birthday)>80
48. Удалить из таблицы Статьи зарплат (таблица Items_pay) все записи, у которых в поле название статьи зарплаты = ‘не известно’: DELETE FROM Items_pay WHERE Item_pay=‘не известно’
49. Удалить из таблицы зарплат все записи, у которых размер зарплаты=0 и табельный номер сотрудника=0: DELETE FROM Paies WHERE T_number = 0 AND Sum_pay = 0
Оператор назначения привилегии GRANT Оператор отмены привилегии REVOKE Оператор запрета привилегии DENY
Информационная безопасность систем управления базами данных Надежда Вьюкова, Владимир Галатенко http://www.citforum.ru/database/kbd96/49.shtml http://www.citforum.ru/database/kbd96/50.shtml
Дата добавления: 2013-12-11; Просмотров: 370; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |