Hỏi về from where và join trong SQL

Chào mọi người, em mới học cơ sở dữ liệu trên SQL và có 1 chút thắc mắc?
Em muốn tìm các chọn thông tin giáo viên và bộ môn tương ứng.
C1:

select *
from GIAOVIEN as gv,  BOMON as bm
where gv.MABM = bm. MABM

C2:

select *
from GIAOVIEN as gv join  BOMON as bm on gv.MABM = bm.MABM

Em thấy 2 cách này đưa ra kết quả giống nhau.

  1. Em muốn hỏi là 2 cách này có thể thay thế cho nhau được ko?
  2. Chúng có gì giống nhau trong mọi trường hợp hay ko? (ý em là giữa riêng join …on và from where như câu trên chứ ko nói tới join left, join right)

EDIT (@library): @nguoithichdua cậu nhớ dùng Markdown để format code, và phân loại post phù hợp từ các post sau nhé!

  1. Được, miễn giải quyết được vấn đề. Ví dụ của bạn cũng là 1 điển hình
  2. Chưa chắc, với những câu query mà có sub query và join nhiều bảng (subqury) hay điều kiện phức tạp thì sử dụng from where sẽ không tường minh
  3. Riêng mình thì hầu như không bao giờ sử dụng cách 1, vì nó rất khó đọc so với cách 2 (ở đây chưa nói tới hiệu năng)
4 Likes

Bạn thắc mắc rât đúng. Cả 2 câu điều trả về kết quả như nhau vì điều là INNER JOIN, chỉ khác nhau cách viết tùy vào bạn viết theo chuẩn ANSI nào.

C1: ANSI SQL 89
C2: ANSI SQL 92

Hầu hết những CSDL lớn hiện nay điều hổ trợ cả 2 kiểu viết trên. Ngay cả trong một câu query bạn cũng có thể đồng thời viết cả 2 cách.

Cách một thời nhìn “gọn” hơn, nhưng bù lại sẽ không thể thể hiện được OUTER JOIN, vd như LEFT JOIN, RIGHT JOIN hay FULL OUTER JOIN.
Trước khi có ANSI SQL 92, một số CSDL như Oracle đã “chế” ra cách cùng dấu (+) đặt phía bên “thiếu” data trong mệnh đề so sách để thể hiện là LEFT/RIGHT JOIN.

Trong thực tế ngày nay C2 được sử dụng rất nhiều vì developer muốn “vét cạn” phòng trường hợp thiếu dữ liệu, cho dù cả 2 column trong mệnh đề so sánh điều NOT NULL họ vẫn kiên quyết dùng LEFT OUTER JOIN thay vì JOIN. Kiểu như thà giết nhầm hơn bỏ sót :slight_smile:

Xem thêm ở đây.

1 Like

Đúng vậy. 2 cách trên giống hệt nhau nhé.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?