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

Thảo luận trong 'SQL' bắt đầu bởi HoaKhanhIT, 19 Tháng mười 2009.

  1. Offline

    HoaKhanhIT

    • Thành Viên Mới

    Số bài viết:
    123
    Đã được thích:
    81
    Điểm thành tích:
    0
    Để 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.
  2. Offline

    vantienitc

    • Thành Viên Mới

    Số bài viết:
    4
    Đã được thích:
    5
    Điểm thành tích:
    0
    Chào bạn, Bạn giải thích cho mình chỗ INNER JOIN với, mình thì biết rồi vì mình học SQL sever, nhưng theo mình được biết CSDLQH & SQL thì không có lệnh này.
    lyvinhr00m, viethung_9xzphuoocm thích bài này.
  3. Offline

    congthangitvn

    • Thành viên sáng lập

    • Liên thông đại học 2012...!
    Số bài viết:
    2.232
    Đã được thích:
    1.550
    Điểm thành tích:
    1.450
    Cái này là chuẩn 2k3 đó bạn.
    có lẽ bạn viết chuẩn 99 quen rồi mình cũng vậy nè giờ viết chuẩn 2k3 khó muốn chết
  4. Offline

    HoaKhanhIT

    • Thành Viên Mới

    Số bài viết:
    123
    Đã được thích:
    81
    Điểm thành tích:
    0
    Thực ra lệnh INNER JOIN hoàn toàn không khó, do ta thấy dung kiểu form where dễ hơn nên ta dùng mà nghĩ INNER JOIN là khó, chỉ cần các bạn bỏ ra 5' đọc là hiểu liền.

    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 thiết và cũng không khó nên mình không giải, các bạn có thể tự giải.
  5. Offline

    HoaKhanhIT

    • Thành Viên Mới

    Số bài viết:
    123
    Đã được thích:
    81
    Điểm thành tích:
    0
    Hướng dẫn giải bài tập chương 5

    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 5
  6. Offline

    kiterot

    • Thành Viên Mới

    Số bài viết:
    14
    Đã được thích:
    10
    Điểm thành tích:
    0
    hehhe cảm ơn cu Trí mén nhìu nha!!
    zphuoocm thích bài này.
  7. Offline

    HoaKhanhIT

    • Thành Viên Mới

    Số bài viết:
    123
    Đã được thích:
    81
    Điểm thành tích:
    0
    Chặc, sao lại có Trí "mén" ở đây nhỉ, mà you là ai
    zphuoocm thích bài này.
  8. Offline

    HoaKhanhIT

    • Thành Viên Mới

    Số bài viết:
    123
    Đã được thích:
    81
    Điểm thành tích:
    0
    các chương về sau mình đã làm xong rồi, nhưng mình không chắc chắn đúng nên mình không port lên. bạn nào có yêu cầu về bài nào xin gởi ý kiến, mình sẽ giải đáp.
    lebinhvhit03azphuoocm thích bài này.
  9. Offline

    kakachi_mya

    • Thành Viên Mới

    Số bài viết:
    1
    Đã được thích:
    0
    Điểm thành tích:
    0
    bạn ơi cho mình link download sách giáo trình được không.
    thank bạn nha
  10. Offline

    clandn.angel

    • friend

    Số bài viết:
    655
    Đã được thích:
    361
    Điểm thành tích:
    450
    INNER JOIN là lệnh để liên kết hay hay nhiều bảng với nhau.
    Vd: emp INNER JOIN dept ON dept.deptid=emp.deptid
    Ở đây mình dùng bảng emp và dept theo như cơ sở dữ liệu Access của nhà trường. Ở đây 2 bảng emp và dept được liền kết với nhau qua trường chung là deptid, cái này bạn có thể click vào 2 bảng emp và dept để thấy được.
    p.s: Viết mấy thứ này những lệnh như SELECT, FROM, v.v.....bạn nên viết hoa để nhận thấy được dễ dàng, mỗi lệnh nên viết 1 dòng để phát hiện lỗi tốt hơn, đó là theo phương pháp học của mình.
    Thân Mr.Nobita
    congthangitvn thích bài này.
  11. Offline

    clandn.angel

    • friend

    Số bài viết:
    655
    Đã được thích:
    361
    Điểm thành tích:
    450
    À quên....thank chủ topic, có 1 topic rất hay, mình đang rất cần topic của bạn, mong là nó luôn được update liên tục. Thank bạn phát nè ^^!
  12. Offline

    HoaKhanhIT

    • Thành Viên Mới

    Số bài viết:
    123
    Đã được thích:
    81
    Điểm thành tích:
    0
    Bạn cần tài liệu nào ? bạn vào topic ebook xem thử có không.
  13. Offline

    HoaKhanhIT

    • Thành Viên Mới

    Số bài viết:
    123
    Đã được thích:
    81
    Điểm thành tích:
    0
    Update gì nữa bạn, mấy bài tập trong giáo trình mình up lên hết rồi. Bây giờ có ai có câu hỏi, bài tập nào khó gởi lên mình hướng dẫn thì được.
    lebinhvhit03asunboy thích bài này.
  14. Offline

    haihung_9x

    • Friends

    • Chém gió đỉnh cao
    Số bài viết:
    353
    Đã được thích:
    271
    Điểm thành tích:
    220
    thank bác nha. Đang làm bài tập. Lấy cái này lên bảng viết cí đạ hehe.:complaint::handshake:
  15. Offline

    lebinhvhit03a

    • Friends

    Số bài viết:
    270
    Đã được thích:
    116
    Điểm thành tích:
    90
    thank anh nhều.mong là anh có thể giúp em giải quyết được nhiều bài tập mà em bó tay nha:001:
  16. Offline

    garupro

    • Thành Viên Mới

    Số bài viết:
    3
    Đã được thích:
    0
    Điểm thành tích:
    0
    Bạn nào có link down giáo trình CSLDQH & SQL của trường bạn ko cho mình xin...
  17. Offline

    integer

    • Tiếu Ngạo Giang Hồ

    • :-?
    Số bài viết:
    1.695
    Đã được thích:
    1.313
    Điểm thành tích:
    900
    vậy bạn là sinh viên trường khác rồi đúng không, giáo trình KHMT trường mình bạn có thể tải thoải mái tại ftp:

    ftp://222.255.128.147
    user: sinhvien
    pass: 123456
    mục : Bai_giang_dien_tu
    viethung_9x thích bài này.
  18. Offline

    Monterkill197

    • Windows NT

    Số bài viết:
    164
    Đã được thích:
    64
    Điểm thành tích:
    60
    câu 15 chương 3 xem lại đi bạn ơi. fix lại đi . bỏ vào access nó không chạy được
  19. Offline

    HoaKhanhIT

    • Thành Viên Mới

    Số bài viết:
    123
    Đã được thích:
    81
    Điểm thành tích:
    0
    Bạn chú ý là có một số câu được viết theo chuẩn sql 2003 nên ko chạy trên access được.
  20. Offline

    Monterkill197

    • Windows NT

    Số bài viết:
    164
    Đã được thích:
    64
    Điểm thành tích:
    60
    bạn ơi !! giải câu 15 theo hàm case đi bạn ơi . mình làm không được

Chia sẻ trang này

Advertising: Linux system admin | nukeviet | nukeviet 4 | Upload ảnh miễn phí