SQLite Truy vấn: Chọn, Ở đâu, GIỚI HẠN, BẮT ĐẦU, Đếm, Nhóm theo

⚡ Tóm tắt thông minh

SQLite Các truy vấn truy xuất và lọc dữ liệu bằng cách sử dụng các mệnh đề SELECT, FROM, WHERE, GROUP BY, ORDER BY và LIMIT. Kết hợp các mệnh đề này với các toán tử, hàm tổng hợp, truy vấn con và các phép toán tập hợp cho phép bạn đọc, định hình và tóm tắt các bản ghi từ bất kỳ nguồn nào. SQLite cơ sở dữ liệu.

  • 🔍 SELECT và FROM: Mệnh đề SELECT chọn các cột, giá trị cố định hoặc bí danh; mệnh đề FROM đặt tên cho các bảng hoặc truy vấn con cung cấp dữ liệu.
  • 🧮 Ở ĐÂU và Operator: Mệnh đề WHERE lọc các hàng bằng các toán tử nối chuỗi, CAST, phép toán số học, phép so sánh, LIKE, GLOB, BETWEEN, IN và EXISTS.
  • 📊 Cốt liệu và Nhómping: AVGCác hàm COUNT, GROUP_CONCAT, MAX, MIN, SUM và TOTAL kết hợp với GROUP BY và HAVING để tóm tắt các hàng được nhóm.
  • 🔗 Truy vấn con và tập hợp: Truy vấn con, biểu thức bảng chung, và các lệnh UNION, INTERSECT, và EXCEPT kết hợp kết quả từ nhiều câu lệnh SELECT.
  • 🧩 Thứ tự và giá trị NULL: Các lệnh ORDER BY, LIMIT, OFFSET, DISTINCT, CASE và IS NULL kiểm soát thứ tự hàng, kích thước đầu ra và các giá trị thiếu.
  • 🤖 Hỗ trợ AI: Các trợ lý chuyển đổi văn bản thành SQL bằng AI và GitHub Copilot tạo ra SQLite Các truy vấn SELECT, JOIN và GROUP BY được tạo từ các câu lệnh bằng tiếng Anh đơn giản.

SQLite Câu Hỏi

Các phần bên dưới sẽ hướng dẫn cách đọc dữ liệu bằng câu lệnh SELECT và FROM, lọc hàng bằng câu lệnh WHERE và các toán tử của nó, sắp xếp và giới hạn kết quả, các hàm tổng hợp, GROUP BY và HAVING, truy vấn con, các phép toán tập hợp, xử lý giá trị NULL, biểu thức CASE và các biểu thức bảng chung.

Viết 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 “C:\sqlite”, sau đó mở tệp “sqlite3.exe“:

Đọc dữ liệu với Select in SQLite

Bước 2) Mở cơ sở dữ liệu “TutorialsSampleDB.db” bằng lệnh sau:

Đọc dữ liệu với Select in SQLite

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:

Đọc dữ liệu với Select in SQLite

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:

Đọc dữ liệu với Select in SQLite

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:

Đọc dữ liệu với Select in SQLite

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:

SQLite Tên và bí danh

Lưu ý rằng, tên cột vẫn là “StudentName”; cột StudentName vẫn giữ nguyên, không thay đổi do việc đặt tên 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 đó:

SQLite Tên và bí danh

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:

SQLite Tên và bí danh

Đ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”:

SQLite Tên và bí danh

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 “s” cho bảng Sinh viên và bí danh “d” cho bảng Phòng ban. Thay vì sử dụng tên đầy đủ của bảng, chúng tôi đã sử dụng bí danh của chúng để tham chiếu đến chúng. INNER JOIN kết nối hai hoặc nhiều bảng với nhau bằng một điều kiện. Trong ví dụ của chúng tôi, chúng tôi đã kết nối bảng Sinh viên với bảng Phòng ban bằng cột DepartmentId. Ngoài ra còn có một giải thích chi tiết về INNER JOIN trong phần “SQLite Tham gia”Hướng dẫn.

Đ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 đó:

SQLite Tên và bí danh

Ở ĐÂ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 hợp kết quả 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;

