Bài tập SQL nâng cao

Mục Lục

Show

  • 1. Truy vấn con
  • 2. Truy vấn sử dụng các hàm kết tập
  • 3. Lưu kết quả với SELECT
  • Tổng kết

Ở 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: SELECT  FROM ... 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? SELECThoten FROMPHICONG WHEREMPCIN (SELECTMPCFROMLAMVIECWHEREsongay>20);--trảvềnhiềugiá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? SELECThotenFROMPHICONG WHEREMPCIN (SELECTMPCFROMLAMVIEC WHEREsongay= (SELECTMAX(songay)FROMLAMVIEC));--trảvềmộtgiá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



    SELECTloaiFROMLOAIMAYBAY WHERENSX='Boeing' ANDsocho>ANY (SELECTsochoFROMLOAIMAYBAYWHERENSX='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



    SELECTloaiFROMLOAIMAYBAY WHERENSX='Airbus' ANDsocho>ALL (SELECTsochoFROMLOAIMAYBAYWHERENSX='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*FROMMAYBAY WHEREEXISTS(SELECTMMBFROMCHUYENBAY WHEREMAYBAY.MMB=CHUYENBAY.MMB ANDnoiden='Paris'); --CũngcóthểsửdụngINhoặc=ANYthaychoEXISTS

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ệuVí dụ 6: Tìm xem có bao nhiêu phi công ở nước Pháp SELECTCOUNT(*)FROMPHICONGWHEREnuoc='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. SELECTSUM(khoangcach)ASTong,MIN(khoangcach)Nho_nhat, MAX(khoangcach)ASLon_nhat,AVG(khoangcach)ASTrung_binh FROMCHUYENBAY WHEREMPC=20;

2.2. Gom nhóm - GROUP BYMệ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 BYCú 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) SELECTnuoc,count(*)so_phi_cong FROMPHICONG GROUPBYnuoc;

2.3. GROUP BY - HAVINGMệ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 SELECTnuoc,count(*)so_phi_cong FROMPHICONG GROUPBYnuocHAVINGcount(*)>=3;

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

3.1. SELECT INTOSELECT 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*INTOtemp FROMCONGTY;--trườnghợp(1) SELECT*INTO#temp FROMCONGTY;--trườnghợp(2)

3.2. INSERT INTO - Thêm dữ liệu cho bảngINSERT 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. CREATETABLEPHICONG_PHAP( MPCsmallintPRIMARYKEY, hotenvarchar(30), dchivarchar(30) ); INSERTINTOPHICONG_PHAP SELECTMPC,hoten,dchi FROMPHICONG WHEREnuoc = '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 SELECTTOP(2)*FROMPHICONG ORDERBYhoten;

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: Website:https://niithanoi.edu.vn Fanpage: https://facebook.com/NIIT.ICT/ #niit #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #java #php #python


Ở 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.


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:


SELECT  FROM ...
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?



SELECThoten FROMPHICONG WHEREMPCIN (SELECTMPCFROMLAMVIECWHEREsongay>20);--trảvềnhiềugiá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?



SELECThotenFROMPHICONG WHEREMPCIN (SELECTMPCFROMLAMVIEC WHEREsongay= (SELECTMAX(songay)FROMLAMVIEC));--trảvềmộtgiá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



    SELECTloaiFROMLOAIMAYBAY WHERENSX='Boeing' ANDsocho>ANY (SELECTsochoFROMLOAIMAYBAYWHERENSX='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



    SELECTloaiFROMLOAIMAYBAY WHERENSX='Airbus' ANDsocho>ALL (SELECTsochoFROMLOAIMAYBAYWHERENSX='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*FROMMAYBAY WHEREEXISTS(SELECTMMBFROMCHUYENBAY WHEREMAYBAY.MMB=CHUYENBAY.MMB ANDnoiden='Paris'); --CũngcóthểsửdụngINhoặc=ANYthaychoEXISTS


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



SELECTCOUNT(*)FROMPHICONGWHEREnuoc='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.



SELECTSUM(khoangcach)ASTong,MIN(khoangcach)Nho_nhat, MAX(khoangcach)ASLon_nhat,AVG(khoangcach)ASTrung_binh FROMCHUYENBAY WHEREMPC=20;


2.2. Gom nhóm - GROUP BYMệ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 BYCú 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) SELECTnuoc,count(*)so_phi_cong FROMPHICONG GROUPBYnuoc;

2.3. GROUP BY - HAVINGMệ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 SELECTnuoc,count(*)so_phi_cong FROMPHICONG GROUPBYnuocHAVINGcount(*)>=3;


3.1. SELECT INTOSELECT 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*INTOtemp FROMCONGTY;--trườnghợp(1) SELECT*INTO#temp FROMCONGTY;--trườnghợp(2)

3.2. INSERT INTO - Thêm dữ liệu cho bảngINSERT 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. CREATETABLEPHICONG_PHAP( MPCsmallintPRIMARYKEY, hotenvarchar(30), dchivarchar(30) ); INSERTINTOPHICONG_PHAP SELECTMPC,hoten,dchi FROMPHICONG WHEREnuoc = '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 SELECTTOP(2)*FROMPHICONG ORDERBYhoten;


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: Website:https://niithanoi.edu.vn Fanpage: https://facebook.com/NIIT.ICT/ #niit #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #java #php #python