TRUY VẤN SQL NÂNG CAO (PHẦN 1)

Ngày đăng: 14/11/2020   -    Cập nhật: 11/03/2021


Trong quá trình truy vấn dữ liệu, không ít lần bạn phải loay hoay về việc dữ liệu trên bảng kết quả trả về cực kỳ lộn xộn.


Dữ liệu này được hiển thị không trực quan gây khó khăn cho quá trình làm việc hoặc tốn thêm nhiều công sức để xử lý chúng theo ý muốn.


Cái mình muốn nói ở đây là hiện thị dữ liệu trong bảng kết quả theo một thứ tự nào đó như tính năng Filler trong Excel.


Do đó, bài viết này chúng ta sẽ tìm hiểu về các kỹ thuật truy vấn nâng cao để có được kết quả tốt hơn.


[Một số bảng, thuộc tính, dữ liệu trong các ví dụ không có sẵn. Bạn hãy thêm vào để kiểm tra nhé.]


1. ORDER BY


Với MS – SQL Server, bạn có thể sắp xếp dữ liệu kết quả theo thứ tự tăng dần (ASC) hoặc giảm dần (DESC) trên một hoặc nhiều cột bằng cách sử dụng kết hợp ORDER BY trong các câu lệnh SELECT.


Mặc định ORDER BY sắp xếp kết quả theo thứ tự tăng dần (ASC), do đó nếu muốn hiển thị kết quả theo thứ tự tằng dần thì bạn không cần làm gì cả.


Nếu có nhiều thuộc tính sau ORDER BY, sắp xếp được thực hiện ưu tiên trên cột đầu tiên, kế đến cột 2, ..., cột n.


Ví dụ: Hiển thị tên và địa chỉ phi công theo thứ tự alpha – beta:




SELECT hoten, dchi
FROM PHICONG
ORDER BY hoten DESC;
 


Các phép toán trên tập hợp (tương ứng với kiến thức trong Đại số quan hệ):


  • Phép hợp () là UNION
  • Phép giao () là INTERSECT
  • Phép trừ (\) là EXCEPT


Cú pháp:


<câu truy vấn 1>
UNION [ALL]  |  INTERSECT [ALL]  |  EXCEPT [ALL]
<câu truy vấn 2>


Ví dụ: Tìm mã phi công từng làm việc cho công ty 1 hoặc công ty 2 (mã phi công duy nhất, không trùng lặp)



SELECT MPC FROM LAMVIEC WHERE MCT = 1
UNION
SELECT MPC FROM LAMVIEC WHERE MCT = 2;
 


Nếu cho phép trùng lặp, bạn chỉ cần sử dụng UNION ALL là được.


Tiếp theo, thử nghiệm với phép giao.


Ví dụ: Tìm mã phi công từng làm việc cho cả công ty 1 và công ty 2




SELECT MPC FROM LAMVIEC WHERE MCT = 1
INTERSECT
SELECT MPC FROM LAMVIEC WHERE MCT = 2;
 


Ví dụ: Tìm các mã phi công làm cho công ty 2 và không làm cho công ty 3



SELECT MPC FROM LAMVIEC WHERE MCT = 2
EXCEPT
SELECT MPC FROM LAMVIEC WHERE MCT = 3;
 

2. Truy vấn đơn giản trên nhiều bảng


Trong SQL, chúng ta được phép tìm kiếm, truy xuất dữ liệu từ nhiều bảng khác nhau trong cùng một CSDL – chỉ cần các bạn có liên kết với nhau.


Danh sách các bảng được liệt kê trong mệnh đề FROM.


Ví dụ: Tìm mã và họ tên phi công có số ngày làm việc cho một công ty bất kỳ lớn hơn 20 ngày




SELECT DISTINCT p.MPC, hoten
FROM LAMVIEC lv, PHICONG pc
WHERE lv.MPC = pc.MPC
AND songay > 20 ;
 


Trong đó: lv.MPC = pc.MPC là điều kiện để nối kết các bảng. songay > 20 là điều kiện chọn (lọc) dữ liệu tìm kiếm.


Điều kiện kết nối:



  • Nếu có n bảng thì có ít nhất n-1 điều kiện nối kết
  • Nối kết giữa thuộc tính khóa chính của bảng cha và thuộc tính khóa ngoài của bảng con
  • Liên kết các điều kiện nối kết bởi toán tử AND


Ví dụ: Tìm tên công ty mà phi công Patrick Cortier đã làm việc



SELECT DISTINCT tencty
FROM LAMVIEC AS lv, PHICONG AS pc, CONGTY AS ct
WHERE (lv.MPC = pc.MPC) AND (lv.MCT = ct.MCT)
AND hoten = 'Patrick Cortier';
 


Nếu không có điều kiện kết nối, ta chỉ có thể lấy về kết quả là một tích Descartes (CROSS JOIN) của các bảng trong mệnh đề FROM



SELECT *
FROM PHICONG AS pc CROSS JOIN LAMVIEC AS lv;

SELECT *
FROM PHICONG AS pc, LAMVIEC AS lv;
 

3. Phép kết nối