Thao tác này sẽ nối chuỗi thành một bí danh mới có tên là “StudentIdWithName“:

  • Giá trị chuỗi ký tự “Id with Name: “
  • với giá trị của cột “StudentId” và
  • với giá trị từ cột “StudentName”

SQLite Mệnh đề WHERE và toán tử

SQLite Toán tử CAST:

Toán tử CAST được sử dụng để chuyển đổi giá trị từ một dạng nào đó. loại dữ liệu sang kiểu dữ liệu khác.

Ví dụ, nếu bạn có một giá trị số được lưu trữ dưới dạng chuỗi như thế này ” '12.5' ​​” và bạn muốn chuyển đổi nó thành giá trị số, bạn có thể sử dụng toán tử CAST để thực hiện như sau “CAST( '12.5' ​​AS REAL)“. Hoặc nếu bạn có một 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ể ép kiểu nó thành số nguyên như sau “CAST(12.5 AS INTEGER)”.

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:

SQLite Mệnh đề WHERE và toán tử

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à:

  • Phép cộng “+” – cho tổng của hai toán hạng.
  • Subtraction “–” – subtracPhép toán này lấy hai toán hạng và cho ra hiệu số.
  • Phép nhân “*” – tích của hai toán hạng.
  • Phần dư (modulo) “%” – cho biết phần dư thu được khi chia một toán hạng cho toán hạng thứ hai.
  • Phép chia “/” – trả về kết quả thương của phép chia toán hạng bên trái cho toán hạng bên phải.

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ố cố định trong cùng một mệnh đề SELECT:

SELECT 25+6, 25-6, 25*6, 25%6, 25/6;

Điều này sẽ cung cấp cho bạn:

SQLite Mệnh đề WHERE và toán tử

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:

  • "<" – trả về true nếu toán hạng bên trái nhỏ hơn toán hạng bên phải.
  • “<=” – trả về true nếu toán hạng bên trái nhỏ hơn hoặc bằng toán hạng bên phải.
  • “>” – trả về true nếu toán hạng bên trái lớn hơn toán hạng bên phải.
  • “>=” – trả về true nếu toán hạng bên trái lớn hơn hoặc bằng toán hạng bên phải.
  • “=” và “==” – trả về true nếu hai toán hạng bằng nhau. Lưu ý rằng cả hai toán tử đều giống nhau và không có sự khác biệt giữa chúng.
  • “!=” và “<>” – trả về true nếu hai toán hạng không bằng nhau. Lưu ý rằng cả hai toán tử đều giống nhau và không có sự khác biệt giữa chúng.

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 Mệnh đề WHERE và toán tử

SQLite Toán tử khớp mẫu

"LIKE" – được sử dụng để so khớp mẫu. Sử dụng "LIKE", bạn có thể tìm kiếm các giá trị khớp với một 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ụ: StudentName LIKE '%a%' – điều này sẽ tìm kiếm tên học sinh có chứa chữ “a” ở bất kỳ vị trí nào trong cột StudentName.
  • Bắt đầu bằng mẫu. Ví dụ: “StudentName LIKE '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 nhất định. Ví dụ: “StudentName LIKE '%a'” – Tìm kiếm tên học sinh có chữ cái cuối là “a”.
  • Tìm kiếm bất kỳ ký tự đơn nào trong một chuỗi bằng cách sử dụng ký tự gạch dưới “_”. Ví dụ: “StudentName LIKE 'J___'” – Tìm kiếm tên học sinh có độ dài 4 ký tự. Tên phải bắt đầu bằng chữ “J” và có thể có thêm ba ký tự bất kỳ sau chữ “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ả:

SQLite Mệnh đề WHERE và toán tử

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ả:

SQLite Mệnh đề WHERE và toán tử

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ả:

SQLite Mệnh đề WHERE và toán tử

“GLOB” – 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:

SQLite Mệnh đề WHERE và toán tử

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 Mệnh đề WHERE và toán tử

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:

SQLite Mệnh đề WHERE và toán tử

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

