You are on page 1of 14

THỰC HÀNH CƠ SỞ DỮ LIỆU QUẢN LÝ NGUỒN NHÂN LỰC

(HR)

2.1. Thông tin về Cơ sở dữ liệu quản lý nguồn nhân lực


Cơ sở dữ liệu HR phát sinh trong quá trình cài đặt hệ quản trị cơ sở dữ liệu Oracle, đáp
ứng thực hành và thao tác dữ liệu trên hệ quản trị cơ sở dữ liệu Oracle. Tại Việt Nam, đa
số là các công ty vừa và nhỏ, sử dụng chủ yếu hệ quản trị cơ sở dữ liệu SQL server vì thế
Khoa hệ thống thông tin đã chuyển đổi cơ sở dữ liệu HR sang cơ sở dữ liệu SQL server
nhằm đáp ứng nhu cầu thực hành của sinh viên trên cả hai hệ quản trị cơ sở dữ liệu.
2.2. Sơ đồ cơ sở dữ liệu HR (Human Resource)
JOBS
JOB_ID
JOB_TITLE
MIN_SALARY
MAX_SALARY

EMPLOYEES
EMPLOYEE_ID
FIRST_NAME
LAST_NAME
EMAIL
DEPARTMENTS
DEPARTMENT_ID PHONE_NUMBER

DEPARTMENT_NAME HIRE_DATE

MANAGER_ID JOB_ID

LOCATION_ID SALARY
COMMISSION_PCT
MANAGER_ID
DEPARTMENT_ID

JOB_HISTORY
EMPLOYEE_ID
START_DATE
END_DATE
JOB_ID
DEPARTMENT_ID

LOCATIONS
LOCATION_ID
COUNTRIES STREET_ADDRESS
COUNTRY_ID
POSTAL_CODE
COUNTRY_NAME
CITY
REGION_ID STATE_PROVINCE
COUNTRY_ID

REGIONS
REGION_ID
REGION_NAME
2.3. Mô tả các bảng dữ liệu trong cơ sở dữ liệu HR
Bảng 2.1. Bảng dữ liệu REGIONS
Tên cột Mô tả cột Kiểu dữ liệu Khóa
REGION_ID Mã khu vực int PK
REGION_NAME Tên khu vực nvarchar(25)

Bảng 2.2. Bảng dữ liệu COUNTRIES


Tên cột Mô tả cột Kiểu dữ liệu Khóa
Mã số quốc
COUNTRY_ID gia char(2) PK

COUNTRY_NAME Tên quốc gia nvarchar(40)


REGION_ID Mã số vùng int

Bảng 2.3. Bảng dữ liệu LOCATIONS


Tên cột Mô tả cột Kiểu dữ liệu Khóa
Mã số địa
LOCATION_ID điểm numeric(4,0) PK
STREET_ADDRESS Địa chỉ nvarchar(40)
POSTAL_CODE Mã số thư tín nvarchar(12)
CITY Thành phố nvarchar(30)
STATE_PROVINCE Tiểu bang nvarchar(25)
COUNTRY_ID Mã quốc gia char(2) FK

Bảng 2.4. Bảng dữ liệu JOBS


Tên cột Mô tả cột Kiểu dữ liệu Khóa
JOB_ID Mã số công việc nvarchar(10) PK
Nội dung công
JOB_TITLE việc nvarchar(35)
Tiền lương thấp
MIN_SALARY nhất numeric(6,0)
Tiền lương cao
MAX_SALARY nhất numeric(6, 0)

Bảng 2.5. Bảng dữ liệu JOB_HISTORY


Tên cột Mô tả cột Kiểu dữ liệu Khóa
EMPLOYEE_ID Mã số nhân viên numeric(6,0)
START_DATE Ngày bắt đầu làm date
Ngày chấm dứt công
END_DATE việc date
JOB_ID Mã số công việc nvarchar(10)
DEPARTMENT_ID Mã số phòng ban numeric(4,0)

Bảng 2.6. Bảng dữ liệu DEPARTMENTS


Tên cột Mô tả cột Kiểu dữ liệu Khóa
Mã số phòng
DEPARTMENT_ID ban numeric(4, 0) PK
DEPARTMENT_NAME Tên phòng ban nvarchar(30)
Mã số nhà quản
MANAGER_ID lý numeric(6, 0) FK
LOCATION_ID Mã số địa điểm numeric(4, 0)

Bảng 2.7. Bảng dữ liệu EMPLOYEES


Tên cột Mô tả cột Kiểu dữ liệu Khóa
EMPLOYEE_ID Mã số nhân viên numeric(6,0) PK
FIRST_NAME Tên nhân viên nvarchar(20)
LAST_NAME Họ nhân viên nvarchar(25)
EMAIL Email nvarchar(25)
PHONE_NUMBER Số điện thoại nvarchar(20)
HIRE_DATE Ngày vào làm date
JOB_ID Mã số công việc nvarchar(10) FK
SALARY Tiền lương numeric(8, 2)
Tỷ lệ hoa hồng bán
COMMISSION_PCT hàng numeric(4,2)
MANAGER_ID Mã số nhà quản lý numeric(6,0) FK
DEPARTMENT_ID Mã số phòng ban numeric(4,0) FK

2.3. Các bài tập thực hiện vấn tin SQL


2.3.1 Thực hành câu lệnh SELECT
a. Tạo vấn tin hiển thị tên nhân viên và lương của những nhân viên có tiền
lương nhiều hơn 12,000 Dolar. Ghi câu lệnh vấn tin lại đặt tên lab2_1.sql.
Chạy vấn tin.

b. Tạo vấn tin hiển thị tên nhân viên và mã số phòng ban của nhân viên có
mã số 176

c. Thay đổi lab2_1.sql hiển thị tên nhân viên và lương của những nhân viên có
mức lương không nằm trong khoảng 5000 đến 12000, ghi câu lệnh lại thành
lab2_3.sql

d. Hiển thị tên nhân viên, mã số công việc và ngày vào làm của những nhân
viên được nhận từ 20/02/1998 đến 01/05/1998

e. Hiển thị tên nhân viên và mã số phòng ban của những nhân viên ở các
phòng ban có mã số là 20 , 50. Kết quả được sắp xếp theo thứ tự tên

f. Thay đổi lab2_3 để hiển thị tên nhân viên và lương của những nhân viên
có tiền lương trong khoảng 5000 và 12000 và ở các phòng ban có mã số
20 hoặc 50. Nhãn của các cột là Employee và Monthly salary, sau đó ghi
lại thành lab2_6
g. Hiển thị tên nhân viên và ngày vào làm của những nhân viên được nhận
vào làm năm 1994

h. Hiển thị tên nhân viên và mã số công việc của những nhân viên không bị
quản lý.

i. Hiển thị tên nhân viên, tiền lương của những nhân viên có tiền hoa hồng .
Sắp xếp kết quả theo thứ tự tiền lương và hoa hồng giảm dần.

j. Hiển thị tên của những nhân viên có ký tự thứ ba của tên là chữ a

k. Hiển thị tên của những nhân viên có ký tự a và e trong tên

l. Hiển thị tên, mã số công việc và tiền lương của những nhân viên là
sales representative (SA_REP) hay stock clerk (ST_CLERK)

2.3.2 Sử dụng hàm


a. Viết vấn tin hiển thị ngày hiện hành

b. Hiển thị mã số nhân viên, tên, tiền lương và cột tiền lương đã được tăng
15% không có số lẽ, nhãn cột là New Salary. Ghi câu lệnh SQL thành tập
tin lab3_2.sql.

c. Chạy lại vấn tin trong lab3_2.sql, thay đổi vấn tin trong lab3_2.sql, thêm
cột mới lương tăng thêm (lương mới – lương củ), đặt tiêu đề là Increase.
Ghi câu lệnh SQL thành tập tin lab3_4.sql. Chạy lại vấn tin.