SQL cho phép kết hợp (JOIN) các dòng giữa hai hay nhiều bảng dựa trên các cột giống nhau giữa các bảng này.


Khái niệm JOIN này có thể dễ hiểu hơn là việc gộp tất cả các điều kiện chọn và điều kiện nối kết trong mệnh đề WHERE.


Ba kiểu nối kết :



  • Phép kết nối tự nhiên NATURAL JOIN
  • Phép nối kết đơn giản INNER JOIN
  • Các phép nối kết OUTER JOIN:
LEFT JOIN (mở rộng trái)

RIGHT JOIN (mở rộng phải)

FULL JOIN (mở rộng hai bên)

 

3.1. NATURAL JOIN



Tương tự đại số quan hệ, nối kết tự nhiên cho phép nối kết giữa hai bảng


  • Không yêu cầu chỉ ra điều kiện nối kết
  • Nối kết ngầm định giữa hai thuộc tính cùng tên giữa 2 bảng
  • Hai thuộc tính cùng tên này chỉ xuất hiện 1 lần trong quan hệ kết quả


Ví dụ: Tìm mã và họ tên phi công có số ngày làm việc cho một công ty bất kỳ lớn hơn 20 ngày



SELECT DISTINCT pc.MPC, hoten
FROM LAMVIEC AS lv NATURAL JOIN PHICONG AS pc
WHERE songay > 20 ; --- ????
 


Nếu 2 thuộc tính không cùng tên -> có thể đổi tên trước khi nối kết.


Có thể xảy ra lỗi khi có 2 thuộc tính cùng tên ở 2 bảng nhưng không phải là hai thuộc tính để nối kết (thuộc tính khoá chính và khoá ngoài)



LƯU Ý: SQL Server không hỗ trợ NATURAL JOIN 😊))


3.2. INNER JION



Là loại nối kết đơn giản được dùng nhiều nhất không chỉ riêng MS – SQL Server mà hầu hết các hệ quản trị CSDL khác – cũng là lựa chọn yêu thích nhất của dân Data và Dev.


Cú pháp:



SELECT <tên cột> [ ,…]
FROM <bảng 1>
INNER JOIN | JOIN <bảng 2>
ON <bảng 1>.<tên cột>  =  <bảng 2>.<tên cột>;


Cách nối kết:


Đối với mỗi dòng của bảng 1, tìm các dòng tương ứng trong bảng 2 -> sự tương ứng này được thực hiện dựa trên các cột chung của 2 bảng, đó là các cột dùng để nối kết:



  • Nếu không tìm được, dòng này (<bảng 1>) không được thêm vào kết quả.
  • Nếu tìm được, một dòng sẽ được thêm vào kết quả (dòng này bao gồm sự kết hợp các cột ở cả hai bảng.
  • Nếu tìm được nhiều dòng tương ứng ở <bảng 2>, nhiều dòng sẽ được thêm vào kết quả (giá trị các cột của <bảng 1> lặp lại nhiều lần).


Ví dụ: Tìm họ tên các phi công có số ngày làm việc cho một công ty nào đó là 20 ngày



SELECT hoten
FROM PHICONG AS pc JOIN LAMVIEC AS lv
ON pc.MPC = lv.MPC
WHERE songay = 20;
 


3.3. LEFT JOIN



Cú pháp LEFT JOIN:


SELECT <tên cột> [ ,…]
FROM <bảng 1>
LEFT JOIN | LEFT OUTER JOIN <bảng 2>
ON <bảng 1>.<tên cột>  =  <bảng 2>.<tên cột>;


Kết quả bao gồm:


  • Các dòng tương ứng ở cả 2 bảng (kết quả INNER JOIN)
  • Và các dòng thuộc bảng <bảng 1> không tương ứng với <bảng 2>. Các cột tương ứng của <bảng 2> sẽ mang giá trị NULL


Ví dụ: Tìm họ tên các phi công, mã công ty và số ngày làm việc cho công ty nào đó kể các các phi công chưa làm việc cho công ty nào.



SELECT hoten, MCT, songay
FROM PHICONG AS pc
LEFT JOIN LAMVIEC AS lv
ON pc.MPC = lv.MPC;
 


3.4. RIGHT JOIN



Cú pháp RIGHT JOIN:


SELECT <tên cột> [ ,…]
FROM <bảng 1>
RIGHT JOIN | RIGHT OUTER JOIN <bảng 2>
ON <bảng 1>.<tên cột>  =  <bảng 2>.<tên cột>;


Kết quả bao gồm :


  • Các dòng tương ứng ở cả 2 bảng (kết quả INNER JOIN)
  • Và các dòng thuộc bảng <bảng 2> không tương ứng với <bảng 1>. Các cột tương ứng của <bảng 1> sẽ mang giá trị NULL


Ví dụ: Tìm họ tên, mã phi công, địa chỉ và số ngày làm việc của các phi công sống ở Anh làm việc cho công ty có mã số là 1 kể cả trường hợp công ty này không có phi công ở Anh làm việc.



SELECT lv.MPC, hoten,dchi, songay
FROM (SELECT * FROM PHICONG WHERE nuoc LIKE 'Anh'AS pc
RIGHT JOIN (SELECT * FROM LAMVIEC where MCT = 1AS lv
ON pc.MPC = lv.MPC;
 


3.5. FULL JOIN



Cú pháp FULL JOIN:


SELECT <tên cột> [ ,…]
FROM <bảng 1>
FULL JOIN | FULL OUTER JOIN <bảng 2>
ON <bảng 1>.<tên cột>  =  <bảng 2>.<tên cột>;


Kết quả bao gồm :


  • Các dòng tương ứng ở cả 2 bảng (kết quả INNER JOIN)
  • Và các dòng thuộc bảng <bảng 1> không tương ứng với <bảng 2>. Các cột tương ứng của <bảng 2> sẽ mang giá trị NULL
  • Và các dòng thuộc bảng <bảng 2> không tương ứng với <bảng 1>. Các cột tương ứng của <bảng 1> sẽ mang giá trị NULL


Ví dụ: Tìm họ tên, MPC, địa chỉ và số ngày làm việc của các phi công sống ở Anh làm việc cho công ty mã số 1 kể cả trường hợp các phi công ở Anh không làm việc cho công ty 1 và cả trường hợp công ty này không có phi công ở Anh làm việc.



SELECT lv.MPC, hoten,dchi, songay
FROM (SELECT * FROM PHICONG WHERE nuoc LIKE 'Anh'AS pc
FULL JOIN (SELECT * FROM LAMVIEC where MCT = 1AS lv
ON pc.MPC = lv.MPC ;
 
 

Tổng kết


Phần truy vấn nâng cao này có vẻ dài quá rồi, mình tạm ngắt tại đây. Phần 9 sẽ tiếp nối kiến thức truy vấn nâng cao từ phần 8 này nhé. Nếu bạn thấy kiến thức phần SQL này giúp bạn hiểu hơn về cách truy vấn thì không có lý do gì không xem tiếp phần 9 đúng không nhỉ?


---
HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Học Lập trình chất lượng cao (Since 2002). Học làm Lập trình viên. Hành động ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0914939543
Email: hello@niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
 
#niit #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #java #php #python
Bình luận Facebook
Đăng ký tư vấn
Nhân viên gọi điện tư vấn miễn phí sau khi đăng ký
Được cập nhật các ưu đãi sớm nhất
Hotline: 0383180086
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Hãy đăng ký để nhận những thông tin mới nhất về học bổng mới nhất tại NIIT - ICT Hà Nội
top
Đóng lại Đăng ký học tại NIIT - ICT Hà Nội
6260+ học viên đã theo học tại NIIT - ICT Hà Nội và có việc làm tốt trong ngành lập trình. Nắm lấy cơ hội ngay hôm nay!
Chọn khóa học
  • KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS
  • KHÓA HỌC LẬP TRÌNH PHP WEB
  • Khóa học PHP Full stack [2023] cho người mới bắt đầu
  • Khóa học BIG DATA với Hadoop và Spark
  • Khóa học Lập trình Android tại Hà Nội
  • [Tuyển sinh 2023] Lập trình viên Quốc tế DigiNxt
  • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại Hà Nội
  • LẬP TRÌNH GAME
    • Khóa học Lập trình Game Unity
  • LẬP TRÌNH WEB FRONT END
    • KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG
    • KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)
  • LẬP TRÌNH WEB BACK END
    • LẬP TRÌNH JAVA WEB VỚI FRAME WORK
    • Lập trình Web với Django
    • Lập trình PHP với Laravel Framework
  • CHƯƠNG TRÌNH ĐÀO TẠO ỨNG DỤNG CÔNG NGHỆ
    • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại TP HCM
  • LẬP TRÌNH WEB FULL STACK
    • Khóa học Java Full stack (IJFD)
  • LẬP TRÌNH MOBILE
    • FRONT-END VỚI REACTJS VÀ REACT NATIVE
    • Lập trình Android Nâng cao
  • ĐÀO TẠO CHO DOANH NGHIỆP
    • KHÓA HỌC BUSINESS ANALYSIC TỪ CƠ BẢN ĐẾN NÂNG CAO 2023
    • Khóa học Magento: Làm chủ CMS TMĐT lớn nhất
    • Khóa học IOT: Xây dựng Sản phẩm IOT với Raspberry Pi
    • Khóa học Automation Testing Chuyên nghiệp
  • KHÓA HỌC DỰ ÁN
    • Học sử dụng bộ Office: Word, Excel, Power Point, Mail chuyên nghiệp
  • KHÓA HỌC KHÁC
    • VBA Excel Toàn Tập (Cơ Bản - Nâng Cao)
    • VBA Excel Nâng cao
    • Khóa học JMeter: Performance Testing
    • Khóa học Tester đạt chuẩn Quốc tế ISTQB Foundation Level
    • Khoá Học Tester đạt chuẩn quốc tế ISTQB Advanced Level
Bạn chưa chọn khóa học cần đăng ký
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Đăng ký học thành công!
Cảm ơn bạn đã đăng ký học tại NIIT - ICT HÀ NỘI!