Toán tử BETWEEN được sử dụng để chọn các giá trị nằm trong khoảng giữa hai giá trị. Ví dụ, “X BETWEEN Y AND Z” sẽ trả về true (1) nếu giá trị X nằm giữa hai giá trị Y và Z. Ngược lại, nó sẽ trả về false (0). “X BETWEEN Y AND Z” tương đương với “X >= Y AND X <= Z”, trong đó 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 Mệnh đề WHERE và toán tử

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

Ví dụ 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:

SQLite Mệnh đề WHERE và toán tử

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. “WHERE StudentId IN(2, 4, 6, 8)” tương đương với “WHERE (StudentId = 2) OR (StudentId = 4) OR (StudentId = 6) OR (StudentId = 8);“

Thích bài viết này:

SQLite Mệnh đề WHERE và toán tử

SQLite KHÔNG VÀO

Toán tử “NOT IN” ngược lại với toán tử IN. Nhưng có cùng cú pháp; nó nhậ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ị của toán hạng đầu tiên không bằng giá trị của bất kỳ toán hạng nào trong danh sách. Tức là, nó sẽ trả về true (0) nếu danh sách các toán hạng không chứa toán hạng đầu tiên. Ví dụ: “col NOT IN(x, y, z)“. Điều này tương đương với “(col<>x) AND (col<>y) AND (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

SQLite Mệnh đề WHERE và toán tử

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

SQLite Mệnh đề WHERE và toán tử

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:

SQLite Mệnh đề WHERE và toán tử

Chỉ có ba khoa “CNTT, Vật lý và Nghệ thuật” sẽ được trả về. Và 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 của 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 khoa “Toán học”.

SQLite KHÔNG

Reverselà kết quả của toán tử đứng trước 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:

SQLite Mệnh đề WHERE và toán tử

Chỉ có khoa “Toán” sẽ được trả về. Bởi vì khoa “Toán” 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 Giới hạn và đặt hàng

  • 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 cách sử dụng mệnh đề OFFSET. Ví dụ, “LIMIT 4 OFFSET 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ư “LIMIT 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:

SQLite Giới hạn và đặt hàng

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 từ khóa “DISTINCT” để loại bỏ các giá trị trùng lặp đó và chỉ trả về các giá trị duy nhất. Bạn có thể chỉ định nhiều hơn một cột sau từ khóa DISTINCT.

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:

Loại bỏ các mục trùng lặp trong SQLite

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:

Loại bỏ các mục trùng lặp trong SQLite

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”:

SQLite Chức năng tổng hợp

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:

SQLite Chức năng tổng hợp

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:

SQLite Chức năng tổng hợp

Đ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:

SQLite Chức năng tổng hợp

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:

SQLite Chức năng tổng hợp

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ừ ​​bảng “Marks”:

SELECT MAX(Mark), MIN(Mark) FROM Marks;

Điều này sẽ cung cấp cho bạn:

SQLite Chức năng tổng hợp

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 hàm SUM và hàm total để tính tổng tất cả các điểm trong bảng “Marks”:

SELECT SUM(Mark), TOTAL(Mark) FROM Marks;

Điều này sẽ cung cấp cho bạn:

SQLite Chức năng tổng hợp

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:

SQLite Chức năng tổng hợp

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:

SQLite Nhóm theo và có

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:

SQLite Nhóm theo và có

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:

SQLite Truy vấn và truy vấn con

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:

SQLite Truy vấn và truy vấn con

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:

SQLite Thiết lập Operations

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:

SQLite Thiết lập Operations

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:

SQLite Thiết lập Operations

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:

SQLite Thiết lập Operations

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

Giá trị “NULL” là một giá trị đặc biệt trong SQLiteNó đượ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 "0" hoặc giá trị trống. Vì 0 và giá trị trống là các giá trị đã biết, nên giá trị null là giá trị 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:

SQLite Xử lý NULL

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 hoạt động, bạn phải sử dụng toán tử “IS NULL” để tìm kiếm các giá trị null như sau:

SELECT * FROM Students WHERE DepartmentId IS NULL;

Điều này sẽ cung cấp cho bạn:

SQLite Xử lý NULL

Truy vấn sẽ trả về những sinh viên có giá trị DepartmentId null.

Nếu bạn muốn lấy những giá trị không phải là null, thì bạn phải sử dụng toán tử “IS NOT NULL” như sau:

SELECT * FROM Students WHERE DepartmentId IS NOT NULL;

Điều này sẽ cung cấp cho bạn:

SQLite Xử lý NULL

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 biểu thức CASE với giá trị NULL trong cột ID phòng ban của bảng Sinh viên để hiển thị văn bản 'Không có phòng ban' 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:

SQLite kết quả có điều kiện TRƯỜNG HỢP

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

“CTEname” 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 CTE sau này. Lưu ý rằng, bạn có thể định nghĩa các 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 ta đã định nghĩa một CTE và đặt tên cho nó là “AllDepartments”. CTE này được định nghĩa từ một truy vấn SELECT:

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:

SQLite Biểu thức bảng chung

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ệnh đề JOIN để 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:

SQLite Truy vấn nâng cao

Câu Hỏi Thường Gặp

WHERE lọc các hàng riêng lẻ trước khi lọc nhóm.ping và không thể sử dụng các hàm tổng hợp. Mệnh đề HAVING lọc toàn bộ nhóm sau mệnh đề GROUP BY và có thể kiểm tra các hàm tổng hợp như COUNT hoặc SUM. Trong một truy vấn, mệnh đề WHERE được viết trước GROUP BY và HAVING được viết sau đó.

Các từ khóa SQL như SELECT và WHERE không phân biệt chữ hoa chữ thường. Toán tử LIKE không phân biệt chữ hoa chữ thường đối với các ký tự ASCII, trong khi GLOB thì phân biệt chữ hoa chữ thường. Văn bản được lưu trữ trong các cột giữ nguyên kiểu chữ ban đầu, vì vậy việc so sánh giá trị bằng toán tử bằng sẽ tôn trọng chính xác các ký tự.

Thêm mệnh đề ORDER BY RANDOM() và LIMIT 1 vào câu lệnh SELECT, ví dụ: SELECT * FROM Students ORDER BY RANDOM() LIMIT 1. Hàm RANDOM() sẽ xáo trộn các hàng và LIMIT trả về giá trị 1. Tăng giá trị LIMIT để lấy nhiều hàng ngẫu nhiên.

Phép JOIN kết hợp các cột từ hai bảng cạnh nhau bằng cách sử dụng điều kiện khớp, mở rộng mỗi hàng. Phép UNION xếp chồng các hàng của hai kết quả SELECT lên nhau thành một danh sách duy nhất, vì vậy cả hai truy vấn phải trả về cùng số lượng cột.

Không. Nếu không có mệnh đề ORDER BY. SQLite LIMIT có thể trả về các hàng theo bất kỳ thứ tự nào, vì vậy mỗi lần chạy lệnh có thể chọn các hàng khác nhau. Luôn kết hợp LIMIT với ORDER BY khi bạn cần kết quả có thể dự đoán được, ví dụ như ORDER BY StudentId LIMIT 10.

Tạo chỉ mục trên các cột được sử dụng trong mệnh đề WHERE, JOIN và ORDER BY để SQLite Có thể định vị các hàng mà không cần quét toàn bộ bảng. Việc chỉ chọn các cột cần thiết và chạy lệnh ANALYZE để làm mới số liệu thống kê cũng giúp cải thiện tốc độ truy vấn.

Đúng vậy. Trợ lý AI chuyển văn bản thành SQL sẽ biến các yêu cầu bằng tiếng Anh thông thường thành... SQLite Các câu lệnh SELECT, WHERE, JOIN và GROUP BY. Việc cung cấp tên bảng và tên cột sẽ cải thiện độ chính xác, và mọi truy vấn được tạo ra cần được xem xét và kiểm tra trước khi chạy trên dữ liệu thực.

Vâng. Trợ lý GitHub gợi ý SQLite truy vấn nội tuyến trong trình soạn thảo như VS CodeHoàn thành các mệnh đề SELECT, JOIN, aggregate và GROUP BY. Nó đọc lược đồ và các bình luận lân cận, vì vậy các đề xuất của nó sử dụng lại tên bảng và cột thực của bạn.

Tóm tắt bài viết này với: