Giai BT

You might also like

Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 5

Hướng dẫn giải bài tập CSDLQH & SQL

Để giúp các bạn nào chưa biết làm các bài tập trong sách giáo trình, nay mình xin mạng
phép lập topic này nhằm hướng dẫn các bạn giải các bài tập trong sách giáo trình, các bạn
nào cảm thấy được thì xin đóng góp vào luôn nhé.
Để thực hiện được các bài tập trong này bắt buộc các bạn phải cài Microsoft Access, và
tải cơ sở dữ liệu mẫu tại đây:http://www.mediafire.com/?mtdyiekndin

Các bạn lưu ý dữ liệu trong này hơi khác so với dữ liệu trong bài tập, nhưng cấu trúc thì
hoàn toàn giống nhau nên cũng không có gì sai cả.

Chương 2: bài tập trang 27-30 (giáo trình CSDL Quan Hệ & SQL)

Câu 8: Câu này rất đơn giản, toàn bộ yêu cầu đều nằm trong bảng GRADE, các bạn chỉ
cần dung lệnh select là xong
Giải:

SELECT *
FROM grade;

Tuy nhiên nếu bạn muốn trông giống như trong sách thì có thể thêm lệnh As (lệnh gán)
vào sau các trường:

SELECT GradeLevel As GRADE, LowestSal As LOSal, HighestSal As HISal


FROM grade;

Câu này dễ nên mình cũng không cần giải thích các bạn cũng đã hiểu.

Câu 9: Câu này là câu cơ bản nhất trong các bài tập liên kết giữa các bảng, các bạn bắt
buộc phải hiểu và làm được câu này thì các câu sau mới có thể làm được
Giải:

SELECT EMPID, LastName, job.JobTitle, ManagerId, HireDay, Salary, CommitionPTC,


DeptId
FROM emp INNER JOIN job ON emp.JobId=job.JobId;
Ở trên sách thì lệnh liên kết là lệnh Where … nhưng theo mình thì các bạn nên dùng lệnh
INNER JOIN như trên vì lệnh where là chuẩn 1999 kia, còn lệnh INNER JOIN là chuẩn
2003, nên mình cũng nên dùng chuẩn mới nhất.
Giải thích: Lệnh INNER JOIN có nghĩa là liên kết tương đương, vì yêu cầu bài tập có
trường Job, nhưng Job chỉ có trong bảng Job. Còn các trường còn lại thì nằm trong bảng
EMP, do đó chúng ta phải liên kết 2 bảng lại bằng lệnh INNER JOIN với điều kiện là
emp.JobId=job.JobId, ở trên lệnh select chúng ta phải thêm tên bảng job vào trước trường
JobTitle để chương trình hiểu là chúng ta lấy trường này từ bảng nào.

Câu 10: Câu này phải thực hiện trong Oracle


Giải: DESC EMP
Câu 12:
Giải:

SELECT LastName, DeptId, Salary


FROM emp
WHERE Salary between 30000 and 80000;
Giải thích: Ở đây yêu cầu đề bài là lấy mức lương từ 1000 đến 2000 (nhưng trong cơ sở
dữ liệu mẫu không có nên chúng ta lấy khác cũng được), do vậy phải dùng lệnh between
(lệnh này có nghĩ là lấy giữa một khoảng nào đó).

Câu 13:
Giải:

SELECT DeptId, DeptName


FROM dept
ORDER BY DeptName;
Giải thích: trong bài này các bạn chỉ cần chú ý đến lệnh Order By là được, lệnh này các
bạn đều đã biết nên mình khỏi giải thích, tuy nhiên các bạn lưu ý là lệnh này luôn đứng
cuối cùng. Và nếu sắp tăng thì dùng lệnh Order By … ASC, xếp giảm thì Order By …
DESC.

Câu 14: Chúng ta thay phòng 10 và 20 bằng phòng 50 và 60


Giải:

SELECT EMPID, LastName, job.JobTitle, ManagerId, HireDay, Salary, CommitionPTC,


DeptId
FROM emp INNER JOIN job ON emp.JobID=job.JobID
WHERE DeptId in ("50","60")
ORDER BY LastName;

Giải thích: Trong bài này các bạn cần chú ý đến lệnh In, lệnh này tương đương với lệnh
Or ( hoặc), trong bài yêu cầu là hiển thị nhân viên là tại phòng 10 và 20, nhưng các bạn
cần phải chú ý không được dùng lệnh And ( có một số bạn bị sai chỗ này) mà phải dùng
lệnh In vi mỗi nhân viên chỉ làm việc tại 1 phòng 50 hoặc 60 mà thôi. Lệnh where (điều
kiện) thì các bạn chắc cũng đã biết, mình không cần phải nói lại (tham khảo trang 20)

Câu 15: Chúng ta thay nghề cleck bằng nghề IT Program


Giải:

SELECT LastName, JobTitle


FROM emp INNER JOIN job ON emp.JobID=job.JobID
WHERE JobTitle="IT Program";
Giải thích: không cần giải thích các bạn cũng đã hiểu.

Câu 16: Chúng ta thay TH bằng ng. Nếu muốn gồm 2 chuỗi kí tự như trong sách thì các
bạn chỉ cần thêm lệnh In hoặc Or cũng được.
Giải:

SELECT *
FROM emp
WHERE LastName like "*ng*";
Giải thích: Ở đây các bạn cần lưu ý là trong sách thì để dùng lệnh like thì dùng kí tự “%”
“or” / để làm kí tự đại diện. Tuy nhiên 2 kí tự trên chỉ dùng được trong HQTCSDL
Oracle or SQL mà thôi, còn trong Access không hỗ trợ nên nếu làm y trong sách không ra
thì cũng không phải là sai đâu.

