You are on page 1of 9

BÀI THỰC HÀNH SỐ 2

Cú pháp câu lệnh select


----------------
select */cot1,2,.../distinct cột/top n/top n
percent as 'tên mới'
from bang1 inner join bang2 on bang1.cot =
bang2.cot
inner join bang3 on ...
where điều kiện lọc
group by cột cần nhóm
having điều kiện nhóm
order by cột cần sắp xếp ASC/DESC
---------------------------------------------------
------------
vd: cho 2 bảng dữ liệu
sv(masv,tensv,que,gt,tuoi,malop)
lop(malop,tenlop,phong)
---------------------------------------------------
---------------
1)đưa ra thông tin sv
select * from sv
2) đưa ra tensv, tuoi
select tensv, tuoi from sv
3) đưa ra các sv nữ
select tensv from sv where gt=N'nữ'
4) đưa ra 10 sv tuổi cao nhất
select top 10 tensv,tuoi
from sv
order by tuoi DESC
--> thường áp dụng:
-- đưa ra 10 tin hots nhất trong ngày
-- đưa ra 10 tin mới nhất trong ngày
-- dưa ra 10 sp bán chạy nhất
5) đưa ra 20% sv nữ thấp tuổi nhất đến cao
select top 20 percent tensv
from sv
where gt=N'nữ'
order by tuoi ASC
6) đưa ra các quê của các sv
select distinct que from sv --> không lặp
7) kết nối 2 hay nhiều bảng
--đưa ra tensv,que,tenlop,phong của các sv
select tensv,que,tenlop,phong
from sv inner join lop on sv.malop=lop.malop
8) chú ý: nếu 1 trường trong select thuộc vào 2 hay
nhiều nguồn dữ liệu thì phải chỉ rõ nguồn nào
--VD: đưa ra tensv,que,malop,tenlop,phong của các
sv nữ
select tensv,que,lop.malop,tenlop,phong
from sv inner join lop on sv.malop=lop.malop
where gt=N'nữ'
9) một số hàm ngày tháng hay dùng
getdate() -- ngày/tháng/năm/giờ/phút/giây hiện
hành
vd: select GETDATE()
- Lấy ngày day(getdate())
- tháng: month(getdate())
- năm year(getdate())
vd: đưa ra tensv,tuoi của các sv
select tensv,YEAR(getdate())-YEAR(ngaysinh)
from sv
---Hay dùng trong việc tính toán:
--quản lý thư viện trong việc tính số ngay mượn
sách
--quản lý KS tính số ngày mượn phòng
10) hàm like '%s%'
vd: đưa ra các bạn nữ tên Hằng
select tensv from sv
where tensv like N'%Hằng'
----hay dùng trong làm ô search
11) hàm case .. when .. then
vd: select masv,tensv,tuoi,case
when gt=N'nam' then N'yêu
tinh'
when gt=N'nữ' then N'yêu
quái'
end as N'giói tính mới'
,que
from sv
---Hay sử dụng trong việc chuyển từ số -> chữ:
vd: lưu 0-Nam, 1-Nữ
hoặc: 1-4:F, 4-6: C, 6-8: D,.....
12) hàm thống kê:
sum(cột), count(*/mã), avg(cột), min(cột), max(cột)
-------------------
vd: đưa ra tổng các sv trong lớp
select COUNT(*) as N'tong sv'
from sv
-- đưa ra tổng các sv nữ
select COUNT(*) as N'tong'
from sv
where gt=N'nữ'
--> where thực hiện đầu tiên --> bảng tạm toàn nữ
--> count(*)
13) hàm group by ... having
-- đưa ra thống kê mỗi quê có bao nhiêu sv
select que,COUNT(*) as N'tong ssv'
from sv
group by que
--> group by trên bảng gốc sv thành các bảng con
chứa các sv mỗi quê
-- sau đó mới thực hiện count(*)
--Hay sử dụng: --thống kê xem mỗi hãng bán được
bao nhiêu sản phẩm
-- thống kê lượng tiền bán được
trong ngày của từng chi nhánh
-- Thống kê xem mỗi quê có bao nhiêu sv nữ:
select que,COUNT(*) as N'tong nu'
from sv
where gt=N'nữ'
group by que
--> chú ý: where thực hiện trước --> group by
--> lọc nữ trên bảng gốc sv --> thành 1 bảng có
toàn nữ trong bảng tạm
-- sau đó mới group nữ theo quê thành các bảng c0n
-- sau đó mới count(*)
-- Đưa ra các quê có nhiều hơn 10 nữ để thành lập
hội đá banh
select que,COUNT(*) as N'tong nu'
from sv
where gt=N'nữ'
group by que
having COUNT(*)>=10
--> where đầu tiên --> group by --> having -->
sum/count/max/min
-- lọc bảng sv --> thành bảng tạm toàn nữ -->
group by bảng tạm này theo quê
-- thành các bảng con chứa nữ của mỗi quê
-- sau đó count(*) trên mỗi bảng con --> having
lọc ra các quê thỏa mãn yêu
-- cầu.
Nếu:
select que,COUNT(*) as N'tong nu'
from sv
where gt=N'nữ' and COUNT(*)>=10
group by que
--> SAI: các hàm thống kê không sử dụng được trong
where
Nếu:
select que,COUNT(*) as N'tong nu'
from sv
group by que
having gt=N'nữ' and COUNT(*)>=10
--> không báo lỗi, nhưng sai kết quả
-- group by theo quê của bảng sv --> count(*) trên
các bảng con chưa lọc nữ--> kết quả sai

