Truy vấn SQLite: Chọn, Ở đâu, LIMIT, OFFSET, Đếm, Nhóm theo

Mục lục:

Anonim

Để viết các truy vấn SQL trong cơ sở dữ liệu SQLite, bạn phải biết cách hoạt động của các mệnh đề SELECT, FROM, WHERE, GROUP BY, ORDER BY và LIMIT và cách sử dụng chúng.

Trong 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 các mệnh đề SQLite.

Trong hướng dẫn này, bạn sẽ học-

  • Đọc dữ liệu với lựa chọn
  • Tên và Bí danh
  • Ở ĐÂU
  • Giới hạn và đặt hàng
  • Loại bỏ các bản sao
  • Tổng hợp
  • Nhóm BẰNG
  • Truy vấn & Truy vấn con
  • Đặt hoạt động -UNION, Intersect
  • Xử lý NULL
  • Kết quả có điều kiện
  • Biểu thức bảng chung
  • Truy vấn nâng cao

Đọc dữ liệu với lựa chọn

Mệnh đề SELECT là câu lệnh chính bạn sử dụng để truy vấn cơ sở dữ liệu SQLite. Trong mệnh đề CHỌN, bạn nêu những gì cần chọn. Nhưng trước mệnh đề select, chúng ta hãy xem từ đâu chúng ta có thể chọn dữ liệ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 con để chọn dữ liệu từ đó, như chúng ta sẽ thấy trong phần hướng dẫn sau.

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ở một kết nối đến cơ sở dữ liệu mẫu như đang chảy:

Bước 1) Trong bước này,

  1. Mở Máy tính của tôi và điều hướng đến thư mục sau " C: \ sqlite " và
  2. Sau đó, mở " sqlite3.exe ":

Bước 2) Mở cơ sở dữ liệu " TutorialsSampleDB.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 đề CHỌN, bạn không chỉ có thể chọn một tên cột mà còn có rất 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 được tham chiếu (hoặc truy vấn con) trong mệnh đề FROM. Ví dụ:

LỰA CHỌN *TỪ sinh viênINNER JOIN Các phòng ban trên sinh viên.DepartmentId = Department.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 "tên bảng". Ví dụ:

CHỌN học sinh. *TỪ sinh viênINNER JOIN Các phòng ban trên sinh viên.DepartmentId = Department.DepartmentId;

Thao tác này sẽ chỉ chọn tất cả các cột từ bảng sinh viên:

Một giá trị theo nghĩa đen

Giá trị chữ là một giá trị không đổi có thể được chỉ định trong câu lệnh select. Bạn có thể sử dụng các giá trị 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ị chữ này sẽ được hiển thị cho mỗi hàng từ các hàng được trả về bởi truy vấn SQL.

Dưới đây là một số ví dụ về các giá trị chữ khác nhau mà bạn có thể chọn:

  • Numeric Literal - 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 'Hoa Kỳ', 'đâ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 mà 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ả học sinh từ bảng Học sinh, với một cột mới được gọi là quốc gia có chứa giá trị "Hoa Kỳ", bạn có thể thực hiện điều này:

CHỌN *, 'Hoa Kỳ' LÀ Quốc gia TỪ Sinh viên;

Điều này sẽ cung cấp cho bạn tất cả các cột của sinh viên, cộng với một cột mới "Quốc gia" như sau:

Lưu ý rằng, cột mới này Quốc gia thực sự không phải là một cột mới được thêm vào bảng. Nó 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 của 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 cho nó một bí danh như sau:

CHỌN Tên Sinh Viên LÀ 'Tên Sinh Viên' TỪ Sinh viên; 

Thao tác này sẽ cung cấp cho bạn tên của các sinh viên với tên "Student Name" thay vì "StudentName" như sau:

Lưu ý rằng, tên cột vẫn là " StudentName "; cột StudentName vẫn như cũ, không thay đổi theo 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, lưu ý rằng, từ khóa "AS" là tùy chọn, bạn có thể đặt tên bí danh mà không có nó, tương tự như sau:

CHỌN Tên Sinh Viên 'Tên Sinh Viên' TỪ Sinh viên;