Câu 17: Chúng ta thay năm 1983 bằng năm 1989


Giải:

SELECT LastName, DeptId, HireDay


FROM emp
WHERE year(HireDay)=1989;
Giải thích: ở đây các bạn cần chú ý đến lệnh year(…), lệnh này sẽ lấy ra năm trong dữ
liệu, tương tự các bạn cũng có thể dùng lệnh day(…) để lấy ra ngày và month(…) để lấy
ra tháng.

Câu 18:
Giải:

SELECT LastName, DeptName


FROM emp INNER JOIN dept ON emp.DeptId=dept.DeptId
ORDER BY DeptName;
Giải thích: không có gì khó, các bạn hoàn toàn làm được.

Câu 19:
Giải:

SELECT emp.LastName, dept.DeptName, location.City


FROM (location INNER JOIN dept ON location.LocationId=dept.LocationId) INNER
JOIN emp ON dept.DeptId=emp.DeptId
WHERE salary >50000;

Giải thích: câu này phức tạp hơn so với các câu trên nhưng không khó nếu bạn hiểu được
lệnh liên kết. Để cho dễ nhìn, các bạn mở bảng Relationships lên (Tool/ Relationships).

Như hình trên các bạn thấy là các trường chúng ta cần lấy đó là LocationId của bảng
DEPT, City của bảng LOCATION, Lastname của bảng EMP. Để có thể lấy 3 trường như
trên (trường này ứng với trường kia) thì buộc các bảng trên phải liên kết với nhau. Chúng
ta chú ý thấy rằng bảng LOCATION liên kết với bảng DEPT thông qua trường
LocationId, bảng DEPT thì liên kết với bảng EMP thông qua trường DeptId, tương tự sơ
đồ sau (L – D) –E. Nói cho dễ hiểu thì các bạn muốn lấy dữ liệu từ 2 bảng trở lên thì chỉ
cần liên kết chúng với nhau là được, nếu khó hiểu thì các bạn cần bỏ chút thời gian ra suy
nghĩ.

Câu 20:
Giải:

SELECT emp.LastName, job.JobTitle, emp.Salary, grade.GradeLevel


FROM grade, emp INNER JOIN job ON emp.JobID = job.JobId
WHERE salary between LowestSal and HighestSal;
Giải thích: các bạn cần chú ý là lương cần phải nằm trong khoản giới hạn cho phép (theo
CSDL mẫu) là dược.

Cau 21:thay điều kiện lương = 3 bằng lương = 6


Giải:

SELECT emp.LastName, job.JobTitle, emp.Salary, grade.GradeLevel


FROM grade, emp INNER JOIN job ON emp.JobID = job.JobId
WHERE salary between LowestSal and HighestSal and GradeLevel = "6";
Giải thích: tương tự câu trên, các bạn nhớ là trong from thì chúng ta ngăn cách giữa các
bảng bằng dấu “,”, còn trong where thì nếu muốn thêm nhiều điều kiện thì chúng ta dùng
lệnh “and”.

Câu 22:
Giải:

SELECT LastName, City, Salary


FROM (location INNER JOIN dept ON location.LocationId=dept.LocationId) INNER
JOIN emp ON dept.DeptId=emp.DeptId;
Giải thích: tương tự câu 20 thôi, không có gì khác cả.

Câu 23:
Giải:

SELECT LastName, JobTitle, Salary, DeptName, GradeLevel


FROM grade, (EMP INNER JOIN job ON emp.JobId=job.JobId) INNER JOIN dept ON
emp.DeptId=dept.DeptId
WHERE Salary between LowestSal and HighestSal;

Giải thích: câu này tương tự câu 19 & 20,ta chỉ cần kết hợp chúng lại mà thôi.

Câu 24:
Giải:

SELECT e.EMPID, e.LastName, e.ManagerId, p.LastName


FROM Emp AS e, emp AS p
WHERE (((e.ManagerId)=p.EMPID));

Giải thích: Nói một cách đơn giản như thế này, bạn cần tìm mã nv, tên nv, mã người quản
lý và tên người quản lý. Các bạn hay mở trang 26 ra và đọc ví dụ, như thế ta phải chia
bảng emp thành 2 bảng khác nhau và lấy dữ liệu trên 2 bảng đó. Như thê thì 3 trường đầu
tiên sẽ được lấy từ bảng emp As e (nên ta đặt e. trước 3 trường đầu tiên). Các bạn chú ý,
ở đây điều khó nhất chính là lấy tên người quản lí, như vậy để lấy tên người quản lí thì
cần có mã người quản lý (ở bảng e) bằng mã nhân viên (ở bảng p).

Câu 25:
Giải:

SELECT LastName, JobTitle, Salary, emp.DeptId, DeptName, GradeLevel


FROM grade, (emp INNER JOIN job ON emp.JobID=job.JobID) INNER JOIN dept ON
emp.DeptId=dept.DeptId
WHERE Salary between LowestSal and HighestSal and ((salary = 36720) or (JobTitle =
"IT Program"));
Giải thích: câu này không khó, chỉ hơi rắc rối chút xíu thôi, các bạn đọc kĩ rồi sẽ hiểu

Vậy là kết thúc các bài tập chương 2, các bạn nào không hiểu chỗ nào xin cứ nêu câu hỏi,
nếu mình có thể giúp được thì sẵn sàng trả lời.

You might also like