Announcement

Collapse
No announcement yet.

Thảo luận về SQL

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Thảo luận về SQL

    Em xin chào các anh chị UIT. Em là sinh viên năm nhất, hiện đang học môn CSDL1. Em rất thích ngôn ngữ SQL. Và khi học gặp phải hai dạng đề khá khó (có thể do em còn non kém), đã nhiều lần tìm cách giải nhưng không được, mong các anh chị giúp đỡ.
    -Dạng 1: chọn ra phần tử đứng thứ 2,3. Thông thường ta dùng lệnh MAX để lấy cái lớn nhất, nhưng lấy cái thứ 3 thì em không biết thế nào.
    VD: Cho bảng SINHVIEN(MaSV, Diem). Chọn ra những sinh viên có điểm cao thứ 3.

    -Dang 2: thực hiện chọn ra 2 cột mà phải dùng 2 truy vấn khác điều kiện nhau trong cùng một truy vấn (nôm na là vậy, em không biết nói thế nào). VD: Bảng THI(Maph, MaSV, CoMat). Đề là cho ra thống kê (MaPh[Mã phòng thi], SoSV[tổng số sinh viên thi phòng đó], SoCoMat[số sv có đi dự thi phòng đó])
    *Chú thích: Nếu SV có đi dự thi thì cột CoMat=1.

  • #2
    Originally posted by 10520437 View Post
    Em xin chào các anh chị UIT. Em là sinh viên năm nhất, hiện đang học môn CSDL1. Em rất thích ngôn ngữ SQL. Và khi học gặp phải hai dạng đề khá khó (có thể do em còn non kém), đã nhiều lần tìm cách giải nhưng không được, mong các anh chị giúp đỡ.
    -Dạng 1: chọn ra phần tử đứng thứ 2,3. Thông thường ta dùng lệnh MAX để lấy cái lớn nhất, nhưng lấy cái thứ 3 thì em không biết thế nào.
    VD: Cho bảng SINHVIEN(MaSV, Diem). Chọn ra những sinh viên có điểm cao thứ 3.

    -Dang 2: thực hiện chọn ra 2 cột mà phải dùng 2 truy vấn khác điều kiện nhau trong cùng một truy vấn (nôm na là vậy, em không biết nói thế nào). VD: Bảng THI(Maph, MaSV, CoMat). Đề là cho ra thống kê (MaPh[Mã phòng thi], SoSV[tổng số sinh viên thi phòng đó], SoCoMat[số sv có đi dự thi phòng đó])
    *Chú thích: Nếu SV có đi dự thi thì cột CoMat=1.
    Dạng 1: order by rồi limit chỉ lấy 3 thằng.

    Dạng 2: Group by.

    Lâu quá rồi anh không có nhớ cụ thể. Em lấy mấy từ khóa trên đi Google đi

    Comment


    • #3
      Câu 1:
      SELECT max(diem )
      FROM sinhvien
      WHERE diem NOT IN (SELECT top 2 diem FROM sinhvien
      ORDER BY diem DESC)
      Câu 2:
      SELECT T1.MaPH, count(T1.MaSV) as SoSV, count(T2.MaSV) as SoCoMat FROM thi T1
      left join
      thi T2 on T1.MaSV=T2.MaSV and T2.CoMat=1
      group by T1.MaSV

      Comment


      • #4
        #

        Originally posted by 08520467 View Post
        Câu 1:
        câu 1 nếu xảy ra trường hợp có 2 hoặc nhiều sv có cùng điểm ở vị trí thứ 3 thì chỉ hiện thị đc 1 bạn, câu này có cách làm khác mà có thể hiện thị đầy đủ ds các sv đứng thư 3, có bạn nào nhớ k, mình quên mất rồi, hic

        Comment


        • #5
          Originally posted by 10520253 View Post
          câu 1 nếu xảy ra trường hợp có 2 hoặc nhiều sv có cùng điểm ở vị trí thứ 3 thì chỉ hiện thị đc 1 bạn, câu này có cách làm khác mà có thể hiện thị đầy đủ ds các sv đứng thư 3, có bạn nào nhớ k, mình quên mất rồi, hic
          Câu 1 bổ sung:
          SELECT * FROM sinhvien
          WHERE diem=(SELECT max(diem )
          FROM sinhvien
          WHERE diem NOT IN (SELECT top 2 diem FROM sinhvien
          ORDER BY diem DESC) )

          Comment


          • #6
            Originally posted by 10520253 View Post
            câu 1 nếu xảy ra trường hợp có 2 hoặc nhiều sv có cùng điểm ở vị trí thứ 3 thì chỉ hiện thị đc 1 bạn, câu này có cách làm khác mà có thể hiện thị đầy đủ ds các sv đứng thư 3, có bạn nào nhớ k, mình quên mất rồi, hic
            Dùng select với unique để bỏ các điểm trùng nhau, sau đó order by limit để lấy cái thứ 3. Sau đó dùng một câu select khác để lấy tất cả sv có điểm giống điểm này.

            Comment


            • #7
              Originally posted by 08520467 View Post
              Câu 1 bổ sung:
              SELECT * FROM sinhvien
              WHERE diem=(SELECT max(diem )
              FROM sinhvien
              WHERE diem NOT IN (SELECT top 2 diem FROM sinhvien
              ORDER BY diem DESC) )
              trong trường hợp có nhiều sv có cùng điểm cao nhất hoặc cao t2 thì có lẽ vẫn chưa đúng

              Originally posted by 07520004 View Post
              Dùng select với unique để bỏ các điểm trùng nhau, sau đó order by limit để lấy cái thứ 3. Sau đó dùng một câu select khác để lấy tất cả sv có điểm giống điểm này.
              bác cho e cái vd với unique đi, e chưa gặp cái nì bh

              Comment


              • #8
                Originally posted by 10520253 View Post
                bác cho e cái vd với unique đi, e chưa gặp cái nì bh
                Google đi em! Nó lềnh cả đống đồng ra

                Comment


                • #9
                  Câu 1 phải viết thế này mới đúng chứ :
                  SELECT * FROM sinhvien
                  WHERE diem=(SELECT max(diem )
                  FROM sinhvien
                  WHERE diem NOT IN (SELECT DISTINCT top 2 diem FROM sinhvien
                  ORDER BY diem DESC) )

                  Comment


                  • #10
                    Câu 1 thì tớ làm thế này, sai các bro đừng chém :-S
                    Select * from sinhvien
                    where diem in (select top 1 diem from sinhvien where diem in
                    (select top 2 diem from sinhvien order by diem DESC) order by diem)
                    Giải thích nhé
                    select top 2 diem from sinhvien order by diem DESC
                    câu lệnh này trả về top 2 người điểm cao nhất, sắp xếp theo giảm dần, tức là thằng đầu tiên là thằng điểm cao nhất
                    select top 1 diem from sinhvien where diem in
                    (select top 2 diem from sinhvien order by diem DESC) order by diem
                    Sau khi đã chọn ra được 2 thằng điểm cao nhất, câu lệnh này chọn ra 1 thằng từ 2 thằng, select top 1 là nó lấy thằng đầu tiên, tà order by diem tức là nó sắp xếp tăng dần ==>thằng thứ 2 sẽ đứng đầu. Khi đó ta select top 1 nó sẽ cho ra thằng này.
                    Còn câu 2 thì tớ không hiểu ý bạn nên bochan ^^
                    Thời trang nam cao cấp, dép da nam, giày da nam

                    Comment


                    • #11
                      Originally posted by 10520597 View Post
                      Câu 1 thì tớ làm thế này, sai các bro đừng chém :-S

                      Giải thích nhé

                      câu lệnh này trả về top 2 người điểm cao nhất, sắp xếp theo giảm dần, tức là thằng đầu tiên là thằng điểm cao nhất

                      Sau khi đã chọn ra được 2 thằng điểm cao nhất, câu lệnh này chọn ra 1 thằng từ 2 thằng, select top 1 là nó lấy thằng đầu tiên, tà order by diem tức là nó sắp xếp tăng dần ==>thằng thứ 2 sẽ đứng đầu. Khi đó ta select top 1 nó sẽ cho ra thằng này.
                      Còn câu 2 thì tớ không hiểu ý bạn nên bochan ^^
                      Theo như những thảo luận ở trên thì cách này sai rồi đó

                      Comment


                      • #12
                        Originally posted by 07520004 View Post
                        Theo như những thảo luận ở trên thì cách này sai rồi đó
                        Không sai đâu An :d, đọc sơ qua thì ý tưởng thế này.

                        Đầu tiền sẽ tìm điểm cao thứ 3 (select max diem... where... not in top 2....) đã có distinct rồi thì sẽ không trùng điểm nữa. Cái này thực chất chỉ tìm xem điểm cao thứ 3, không dính dáng j đến sinh viên. Quan trọng là ở chỗ distinct

                        Sau đó tìm sv có điểm = điểm cao thứ 3 vừa mới select dc ^^!. Vậy sẽ ra nguyên 1 list sv
                        Last edited by 07520201; 07-06-2011, 14:24.

                        Comment


                        • #13
                          Originally posted by 07520201 View Post
                          Không sai đâu An :d, đọc sơ qua thì ý tưởng thế này.

                          Đầu tiền sẽ tìm điểm cao thứ 3 (select max diem... where... not in top 2....) đã có distinct rồi thì sẽ không trùng điểm nữa. Cái này thực chất chỉ tìm xem điểm cao thứ 3, không dính dáng j đến sinh viên. Quan trọng là ở chỗ distinct

                          Sau đó tìm sv có điểm = điểm cao thứ 3 vừa mới select dc ^^!. Vậy sẽ ra nguyên 1 list sv
                          Cái của 10520597 đâu có distinct, mà cũng không phải là tìm người thứ 3

                          Comment


                          • #14
                            Originally posted by 09520065 View Post
                            Câu 1 phải viết thế này mới đúng chứ :
                            SELECT * FROM sinhvien
                            WHERE diem=(SELECT max(diem )
                            FROM sinhvien
                            WHERE diem NOT IN (SELECT DISTINCT top 2 diem FROM sinhvien
                            ORDER BY diem DESC) )
                            Originally posted by 08520467 View Post
                            Câu 1 bổ sung:
                            SELECT * FROM sinhvien
                            WHERE diem=(SELECT max(diem )
                            FROM sinhvien
                            WHERE diem NOT IN (SELECT top 2 diem FROM sinhvien
                            ORDER BY diem DESC) )
                            Nó đây... hoặc bài của Bạch Sỹ Đức Vinh thêm distinct :d. Hoặc còn cách nữa là limit (nhưng cho mysql ) )
                            Last edited by 07520201; 07-06-2011, 17:08.

                            Comment


                            • #15
                              Originally posted by 07520201 View Post
                              Nó đây... hoặc bài của Bạch Sỹ Đức Vinh thêm distinct :d. Hoặc còn cách nữa là limit
                              Cái đó thì đúng, còn cái bài mà tớ quote thì chưa đúng

                              Limit hình như mysql có M$ sql ko có thì phải. Còn oracle nó dùng unique thay cho distinct thì phải
                              Tốt nhất mình chỉ nói ý tưởng, để các em nhỏ tự google, chứ mình tự viết khéo nó sai bét nhè ra

                              Comment

                              LHQC

                              Collapse
                              Working...
                              X