PDA

View Full Version : Giúp mình câu lệnh này với



whitelotus4ml
27-04-2005, 20:31
Mình có 2 bảng:
Lop: MaLop, TenLop
SinhVien: MaSinhVien, MaLop, TenSinhVien

Bây giờ mình muốn lấy danh sách các lớp và tổng số sinh viên có trong lớp. Trong trường hợp lớp không có sinh viên thì tổng số bằng 0.

RESULT:
-------------------------------------
| MaLop | TenLop | TongSoSV |
-------------------------------------
| 1 | Mau giao | 20 |
2 Choi 1
3 La 0

Các bạn giúp mình với

thukhoa
28-04-2005, 10:52
Bạn có thể dùng đoạn code sau:
Create table #temp (malop int,tenlop varchar(50),tongsosv int)
insert into #temp select malop,tenlop,0 from lop
update #temp set tongsosv=b.tongso from #temp a, (select malop,tongso=count(*) from sinhvien group by malop having count(*)>0) b where a.malop=b.malop
select * from #temp
drop table #temp
Chúc vui vẻ

phatnq2003
28-04-2005, 13:52
Mình có 2 bảng:
Lop: MaLop, TenLop
SinhVien: MaSinhVien, MaLop, TenSinhVien

Bây giờ mình muốn lấy danh sách các lớp và tổng số sinh viên có trong lớp. Trong trường hợp lớp không có sinh viên thì tổng số bằng 0.

RESULT:
-------------------------------------
| MaLop | TenLop | TongSoSV |
-------------------------------------
| 1 | Mau giao | 20 |
2 Choi 1
3 La 0

Các bạn giúp mình với

SELECT A.malop, B.tenlop, COUNT(A.masinhvien) AS tongsoSV
FROM sinhvien A JOIN lop B ON A.malop = B.malop
GROUP BY A.malop, B.tenlop

Cyber
12-05-2005, 12:59
Hoặc kiểu này cũng được

Select MaLop, TenLop, (Select Count(*) from SinhVien where MaLop = Lop.MaLop) as tongsoSV
Form Lop

Bây giờ mới hay nè. Trong hai SQL command: của Cyber và Phatnq2003. Câu nào chạy nhanh hơn. Đố biết đó :D

m2mhung
12-05-2005, 17:30
Theo mình biết thì câu của Phatnq2003 chạy nhanh hơn vì không có WHERE mà thay vào đó Phatnq2003 dùng Join. Không biết Cyber nghĩ sao?

Cyber
14-05-2005, 23:26
Thực sự thì Cyber chả rành vụ này lắm.
Diễn giải câu SQL thứ nhất:

SELECT A.malop, B.tenlop, COUNT(A.masinhvien) AS tongsoSV
FROM sinhvien A JOIN lop B ON A.malop = B.malop
GROUP BY A.malop, B.tenlop

-Theo Cyber hiểu Join và where cũng giống nhau
Viết
SELECT * FROM lop A JOIN sinhvien B ON A.malop = B.malop
hay SELECT * FROM lop, sinhvien where lop.malop = sinhvien.malop
chả khác gì nhau nhiều lắm

Giả sử có n record Lop và m record SinhVien
Nếu viết SELECT * FROM lop, sinhvien where lop.malop = sinhvien.malop thì với mỗi
record trong Lop mang sang table SinhVien để compare thì phải thực hiện m lần. Với n record của Lop thì tổng số compare phải thực hiện là n*m. Hay ngược lại lấy SinhVien làm chuẩn để compare cũng vậy.
Nếu viết SELECT * FROM lop A JOIN sinhvien B ON A.malop = B.malop thì sẽ là n*m lần compare.
Còn Phatnq2003 viết "FROM sinhvien A JOIN lop B ON A.malop = B.malop" thì cũng same đúngkhông m*n.


-Vì khi select có một trường dùng calculator function nên các trường khác group lại.
-Khi group thì phải 2 lần group nhé. GROUP BY A.malop, B.tenlop. Một cho Malop và một cho Tenlop (mặc dù tên lớp có thể trùng.Trong bảng đó Ma_lop là khóa chính==> khả tính sai có thể xảy ra)
- Sau khi group xong thì phải count xem mỗi group có bao nhiêu lớp.

Diễn giải câu SQL thứ 2:

Select MaLop, TenLop, (Select Count(*) from SinhVien where MaLop = Lop.MaLop) as tongsoSV
Form Lop

-Select hết tất cả data trong bảng Lop
- Với mỗi một record của lớp thực hiện where một lần và count một lần.

Vậy khả năng câu SQL của Cyber tốt hơn đúng không ? SQL càng đơn giản càng chạy tốt. Đó là ý kiến của Cyber

jiSh@n
15-05-2005, 18:19
Nhưng Cyber dùng sub-query nên cũng khó nói cái nào nhanh hơn cái nào. Tốt nhứt là dùng tool trong Enterprise Manager để kiểm tra thôi.