SELECT đọc các hàng từ một bảng
Mọi câu hỏi bạn đặt ra cho cơ sở dữ liệu SQLite đều bắt đầu bằng SELECT. Nó nói: cho tôi những cột này, từ bảng này, với những hàng khớp các điều kiện này. Hôm nay ta tập trung vào hai phần đầu: cột và bảng. Phần lọc sẽ có ở trang tài liệu tiếp theo.
Truy vấn đơn giản nhất có thể:
SELECT * nghĩa là "mọi cột". FROM products chỉ ra bảng. Kết quả là mỗi bản ghi một hàng, với đủ bốn cột. Dấu chấm phẩy kết thúc câu lệnh.
Đó là toàn bộ cấu trúc: SELECT <columns> FROM <table>;.
Chọn các cột cụ thể
* tiện khi bạn đang khám phá. Trong code thật, bạn gần như luôn muốn ghi rõ tên những cột mình thật sự quan tâm:
Bạn nhận lại hai cột, theo đúng thứ tự bạn yêu cầu. Thứ tự trong danh sách SELECT quyết định thứ tự trong kết quả; nó không cần khớp với thứ tự cột của bảng.
Vì sao nên chọn cách này thay vì SELECT *? Có hai lý do. Thứ nhất, ít dữ liệu phải truyền đi hơn (hoặc đọc ra từ tệp hơn), điều này quan trọng khi bảng có nhiều cột. Thứ hai, truy vấn của bạn vẫn ổn định khi tháng sau ai đó thêm một cột vào bảng. SELECT * sẽ lặng lẽ trả về nhiều hơn, có thể làm hỏng code ứng dụng đọc hàng theo vị trí.
SELECT có thể tính toán, không chỉ lấy dữ liệu
Các cột trong danh sách SELECT không nhất thiết là tên cột thô. Chúng có thể là bất kỳ biểu thức nào: phép tính số học, lời gọi hàm, nối chuỗi, hằng số. SQLite tính biểu thức cho từng hàng.
Cột thứ tư không có trong bảng; SQLite đã tính nó từng hàng một. Bạn có thể làm tương tự với hàm xử lý chuỗi, ngày tháng, biểu thức điều kiện, bất cứ thứ gì. Danh sách SELECT là nơi định hình dữ liệu, không chỉ để lấy dữ liệu ra.
Bạn thậm chí có thể SELECT mà không có mệnh đề FROM, dùng SQLite như một chiếc máy tính:
Một hàng, ba cột. Hữu ích để thử xem một biểu thức làm gì trước khi đưa nó vào truy vấn thật.
Đặt bí danh cho cột với AS
Khi bạn tính một cột, SQLite chọn một tên mặc định cho nó, thường chính là biểu thức, như price * stock. Tên đó xấu và không ổn định. Hãy đặt cho cột một cái tên đàng hoàng bằng AS:
Bí danh (alias) là tên của cột trong tập kết quả. Điều đó quan trọng cho tính dễ đọc khi bạn xem kết quả, và càng quan trọng với code ứng dụng lấy giá trị theo tên cột (row["inventory_value"] thay vì row[1]).
Từ khóa AS là tùy chọn, price * stock inventory_value vẫn chạy như vậy, nhưng hãy viết nó ra. Ý định rõ ràng hơn, và tránh làm người đọc nhầm một dấu phẩy bị thiếu thành bí danh.
Đặt bí danh cho cả bảng
Bạn cũng có thể đặt cho chính bảng một bí danh ngắn. Với một bảng thì không hữu ích lắm, nhưng thói quen này phát huy tác dụng ngay khi bạn bắt đầu join:
Giờ p đại diện cho products. Dạng có dấu chấm p.name nói rõ cột đến từ bảng nào. Với một bảng thì đó chỉ là thừa; với ba bảng được join thì đó là thứ duy nhất giữ cho truy vấn dễ đọc.
Giá trị literal và hằng số trong kết quả
Bạn có thể trộn các cột thật với giá trị hằng. Hữu ích khi muốn gắn nhãn cho các hàng hoặc điền một giá trị giữ chỗ:
Mọi hàng đều nhận cùng 'USD' và 1. Mẫu này xuất hiện khi bạn kết hợp kết quả từ nhiều truy vấn bằng UNION và cần một cột đánh dấu để phân biệt nguồn.
Đôi lời về NULL
Một số cột để trống: không có giá trị nào được chèn vào, hoặc cột không có giá trị mặc định. SQLite biểu diễn "không có giá trị" là NULL, và NULL hiện trong kết quả SELECT dưới dạng ô trống hoặc chữ NULL, tùy công cụ bạn dùng.
Hãy nhìn hàng thứ hai. price là NULL, và price * 2 cũng là NULL: mọi phép tính số học có NULL đều cho ra NULL. Đây là một trong những nguồn phổ biến nhất gây ra kết quả SQL khó hiểu, và nó sẽ có trang riêng ở phần sau. Lúc này, chỉ cần để ý rằng NULL lây lan qua các biểu thức.
Điều cần nhớ
SELECT <columns> FROM <table>;là cấu trúc của mọi truy vấn.- Liệt kê cột rõ ràng trong code thật; để dành
SELECT *cho lúc khám phá. - Danh sách
SELECTcó thể chứa bất kỳ biểu thức nào, không chỉ tên cột. - Dùng
ASđể đặt tên phù hợp cho cột được tính và bảng có bí danh. NULLlan qua các phép tính số học; hãy nhớ điều đó khi kết quả trông có vẻ sai.
Tiếp theo: lọc với WHERE
Đến giờ mọi truy vấn đều trả về mọi hàng trong bảng. Mệnh đề WHERE là cách thu hẹp lại: chọn hàng theo giá, theo tên, theo ngày, theo bất kỳ biểu thức nào cho ra đúng hoặc sai. Đó là trang tài liệu tiếp theo.
Câu hỏi thường gặp
Cú pháp cơ bản của SELECT trong SQLite là gì?
SELECT <columns> FROM <table>;. Phần cột có thể là danh sách cách nhau bằng dấu phẩy (SELECT name, email FROM users), dấu * cho mọi cột, hoặc bất kỳ biểu thức nào như price * quantity. Mệnh đề FROM chỉ ra bảng cần đọc, và dấu chấm phẩy kết thúc câu lệnh.
Có nên dùng SELECT * trong SQLite không?
Không sao khi bạn đang mày mò trong CLI để xem bảng có gì. Trong code ứng dụng, hãy liệt kê đúng những cột bạn cần. SELECT * khiến code bị ràng buộc với schema hiện tại: thêm một cột vào ngày mai là mọi truy vấn lặng lẽ trả về nhiều dữ liệu hơn, có thể làm hỏng code đọc hàng theo vị trí.
Làm sao đổi tên cột trong kết quả SELECT?
Dùng AS để đặt bí danh cho một cột hoặc biểu thức: SELECT price * quantity AS total FROM orders. Bí danh trở thành tên cột trong tập kết quả, điều này quan trọng cho tính dễ đọc và cho code đọc kết quả theo tên cột. Từ khóa AS là tùy chọn nhưng nên giữ lại cho rõ ràng.