Và nó sẽ cung cấp cho bạn kết quả chính xác giống như truy vấn trước đó:

Bạn cũng có thể đặt bí danh cho bảng, không chỉ cột. Với cùng một 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 Học sinh:

Đ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 gọn. Ví dụ, trong truy vấn sau:

CHỌN Sinh viên. Tên học sinh, Phòng ban, Bộ phậnTỪ sinh viênINNER JOIN Các phòng ban trên sinh viên.DepartmentId = Department.DepartmentId;

Truy vấn này sẽ chọn từng tên sinh viên từ bảng "Sinh viên" với tên khoa từ bảng "Khoa":

Tuy nhiên, cùng một truy vấn có thể được viết như thế này:

CHỌN s.StudentName, d.DepartmentNameTỪ Sinh viên NHƯ sINNER JOIN Các phòng ban 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 các phòng ban có 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 kết hợp hai hoặc nhiều bảng với nhau bằng cách sử dụng một điều kiện. Trong ví dụ của chúng tôi, chúng tôi đã kết hợp bảng Sinh viên với bảng Phòng ban với cột DepartmentId. Ngoài ra còn có giải thích chuyên sâu cho INNER JOIN trong hướng dẫn "SQLite Joins".

Điều này sẽ cung cấp cho bạn kết quả 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 từ 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à true, false hoặc null.
  • Sau đó, chỉ các hàng mà biểu thức được đánh giá với giá trị đúng sẽ được trả về và những hàng có kết quả sai hoặc rỗng sẽ bị bỏ qua và không được đưa vào tập kết quả.
  • Để lọc tậ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 toán tử 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 cách sử dụng biểu thức và toán tử.

Biểu thức là một hoặc nhiều giá trị 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 họ hoạt động như thế nào.

Có các 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ị hoặc cột theo nghĩa đen 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 theo nghĩa đen được nối. Ví dụ:

CHỌN 'Id với Tên:' || StudentId || StudentName AS StudentIdWithNameTỪ Sinh viên;

Điều này sẽ kết hợp thành một bí danh mới " StudentIdWithName ":

  • Giá trị chuỗi chữ " Id với Tên: "
  • với giá trị của cột " StudentId " và
  • với giá trị từ cột " StudentName "

Toán tử SQLite CAST:

Toán tử CAST được sử dụng để chuyển đổi một giá trị từ một kiểu dữ liệu sang một 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 giá trị 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 điều này như sau " CAST ('12 .5' AS 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ể ép kiểu đó thành một số nguyên như sau "CAST (12,5 AS INTEGER)".

Thí dụ

Trong lệnh sau, chúng tôi sẽ cố gắng 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à một 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à nó trở thành 12.

Toán tử số học SQLite:

Lấy hai hoặc nhiều giá trị chữ số 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.
  • Phép trừ " - " - trừ hai toán hạng và dẫn đến hiệu số.
  • Phép nhân " * " - tích của hai toán hạng.
  • Reminder (modulo) " % " - cho phần còn lại là kết quả của việc chia một toán hạng cho toán hạng thứ hai.
  • Phép chia " / " - trả về kết quả thương số từ việc chia toán hạng bên trái cho toán hạng bên phải.

Thí dụ:

Trong ví dụ sau, chúng tôi sẽ thử năm toán tử số học với các giá trị số theo nghĩa đen giống nhau

chọn mệnh đề:

CHỌN 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 phép trong SQLite miễn là chúng ta chọn các giá trị theo nghĩa đen.

Toán tử so sánh SQLite

So sánh hai toán hạng với nhau và trả về true hoặc false 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.

Thí dụ:

LỰA CHỌN10 <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:

Toán tử Đối sánh Mẫu SQLite

" LIKE " - được sử dụng để đối sánh mẫu. Sử dụng " Thích ", bạn có thể tìm kiếm các giá trị phù hợ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à một giá trị chuỗi ký tự hoặc một cột chuỗi. Mẫu có thể được chỉ định như sau:

  • Chứa hoa văn. Ví dụ: StudentName LIKE '% a%' - điều này sẽ tìm kiếm tên của các sinh viên có chứa ký tự "a" ở bất kỳ vị trí nào trên cột StudentName.
  • Bắt đầu với mẫu. Ví dụ, " StudentName LIKE 'a%' " - tìm kiếm tên của các sinh viên bắt đầu bằng chữ cái "a".
  • Kết thúc với mô hình. Ví dụ, " StudentName LIKE '% a' " - Tìm kiếm tên của các sinh viên kết thúc bằng chữ cái "a".
  • So khớp 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 của sinh viên có độ dài 4 ký tự. Nó phải bắt đầu bằng chữ "J" và có thể có thêm ba ký tự khác sau chữ "J".

Ví dụ về đối sánh mẫu:

  1. Nhận tên Học sinh bắt đầu bằng chữ cái 'j':
    CHỌN Tên Sinh Viên TỪ Sinh Viên MÀ Tên Sinh Viên THÍCH 'j%';

    Kết quả:

  2. Nhận tên của Học sinh kết thúc bằng chữ cái 'y':
    CHỌN Tên Sinh Viên TỪ Sinh Viên NƠI Tên Sinh Viên THÍCH '% y'; 

    Kết quả:

  3. Lấy tên của Học sinh có chứa chữ cái 'n':
    CHỌN Tên Sinh Viên TỪ Sinh Viên NƠI Tên Sinh Viên THÍCH '% n%';

    Kết quả:

"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ề các kết quả khác nhau:

CHỌN 'Jack' GLOB 'j%';CHỌN 'Jack' THÍCH '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ử LIKE 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À

Một 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 mang lại giá trị "false".

Thí dụ:

Truy vấn sau sẽ tìm kiếm các sinh viên có StudentId> 5 và StudentName bắt đầu bằng chữ N, các sinh viên được trả về phải đáp ứng hai điều kiện:

LỰA CHỌN *TỪ sinh viênWHERE (StudentId> 5) AND (StudentName LIKE 'N%');

Như 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à sinh viên duy nhất đáp ứng cả hai điều kiện.

SQLite HOẶC

Một toán tử logic kết hợp một hoặc nhiều biểu thức, để nếu một trong các toán tử kết hợp cho kết quả true, thì nó sẽ trả về true. Tuy nhiên, nếu tất cả các biểu thức trả về false, nó sẽ trả về false.

Thí dụ:

Truy vấn sau sẽ tìm kiếm các sinh viên có StudentId> 5 hoặc StudentName bắt đầu bằng chữ N, các sinh viên được trả về phải đáp ứng ít nhất một trong các điều kiện:

LỰA CHỌN *TỪ sinh viênWHERE (StudentId> 5) OR (StudentName LIKE 'N%');

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

Như một đầ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 sinh viên có chữ "n" trong tên của họ cộng với id sinh viên có giá trị> 5.

Như bạn có thể thấy kết quả khác với truy vấn với toán tử AND.

SQLite GIỮA

BETWEEN đượ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. Ngược lại, 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.

Thí dụ:

Trong truy vấn ví dụ sau, chúng tôi sẽ viết một truy vấn để lấy các sinh viên có giá trị Id từ 5 đến 8:

LỰA CHỌN *TỪ sinh viênNơi học sinh GIỮA 5 VÀ 8;

Điều này sẽ chỉ cung cấp cho những sinh viên 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 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) ".

Thí dụ:

Truy vấn sau sẽ chỉ chọn học sinh có id 2, 4, 6, 8:

LỰA CHỌN *TỪ sinh viênStudentId IN ở đâu (2, 4, 6, 8);

Như thế này:

Truy vấn trước sẽ cho kết quả chính xác như truy vấn sau vì chúng tương đương nhau:

LỰA CHỌN *TỪ sinh viênWHERE (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, sự 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ử "OR".

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); "

Như thế 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ùng một cú pháp; 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ị của toán hạng từ 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. Như thế này: " col NOT IN (x, y, z) ". Điều này tương đương với " (col <> x) AND (col <> y) AND (col <> z) ".

Thí dụ:

Truy vấn sau sẽ chọn sinh viên có id không bằng một trong các Id 2, 4, 6, 8 sau:

LỰA CHỌN *TỪ sinh viênHỌC SINH KHÔNG Ở ĐÂU (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 nhau:

LỰA CHỌN *TỪ sinh viênWHERE (StudentId <> 2) AND (StudentId <> 4) AND (StudentId <> 6) AND (StudentId <> 8);

Như thế 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ông bằng nhau "<>" để lấy danh sách sinh viên, không bằng cả 2, 4, 6 và 8. Id sau đây cũng không phải là 8. Truy vấn này sẽ trả về tất cả các sinh viên khác ngoài danh sách 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; nó 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.

Thí dụ:

Trong ví dụ sau, chúng tôi sẽ chọn tên khoa, nếu id khoa tồn tại trong bảng sinh viên:

CHỌN Tên bộ phậnTỪ các phòng ban NHƯ dWHERE TỒN TẠI (CHỌN DepartmentId TỪ Sinh viên AS s WHERE d.DepartmentId = s.DepartmentId);

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

Chỉ có ba khoa " CNTT, Vật lý và Nghệ thuật " sẽ được trả lại. Và tên khoa " Toán " sẽ không được trả lại vì không có sinh viên nào trong khoa đó, vì vậy 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 bộ phận " Toán học ".

SQLite KHÔNG

Đảo ngược 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 LIKE - Nó sẽ trả về true nếu LIKE trả về false 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.

Thí 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 phòng ban 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, việc tìm kiếm sẽ được thực hiện thông qua DepartmentId không tồn tại trong bảng phòng ban.

CHỌN Tên bộ phậnTỪ các phòng ban NHƯ dNƠI KHÔNG TỒN TẠI (CHỌN DepartmentIdTỪ Sinh viên NHƯ sWHERE d.DepartmentId = s.DepartmentId);

Đầu ra :

Chỉ bộ phận " Toán học " sẽ được trả lại. Bởi vì khoa " Toán " là khoa duy nhất, không tồn tại trong bảng học sinh.

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

Lệnh SQLite

SQLite Order 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 bộ 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ỉ có điều khoản LIMIT 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à một tên cột hoặc một biểu thức.
  • Sau biểu thức, bạn có thể chỉ định một hướng sắp xếp tùy chọn. 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ỳ dữ liệu nào trong số chúng, 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 "," giữa nhau.

Thí dụ

Trong ví dụ sau, chúng tôi sẽ chọn tất cả các sinh viên được sắp xếp theo tên của họ nhưng theo thứ tự giảm dần, sau đó theo tên khoa theo thứ tự tăng dần:

CHỌN s.StudentName, d.DepartmentNameTỪ Sinh viên NHƯ sINNER Tham gia các phòng ban AS d ON s.DepartmentId = d.DepartmentIdĐẶT HÀNG BỞI 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 thứ tự tất cả các sinh viên theo tên khoa của họ theo thứ tự tăng dần
  • Sau đó, đối với mỗi tên khoa, tất cả sinh viên dưới tên khoa đó sẽ được hiển thị theo thứ tự giảm dần theo tên của họ

Giới hạn SQLite:

Bạn có thể giới hạn số hàng được trả về bởi truy vấn SQL của mình 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ụ: " 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, vì vậy 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 tôi sẽ chỉ trả về 3 sinh viên bắt đầu từ id sinh viên 5 bằng cách sử dụng truy vấn:

CHỌN * TỪ HỌC SINH GIỚI HẠN 4,3;

Điều này sẽ cung cấp cho bạn chỉ 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ó StudentId 5, 6 và 7:

Loại bỏ các bản sao

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à trả về các giá trị riêng biệt. Bạn có thể chỉ định nhiều cột sau khi khóa DISTINCT hoạt động.

Thí dụ:

Truy vấn sau sẽ trả về "giá trị tên bộ phận" trùng lặp: Ở đây chúng tôi có các giá trị trùng lặp với tên CNTT, Vật lý và Nghệ thuật.

CHỌN d.DepartmentNameTỪ Sinh viên NHƯ sINNER JOIN Các phòng ban 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 ý, làm thế nào 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 bản sao đó và chỉ lấy các giá trị duy nhất. Như thế này:

CHỌN DISTINCT d.DepartmentNameTỪ Sinh viên NHƯ sINNER JOIN Các phòng ban 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 Aggregates là các hàm dựng sẵn được định nghĩa 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à các 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.

Thí dụ:

Trong ví dụ sau, chúng tôi sẽ lấy điểm trung bình mà học sinh đạt được từ tất cả các bài kiểm tra:

CHỌN AVG (Đánh dấu) TỪ Dấu hiệu;

Điều này sẽ cung cấp cho bạn giá trị "18,375":

Các kết quả này đến từ tổng tất cả các giá trị nhãn hiệu 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 các giá trị x, 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, từ khóa này sẽ nhận tổng số các giá trị riêng biệt của x.

Thí dụ

Trong ví dụ sau, chúng ta sẽ nhận được tổng số các Phòng ban với COUNT (DepartmentId), COUNT (*) và COUNT (DISTINCT DepartmentId) và chúng khác nhau như thế nào:

CHỌN COUNT (DepartmentId), COUNT (DISTINCT DepartmentId), COUNT (*) TỪ Sinh viên;

Đ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ị rỗng.
  • COUNT (DISTINCT DepartmentId) cung cấp cho bạn các giá trị riêng biệt của DepartmentId, chỉ là 3. Ba giá trị khác nhau của tên phòng ban là ba giá trị khác nhau. Chú ý rằng có 8 giá trị của tên bộ phận 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 học sinh là 10 hàng cho 10 học sinh.

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 tá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ụ về GROUP_CONCAT (DepartmentName)

Truy vấn sau sẽ nối tất cả các giá trị của tên khoa từ sinh viên và bảng phòng ban thành một chuỗi được phân tách bằng dấu phẩy. Vì vậy, thay vì trả về một 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)TỪ Sinh viên NHƯ sINNER JOIN Các phòng ban AS d ON s.DepartmentId = d.DepartmentId;

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

Thao tác này sẽ cung cấp cho bạn danh sách 8 giá trị tên của 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ụ về GROUP_CONCAT (DISTINCT DepartmentName)

Truy vấn sau 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)TỪ Sinh viên NHƯ sINNER JOIN Các phòng ban AS d ON s.DepartmentId = d.DepartmentId;

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

Chú ý kết quả 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ụ về GROUP_CONCAT (DepartmentName, '&')

Truy vấn sau 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 với ký tự '&' thay vì dấu phẩy làm dấu phân cách:

CHỌN GROUP_CONCAT (d.DepartmentName, '&')TỪ Sinh viên NHƯ sINNER JOIN Các phòng ban AS d ON s.DepartmentId = d.DepartmentId;

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

Lưu ý cách ký tự "&" được sử dụng thay vì ký tự mặc định "," để phân tách giữa các giá trị.

SQLite MAX () & MIN ()

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 đều rỗng.

Thí dụ

Trong truy vấn sau, chúng tôi 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 ":

CHỌN MAX (Mark), MIN (Mark) FROM Marks;

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

SQLite SUM (x), Total (x)

Cả hai 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. Hàm SUM trả về một giá trị nguyên nếu tất cả các giá trị x là một 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.

Thí dụ

Trong truy vấn sau, chúng tôi sẽ sử dụng SUM và tổng để lấy tổng của tất cả các dấu trong bảng " Dấu ":

CHỌN SUM (Đánh dấu), TỔNG (Đánh dấu) TỪ Dấu hiệu;

Đ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 hàm SUM trả về giá trị số nguyên vì các giá trị trong cột "Đánh dấu" có thể ở dạng số nguyên.

Sự khác biệt giữa SUM và TOTAL ví dụ:

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 nhận được giá trị SUM của NULL:

CHỌN SUM (Đánh dấu), TỔNG (Đánh dấu) TỪ Dấu hiệu WHERE TestId = 4;

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

Lưu ý rằng không có điểm nào cho TestId = 4, vì vậy sẽ có giá trị rỗng cho bài kiểm tra đó. SUM trả về giá trị null dưới dạng giá trị trống, trong khi TOTAL trả về 0.

Nhóm BẰNG

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 nhóm. Các hàng có cùng giá trị sẽ được tập hợp (sắp xếp) lại với nhau thành các 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 đó.

Thí 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.

CHỌN d.DepartmentName, COUNT (s.StudentId) AS StudentsCountTỪ Sinh viên NHƯ sINNER Tham gia các phòng ban AS d ON s.DepartmentId = d.DepartmentIdNHÓM THEO d. Tên bộ phận;

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

Mệnh đề Tên bộ phận GROUPBY sẽ nhóm tất cả sinh viên thành các nhóm một cho mỗi tên bộ phận. Đối với mỗi nhóm của "bộ phận", nó sẽ tính số sinh viên trên đó.

Điều khoản HAVING

Nếu bạn muốn lọc các nhóm được trả về bởi mệnh đề GROUP BY, thì bạn có thể chỉ định mệnh đề "HAVING" với biểu thức sau GROUP BY. Biểu thức sẽ được sử dụng để lọc các nhóm này.

Thí dụ

Trong truy vấn sau, chúng tôi sẽ chọn những khoa chỉ có hai sinh viên trên đó:

CHỌN d.DepartmentName, COUNT (s.StudentId) AS StudentsCountTỪ Sinh viên NHƯ sINNER Tham gia các phòng ban AS d ON s.DepartmentId = d.DepartmentIdNHÓM THEO d. Tên bộ phậnCÓ 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 đúng hai sinh viên trên đó. Trong trường hợp của chúng tôi, khoa Nghệ thuật có 2 sinh viên, vì vậy nó được hiển thị trong đầu ra.

Truy vấn SQLite & Truy vấn con

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 một 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ề việc 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ẽ thấy 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ụ mệnh đề FROM

Trong truy vấn sau, chúng tôi sẽ bao gồm một truy vấn con bên trong mệnh đề FROM:

LỰA CHỌNs.StudentName, t.MarkTỪ Sinh viên NHƯ sTHAM GIA INNER(SELECT StudentId, MarkTỪ KIỂM TRA NHƯ tINNER JOIN Đánh dấu AS m ON t.TestId = m.TestId) ON s.StudentId = t.StudentId;

Truy vấn:

 SELECT StudentId, MarkTỪ KIỂM TRA NHƯ tINNER JOIN Đánh dấu AS m ON t.TestId = m.TestId

Truy vấn trên được gọi là truy vấn con ở đây 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 "t" để chúng ta 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 học sinh và
  • t.Mark được chọn từ truy vấn con; cho điểm mỗi học sinh này đạt được

Sử dụng truy vấn con trong ví dụ mệnh đề WHERE

Trong truy vấn sau, chúng tôi sẽ bao gồm một truy vấn con trong mệnh đề WHERE:

CHỌN Tên bộ phậnTỪ các phòng ban NHƯ dNƠI KHÔNG TỒN TẠI (CHỌN DepartmentIdTỪ Sinh viên NHƯ sWHERE d.DepartmentId = s.DepartmentId);

Truy vấn:

CHỌN DepartmentIdTỪ Sinh viên NHƯ sWHERE d.DepartmentId = s.DepartmentId

Truy vấn trên được gọi là truy vấn con ở đây vì nó được lồng trong mệnh đề WHERE. Truy vấn con sẽ trả về các giá trị DepartmentId sẽ được sử dụng bởi toán tử KHÔNG TỒN TẠI.

Truy vấn này sẽ cung cấp cho bạn:

Trong câu hỏi trên, chúng tôi đã chọn khoa không có sinh viên nào đăng ký. Ở đây là khoa "Toán" nào.

Đặt hoạt động - UNION, Intersect

SQLite hỗ trợ các hoạt động SET sau:

ĐOÀN KẾT & ĐOÀN KẾT 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.

Ví dụ về UNION

Trong ví dụ sau, chúng ta sẽ lấy danh sách DepartmentId từ bảng sinh viên và danh sách DepartmentId từ bảng phòng ban trong cùng một cột:

CHỌN Bộ phận làm bộ phận Đã chọn từ sinh viênLIÊN HIỆPCHỌN DepartmentId TỪ Các Phòng ban;

Đ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 bộ phận riêng biệt. Lưu ý giá trị đầu tiên là giá trị null.

Ví dụ về SQLite UNION ALL

Trong ví dụ sau, chúng ta sẽ lấy danh sách DepartmentId từ bảng sinh viên và danh sách DepartmentId từ bảng phòng ban trong cùng một cột:

CHỌN Bộ phận làm bộ phận Đã chọn từ sinh viênĐOÀN KẾT TẤT CẢCHỌN DepartmentId TỪ Các Phòng ban;

Đ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ó các bản sao trong các giá trị được trả về. 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ờ, chúng ta hãy xem UNION tất cả sẽ cho kết quả khác nhau như thế nào nếu chúng ta thay UNION ALL bằng UNION:

SQLite INTERSECT

Trả về các giá trị tồn tại trong cả tập kết quả được kết hợp. Các giá trị tồn tại trong một trong các tập kết quả được kết hợp sẽ bị bỏ qua.

Thí dụ

Trong truy vấn sau, chúng tôi sẽ chọn các giá trị DepartmentId tồn tại trong cả bảng Sinh viên và Phòng ban trong cột DepartmentId:

CHỌN BỘ PHẬN TỪ Sinh viênGiao nhauCHỌN DepartmentId TỪ Các Phòng ban;

Đ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, các giá trị null và 4 không được bao gồm vì giá trị null chỉ tồn tại trong bảng sinh viên và không có trong bảng phòng ban. Và giá trị 4 tồn tại trong bảng phòng ban chứ không phả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 bao gồm trong các 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 muốn các hàng chỉ 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ề những hàng tồn tại trong list1 và không tồn tại trong list2.

Thí dụ

Trong truy vấn sau, chúng tôi sẽ chọn các giá trị DepartmentId tồn tại trong bảng phòng ban và không tồn tại trong bảng sinh viên:

CHỌN DANH SÁCH TỪ CÁC BỘ PHẬNNGOẠI TRỪCHỌN BỘ PHẬN TỪ Sinh viên;

Đ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 phòng ban 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 để đại diện cho một giá trị không xác định hoặc thiếu giá trị. Lưu ý rằng giá trị null hoàn toàn khác với giá trị " 0 " hoặc "" trống. Bởi vì 0 và giá trị trống là một giá trị đã biết, tuy nhiên, giá trị rỗng là không xác định.

Các giá trị NULL yêu cầu một 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ình đẳng thông thường (=) để tìm kiếm các giá trị rỗng. Ví dụ: truy vấn sau đây tìm kiếm các sinh viên có giá trị DepartmentId rỗng:

SELECT * FROM Students WHERE DepartmentId = NULL;

Truy vấn này sẽ không đưa ra bất kỳ kết quả nào:

Vì giá trị NULL không bằng bất kỳ giá trị nào khác bao gồm bản thân 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:
CHỌN * TỪ Sinh viên TẠI ĐÂU DepartmentId LÀ KHÔNG ĐỦ;

Đ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 rỗng.

  • Nếu bạn muốn nhận 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:
CHỌN * TỪ Sinh viên TẠI ĐÓ BỘ PHẬN KHÔNG ĐẦY ĐỦ;

Đ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ị NULL DepartmentId.

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 là đúng, nó sẽ trả về giá trị đó.

Ví dụ: nếu bạn có cột "Lớp" và bạn muốn chọn một giá trị văn bản dựa trên giá trị lớp 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 các kết quả nhất định tùy thuộc vào các điều kiện nhất định như câu lệnh if chẳng hạn.

Toán tử CASE có thể được định nghĩa với các cú pháp khác nhau như sau:

  1. Bạn có thể sử dụng các điều kiện khác nhau:
TRƯỜNG HỢPWHEN condition1 THEN result1WHEN condition2 THEN result2WHEN condition3 THEN resultn 3… ELSE resultnKẾT THÚC
  1. Hoặc, bạn có thể chỉ sử dụng một biểu thức và đặt các giá trị có thể khác nhau để chọn:
Biểu thức CASEWHEN value1 THEN result1WHEN value2 THEN result2WHEN value3 THEN result3… ELSE restulnKẾT THÚC

Lưu ý rằng mệnh đề ELSE là tùy chọn.

Thí dụ

Trong ví dụ sau, chúng tôi sẽ sử dụng biểu thức CASE với giá trị NULL trong cột Id bộ phận trong bảng Sinh viên để hiển thị văn bản 'Không có Bộ phận' như sau:

LỰA CHỌNTên học sinh,TRƯỜNG HỢPKHI BỘ PHẬN LÀ KHÔNG ĐẦY ĐỦ THÌ 'Không có Bộ phận'ELSE DepartmentIdEND AS DepartmentIdTỪ Sinh viên;
  • 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ị theo nghĩa đen là '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 kết quả như hình dưới đây:

Biểu thức bảng chung

Biểu thức bảng thông thường (CTE) là các truy vấn con được định nghĩa bên trong câu lệnh SQL với một tên nhất định.

Nó có lợi thế hơn các truy vấn con vì nó được định nghĩa bên ngoài các câu lệnh SQL và sẽ làm cho các truy vấn dễ đọc, duy trì và hiểu hơn.

Một biểu thức bảng chung có thể được xác định bằng cách đặt mệnh đề WITH trước câu lệnh SELECT như sau:

VỚI CTEnameNHƯ(Câu lệnh SELECT)CHỌN, CẬP NHẬT, CHÈN hoặc cập nhật câu lệnh tại đây TỪ 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 khảo sau này. Lưu ý rằng, bạn có thể xác định câu lệnh SELECT, UPDATE, INSERT hoặc DELETE trên CTE

Bây giờ, chúng ta hãy xem một ví dụ về cách sử dụng CTE trong mệnh đề SELECT.

Thí dụ

Trong ví dụ sau, chúng tôi sẽ xác định một CTE từ một câu lệnh SELECT, và sau đó chúng tôi sẽ sử dụng nó sau cho một truy vấn khác:

VỚI Tất cả các ngănNHƯ(CHỌN DepartmentId, DepartmentNameTỪ các phòng ban)LỰA CHỌNs.StudentId,s.StudentName,a.DepartmentNameTỪ Sinh viên NHƯ sINNER JOIN AllDep domains AS a ON s.DepartmentId = a.DepartmentId;

Trong truy vấn này, chúng tôi đã xác định một CTE và đặt tên cho nó là " AllDep domains ". CTE này được xác định từ một truy vấn SELECT:

 CHỌN DepartmentId, DepartmentNameTỪ các phòng ban

Sau đó, sau khi chúng tôi xác định CTE, chúng tôi sử dụng nó trong truy vấn SELECT sau nó.

Lưu ý rằng, các biểu thức bảng phổ biến không ảnh hưởng đến kết quả đầu ra của truy vấn. Đó là một cách để xác định một khung nhìn logic hoặc truy vấn con để sử dụng lại chúng trong cùng một truy vấn. Biểu thức bảng thông thường giống như một biến mà bạn khai báo và sử dụng lại nó như một truy vấn con. Chỉ câu lệnh SELECT mới ảnh hưởng đến đầ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 có chứa các phép nối phức tạp, truy vấn con và một số tổng hợp. Trong phần sau, chúng ta sẽ thấy một ví dụ về truy vấn nâng cao:

Nơi chúng tôi nhận được,

  • Tên bộ phận với tất cả học sinh của mỗi bộ phận
  • 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 trong đó
LỰA CHỌNd.DepartmentName,COUNT (s.StudentId) Số học sinh,GROUP_CONCAT (StudentName) AS StudentTỪ các phòng ban NHƯ dINNER THAM GIA Sinh viên NHƯ TRÊN s.DepartmentId = d.DepartmentIdGROUP BY d.DepartmentNameCÓ ĐẾM (s.StudentId)> = 3;

Chúng tôi đã thêm một mệnh đề JOIN để lấy Tên Bộ phận từ bảng Bộ phận. Sau đó, chúng tôi đã thêm mệnh đề GROUP BY với hai hàm tổng hợp:

  • "COUNT" để đếm sinh viên cho mỗi nhóm bộ phận.
  • GROUP_CONCAT để nối các sinh viên cho mỗi nhóm bằng dấu phẩy được phân tách trong 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óm lược:

Đây là phần giới thiệu về cách viết truy vấn SQLite và những điều 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 trả về. Bây giờ bạn có thể viết các truy vấn SQLite của riêng bạn.