d. Viết vấn tin hiển thị tên các nhân viên có ký tự đầu là chữ hoa và các ký tự
khác là chữ thường, chiều dài tên nhân viên cho các nhân viên có tên bắt
đầu với J, A hay M. Đặt mỗi cột một nhãn thích hợp. Sắp xếp kết quả theo
tên nhân viên.

e. Hiển thị tên nhân viên và tính số tháng làm việc của nhân viên, đặt tên
cột là MONTHS_WORKED.Sắp xếp kết quả theo số tháng làm việc. Làm
tròn số tháng làm việc.

f. Viết vấn tin tạo nội dung sau cho mỗi nhân viên : <employee last name>
earns <salary> monthly but wants <3 times salary>. Đặt tên cột là Dream
Salaries.

g. Tạo vấn tin hiển thị tên nhân viên và tiền lương của các nhân viên, Định
dạng tiền lương dài 15 ký tự, lắp đầy bên trái bằng dấu $. Đặt tên nhãn là
Salary.
h. Hiển thị tên nhân viên, ngày vào làm, ngày nâng lương (ngày thứ hai đầu tiên
sau 6 tháng làm việc. Đặt tên cột REVIEW và định dạng cột ngày theo mẫu
“Monday, the Thirty-First of July, 2000.”

i. Hiển thị tên nhân viên, ngày vào làm và ngày trong tuần của ngày vào làm.
Đặt tên cột là DAY. Sắp xếp kết quả theo ngày trong tuần, bắt đầu bằng
Monday.

j. Tạo vấn tin hiển thị tên nhân viên, tổng số hoa hồng. Nếu nhân viên không
có thu nhập hoa hồng thì hiển thị nội dung là “No Comission”, đặt tên nhãn là
COMM.

k. Tạo vấn tin hiển thị tên nhân viên và biểu thị tổng số tiền lương hàng năm
bằng dấu *. Mỗi dấu * đại diện 1000 dolar. Sắp xếp dữ liệu theo thứ tự
giảm dần của tiền lương. Đặt tên nhãn là
EMPLOYEES_AND_THEIR_SALARIES.

l. Sử dụng hàm CASE, viết vấn tin hiển thị cấp bậc của tất cả các nhân viên
dựa trên giá trị của cột JOB_ID, như sau :
JOB GRADE
a. AD_PRES A
b. ST_MAN B
c. IT_PROG C
d. SA_REP D
e. ST_CLERK E
f. Khác 0

2.3.3 Thực hành JOIN


a. Viết vấn tin hiển thị tên nhân viên, mã số phòng ban và tên phòng ban cho
tất cả các nhân viên.

b. Tạo danh sách các công việc duy nhất trong phòng ban có mã số 30, bao
gồm cột mã số vị trí của phòng ban trong kết quả.

c. Viết vấn tin hiển thị tên nhân viên, mã số phòng ban, mã số vị trí phòng
ban và tên thành phố của tất cả các nhân viên có thu nhập từ hoa hồng.

d. Hiển thị tên nhân viên và tên phòng ban cho tất cả các nhân viên có chữ a
trong tên. Ghi câu lệnh thành tập tin lab4_4.sql.
e. Viết vấn tin hiển thị tên nhân viên, mã số công việc, mã số phòng ban
và tên phòng ban cho tất cả các nhân viên làm việc ở Toronto.

f. Hiển thị tên nhân viên và mã số nhân viên, cùng với tên người quản lý và
mã số người quản lý. Nhãn của các cột là Employee, Emp#, Manager,
Mgr#. Ghi câu lệnh lại thành lab4_6.sql.

g. Thay đổi lab4_6.sql để hiển thị tất cả các nhân viên bao gồm nhân viên
King (không có người quản lý).

h. Tạo vấn tin hiển thị tên nhân viên, mã số phòng ban và tất cả các nhân viên
làm chung phòng ban với nhân viên đó. Đặt tên nhãn cho các cột.

i. Tạo vấn tin hiển thị tên nhân viên, ngày vào làm của những nhân viên được
nhận vào làm sau ngày vào làm của Davies.

j. Hiển thị tên và ngày vào làm của những nhân viên được nhận vào làm trước
quản lý của họ, cùng với tên của người quản lý và ngày vào làm. Nhãn của
các cột là Employee, Emp Hired, Manager, Mgr Hired.

2.3.4 Thực hành GROUP BY

a. Hiển thị tiền lương cao nhất, thấp nhất, tổng lương và lương trung bình
của các nhân viên. Đặt tên cột lần lượt là Maximum, Minimum, Sum và
Average. Làm tròn kết quả không có số lẽ. Ghi câu lệnh lại thành tập tin
lab5_6.sql

b. Thay đổi lab5_6.sql để có kết quả theo từng nhóm công việc.

c. Viết vấn tin để hiển thị tổng số nhân viên của mỗi nhóm công việc.

d. Hiển thị tổng số nhân viên quản lý.

e. Viết vấn tin hiển thị chênh lệch giữa lương cao nhất và thấp nhất. Đặt tên cột
là DIFFERENCE. SELECT max(salary)-min(salary) as Differece FROM
employees

f. Hiển thị mã số nhà quản lý và tiền lương thấp nhất của nhân viên trong nhóm
nhà quản lý đó. Chỉ hiển thị tiền lương thấp nhất trên 6000 dolar, sắp xếp thứ
tự giảm dần theo tiền lương thấp nhất.

g. Viết vấn tin hiển thị tên phòng ban, địa điểm, số nhân viên trong phòng ban
và lương trung bình của phòng ban. Đặt tên nhãn lần lượt là Name, Location,
Number of People và Salary. Làm tròn lương trung bình đến 2 số lẽ.
2.3.5 Thực hành SUBQUERY

a. Viết vấn tin hiển thị tên và ngày vào làm của các nhân viên trong phòng ban
của nhân viên tên Zlotkey, không bao gồm Zlotkey.

b. Tạo vấn tin hiển thị mã số nhân viên và tên nhân viên của các nhân viên
có thu nhập cao hơn tiền lương trung bình. Sắp xếp kết quả theo thứ tự
tiền lương giảm dần.

c. Viết vấn tin hiển thị mã số nhân viên và tên nhân viên của các nhân viên làm
việc cùng phòng với những nhân viên có chữ u trong tên. Ghi câu lệnh SQL
thành lab6_3.sql. Chạy vấn tin.

d. Hiển thị tên, mã số phòng ban và mã số công việc của tất cả các nhân viên
có vị trí phòng ban là 1700.

e. Hiển thị tên và tiền lương của những nhân viên do King quản lý.

f. Hiển thị mã số phòng ban, tên nhân viên và mã số công việc của mọi nhân
viên trong phòng ban tên Executive.

g. Thay đổi lab6_3.sql hiển thị mã số nhân viên, tên nhân viên và tiền lương
của các nhân viên có thu nhập lớn hơn tiền lương trung bình và làm chung
phòng với bất kỳ nhân viên nào có chữ u trong tên.

2.3.6 Thực hành SET

a. Phòng nhân sự cần danh sách mã số phòng ban không có công việc
‘ST_CLERK’. Sử dụng toán tử tập hợp để tạo báo cáo này.

b. Phòng nhân sự cần danh sách các quốc gia không đặt phòng ban nào. Hiển thị
mã số quốc gia và tên quốc gia. Sử dụng toán tử tập hợp để tạo báo cáo này.

c. Tạo danh sách các công việc cho các phòng ban 10, 50, 20 (kết quả theo
đúng thứ tự phòng ban như vậy). Hiển thị mã số công việc và mã số phòng
ban sử dụng toán tử tập hợp.

d. Tạo báo cáo danh sách bao gồm mã nhân viên, mã công việc của các nhân
viên có tên công việc giống như tên công việc khi họ bắt đầu vào làm (nghĩa là,
họ đã từng thay đổi công việc nhưng bây giờ quay lại làm công việc ban đầu)

e. Phòng nhân sự cần báo cáo như sau :


- Tên nhân viên, mã phòng ban của nhân viên từ bảng
EMPLOYEES - Mã phòng ban, tên phòng ban của các
phòng ban từ bảng

f. Viết vấn tin kép để thực hiện điều này.

2.3.7 Thực hành DML

a. Thực hiện câu lệnh sau để tạo table tên


MY_EMPLOYEE :
CREATE TABLE my_employee
(
ID int PRIMARY KEY,
last_name VARCHAR(25),
first_name VARCHAR(25),
user_id VARCHAR(8),
salary NUMERIC(9,2)
)

b. Hiển thị cấu trúc table tên MY_EMPLOYEE

c. Thực hiện chuyển chế độ transaction từ AUTO_COMMIT sang IMPLICIT

Thêm dòng đầu tiên trong bảng dữ liệu mẫu sau vào table
MY_EMPLOYEE, đừng liệt kê các cột trong câu lệnh INSERT

ID LAST_NAME FIRST_NAME USERID SALARY

1 Patel Ralph rpatel 895


2 Dancs Betty bdancs 860
3 Biri Ben bbiri 1100
4 Newman Chad cnewman 750
5 Ropeburn Audrey aropebur 1550

d. Thêm dòng thứ hai trong bảng dữ liệu đã cho vào table MY_EMPLOYEE, liệt
kê các cột được thêm dữ liệu trong câu lệnh INSERT, xem lại các dòng đã
thêm vào table MY_EMPLOYEE

e. Thêm 2 dòng dữ liệu kế trong bảng dữ liệu mẫu vào table

f. Xem lại nội dung bảng dữ liệu

g. Buộc dữ liệu đã thêm vào là thường trực (COMMIT)


h. Thay đổi họ của nhân viên 3 thành Drexler.

i. Thay đổi lương cho các nhân viên có tiền lương nhỏ hơn 900 thành 1000.

j. Xóa nhân viên Dancs.

k. Chấp nhận tất cả những thay đổi ở trên (COMMIT)

l. Thêm dòng dữ liệu cuối cùng trong bảng dữ liệu mẫu vào table
MY_EMPLOYEE.

m. Đánh dấu điểm bảo lưu trong xử lý Transaction (SAVE TRANSACTION)

n. Xóa dữ liệu toàn bộ table.

o. Hủy bỏ tác vụ DELETE gần đây nhất (câu n) mà không hủy bỏ tác vụ
INSERT từ trước (câu l).

p. Buộc dữ liệu đã thêm vào là thường trực (COMMIT)

q. Xem lại nội dung bảng dữ liệu

2.3.8 Thực hành DDL


a. Viết câu lệnh tạo table DEPT dựa trên bảng sau. Ghi lại thành tập tin
script lab9_1.sql, sau đó thi hành câu lệnh để tạo table. Xem lại table
đã được tạo chưa.

Column Data type


Name
ID numeric(7,0)
NAME Varchar(25)

b. Lấy dữ liệu từ table DEPARTMENTS thêm vào table


DEPT.

c. Viết câu lệnh tạo table EMP dựa trên bảng sau. Ghi lại thành tập tin
script lab9_3.sql, sau đó thi hành câu lệnh để tạo table. Xem lại table đã
được tạo chưa.

Column Data type


Name
ID numeric(7,0)
LAST_NAME varchar(25)
FIRST_NAME varchar(25)
DEPT_ID varchar(7)

d. Thay đổi table EMP cho phép họ nhân viên dài hơn. Xem lại thay
đổi.

e. Xem lại hai table DEPT và EMP đã có trong kho dữ liệu chưa

f. Tạo table EMPLOYEES2 dựa vào cấu trúc của table EMPLOYEES (bao gồm
các cột EMPLOYEE_ID, FIRST_NAME, LAST_NAME, SALARY và
DEPARTMENT_ID). Tên của các cột trong table mới lần lượt là ID,
FIRST_NAME, LAST_NAME, SALARY và DEPT_ID.

g. Xóa table EMP.

h. Đổi tên table EMPLOYEES2 thành EMP.

i. Xóa cột đầu tiên của table EMP, xem lại cấu trúc của EMP.

2.3.9 Thực hành CONSTRAINT

EMP
Column Data type
Name
ID numeric(7,0)
LAST_NAME varchar(25)
FIRST_NAME varchar(25)

DEPT
Column Data type
Name
ID numeric(7,0)
NAME Varchar(25)

a. Thêm ràng buộc khóa chính mức table cho table EMP trên cột ID. Đặt tên
ràng buộc là my_emp_id_pk

b. Thêm ràng buộc khóa chính mức table cho table DEPT trên cột ID. Đặt tên
ràng buộc là my_deptid_pk.
c. Thêm cột DEPT_ID vào table EMP. Thêm ràng buộc khóa ngoài cho table
EMP để bảo đảm là không thể gán cho nhân viên một phòng ban chưa có.
Đặt tên ràng buộc là my_emp_dept_id_fk.

d. Xác định các ràng buộc đã được thêm vào bằng cách vấn tin view

e. Hiển thị tên đối tượng và kiểu đối tượng cho các table EMP và DEPT sử
dụng view INFORMATION_SCHEMA. TABLES hoặc sys. all_objects ,
chú ý đến các table mới và các tập tin INDEX đã được tạo.

f. Thay đổi table EMP. Thêm cột COMMISSION kiểu số (precision 2, scale 2).
Thêm ràng buộc cho cột để bảo đảm gía trị cột >0.

2.4. Thực hành viết Store Procedure và Trigger (SQL server)


2.4.1Viết thủ tục hiển thị tổng số tiền lương (SALARY) của từng loại công việc (JOB_ID)
trong một phòng ban (DEPARTMENT_ID) trong công ty. Thủ tục nhận một tham số mã
số phòng ban (@dept_id).
2.4.2 Viết thủ tục hiển thị các nhân viên (EMPLOYEE_ID) của một nhân viên quản lý
(MANAGER_ID). Thủ tục nhận một tham số là mã số nhà quản lý (@man_id).
2.4.3 Viết thủ tục hiển thị tổng số tiền lương (SALARY) của từng loại công việc (JOB_ID)
trong một phòng ban (DEPARTMENT_ID) trong công ty. Thủ tục nhận một tham số mã
số phòng ban (@dept_id), nếu tham số nhận vào có giá trị thì hiển thị tổng số tiền lương
của từng loại công việc của một phòng ban, nếu tham số nhận vào không có giá trị thì hiển
thị tổng số tiền lương của từng loại công việc của công ty.
2.4.4 Viết Trigger kiểu AFTER TRIGGER theo dõi những nhân viên (EMPLOYEE_ID)
có thay đổi tiền lương (SALARY). Tạo bảng dữ liệu ghi nhận những thay đổi tiền lương
của nhân viên bao gồm:
Employee_id
Last_name
Old_salary
Change_time
Change_User
Thủ tục ghi nhận thời gian thay đổi sử dụng hàm CURRENT_TIMESTAMP và ghi nhận
nhân viên thay đổi sử dụng hàm SUSER_SNAME()
2.4.5 Viết AFTER TRIGGER để thống kê tổng số tiền lương theo từng công việc cho từng
phòng ban, mỗi khi thêm nhân viên hoặc thay đổi tiền lương của nhân viên trong phòng
ban thì bảng tổng hợp tiền lương sẽ thay đổi ngay lập tức. Bảng tổng hợp tiền lương bao
gồm các thông tin sau:
Mã số phòng ban
Mã số công việc
Tổng tiền lương

You might also like