Trắc nghiệm SQL
Bạn đang xem tài liệu "Trắc nghiệm SQL", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- trac_nghiem_sql.doc
Nội dung text: Trắc nghiệm SQL
- Trắc nghiệm SQL
- 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. Hướng dẫn giải bài tập chương 3: Câu 5: Giải: SELECT emp.DeptId, emp.LastName, (salary+(salary\100)*10) AS PCTSAL FROM emp; Giải thích: câu này đơn giản không có gì để nói. Câu 6: Giải: SELECT LastName+" "+"("+JobTitle+")" AS Expr1 FROM emp INNER JOIN job ON emp.JobID=job.JobId; Giải thích: câu này đơn giản không có gì để nói. Câu 7: các bạn chú ý là câu này không thực hiện trên Access được mà phải dùng chương trình SQL hoặc Oracle mới được. Giải: SELECT LastName,HireDay,add_month(HireDay,12) As REWIEW
- from emp order by REWIEW; Giải thích: sau ngày gia nhập công ty một năm tức là 12 tháng, vậy bạn chỉ cần cộng HireDay với 12 tháng bằng lệnh add_month là được (tham khảo trang 38) Câu 8: ở đây mình thay 1500 = 30000 Giải: SELECT LastName, iif(Salary > 30000,Salary,"BELOW 30000") AS SAL FROM emp; Giải thích: câu này có rất nhiều cách làm, các bạn có thể dùng lệnh case Câu 9: Giải: SELECT LastName, HireDay, next_day(HireDay,friday) AS [ngay linh luong] FROM emp WHERE (day([ngay linh luong])-day(HireDay))>15; Giải thích: câu này mình không chắc lắm mình sẽ coi lại. Tuy nhiên các bạn chú y hàm next_day không thực hiện được trong Access. Câu 10: Giải: SELECT Min(Salary) AS luong_thap_nhat, Max(Salary) AS luong_cao_nhat, Avg(Salary) AS luong_trung_binh FROM emp; Giải thích: cái này dễ, các bạn làm được. Câu 12: Giải: SELECT count(EMPID) AS so_nguoi_chuc_vu_manage FROM emp WHERE JobID="ST_MAN"; Câu 13: Giải: SELECT deptid FROM emp GROUP BY deptid HAVING count(*) >3; Giải thích: câu này nhiều bạn không làm được, thật ra cũng không khó. Ta cần phải hiểu rõ được câu hỏi, trước hết ta cần chọn ra tên mã phòng ban trong bảng emp và group by nó lại, như thế nó sẽ hiện ra một dãy các mã phòng ban. Sau đó ta dùng lệnh HAVING đặt điều kiện cho Group by, count(*) này có nghĩa là từ một dãy các mã phòng ban hiện ra ta đếm xem tất cả các bản ghi trong bảng emp nhóm theo mã phòng ban và điều kiện là lớn hơn 3.
- Câu 14: Giải: SELECT ManagerId, min(salary) FROM emp GROUP BY ManagerId ORDER BY min(salary) DESC; Giải thích: câu này chắc mình cũng không có gì để giải thích. Tham khảo trang 44. Câu 15: câu này Access không hỗ trợ Giải: SELECT (FirstName+" "+"earn"+"$"+to_char(salary)+" "+"monthly") AS sal FROM emp; Giải thích: câu này theo mình nghĩ thì giải như thế này là hợp lý, vì nếu như ta đều dùng lệnh “+” thì chương trình sẽ báo lỗi vì kiểu char không thể cộng cho kiểu number được. Vì thế ta cần phải dùng lệnh to_char để chuyển đổi kiểu cho salary. Câu 16: Giải: SELECT LastName, month_between("ngay_hien_tai","Hireday") FROM emp; Giải thích: câu này mình không chắc lắm, các bạn có thể tìm cách khác. Lệnh month_between các bạn tham khảo trang 37. Câu 17: Giải: SELECT LastName, hireday, day(hireday) AS ngay FROM emp; Giải thích: câu này chính xác là thế, nhưng vì định dạng ngày trong CSDL này và trong sách khác nhau nên kết quả khác nhau, các bạn có thể tham khảo trang 40 Câu 18: câu này access không hỗ trợ, mình chỉnh làm tương đối Giải: SELECT JobID,DECODE(JobID,”AD_PRESS”,”A” ,” AD_VP”,”B”, ,” it_prog”,”C”, ,” ST_CLERK”,”D”,0) as Grade FROM emp; Giải thích: ta chọn ra 2 trường đó là trương JobID và 1 trường Grade với điều kiện là : Nếu jobID = AD_PRESS thì xuất ra kết quả là A, nếu JobID = AD_VP thì xuất ra kết quả là B nếu không có cái nào thì xuất kết quả là không, Câu 19: Giải:
- SELECT LastName, iif(CommitionPTC is null or CommitionPTC = 0,"khong_thuong","thuong") FROM emp; Giải thích: lệnh iif trong này có nghĩa là nếu CommitionPTC mà là rỗng (is null) hoặc CommitionPTC = 0 thì hiển thị chuỗi khong_thuong, còn nếu không thì hiển thị thuong. Hướng dẫn giải bài tập chương 4 Câu 6: a) Xóa toàn bộ dữ liệu trong bảng emp_tmp Giải: DELETE * FROM emp_tmp; b) Cập nhật lại dữ liệu cho bảng emp_tmp Giải: INSERT INTO emp_tmp ( FirstName, Salary, DeptId ) SELECT FirstName, Salary, DeptId FROM emp; Giải thích: 2 câu này tương đối dễ nên mình không cần giải thích. Câu 7: Giải: DELETE * FROM emp WHERE ManagerId is null; Giải thích: lệnh delete có nghĩa là xóa một hoặc nhiều bản ghi tùy theo điều kiện, theo đề thì xóa nhân viên ko có người quản lý, có nghĩ là trường ManagerId sẽ trống. Do đó ta dùng lệnh “is null” để thực hiện điều kiện trên. Câu 8: Giải: UPDATE emp SET salary = salary*1.2 WHERE ManagerId =(select ManagerId from emp where empid='124'); Giải thích: câu này các bạn nhìn lời giải thì có thể hiểu rõ. Câu 9: Giải: UPDATE emp SET hireday = now(); Giải thích: câu này mình ko chắc lắm, các bạn nào có đáp án khác xin post lên cho mọi người tham khảo. Câu 10:
- Giải: Merge into emp as a Using (select * from emp where empID = ‘167’) As c On (c.empID = e.empID) when matched then Update set e.ManagerId = "manager" When not matched then Insert values('167',"Nguyen Trong","Tri", ) Giải thích: trước hết các bạn cần đọc kỹ sách xem lệnh Merge là như thế nào. Trước hết ta phải xác định được bảng nào là nguồn và bảng nào là đích, ở đây theo đề thì “xét trong bảng Emp” có nghĩa là bảng Emp sẽ là bảng đích, còn bảng nguồn là bảng Emp_tmp. Mình sẽ viết lại đề và giải thích bên cạnh: Merge into emp as a (đây là tên bảng mình muốn cập nhật hay chèn vào) Using (select * from emp where empID = ‘167’) As c ( đây là một bản ghi mình lấy từ bảng emp với điều kiện là bản ghi có mã nhân viên là 167, mình gán nó là “c” ) On (c.empID = e.empID) (điều kiên : nếu c.empId = e.empID thì, có nghĩa là nếu trong bảng emp có nhân viên mã là 167 thì) when matched then ( nếu điều kiện đúng thì ) Update set e.ManagerId = "manager" (cập nhật ) When not matched then ( nếu điều kiện sai thì ) Insert (chèn ) values('167',"Nguyen Trong","Tri", ); Câu 11: Giải: UPDATE emp SET FirstName = "Join" WHERE EmpID='100'; Giải thích: câu này tương đối dễ nên mình không cần giải thích. Câu 12: Giải: UPDATE emp SET salary = 40000 WHERE salary<40000; Giải thích: câu này tương đối dễ nên mình không cần giải thích. Các câu còn lại không cần Hướng dẫn giải bài tập chương 5 Trong tất cả các câu dưới đây thì giám đốc chính là người quản lý (managerID) Câu 4: Giải: SELECT t.EMPID, t.FirstName, t.ManagerId, r.FirstName FROM emp AS t, emp AS r WHERE t.ManagerId=r.EMPID;
- Giải thích: câu này nhiều bạn làm thì được mà không hiểu vì sao lại như thế, ở đây ta tạo ra 2 bảng emp đặt lại tên là “t” và “r”. trước hết ta lấy ra 3 trường EMPID, FirstName, ManagerId từ bảng “t”, theo đề bài thì yêu cầu khó nhất là lấy ra trường tên người quản lý. Tên người quản lý sẽ nằm trong bảng “r”, mỗi người quản lý đều có một mã riêng đúng không, vậy thì mã người quản lý trong bảng “t” nó sẽ chính là mã nhân viên trong bảng “r”. Khi biết được mã nhân viên trong bảng “r” thì ta sẽ viết được tên người quản lý của nhân viên trong bảng t. Ví dụ: mã một nhân viên là 101, tên là Nghị chẳng hạn, có mã người quản lý là 100. mà mã người quản lý ấy chính là mã nhân viên trong bảng “r”. vậy chắc các bạn cũng đã hiểu. Câu 5: theo thầy phi thì đề được sửa lại là vào năm 1981 và năm 1994. Trong bài giải phía dưới mình thay đổi năm cho phù hợp với CSDL mẫu Giải: SELECT JobID FROM emp WHERE year(hireday)='1989' And year(hireday) = '2001'; Giải thích: câu này dễ các bạn tự làm được. Câu 6: Giải: SELECT EMPID, FirstName FROM emp AS o WHERE hireday < (select hireday from emp as i where o.ManagerId = i.empid); Giải thích: câu này ta phải dùng câu lệnh con tương quan. Ý nghĩa câu lệnh con như sau, đó là ta tìm ra được ngày vào làm việc của người quản lý tuy nhiên mã nhân viên của người quản lý này phải chính là mã người quản lý trong bảng emp(o). để hiểu thêm về câu lệnh con tương quan thì đọc giáo trình trang 65. Câu 7: Giải: SELECT o.EMPID, o.FirstName, o.HireDay, o.ManagerId, n.HireDay FROM emp AS o, emp AS n WHERE o.ManagerId=n.empid; Giải thích: câu này tương tự câu 4. Câu 8: Giải: SELECT EMPID, FirstName, jobid, Salary FROM emp WHERE Salary in (select max(Salary) from emp group by jobid); Giải thích: ý nghĩa của câu lệnh con đó là tìm ra được lương cao nhất trong mỗi công việc khác nhau, nếu ở đây ta không dùng lệnh group by thì câu lệnh con này sẽ chỉ hiện thị ra một mức lương cao nhất trong tất cả các phòng ban chứ không phải mỗi công việc. Vì thế ta dùng lệnh group by để nhóm các công việc lại, và mỗi công việc thì sẽ có một mức lương cao nhất. còn ở trong câu lệnh chính ta hiển thì các cái như trên với điều kiện là salary phải nằm trong ( dùng
- lệnh IN) các lương trong lệnh con. Câu 9: Giải: SELECT max(salary) AS luong_cao_nhat, deptid FROM emp GROUP BY deptid ORDER BY deptid; Giải thích: câu này đơn giản, khỏi giải thích. Còn ý nghĩa vì sao dùng lệnh group by thì các bạn tìm hiểu ở các câu trên. Câu 10: Giải: SELECT EMPID, FirstName, deptid FROM emp WHERE hireday in (select min(hireday) from emp group by deptid); Giải thích: câu lệnh con này có nghĩa là tìm ra được thời gian gia nhập phòng ban sớm nhất trong mỗi phòng ban (lệnh group by). Sau đó ta cho hiển thị như trên với điều kiện là hireday phải nằm trong hireday lệnh con. Câu 11: Giải: SELECT EMPID, FirstName FROM emp AS o WHERE salary > (select avg(salary) from emp where deptid = o.deptid); Giải thích: câu này dùng lệnh con tương quan, xem thêm trong giáo trình trang 66. Câu 12: Giải: SELECT o.EMPID, o.FirstName, o.HireDay, o.ManagerId, n.FirstName AS ten_giam_doc, n.deptid AS ma_phong_lam_viec_cua_GD, n.salary AS luong_giam_doc FROM emp AS o, emp AS n WHERE o.ManagerId=n.empid; Giải thích: câu này tương tự câu 7. Câu 13: Giải: SELECT FirstName, ManagerId, DeptId FROM emp; Giải thích: câu này quá đơn giản. Câu 14:
- Giải: SELECT LastName, Salary, DeptId FROM emp; Giải thích: câu này cũng thế. Câu 15: câu này mai mới học nên mình up sau Câu 16: Giải: SELECT EMPID, FirstName, Salary FROM emp AS o WHERE Salary > (select avg(Salary) from emp as n where o.DeptId = n.DeptId); Giải thích: câu này tương tự câu 11. Câu 17: Giải: SELECT EMPID, FirstName FROM emp WHERE jobid in (select jobid from emp where FirstName like "*a*" or FirstName like "*u*"); Giải thích: ở đây khó chỗ lệnh like thôi, bạn nào quên thì mở giáo trình trang 22 thì hiểu. HẾT CHƯƠNG 5thiết và cũng không khó nên mình không giải, các bạn có thể tự giải.