BÀI THỰC HÀNH

A. Tạo CSDL có tên DeptEmp (1 điểm)


B. Tạo các bảng dữ liệu sau trong CSDL vừa tạo với các chỉ định ràng buộc tương ứng (2
điểm).

Table : Department

Column Names Data Type Description


DepartmentNo Integer Department No - PRIMARY KEY
DepartmentName CHAR(25) Department Name – NOT NULL
Location CHAR(25) Location of Department - NOTNULL

Table : Employee

Column Names Data Type Description


EmpNo Integer Employee No - PRIMARY KEY
Fname varchar(15) First Name – NOT NULL
Lname Varchar(15) Last Name – NOT NULL
Job Varchar(25) Job of Employee - NOT NULL
HireDate Datetime Hire Date – NOT NULL
Salary Numeric Salary of employee – NOT NULL
Commision Numeric Commision
DepartmentNo Integer FOREIGN KEY REF
Department.DepartmentNo

C. Chèn dữ liệu sau đây vào các bảng trên

DepartmentNo DepartmentName Location


10 Accounting Melbourne
20 Research Adealide
30 Sales Sydney
40 Operations Perth

Emp Fname Lname Job HireDate Salary Commision DepartmentNo


No
1 John Smith Clerk 17-Dec-1980 800 200 20
2 Peter Allen Salesman 20-Feb-1981 1600 300 30
3 Kate Ward Salesman 22-Feb-1981 1250 500 30
4 Jack Jones Manager 02-Apr-1981 2975 100 20
5 Joe Martin Salesman 28-Sep-1981 1250 1400 30

D. Thực hiện các truy vấn sau trên cơ sở dữ liệu trên (mỗi câu 2 điểm):

1. Hiển thị nội dung bảng Department


2. Hiển thị nội dung bảng Employee
3. Hiển thị employee number, employee first name và employee last name từ
bảng Employee mà employee first name có tên là ‘Kate’.
4. Hiển thị ghép 2 trường Fname và Lname thành Full Name, Salary,
10%Salary (tăng 10% so với lương ban đầu).
5. Hiển thị Fname, Lname, HireDate cho tất cả các Employee có HireDate là
năm 1981 và sắp xếp theo thứ tự tăng dần của Lname.
6. Hiển thị trung bình(average), lớn nhất (max) và nhỏ nhất(min) của
lương(salary) cho từng phòng ban trong bảng Employee.
7. Hiển thị DepartmentNo và số người có trong từng phòng ban có trong bảng
Employee.
8. Hiển thị DepartmentNo, DepartmentName, FullName (Fname và Lname),
Job, Salary trong bảng Department và bảng Employee.
9. Hiển thị DepartmentNo, DepartmentName, Location và số người có trong
từng phòng ban của bảng Department và bảng Employee.
10.Hiển thị tất cả DepartmentNo, DepartmentName, Location và số người có
trong từng phòng ban của bảng Department và bảng Employee
Hướng dẫn
-------------------------------------------------------
---
--SINH VIEN: NGUYỄN VĂN A
--LỚP: AV18
-------------------------------------------------------
-----A. Tao CSDL DeptEmp
create database DeptEmp
on primary
(name='DeptEmp_Dat',Filename='D:\Data\DeptEmp_dat.mdf')
Log on
(name='DeptEmp_Log',Filename='D:\Data\DeptEmp_log.ldf')

