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

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


Ở bài truy vấn SQL nâng cao (phần 1) bạn đã được học về các sắp xếp kết quả truy vấn, truy vấn trên nhiều bảng và các phép nối kết. Bài này chúng ta sẽ tiếp tục tìm hiểu về các truy vấn SQL nâng cao với việc sử dụng truy vấn con, các hàm kết tập.

1. Truy vấn con


Một truy vấn con là một câu lệnh SELECT được lồng trong một SELECT, INSERT, DELETE, UPDATE hoặc một SELECT con khác.


Kết quả của truy vấn con có thể là một giá trị hoặc nhiều giá trị, truy vấn con sinh ra một điều kiện trong mệnh đề.


Cú pháp:



SELECTFROM ...
WHERE [… AND] <điều kiện với truy vấn con>
(SELECT con)


Ví dụ 1: Tìm họ tên của các phi công có số ngày làm việc lớn hơn 20?



SELECT hoten
FROM PHICONG
WHERE MPC IN
(SELECT MPC FROM LAMVIEC WHERE songay > 20) ; -- trả về nhiều giá trị
 


Ở đây, chương trình sẽ tìm số phi công có ngày làm việc lớn hơn 20. Sau đó, trong tập kết quả trả về lại tìm họ tên của các phi công này.


Ví dụ 2: Tìm họ tên của các phi công có số ngày làm việc nhiều nhất?



SELECT hoten FROM PHICONG
WHERE MPC IN
(SELECT MPC FROM LAMVIEC
WHERE songay =
(SELECT MAX(songay) FROM LAMVIEC)); -- trả về một giá trị
 


Truy vấn con có ràng buộc:


  • Mệnh đề ORDER BY không được dùng trong truy vấn con
  • Câu truy vấn con phải được bao trong cặp dấu ngoặc đơn ()
  • Mệnh đề SELECT của truy vấn con chỉ bao gồm một thuộc tính duy nhất trừ trường hợp dùng EXISTS
  • Thuộc tính trong điều kiện với truy vấn con và thuộc tính trong mệnh đề SELECT của truy vấn con phải tương thích trừ trường hợp dùng EXISTS
  • Các thuộc tính được định nghĩa trong SELECT chính có thể được sử dụng trong SELECT con
  • Nhưng các thuộc tính được định nghĩa trong SELECT con không thể được sử dụng trong SELECT chính


Truy vấn con có điều kiện và toán tử:


  • Nếu truy vấn con trả về một giá trị, các toán tử như >, >=, <, … có thể được sử dụng trong điều kiện với truy vấn con
  • Nếu truy vấn con trả về một tập các giá trị, phải sử dụng các toán tử như ANY, ALL, EXISTS trong điều kiện với truy vấn con:
ANY: Trả về true nếu một trong các giá trị của truy vấn con đúng

ALL: Trả về true nếu tất cả các giá trị của truy vấn con đúng

EXISTS: Trả về true nếu truy vấn con trả về ít nhất một dòng
 

Ví dụ 3: Tìm các loại máy bay của hãng Boeing mà có số chỗ lớn hơn ít nhất một loại nào đó của hãng Airbus



SELECT loai FROM LOAIMAYBAY
WHERE NSX = 'Boeing'
AND socho > ANY
(SELECT socho FROM LOAIMAYBAY WHERE NSX = 'Airbus');
 


Ví dụ 4: Tìm các kiểu máy bay của hãng Airbus mà có số chỗ lớn hơn số chỗ của tất cả các kiểu của hãng Boeing



SELECT loai FROM LOAIMAYBAY
WHERE NSX = 'Airbus'
AND socho > ALL
(SELECT socho FROM LOAIMAYBAY WHERE NSX = 'Boeing');
 


Ví dụ dụ 5: Tìm các máy bay thực hiện ít nhất một chuyến bay đến Paris?



SELECT * FROM MAYBAY
WHERE EXISTS (SELECT MMB FROM CHUYENBAY
WHERE MAYBAY.MMB = CHUYENBAY.MMB
AND noiden='Paris');
--  Cũng có thể sử dụng IN hoặc = ANY thay cho EXISTS
 
 

2. Truy vấn sử dụng các hàm kết tập


SQL hỗ trợ sử dụng các hàm kết tập để truy vấn dữ liệu


Ví dụ 6: Tìm xem có bao nhiêu phi công ở nước Pháp



