SQLite Truy vấn: Chọn, Ở đâu, GIỚI HẠN, BẮT ĐẦU, Đếm, Nhóm theo
Để viết các truy vấn SQL trong một SQLite cơ sở dữ liệu, bạn phải biết các mệnh đề SELECT, FROM, WHERE, GROUP BY, ORDER BY và LIMIT hoạt động như thế nào cũng như cách sử dụng chúng.
Trong phần hướng dẫn này, bạn sẽ học cách sử dụng các mệnh đề này và cách viết SQLite điều khoản.
Đọc dữ liệu bằng Select
Mệnh đề SELECT là câu lệnh chính bạn sử dụng để truy vấn một SQLite cơ sở dữ liệu. Trong mệnh đề SELECT, bạn nêu rõ những gì cần chọn. Nhưng trước mệnh đề select, hãy xem chúng ta có thể chọn dữ liệu từ đâu bằng mệnh đề FROM.
Mệnh đề FROM được sử dụng để chỉ định nơi bạn muốn chọn dữ liệu. Trong mệnh đề from, bạn có thể chỉ định một hoặc nhiều bảng hoặc truy vấn phụ để chọn dữ liệu, như chúng ta sẽ thấy sau trong các hướng dẫn.
Lưu ý rằng, đối với tất cả các ví dụ sau, bạn phải chạy sqlite3.exe và mở kết nối đến cơ sở dữ liệu mẫu dưới dạng flow:
Bước 1) Trong bước này,
- Mở My Computer và điều hướng đến thư mục sau “C:\sqlite"Và
- Sau đó mở “sqlite3.exe":
Bước 2) Mở cơ sở dữ liệu “Hướng dẫnSampleDB.db” bằng lệnh sau:
Bây giờ bạn đã sẵn sàng chạy bất kỳ loại truy vấn nào trên cơ sở dữ liệu.
Trong mệnh đề SELECT, bạn không chỉ có thể chọn tên cột mà còn có nhiều tùy chọn khác để chỉ định những gì cần chọn. Như sau:
LỰA CHỌN *
Lệnh này sẽ chọn tất cả các cột từ tất cả các bảng (hoặc truy vấn con) được tham chiếu trong mệnh đề FROM. Ví dụ:
SELECT * FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Thao tác này sẽ chọn tất cả các cột từ cả bảng sinh viên và bảng phòng ban:
CHỌN tên bảng.*
Thao tác này sẽ chọn tất cả các cột chỉ từ bảng “tablename”. Ví dụ:
SELECT Students.* FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Điều này sẽ chỉ chọn tất cả các cột từ bảng sinh viên:
Giá trị theo nghĩa đen
Giá trị bằng chữ là một giá trị không đổi có thể được chỉ định trong câu lệnh chọn. Bạn có thể sử dụng các giá trị bằng chữ một cách bình thường giống như cách bạn sử dụng tên cột trong mệnh đề SELECT. Các giá trị bằng chữ này sẽ được hiển thị cho mỗi hàng từ các hàng được truy vấn SQL trả về.
Dưới đây là một số ví dụ về các giá trị bằng chữ khác nhau mà bạn có thể chọn:
- Chữ số – các số ở bất kỳ định dạng nào như 1, 2.55, …, v.v.
- Chuỗi ký tự – Bất kỳ chuỗi nào 'USA', 'đây là văn bản mẫu', v.v.
- NULL - Giá trị NULL.
- Current_TIME – Nó sẽ cung cấp cho bạn thời gian hiện tại.
- CURRENT_DATE – điều này sẽ cung cấp cho bạn ngày hiện tại.
Điều này có thể hữu ích trong một số trường hợp khi bạn phải chọn một giá trị không đổi cho tất cả các hàng được trả về. Ví dụ: nếu bạn muốn chọn tất cả sinh viên từ bảng Sinh viên, với một cột mới gọi là quốc gia chứa giá trị “USA”, bạn có thể thực hiện việc này:
SELECT *, 'USA' AS Country FROM Students;
Điều này sẽ cung cấp cho bạn tất cả các cột của học sinh, cộng với một cột mới “Quốc gia” như thế này:
Lưu ý rằng, cột mới này Quốc gia không thực sự là một cột mới được thêm vào bảng. Đó là một cột ảo, được tạo trong truy vấn để hiển thị kết quả và nó sẽ không được tạo trên bảng.
Tên và bí danh
Bí danh là tên mới cho cột cho phép bạn chọn cột có tên mới. Bí danh cột được chỉ định bằng từ khóa “AS”.
Ví dụ: nếu bạn muốn chọn cột Tên sinh viên để được trả về bằng “Tên sinh viên” thay vì “Tên sinh viên”, bạn có thể đặt bí danh như thế này:
SELECT StudentName AS 'Student Name' FROM Students;
Điều này sẽ cung cấp cho bạn tên của các học sinh có tên là “Tên học sinh” thay vì “Tên học sinh” như thế này:
Lưu ý rằng tên cột vẫn là “Tên học sinh“; cột Tên sinh viên vẫn giữ nguyên, không thay đổi bằng bí danh.
Bí danh sẽ không thay đổi tên cột; nó sẽ chỉ thay đổi tên hiển thị trong mệnh đề SELECT.
Ngoài ra, hãy lưu ý rằng từ khóa “AS” là tùy chọn, bạn có thể đặt bí danh mà không cần nó, đại loại như sau:
SELECT StudentName 'Student Name' FROM Students;
Và nó sẽ cung cấp cho bạn kết quả đầu ra giống hệt như truy vấn trước đó:
Bạn cũng có thể đặt bí danh cho các bảng chứ không chỉ các cột. Với cùng từ khóa “AS”. Ví dụ: bạn có thể làm điều này:
SELECT s.* FROM Students AS s;
Điều này sẽ cung cấp cho bạn tất cả các cột trong bảng Sinh viên:
Điều này có thể rất hữu ích nếu bạn đang tham gia nhiều hơn một bảng; thay vì lặp lại tên bảng đầy đủ trong truy vấn, bạn có thể đặt cho mỗi bảng một tên bí danh ngắn. Ví dụ, trong truy vấn sau:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Truy vấn này sẽ chọn tên từng sinh viên từ bảng “Students” với tên khoa của nó từ bảng “Departments”:
Tuy nhiên, cùng một truy vấn có thể được viết như thế này:
SELECT s.StudentName, d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
- Chúng tôi đặt bí danh cho bảng Sinh viên là “s” và bảng khoa là bí danh “d”.
- Sau đó, thay vì sử dụng tên đầy đủ của bảng, chúng tôi sử dụng bí danh của họ để chỉ họ.
- INNER JOIN nối hai hoặc nhiều bảng lại với nhau bằng một điều kiện. Trong ví dụ của chúng tôi, chúng tôi đã nối bảng Sinh viên với bảng Phòng ban có cột DepartmentId. Ngoài ra còn có lời giải thích sâu sắc cho INNER JOIN trong phần “SQLite Hướng dẫn tham gia”.
Điều này sẽ cung cấp cho bạn kết quả đầu ra chính xác như truy vấn trước đó:
Ở ĐÂU
Việc viết các truy vấn SQL chỉ sử dụng mệnh đề SELECT với mệnh đề FROM như chúng ta đã thấy trong phần trước sẽ cung cấp cho bạn tất cả các hàng trong các bảng. Tuy nhiên, nếu bạn muốn lọc dữ liệu trả về, bạn phải thêm mệnh đề “WHERE”.
Mệnh đề WHERE được sử dụng để lọc tập kết quả được trả về bởi Truy vấn SQL. Đây là cách mệnh đề WHERE hoạt động:
- Trong mệnh đề WHERE, bạn có thể chỉ định một “biểu thức”.
- Biểu thức đó sẽ được đánh giá cho mỗi hàng được trả về từ (các) bảng được chỉ định trong mệnh đề FROM.
- Biểu thức sẽ được đánh giá là biểu thức Boolean, với kết quả là đúng, sai hoặc rỗng.
- Sau đó, chỉ những hàng mà biểu thức được đánh giá bằng giá trị đúng mới được trả về và những hàng có kết quả sai hoặc null sẽ bị bỏ qua và không được đưa vào tập kết quả.
- Để lọc tập hợp kết quả bằng mệnh đề WHERE, bạn phải sử dụng các biểu thức và toán tử.
Danh sách các nhà điều hành trong SQLite và cách sử dụng chúng
Trong phần sau, chúng tôi sẽ giải thích cách bạn có thể lọc bằng biểu thức và toán tử.
Biểu thức là một hoặc nhiều giá trị bằng chữ hoặc cột được kết hợp với nhau bằng một toán tử.
Lưu ý rằng, bạn có thể sử dụng biểu thức trong cả mệnh đề SELECT và mệnh đề WHERE.
Trong các ví dụ sau, chúng ta sẽ thử các biểu thức và toán tử trong cả mệnh đề select và mệnh đề WHERE. Để cho bạn thấy chúng hoạt động như thế nào.
Có nhiều loại biểu thức và toán tử khác nhau mà bạn có thể chỉ định như sau:
SQLite toán tử nối “||”
Toán tử này được sử dụng để nối một hoặc nhiều giá trị bằng chữ hoặc cột với nhau. Nó sẽ tạo ra một chuỗi kết quả từ tất cả các giá trị hoặc cột bằng chữ được nối. Ví dụ:
SELECT 'Id with Name: '|| StudentId || StudentName AS StudentIdWithName FROM Students;
Điều này sẽ nối thành một bí danh mới “Id sinh viênVới tên":
- Giá trị chuỗi chữ “Id có tên: "
- với giá trị là “Thẻ học sinh” cột và
- với giá trị từ “Tên học sinh" cột
SQLite Toán tử CAST:
Toán tử CAST được sử dụng để chuyển đổi một giá trị từ kiểu dữ liệu này sang kiểu dữ liệu khác loại dữ liệu.
Ví dụ: nếu bạn có một giá trị số được lưu dưới dạng giá trị chuỗi như thế này ” '12.5' ” và bạn muốn chuyển nó thành giá trị số, bạn có thể sử dụng toán tử CAST để thực hiện việc này như thế này “CAST('12.5' NHƯ THẬT)“. Hoặc nếu bạn có giá trị thập phân như 12.5 và bạn chỉ cần lấy phần nguyên, bạn có thể chuyển nó thành một số nguyên như “CAST(12.5 AS INTEGER)” này.
Ví dụ
Trong lệnh sau, chúng ta sẽ thử chuyển đổi các giá trị khác nhau thành các kiểu dữ liệu khác:
SELECT CAST('12.5' AS REAL) ToReal, CAST(12.5 AS INTEGER) AS ToInteger;
Điều này sẽ cung cấp cho bạn:
Kết quả như sau:
- CAST('12.5' AS REAL) – giá trị '12.5' là giá trị chuỗi, nó sẽ được chuyển đổi thành giá trị REAL.
- CAST(12.5 AS INTEGER) – giá trị 12.5 là giá trị thập phân, nó sẽ được chuyển đổi thành giá trị số nguyên. Phần thập phân sẽ bị cắt bớt và trở thành 12.
SQLite toán học Operator:
Lấy hai hoặc nhiều giá trị số theo nghĩa đen hoặc cột số và trả về một giá trị số. Các toán tử số học được hỗ trợ trong SQLite là:
|
Ví dụ:
Trong ví dụ sau, chúng ta sẽ thử năm toán tử số học với các giá trị số theo nghĩa đen trong cùng một
mệnh đề chọn:
SELECT 25+6, 25-6, 25*6, 25%6, 25/6;
Điều này sẽ cung cấp cho bạn:
Lưu ý cách chúng tôi sử dụng câu lệnh SELECT mà không có mệnh đề FROM ở đây. Và điều này được cho phép trong SQLite miễn là chúng ta chọn các giá trị theo nghĩa đen.
SQLite Toán tử so sánh
So sánh hai toán hạng với nhau và trả về giá trị đúng hoặc sai như sau:
|
Lưu ý rằng, SQLite biểu thị giá trị đúng bằng 1 và giá trị sai bằng 0.
Ví dụ:
SELECT 10<6 AS '<', 10<=6 AS '<=', 10>6 AS '>', 10>=6 AS '>=', 10=6 AS '=', 10==6 AS '==', 10!=6 AS '!=', 10<>6 AS '<>';
Điều này sẽ cung cấp một cái gì đó như thế này:
SQLite Toán tử khớp mẫu
"Tương tự” – được sử dụng để khớp mẫu. Sử dụng “Như“, bạn có thể tìm kiếm các giá trị khớp với mẫu được chỉ định bằng ký tự đại diện.
Toán hạng bên trái có thể là giá trị bằng chuỗi hoặc cột chuỗi. Mẫu có thể được chỉ định như sau:
- Chứa mẫu. Ví dụ, Tên sinh viên THÍCH '%a%' – thao tác này sẽ tìm kiếm tên học sinh có chứa chữ cái “a” ở bất kỳ vị trí nào trên cột Tên học sinh.
- Bắt đầu với mẫu. Ví dụ, "Tên sinh viên THÍCH 'a%'” – tìm kiếm tên học sinh bắt đầu bằng chữ “a”.
- Kết thúc bằng mẫu. Ví dụ, "Tên sinh viên THÍCH '%a'” – Tìm kiếm những tên học sinh kết thúc bằng chữ “a”.
- Khớp bất kỳ ký tự đơn nào trong chuỗi bằng ký tự gạch dưới “_”. Ví dụ, "Tên học sinh THÍCH 'J___'” – Tìm kiếm tên học sinh có độ dài 4 ký tự. Nó phải bắt đầu bằng chữ cái “J” và có thể có thêm ba ký tự khác sau chữ cái “J”.
Ví dụ về khớp mẫu:
- Lấy tên học sinh bắt đầu bằng chữ cái 'j':
SELECT StudentName FROM Students WHERE StudentName LIKE 'j%';
Kết quả:
- Lấy tên học sinh kết thúc bằng chữ cái 'y':
SELECT StudentName FROM Students WHERE StudentName LIKE '%y';
Kết quả:
- Lấy tên học sinh có chứa chữ cái 'n':
SELECT StudentName FROM Students WHERE StudentName LIKE '%n%';
Kết quả:
“ TOÀN CẦU” – tương đương với toán tử LIKE, nhưng GLOB phân biệt chữ hoa chữ thường, không giống như toán tử LIKE. Ví dụ, hai lệnh sau sẽ trả về kết quả khác nhau:
SELECT 'Jack' GLOB 'j%'; SELECT 'Jack' LIKE 'j%';
Điều này sẽ cung cấp cho bạn:
- Câu lệnh đầu tiên trả về 0(false) vì toán tử GLOB phân biệt chữ hoa chữ thường, vì vậy 'j' không bằng 'J'. Tuy nhiên, câu lệnh thứ hai sẽ trả về 1 (true) vì toán tử THÍCH không phân biệt chữ hoa chữ thường, vì vậy 'j' bằng 'J'.
Các nhà khai thác khác:
SQLite VÀ
Toán tử logic kết hợp một hoặc nhiều biểu thức. Nó sẽ trả về true, chỉ khi tất cả các biểu thức mang lại giá trị “true”. Tuy nhiên, nó sẽ chỉ trả về false nếu tất cả các biểu thức đều mang lại giá trị “false”.
Ví dụ:
Truy vấn sau sẽ tìm kiếm những sinh viên có StudentId > 5 và StudentName bắt đầu bằng chữ N, những sinh viên trả về phải đáp ứng hai điều kiện:
SELECT * FROM Students WHERE (StudentId > 5) AND (StudentName LIKE 'N%');
Là một đầu ra, trong ảnh chụp màn hình ở trên, điều này sẽ chỉ cung cấp cho bạn “Nancy”. Nancy là học sinh duy nhất đáp ứng được cả hai điều kiện.
SQLite OR
Toán tử logic kết hợp một hoặc nhiều biểu thức, do đó nếu một trong các toán tử kết hợp mang lại kết quả đúng thì nó sẽ trả về giá trị đúng. Tuy nhiên, nếu tất cả các biểu thức đều sai thì nó sẽ trả về sai.
Ví dụ:
Truy vấn sau sẽ tìm kiếm những sinh viên có StudentId > 5 hoặc StudentName bắt đầu bằng chữ cái N, những sinh viên được trả về phải đáp ứng ít nhất một trong các điều kiện sau:
SELECT * FROM Students WHERE (StudentId > 5) OR (StudentName LIKE 'N%');
Điều này sẽ cung cấp cho bạn:
Kết quả đầu ra, trong ảnh chụp màn hình ở trên, điều này sẽ cung cấp cho bạn tên của một học sinh có chữ cái “n” trong tên của họ cộng với id học sinh có giá trị>5.
Như bạn có thể thấy kết quả khác với truy vấn bằng toán tử AND.
SQLite GIỮA
GIỮA được sử dụng để chọn những giá trị nằm trong phạm vi hai giá trị. Ví dụ, "X GIỮA Y VÀ Z” sẽ trả về true (1) nếu giá trị X nằm giữa hai giá trị Y và Z. Nếu không, nó sẽ trả về false (0). “X GIỮA Y VÀ Z" tương đương với "X >= Y VÀ X <= Z“, X phải lớn hơn hoặc bằng Y và X nhỏ hơn hoặc bằng Z.
Ví dụ:
Trong ví dụ truy vấn sau, chúng ta sẽ viết truy vấn để lấy thông tin về những sinh viên có giá trị Id từ 5 đến 8:
SELECT * FROM Students WHERE StudentId BETWEEN 5 AND 8;
Điều này sẽ chỉ cung cấp cho những học sinh có id 5, 6, 7 và 8:
SQLite IN
Lấy một toán hạng và một danh sách các toán hạng. Nó sẽ trả về true nếu giá trị toán hạng đầu tiên bằng với một trong các giá trị của toán hạng từ danh sách. Toán tử IN trả về true (1) nếu danh sách các toán hạng chứa giá trị toán hạng đầu tiên trong các giá trị của nó. Nếu không, nó sẽ trả về false (0).
Như thế này: "col IN(x, y, z)“. Điều này tương đương với” (col=x) hoặc (col=y) hoặc (col=z) ".
Ví dụ:
Truy vấn sau đây sẽ chỉ chọn những học sinh có id là 2, 4, 6, 8:
SELECT * FROM Students WHERE StudentId IN(2, 4, 6, 8);
Thích bài viết này:
Truy vấn trước sẽ đưa ra kết quả chính xác như truy vấn sau vì chúng tương đương:
SELECT * FROM Students WHERE (StudentId = 2) OR (StudentId = 4) OR (StudentId = 6) OR (StudentId = 8);
Cả hai truy vấn đều cho kết quả chính xác. Tuy nhiên, điểm khác biệt giữa hai truy vấn là truy vấn đầu tiên chúng tôi sử dụng toán tử “IN”. Trong truy vấn thứ hai, chúng tôi đã sử dụng nhiều toán tử “HOẶC”.
Toán tử IN tương đương với việc sử dụng nhiều toán tử OR. Các "WHERE Sinh viênId IN(2, 4, 6, 8)" tương đương với " Ở ĐÂU (StudentId = 2) HOẶC (StudentId = 4) HOẶC (StudentId = 6) HOẶC (StudentId = 8);"
Thích bài viết này:
SQLite KHÔNG VÀO
Toán hạng “NOT IN” ngược lại với toán tử IN. Nhưng với cú pháp tương tự; nó cần một toán hạng và một danh sách các toán hạng. Nó sẽ trả về true nếu giá trị toán hạng đầu tiên không bằng một trong các giá trị toán hạng trong danh sách. tức là nó sẽ trả về true (0) nếu danh sách toán hạng không chứa toán hạng đầu tiên. Như thế này: "col KHÔNG IN(x, y, z)“. Điều này tương đương với “(col<>x) VÀ (col<>y) VÀ (col<>z)".
Ví dụ:
Truy vấn sau đây sẽ chọn những sinh viên có ID không bằng một trong các ID sau: 2, 4, 6, 8:
SELECT * FROM Students WHERE StudentId NOT IN(2, 4, 6, 8);
Như thế này
Ở truy vấn trước, chúng tôi đưa ra kết quả chính xác như truy vấn sau vì chúng tương đương:
SELECT * FROM Students WHERE (StudentId <> 2) AND (StudentId <> 4) AND (StudentId <> 6) AND (StudentId <> 8);
Thích bài viết này:
Trong ảnh chụp màn hình ở trên,
Chúng tôi đã sử dụng nhiều toán tử khác nhau “<>” để lấy danh sách các sinh viên không bằng một trong các Id sau: 2, 4, 6 hoặc 8. Truy vấn này sẽ trả về tất cả các sinh viên khác ngoài danh sách các Id này.
SQLite TỒN TẠI
Toán tử EXISTS không nhận bất kỳ toán hạng nào; chỉ cần một mệnh đề SELECT sau nó. Toán tử EXISTS sẽ trả về true (1) nếu có bất kỳ hàng nào được trả về từ mệnh đề SELECT và nó sẽ trả về false (0) nếu không có hàng nào được trả về từ mệnh đề SELECT.
Ví dụ:
Trong ví dụ sau, chúng ta sẽ chọn tên khoa nếu ID khoa tồn tại trong bảng sinh viên:
SELECT DepartmentName FROM Departments AS d WHERE EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);
Điều này sẽ cung cấp cho bạn:
Chỉ có ba bộ phận “CNTT, Vật lý và Nghệ thuật" sẽ được trả lại. Và tên khoa “Toán học” sẽ không được trả về vì không có sinh viên nào trong khoa đó nên Id khoa đó không tồn tại trong bảng sinh viên. Đó là lý do tại sao toán tử EXISTS bỏ qua “Toán học" phòng.
SQLite KHÔNG
Revthay thế kết quả của toán tử trước đó theo sau nó. Ví dụ:
- NOT BETWEEN – Nó sẽ trả về true nếu BETWEEN trả về false và ngược lại.
- NOT THÍCH – Nó sẽ trả về true nếu THÍCH trả về sai và ngược lại.
- NOT GLOB – Nó sẽ trả về true nếu GLOB trả về false và ngược lại.
- NOT EXISTS – Nó sẽ trả về true nếu EXISTS trả về false và ngược lại.
Ví dụ:
Trong ví dụ sau, chúng ta sẽ sử dụng toán tử NOT với toán tử EXISTS để lấy tên các khoa không tồn tại trong bảng Students, đây là kết quả ngược lại của toán tử EXISTS. Vì vậy, tìm kiếm sẽ được thực hiện thông qua DepartmentId không tồn tại trong bảng department.
SELECT DepartmentName
FROM Departments AS d
WHERE NOT EXISTS (SELECT DepartmentId
FROM Students AS s
WHERE d.DepartmentId = s.DepartmentId);
Đầu ra:
Chỉ có bộ phận “Toán học " sẽ được trả lại. Bởi vì "Toán học” khoa là khoa duy nhất không tồn tại trong bảng sinh viên.
Giới hạn và đặt hàng
SQLite Mã đơn hàng
SQLite Thứ tự là sắp xếp kết quả của bạn theo một hoặc nhiều biểu thức. Để sắp xếp tập kết quả, bạn phải sử dụng mệnh đề ORDER BY như sau:
- Đầu tiên, bạn phải xác định mệnh đề ORDER BY.
- Mệnh đề ORDER BY phải được chỉ định ở cuối truy vấn; chỉ mệnh đề LIMIT mới có thể được chỉ định sau nó.
- Chỉ định biểu thức để sắp xếp dữ liệu, biểu thức này có thể là tên cột hoặc biểu thức.
- Sau biểu thức, bạn có thể chỉ định hướng sắp xếp tùy chọn. Hoặc DESC, để sắp xếp dữ liệu giảm dần hoặc ASC để sắp xếp dữ liệu tăng dần. Nếu bạn không chỉ định bất kỳ mục nào trong số đó, dữ liệu sẽ được sắp xếp tăng dần.
- Bạn có thể chỉ định nhiều biểu thức hơn bằng cách sử dụng dấu “,” giữa các biểu thức khác.
Ví dụ
Trong ví dụ sau, chúng ta sẽ chọn tất cả sinh viên theo thứ tự tên nhưng giảm dần, sau đó theo tên khoa theo thứ tự tăng dần:
SELECT s.StudentName, d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId ORDER BY d.DepartmentName ASC , s.StudentName DESC;
Điều này sẽ cung cấp cho bạn:
- SQLite đầu tiên sẽ sắp xếp tất cả sinh viên theo tên khoa của họ theo thứ tự tăng dần
- Sau đó với mỗi tên khoa, tất cả sinh viên thuộc tên khoa đó sẽ được hiển thị theo thứ tự giảm dần theo tên của họ
SQLite Giới hạn:
Bạn có thể giới hạn số lượng hàng được truy vấn SQL trả về bằng cách sử dụng mệnh đề LIMIT. Ví dụ: LIMIT 10 sẽ chỉ cung cấp cho bạn 10 hàng và bỏ qua tất cả các hàng khác.
Trong mệnh đề LIMIT, bạn có thể chọn một số hàng cụ thể bắt đầu từ một vị trí cụ thể bằng mệnh đề OFFSET. Ví dụ, "GIỚI HẠN 4 Bù Đắp 4” sẽ bỏ qua 4 hàng đầu tiên và trả về 4 hàng bắt đầu từ hàng thứ năm, do đó bạn sẽ nhận được các hàng 5,6,7 và 8.
Lưu ý rằng mệnh đề OFFSET là tùy chọn, bạn có thể viết nó như sau “GIỚI HẠN 4, 4” và nó sẽ cho bạn kết quả chính xác.
Ví dụ:
Trong ví dụ sau, chúng ta sẽ chỉ trả về 3 sinh viên bắt đầu từ sinh viên có id là 5 bằng cách sử dụng truy vấn:
SELECT * FROM Students LIMIT 4,3;
Điều này sẽ chỉ cung cấp cho bạn ba sinh viên bắt đầu từ hàng 5. Vì vậy, nó sẽ cung cấp cho bạn các hàng có ID sinh viên 5, 6 và 7:
Loại bỏ trùng lặp
Nếu truy vấn SQL của bạn trả về các giá trị trùng lặp, bạn có thể sử dụng “DISTINCT” từ khóa để loại bỏ những trùng lặp đó và trả về các giá trị riêng biệt. Bạn có thể chỉ định nhiều cột sau khi phím DISTINCT hoạt động.
Ví dụ:
Truy vấn sau sẽ trả về các “giá trị tên khoa” trùng lặp: Ở đây chúng ta có các giá trị trùng lặp với tên CNTT, Vật lý và Nghệ thuật.
SELECT d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Điều này sẽ cung cấp cho bạn các giá trị trùng lặp cho tên bộ phận:
Lưu ý rằng có các giá trị trùng lặp cho tên bộ phận. Bây giờ, chúng ta sẽ sử dụng từ khóa DISTINCT với cùng một truy vấn để loại bỏ các giá trị trùng lặp đó và chỉ nhận các giá trị duy nhất. Như thế này:
SELECT DISTINCT d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Điều này sẽ chỉ cung cấp cho bạn ba giá trị duy nhất cho cột tên bộ phận:
Tổng hợp
SQLite Tập hợp là các hàm dựng sẵn được xác định trong SQLite sẽ nhóm nhiều giá trị của nhiều hàng thành một giá trị.
Dưới đây là tổng hợp được hỗ trợ bởi SQLite:
SQLite AVG()
Trả về giá trị trung bình cho tất cả các giá trị x.
Ví dụ:
Trong ví dụ sau, chúng ta sẽ có được điểm trung bình mà học sinh đạt được từ tất cả các kỳ thi:
SELECT AVG(Mark) FROM Marks;
Điều này sẽ cung cấp cho bạn giá trị “18.375”:
Những kết quả này đến từ tổng của tất cả các giá trị điểm chia cho số lượng của chúng.
COUNT() – COUNT(X) hoặc COUNT(*)
Trả về tổng số lần giá trị x xuất hiện. Và đây là một số tùy chọn bạn có thể sử dụng với COUNT:
- COUNT(x): Chỉ đếm x giá trị, trong đó x là tên cột. Nó sẽ bỏ qua các giá trị NULL.
- COUNT(*): Đếm tất cả các hàng từ tất cả các cột.
- COUNT (DISTINCT x): Bạn có thể chỉ định từ khóa DISTINCT trước x để lấy số lượng các giá trị riêng biệt của x.
Ví dụ
Trong ví dụ sau, chúng ta sẽ lấy tổng số Phòng ban với COUNT(DepartmentId), COUNT(*) và COUNT(DISTINCT DepartmentId) và sự khác biệt của chúng:
SELECT COUNT(DepartmentId), COUNT(DISTINCT DepartmentId), COUNT(*) FROM Students;
Điều này sẽ cung cấp cho bạn:
Như sau:
- COUNT(DepartmentId) sẽ cung cấp cho bạn số lượng tất cả id bộ phận và nó sẽ bỏ qua các giá trị null.
- COUNT(DISTINCT DepartmentId) cung cấp cho bạn các giá trị riêng biệt của DepartmentId, chỉ có 3. Đây là ba giá trị khác nhau của tên bộ phận. Lưu ý rằng có 8 giá trị tên khoa trong tên sinh viên. Nhưng chỉ có ba giá trị khác nhau là Toán, CNTT và Vật lý.
- COUNT(*) đếm số hàng trong bảng sinh viên là 10 hàng cho 10 sinh viên.
GROUP_CONCAT() – GROUP_CONCAT(X) hoặc GROUP_CONCAT(X,Y)
Hàm tổng hợp GROUP_CONCAT nối nhiều giá trị thành một giá trị bằng dấu phẩy để phân tách chúng. Nó có các tùy chọn sau:
- GROUP_CONCAT(X): Điều này sẽ nối tất cả giá trị của x thành một chuỗi, với dấu phẩy “,” được sử dụng làm dấu phân cách giữa các giá trị. Giá trị NULL sẽ bị bỏ qua.
- GROUP_CONCAT(X, Y): Điều này sẽ nối các giá trị của x thành một chuỗi, với giá trị của y được sử dụng làm dấu phân cách giữa mỗi giá trị thay vì dấu phân cách mặc định ','. Giá trị NULL cũng sẽ bị bỏ qua.
- GROUP_CONCAT(DISTINCT X): Điều này sẽ nối tất cả các giá trị riêng biệt của x thành một chuỗi, với dấu phẩy “,” được sử dụng làm dấu phân cách giữa các giá trị. Giá trị NULL sẽ bị bỏ qua.
Ví dụ GROUP_CONCAT(Tên phòng ban)
Truy vấn sau sẽ nối tất cả các giá trị tên khoa từ bảng students và department thành một chuỗi được phân tách bằng dấu phẩy. Vì vậy, thay vì trả về danh sách các giá trị, một giá trị trên mỗi hàng. Nó sẽ chỉ trả về một giá trị trên một hàng, với tất cả các giá trị được phân tách bằng dấu phẩy:
SELECT GROUP_CONCAT(d.DepartmentName) FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Điều này sẽ cung cấp cho bạn:
Điều này sẽ cung cấp cho bạn danh sách giá trị tên của 8 phòng ban được nối thành một chuỗi được phân tách bằng dấu phẩy.
Ví dụ GROUP_CONCAT(DISTINCT Tên phòng ban)
Truy vấn sau đây sẽ nối các giá trị riêng biệt của tên khoa từ bảng sinh viên và khoa thành một chuỗi được phân tách bằng dấu phẩy:
SELECT GROUP_CONCAT(DISTINCT d.DepartmentName) FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Điều này sẽ cung cấp cho bạn:
Lưu ý rằng kết quả này khác với kết quả trước đó như thế nào; chỉ có ba giá trị được trả về là tên của các phòng ban riêng biệt và các giá trị trùng lặp đã bị xóa.
Ví dụ GROUP_CONCAT(DepartmentName ,'&')
Truy vấn sau đây sẽ nối tất cả các giá trị của cột tên khoa từ bảng sinh viên và khoa thành một chuỗi, nhưng sử dụng ký tự '&' thay vì dấu phẩy để phân cách:
SELECT GROUP_CONCAT(d.DepartmentName, '&') FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Điều này sẽ cung cấp cho bạn:
Lưu ý cách sử dụng ký tự “&” thay vì ký tự mặc định “,” để phân tách giữa các giá trị.
SQLite LỚN NHẤT NHỎ NHẤT()
MAX(X) trả về cho bạn giá trị cao nhất từ các giá trị X. MAX sẽ trả về giá trị NULL nếu tất cả các giá trị của x đều rỗng. Trong khi đó MIN(X) trả về cho bạn giá trị nhỏ nhất từ các giá trị X. MIN sẽ trả về giá trị NULL nếu tất cả các giá trị của X là null.
Ví dụ
Trong truy vấn sau, chúng ta sẽ sử dụng các hàm MIN và MAX để lấy điểm cao nhất và điểm thấp nhất từ “Điểm" bàn:
SELECT MAX(Mark), MIN(Mark) FROM Marks;
Điều này sẽ cung cấp cho bạn:
SQLite TỔNG(x), Tổng(x)
Cả hai đều sẽ trả về tổng của tất cả các giá trị x. Nhưng chúng khác nhau ở những điểm sau:
- SUM sẽ trả về null nếu tất cả các giá trị đều rỗng, nhưng Total sẽ trả về 0.
- TOTAL luôn trả về giá trị dấu phẩy động. SUM trả về một giá trị số nguyên nếu tất cả các giá trị x là số nguyên. Tuy nhiên, nếu các giá trị không phải là số nguyên, nó sẽ trả về giá trị dấu phẩy động.
Ví dụ
Trong truy vấn sau, chúng ta sẽ sử dụng SUM và total để lấy tổng của tất cả các điểm trong “Điểm" những cái bàn:
SELECT SUM(Mark), TOTAL(Mark) FROM Marks;
Điều này sẽ cung cấp cho bạn:
Như bạn có thể thấy, TOTAL luôn trả về một dấu phẩy động. Nhưng SUM trả về một giá trị số nguyên vì các giá trị trong cột “Mark” có thể ở dạng số nguyên.
Sự khác biệt giữa ví dụ SUM và TOTAL:
Trong truy vấn sau, chúng tôi sẽ chỉ ra sự khác biệt giữa SUM và TOTAL khi chúng lấy SUM của các giá trị NULL:
SELECT SUM(Mark), TOTAL(Mark) FROM Marks WHERE TestId = 4;
Điều này sẽ cung cấp cho bạn:
Lưu ý rằng không có điểm cho TestId = 4, do đó có giá trị null cho bài kiểm tra đó. SUM trả về giá trị null ở dạng trống, trong khi TOTAL trả về 0.
Nhóm THEO
Mệnh đề GROUP BY được sử dụng để chỉ định một hoặc nhiều cột sẽ được sử dụng để nhóm các hàng thành các nhóm. Các hàng có giá trị giống nhau sẽ được tập hợp (sắp xếp) lại với nhau thành nhóm.
Đối với bất kỳ cột nào khác không được bao gồm trong nhóm theo cột, bạn có thể sử dụng hàm tổng hợp cho cột đó.
Ví dụ:
Truy vấn sau đây sẽ cung cấp cho bạn tổng số sinh viên có mặt trong mỗi khoa.
SELECT d.DepartmentName, COUNT(s.StudentId) AS StudentsCount FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId GROUP BY d. DepartmentName;
Điều này sẽ cung cấp cho bạn:
Mệnh đề GROUPBY DepartmentName sẽ nhóm tất cả sinh viên thành các nhóm tương ứng với tên của mỗi bộ phận. Đối với mỗi nhóm “khoa” sẽ tính số sinh viên vào đó.
mệnh đề HAVING
Nếu bạn muốn lọc các nhóm được mệnh đề GROUP BY trả về thì bạn có thể chỉ định mệnh đề “HAVING” có biểu thức sau GROUP BY. Biểu thức sẽ được sử dụng để lọc các nhóm này.
Ví dụ
Trong truy vấn sau, chúng ta sẽ chọn những khoa chỉ có hai sinh viên:
SELECT d.DepartmentName, COUNT(s.StudentId) AS StudentsCount FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId GROUP BY d. DepartmentName HAVING COUNT(s.StudentId) = 2;
Điều này sẽ cung cấp cho bạn:
Mệnh đề HAVING COUNT(S.StudentId) = 2 sẽ lọc các nhóm được trả về và chỉ trả về những nhóm chứa chính xác hai sinh viên trong đó. Trong trường hợp của chúng tôi, khoa Nghệ thuật có 2 sinh viên nên nó được hiển thị trong đầu ra.
SQLite Truy vấn & Truy vấn phụ
Bên trong bất kỳ truy vấn nào, bạn có thể sử dụng một truy vấn khác trong CHỌN, CHÈN, XÓA, CẬP NHẬT hoặc bên trong một truy vấn con khác.
Truy vấn lồng nhau này được gọi là truy vấn con. Bây giờ chúng ta sẽ xem một số ví dụ về cách sử dụng truy vấn con trong mệnh đề SELECT. Tuy nhiên, trong hướng dẫn Sửa đổi dữ liệu, chúng ta sẽ xem cách chúng ta có thể sử dụng các truy vấn con với câu lệnh INSERT, DELETE và UPDATE.
Sử dụng truy vấn con trong ví dụ về mệnh đề FROM
Trong truy vấn sau, chúng ta sẽ bao gồm một truy vấn phụ bên trong mệnh đề FROM:
SELECT s.StudentName, t.Mark FROM Students AS s INNER JOIN ( SELECT StudentId, Mark FROM Tests AS t INNER JOIN Marks AS m ON t.TestId = m.TestId ) ON s.StudentId = t.StudentId;
Truy vấn:
SELECT StudentId, Mark FROM Tests AS t INNER JOIN Marks AS m ON t.TestId = m.TestId
Truy vấn ở trên được gọi là truy vấn con vì nó được lồng bên trong mệnh đề FROM. Lưu ý rằng chúng tôi đã đặt cho nó một tên bí danh là “t” để có thể tham chiếu đến các cột được trả về từ nó trong truy vấn.
Truy vấn này sẽ cung cấp cho bạn:
Vì vậy, trong trường hợp của chúng tôi,
- s.StudentName được chọn từ truy vấn chính cung cấp tên của sinh viên và
- t.Mark được chọn từ truy vấn phụ; cho biết điểm mà mỗi học sinh này đạt được
Sử dụng truy vấn con trong ví dụ về mệnh đề WHERE
Trong truy vấn sau, chúng ta sẽ bao gồm một truy vấn phụ trong mệnh đề WHERE:
SELECT DepartmentName
FROM Departments AS d
WHERE NOT EXISTS (SELECT DepartmentId
FROM Students AS s
WHERE d.DepartmentId = s.DepartmentId);
Truy vấn:
SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId
Truy vấn ở trên được gọi là truy vấn con vì nó được lồng trong mệnh đề WHERE. Truy vấn con sẽ trả về các giá trị DepartmentId sẽ được toán tử NOT EXISTS sử dụng.
Truy vấn này sẽ cung cấp cho bạn:
Trong truy vấn trên, chúng tôi đã chọn khoa không có sinh viên nào đăng ký vào đó. Khoa Toán ở đây là khoa nào vậy?
Thiết lập Operations – UNION,Intersect
SQLite hỗ trợ các hoạt động SET sau:
ĐOÀN & ĐOÀN TẤT CẢ
Nó kết hợp một hoặc nhiều tập kết quả (một nhóm hàng) được trả về từ nhiều câu lệnh SELECT thành một tập kết quả.
UNION sẽ trả về các giá trị riêng biệt. Tuy nhiên, UNION ALL sẽ không và sẽ bao gồm các bản sao.
Lưu ý rằng tên cột sẽ là tên cột được chỉ định trong câu lệnh SELECT đầu tiên.
ĐOÀN Ví dụ
Trong ví dụ sau, chúng ta sẽ lấy danh sách DepartmentId từ bảng students và danh sách DepartmentId từ bảng department trong cùng một cột:
SELECT DepartmentId AS DepartmentIdUnioned FROM Students UNION SELECT DepartmentId FROM Departments;
Điều này sẽ cung cấp cho bạn:
Truy vấn chỉ trả về 5 hàng là các giá trị id phòng ban riêng biệt. Lưu ý giá trị đầu tiên là giá trị null.
SQLite UNION TẤT CẢ Ví dụ
Trong ví dụ sau, chúng ta sẽ lấy danh sách DepartmentId từ bảng students và danh sách DepartmentId từ bảng department trong cùng một cột:
SELECT DepartmentId AS DepartmentIdUnioned FROM Students UNION ALL SELECT DepartmentId FROM Departments;
Điều này sẽ cung cấp cho bạn:
Truy vấn sẽ trả về 14 hàng, 10 hàng từ bảng sinh viên và 4 hàng từ bảng phòng ban. Lưu ý rằng có những giá trị được trả về trùng lặp. Ngoài ra, hãy lưu ý rằng tên cột là tên được chỉ định trong câu lệnh SELECT đầu tiên.
Bây giờ, hãy xem UNION all sẽ cho kết quả khác nhau như thế nào nếu chúng ta thay thế UNION ALL bằng UNION:
SQLite GIAO NHAU
Trả về các giá trị tồn tại trong cả tập kết quả tổng hợp. Các giá trị tồn tại trong một trong các tập kết quả kết hợp sẽ bị bỏ qua.
Ví dụ
Trong truy vấn sau, chúng ta sẽ chọn các giá trị DepartmentId tồn tại trong cả hai bảng Students và Departments trong cột DepartmentId:
SELECT DepartmentId FROM Students Intersect SELECT DepartmentId FROM Departments;
Điều này sẽ cung cấp cho bạn:
Truy vấn chỉ trả về ba giá trị 1, 2 và 3. Đó là những giá trị tồn tại trong cả hai bảng.
Tuy nhiên, giá trị null và 4 không được đưa vào vì giá trị null chỉ tồn tại trong bảng sinh viên chứ không tồn tại trong bảng phòng ban. Và giá trị 4 tồn tại trong bảng khoa chứ không tồn tại trong bảng sinh viên.
Đó là lý do tại sao cả hai giá trị NULL và 4 đều bị bỏ qua và không được đưa vào giá trị trả về.
NGOẠI TRỪ
Giả sử nếu bạn có hai danh sách các hàng, list1 và list2, và bạn chỉ muốn các hàng từ list1 không tồn tại trong list2, bạn có thể sử dụng mệnh đề “EXCEPT”. Mệnh đề EXCEPT so sánh hai danh sách và trả về các hàng tồn tại trong list1 và không tồn tại trong list2.
Ví dụ
Trong truy vấn sau, chúng ta sẽ chọn các giá trị DepartmentId có trong bảng department và không có trong bảng students:
SELECT DepartmentId FROM Departments EXCEPT SELECT DepartmentId FROM Students;
Điều này sẽ cung cấp cho bạn:
Truy vấn chỉ trả về giá trị 4. Đây là giá trị duy nhất tồn tại trong bảng khoa và không tồn tại trong bảng sinh viên.
Xử lý NULL
Các "NULL”giá trị là một giá trị đặc biệt trong SQLite. Nó được sử dụng để biểu thị một giá trị không xác định hoặc giá trị bị thiếu. Lưu ý rằng giá trị null hoàn toàn khác với “0Giá trị ” hoặc trống “”. Tuy nhiên, vì 0 và giá trị trống là giá trị đã biết nên giá trị null là không xác định.
Giá trị NULL yêu cầu xử lý đặc biệt trong SQLite, bây giờ chúng ta sẽ xem cách xử lý các giá trị NULL.
Tìm kiếm giá trị NULL
Bạn không thể sử dụng toán tử bằng thông thường (=) để tìm kiếm các giá trị null. Ví dụ, truy vấn sau đây tìm kiếm các sinh viên có giá trị null DepartmentId:
SELECT * FROM Students WHERE DepartmentId = NULL;
Truy vấn này sẽ không đưa ra bất kỳ kết quả nào:
Bởi vì giá trị NULL không bằng bất kỳ giá trị nào khác bao gồm chính giá trị null, đó là lý do tại sao nó không trả về bất kỳ kết quả nào.
- Tuy nhiên, để truy vấn có thể hoạt động, bạn phải sử dụng “LÀ KHÔNG” toán tử để tìm kiếm giá trị null như sau:
SELECT * FROM Students WHERE DepartmentId IS NULL;
Điều này sẽ cung cấp cho bạn:
Truy vấn sẽ trả về những sinh viên có giá trị DepartmentId null.
- Nếu bạn muốn nhận những giá trị không rỗng, thì bạn phải sử dụng “KHÔNG PHẢI” toán tử như thế này:
SELECT * FROM Students WHERE DepartmentId IS NOT NULL;
Điều này sẽ cung cấp cho bạn:
Truy vấn sẽ trả về những sinh viên không có giá trị DepartmentId NULL.
Kết quả có điều kiện
Nếu bạn có một danh sách các giá trị và bạn muốn chọn bất kỳ giá trị nào trong số chúng dựa trên một số điều kiện. Vì vậy, điều kiện cho giá trị cụ thể đó phải đúng để được chọn.
Biểu thức CASE sẽ đánh giá danh sách các điều kiện này cho tất cả các giá trị. Nếu điều kiện đúng thì nó sẽ trả về giá trị đó.
Ví dụ, nếu bạn có cột “Điểm” và bạn muốn chọn giá trị văn bản dựa trên giá trị điểm như sau:
– “Xuất sắc” nếu điểm cao hơn 85.
– “Rất tốt” nếu điểm từ 70 đến 85.
– “Tốt” nếu điểm từ 60 đến 70.
Sau đó, bạn có thể sử dụng biểu thức CASE để làm điều đó.
Điều này có thể được sử dụng để xác định một số logic trong mệnh đề SELECT để bạn có thể chọn một số kết quả nhất định tùy thuộc vào các điều kiện nhất định, chẳng hạn như câu lệnh if.
Toán tử CASE có thể được định nghĩa bằng các cú pháp khác nhau như sau:
- Bạn có thể sử dụng các điều kiện khác nhau:
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 WHEN condition3 THEN result3 … ELSE resultn END
- Hoặc, bạn chỉ có thể sử dụng một biểu thức và đặt các giá trị khác nhau để chọn:
CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 WHEN value3 THEN result3 … ELSE restuln END
Lưu ý rằng mệnh đề ELSE là tùy chọn.
Ví dụ
Trong ví dụ sau, chúng ta sẽ sử dụng CASE biểu hiện với NULL giá trị trong cột Id khoa trong bảng Sinh viên để hiển thị văn bản 'Không có khoa' như sau:
SELECT
StudentName,
CASE
WHEN DepartmentId IS NULL THEN 'No Department'
ELSE DepartmentId
END AS DepartmentId
FROM Students;
- Toán tử CASE sẽ kiểm tra giá trị của DepartmentId xem nó có rỗng hay không.
- Nếu đó là giá trị NULL thì nó sẽ chọn giá trị bằng chữ 'No Department' thay vì giá trị DepartmentId.
- Nếu không phải là giá trị null thì nó sẽ chọn giá trị của cột DepartmentId.
Điều này sẽ cung cấp cho bạn đầu ra như hình dưới đây:
Biểu thức bảng chung
Biểu thức bảng chung (CTE) là các truy vấn con được xác định bên trong câu lệnh SQL với một tên đã cho.
Nó có lợi thế hơn các truy vấn phụ vì nó được xác định trong các câu lệnh SQL và sẽ làm cho các truy vấn dễ đọc, duy trì và dễ hiểu hơn.
Một biểu thức bảng phổ biến có thể được định nghĩa bằng cách đặt mệnh đề WITH trước câu lệnh SELECT như sau:
WITH CTEname AS ( SELECT statement ) SELECT, UPDATE, INSERT, or update statement here FROM CTE
Các "Tên CTE” là bất kỳ tên nào bạn có thể đặt cho CTE, bạn có thể sử dụng nó để tham chiếu đến nó sau này. Lưu ý rằng, bạn có thể định nghĩa câu lệnh SELECT, UPDATE, INSERT hoặc DELETE trên CTE
Bây giờ, hãy xem ví dụ về cách sử dụng CTE trong mệnh đề SELECT.
Ví dụ
Trong ví dụ sau, chúng ta sẽ định nghĩa CTE từ câu lệnh SELECT và sau đó sử dụng nó trong truy vấn khác:
WITH AllDepartments AS ( SELECT DepartmentId, DepartmentName FROM Departments ) SELECT s.StudentId, s.StudentName, a.DepartmentName FROM Students AS s INNER JOIN AllDepartments AS a ON s.DepartmentId = a.DepartmentId;
Trong truy vấn này, chúng tôi đã xác định CTE và đặt tên cho nó là “Tất cả bộ ngành“. CTE này được xác định từ truy vấn CHỌN:
SELECT DepartmentId, DepartmentName FROM Departments
Sau đó, sau khi xác định CTE, chúng tôi đã sử dụng nó trong truy vấn SELECT theo sau nó.
Lưu ý rằng, biểu thức bảng chung không ảnh hưởng đến kết quả đầu ra của truy vấn. Đó là một cách để xác định chế độ xem logic hoặc truy vấn phụ để sử dụng lại chúng trong cùng một truy vấn. Biểu thức bảng chung giống như một biến mà bạn khai báo và sử dụng lại nó dưới dạng truy vấn con. Chỉ câu lệnh SELECT mới ảnh hưởng đến kết quả đầu ra của truy vấn.
Truy vấn này sẽ cung cấp cho bạn:
Truy vấn nâng cao
Truy vấn nâng cao là những truy vấn chứa các phép nối phức tạp, truy vấn phụ và một số phép tổng hợp. Trong phần sau, chúng ta sẽ xem một ví dụ về truy vấn nâng cao:
Nơi chúng tôi nhận được,
- Tên các khoa và tất cả sinh viên của từng khoa
- Tên học sinh được phân tách bằng dấu phẩy và
- Hiển thị khoa có ít nhất ba sinh viên
SELECT d.DepartmentName, COUNT(s.StudentId) StudentsCount, GROUP_CONCAT(StudentName) AS Students FROM Departments AS d INNER JOIN Students AS s ON s.DepartmentId = d.DepartmentId GROUP BY d.DepartmentName HAVING COUNT(s.StudentId) >= 3;
Chúng tôi đã thêm một THAM GIA mệnh đề để lấy DepartmentName từ bảng Departments. Sau đó, chúng tôi đã thêm mệnh đề GROUP BY với hai hàm tổng hợp:
- “COUNT” để đếm số sinh viên cho mỗi nhóm khoa.
- GROUP_CONCAT để nối các học sinh trong mỗi nhóm bằng dấu phẩy được phân tách thành một chuỗi.
- Sau GROUP BY, chúng tôi đã sử dụng mệnh đề HAVING để lọc các khoa và chỉ chọn những khoa có ít nhất 3 sinh viên.
Kết quả sẽ như sau:
Tổng kết
Đây là phần giới thiệu về văn bản SQLite truy vấn và kiến thức cơ bản về truy vấn cơ sở dữ liệu cũng như cách bạn có thể lọc dữ liệu được trả về. Bây giờ bạn có thể tự viết SQLite truy vấn.




















