--Su dung CSDL DeptEmp


use DeptEmp
go
--B: Tao cac bang du lieu trong CSDL
create table Department
(
DepartmentNo int not null primary key,
DepartmentName varchar(25) not null,
Location varchar(25) not null
)
create table Employee
(
EmpNo int not null primary key,
FName varchar(15) not null,
LName varchar(15) not null,
Job varchar(25) not null,
HireDate datetime not null,
Salary numeric not null,
Commision numeric,
DepartmentNo int,
Constraint FK_DepartmentNo
Foreign key(DepartmentNo) references
Department(DepartmentNo)
)
--C: Chen du lieu vao 2 bang tren
--Department
insert into Department
values(10,'Accounting','Melbourne')
insert into Department values(20,'Research','Adealide')
insert into Department values(30,'Sales','Sydney')
insert into Department values(40,'Operations','Perth')
--Employee
--Khong co truong Comision vi = null
insert into
Employee(EmpNo,FName,LName,Job,HireDate,Salary,commisio
n,DepartmentNo) values(1,'John','Smith','Clerk','17-
Dec-1980',800,100,20)

insert into
Employee(EmpNo,FName,LName,Job,HireDate,Salary,commisio
n,DepartmentNo)
values(2,'Peter','Allen','Salesman','20-Feb-
1981',1600,300,30)

insert into Employee values(3,'Kate','Ward','Salesman',


'22-Feb-1981', 1250,500,30)

insert into
Employee(EmpNo,FName,LName,Job,HireDate,Salary,commisio
n,DepartmentNo) values(4,'Jack','Jones','Manager','02-
Apr-1981', 2975,100,20)

insert into Employee


values(5,'Joe','Martin','Salesman', '28-Sep-
1981',1250,1400,30)

--D: Thuc hien truy van


--1.
Select * from Department
--2.
Select * from Employee
--3.
select EmpNo,FName,LName from Employee
where FName='Kate'
--4.
Select FName+ ' ' +LName as
'Fullname',Salary,Salary*0.1 as 'Tang luong'
from Employee
--5.
select FName,Lname,HireDate from Employee
where YEAR(Hiredate)='1981'
order by LName ASC
--6.
select avg(salary)as 'TB Luong',max(salary) as 'Luong
cao nhat',min(salary)as 'Luong thap nhat'
from Employee
group by DepartmentNo
--7.
select DepartmentNo,count(*) as 'So nguoi'
from Employee
group by DepartmentNo
--8.DepartmentName Trong bang Derpartment, con lai
trong bang Employee
--Duoc ket noi thong qua truong DepartmentNo
select
Department.DepartmentNo,Department.DepartmentName,
Employee.FName+' '+Employee.LName as
'Fullname',Employee.Job,Employee.Salary
from Department inner join Employee
on Department.DepartmentNo=Employee.DepartmentNo
--9. Tuong tu 8
--Tao bang phu SoNguoi de luu tongnguoi trong tung
phong ban (DepartmentNo)
select count(*)AS 'Tongnguoi',Employee.DepartmentNo
into SoNguoi
from Employee
group by Employee.DepartmentNo
--Dung bang phu de ket noi
select
Department.DepartmentNo,Department.DepartmentName,Depar
tment.Location,SoNguoi.Tongnguoi
from Department inner join SoNguoi
on Department.DepartmentNo=SoNguoi.Department

You might also like