SELECT COUNT(*) FROM PHICONG WHERE nuoc = 'Phap';
 


Ví dụ 7: Tính tổng khoảng cách đã bay, đường bay ngắn nhất, dài nhất và độ dài trung bình các chuyến bay của phi công mã số 20.



SELECT SUM(khoangcach) AS Tong, MIN(khoangcach) Nho_nhat,
MAX(khoangcach) AS Lon_nhat, AVG(khoangcach) AS Trung_binh
FROM CHUYENBAY
WHERE MPC = 20;
 


2.2. Gom nhóm - GROUP BY



Mệnh đề GROUP BY được dùng kết hợp với các hàm kết tập để nhóm kết quả theo một hoặc nhiều cột.


NOTE: mỗi thuộc tính trong mệnh đề SELECT phải bao hàm trong hàm kết tập hoặc trong mệnh đề GROUP BY


Cú pháp:



SELECT <tên cột 1> [, tên cột 2> ,…], <hàm kết tập(tên cột 1)>, [, <hàm kết tập(tên cột 2)>, …]
FROM <tên bảng 1> [, <tên bảng 2>, …]
[ WHERE <điều kiện> ]
GROUP BY <tên cột 1> [, <tên cột 2>, …];


Ví dụ 8: Tìm số phi công của mỗi nước (nhóm theo từng nước)



SELECT nuoc, count(*) so_phi_cong
FROM PHICONG
GROUP BY nuoc;
 


2.3. GROUP BY - HAVING



Mệnh đề WHERE không thể được dùng với các hàm kết tập -> Điều kiện trên nhóm với hàm kết tập -> dùng HAVING (WHERE : điều kiện trên dòng).

HAVING chỉ hiểu các điều kiện trên các hàm kết tập.


Ví dụ 9: Số phi công của mỗi nước lớn hơn 3 phi công




SELECT nuoc, count(*) so_phi_cong
FROM PHICONG
GROUP BY nuoc HAVING count(*) >= 3;
 

3. Lưu kết quả với SELECT


3.1. SELECT INTO



SELECT INTO cho phép lưu kết quả truy vấn vào một bảng mới hoặc một biến (1)


SELECT <tên cột> [, …] INTO <tên bảng mới>
FROM <tên bảng>;


SQL Server còn cho phép lưu kết quả vào biến tạm (2)


SELECT <tên cột> [, ... ] INTO <#Tên biến tạm>
FROM <tên bảng>;


Ví dụ 10:



SELECT * INTO temp
FROM CONGTY; --  trường hợp (1)

SELECT * INTO #temp
FROM CONGTY; --  trường hợp (2)
 


3.2. INSERT INTO - Thêm dữ liệu cho bảng



INSERT INTO cho phép thêm các dòng vào bảng từ kết quả truy vấn SELECT:


INSERT INTO <tên bảng> [ ( <tên cột> [, …]) ]
<Lệnh SELECT>;


Ví dụ 11: Thêm dữ liệu phi công Pháp vào một bảng mới.



CREATE TABLE PHICONG_PHAP(
MPC smallint PRIMARY KEY,
hoten varchar(30),
dchi varchar(30)
);

INSERT INTO PHICONG_PHAP
SELECT MPC, hoten, dchi
FROM PHICONG
WHERE nuoc = 'Pháp';
 


3.3. SELECT TOP - Giới hạn kết quả hiển thị



Trong SQL Server, để giới hạn số dòng kết quả, ta sử dụng SELECT TOP(<số dòng>) và kết hợp với một số lệnh / mệnh đề khác.


Ví dụ 12: Sắp xếp các phi công theo họ tên và hiển thị 2 người đầu tiên




SELECT TOP(2) * FROM PHICONG
ORDER BY hoten;
 

Tổng kết


Như vậy khi kết thúc 2 phần truy vấn SQL nâng cao này bạn hoàn toàn có thể tự tin áp dụng các kiến thức này vào việc thiết kế - truy vấn hay thao tác với CSDL.


Tất cả những gì được chia sẻ trên đây hoàn toàn là kiến thức cốt lõi, chưa thể đầy đủ hết nhưng nó sẽ là chìa khoá giúp bạn sử dụng SQL thuận lợi hơn trong tương lai.


Series học Lập trình SQL này còn vài phần nâng cao hơn nữa – nhưng những phần sau này thiên về việc quản trị CSDL hơn – bạn nhớ đón xem 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!