Bài viết này chứa các ví dụ về truy vấn SQL cơ bản mà người mới bắt đầu có thể sử dụng để truy xuất dữ liệu từ cơ sở dữ liệu của họ.
SELECT
cơ bản Truy vấn
Dưới đây là một ví dụ về truy vấn có thể, được sử dụng phổ biến nhất trong SQL:
SELECT *
FROM Pets;
Kết quả:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
Truy vấn này chọn tất cả các hàng và tất cả các cột từ Pets
bàn. Điều này là do dấu hoa thị (*
) ký tự đại diện chọn tất cả các cột.
Chọn tên cột
Vì lý do hiệu suất, tốt nhất bạn nên tránh chọn tất cả các cột trừ khi bạn thực sự cần chúng. Thông thường tốt hơn là chỉ chọn các cột bạn cần.
Đây là một ví dụ.
SELECT PetId, PetName
FROM Pets;
Kết quả:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 1 | Fluffy | | 2 | Fetch | | 3 | Scratch | | 4 | Wag | | 5 | Tweet | | 6 | Fluffy | | 7 | Bark | | 8 | Meow | +---------+-----------+
Lọc kết quả
Bạn có thể thêm WHERE
để lọc kết quả thành những hàng bạn cần.
SELECT PetId, PetName
FROM Pets
WHERE PetName = 'Fluffy';
Kết quả:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 1 | Fluffy | | 6 | Fluffy | +---------+-----------+
Đây là một ví dụ khác về lọc kết quả. Lần này chúng tôi sử dụng toán tử lớn hơn (>
) để lọc nó theo ngày.
SELECT PetName, DOB
FROM Pets
WHERE DOB > '2020-01-01';
Kết quả:
+-----------+------------+ | PetName | DOB | |-----------+------------| | Fluffy | 2020-11-20 | | Wag | 2020-03-15 | | Tweet | 2020-11-28 | | Fluffy | 2020-09-17 | +-----------+------------+
Bạn có thể hoán đổi toán tử lớn hơn thành các toán tử khác, chẳng hạn như toán tử lớn hơn hoặc bằng với toán tử (>=
), nhỏ hơn toán tử (<
), hoặc nhỏ hơn hoặc bằng toán tử (<=
).
Bạn cũng có thể sử dụng BETWEEN
toán tử để lọc kết quả cho một phạm vi cụ thể (ví dụ:giữa hai ngày).
SELECT
PetName,
DOB
FROM Pets
WHERE DOB BETWEEN '2018-01-01' AND '2020-01-01';
Kết quả:
+-----------+------------+ | PetName | DOB | |-----------+------------| | Fetch | 2019-08-16 | | Scratch | 2018-10-01 | +-----------+------------+
Sắp xếp kết quả
Bạn có thể thêm ORDER BY
mệnh đề để sắp xếp các hàng được trả về bởi truy vấn.
Thứ tự tăng dần
Sử dụng ASC
từ khóa để sắp xếp các kết quả theo thứ tự tăng dần. Đây là giá trị mặc định, vì vậy bạn cũng có thể bỏ qua từ khóa này nếu bạn muốn kết quả theo thứ tự tăng dần.
SELECT PetId, PetName
FROM Pets
ORDER BY PetName ASC;
Hoặc:
SELECT PetId, PetName
FROM Pets
ORDER BY PetName;
Kết quả:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 7 | Bark | | 2 | Fetch | | 1 | Fluffy | | 6 | Fluffy | | 8 | Meow | | 3 | Scratch | | 5 | Tweet | | 4 | Wag | +---------+-----------+
Thứ tự giảm dần
Sử dụng DESC
từ khóa để sắp xếp kết quả theo thứ tự giảm dần.
SELECT PetId, PetName
FROM Pets
ORDER BY PetName DESC;
Kết quả:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 4 | Wag | | 5 | Tweet | | 3 | Scratch | | 8 | Meow | | 1 | Fluffy | | 6 | Fluffy | | 2 | Fetch | | 7 | Bark | +---------+-----------+
Sắp xếp theo nhiều cột
Bạn có thể sắp xếp theo nhiều cột bằng cách liệt kê từng cột, được phân tách bằng dấu phẩy.
SELECT PetId, PetName
FROM Pets
ORDER BY PetName ASC, PetId ASC;
SELECT PetId, PetName
FROM Pets
ORDER BY PetName ASC, PetId DESC;
Kết quả:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 7 | Bark | | 2 | Fetch | | 1 | Fluffy | | 6 | Fluffy | | 8 | Meow | | 3 | Scratch | | 5 | Tweet | | 4 | Wag | +---------+-----------+ (8 rows affected) +---------+-----------+ | PetId | PetName | |---------+-----------| | 7 | Bark | | 2 | Fetch | | 6 | Fluffy | | 1 | Fluffy | | 8 | Meow | | 3 | Scratch | | 5 | Tweet | | 4 | Wag | +---------+-----------+ (8 rows affected)
Chúng ta có thể thấy rằng hai Fluffys có thứ tự khác nhau trong mỗi kết quả (chúng ta có thể biết bằng cách xem PetId
của chúng giá trị). Điều này là do PetName
cột được sắp xếp đầu tiên, sau đó đến PetId
đã sắp xếp mọi bản sao từ lần sắp xếp đầu tiên.
Sắp xếp theo các cột ẩn
Bạn có thể sắp xếp theo các cột không có trong SELECT
danh sách.
SELECT PetId, PetName
FROM Pets
ORDER BY DOB DESC;
Kết quả:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 5 | Tweet | | 1 | Fluffy | | 6 | Fluffy | | 4 | Wag | | 2 | Fetch | | 3 | Scratch | | 7 | Bark | | 8 | Meow | +---------+-----------+
Trong trường hợp này, chúng tôi có thể suy ra từ các kết quả này rằng Tweet
là vật nuôi nhỏ tuổi nhất và Meow
là người già nhất. Điều này là do chúng tôi sắp xếp theo ngày sinh của họ (DOB
) theo thứ tự giảm dần.
Chỉ để chắc chắn, đây là một lần nữa với DOB
được bao gồm trong SELECT
danh sách.
SELECT PetId, PetName, DOB
FROM Pets
ORDER BY DOB DESC;
Kết quả:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 5 | Tweet | 2020-11-28 | | 1 | Fluffy | 2020-11-20 | | 6 | Fluffy | 2020-09-17 | | 4 | Wag | 2020-03-15 | | 2 | Fetch | 2019-08-16 | | 3 | Scratch | 2018-10-01 | | 7 | Bark | NULL | | 8 | Meow | NULL | +---------+-----------+------------+
Trên thực tế, bây giờ chúng ta có thể thấy rằng Meow và Bark có NULL
các giá trị trong DOB
cột. Do đó, chúng tôi không biết họ thực sự lớn hơn hay trẻ hơn.
Nhưng điều này chứng tỏ rằng NULL
giá trị được coi là giá trị thấp nhất có thể. Hãy lưu ý đến NULL
giá trị khi chạy truy vấn.
Khớp mẫu
Bạn có thể sử dụng LIKE
để sử dụng đối sánh mẫu.
SELECT PetId, PetName
FROM Pets
WHERE PetName LIKE 'F%';
Kết quả:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 1 | Fluffy | | 2 | Fetch | | 6 | Fluffy | +---------+-----------+
Trong ví dụ này, chúng tôi tìm kiếm tất cả vật nuôi có tên bắt đầu bằng chữ cái F
. Dấu phần trăm (%
) là một ký tự đại diện khớp với bất kỳ chuỗi nào không hoặc nhiều ký tự. Nó có thể được sử dụng như một tiền tố hoặc một hậu tố, và nó cũng có thể được sử dụng ở giữa một chuỗi.
Đây là một ví dụ khác.
SELECT FirstName, LastName, Email
FROM Owners
WHERE Email LIKE '%@example.%';
Kết quả:
+-------------+------------+-------------------+ | FirstName | LastName | Email | |-------------+------------+-------------------| | Homer | Connery | [email protected] | | Bart | Pitt | [email protected] | +-------------+------------+-------------------+
Chọn từ danh sách
IN
toán tử xác định xem một giá trị được chỉ định có khớp với bất kỳ giá trị nào trong một truy vấn con hoặc một danh sách hay không.
Đây là một ví dụ.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetName IN ('Fluffy', 'Bark', 'Wag');
Kết quả:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 4 | Wag | 2020-03-15 | | 6 | Fluffy | 2020-09-17 | | 7 | Bark | NULL | +---------+-----------+------------+
Truy vấn con
Bạn có thể sử dụng IN
toán tử khi thực hiện một truy vấn con (một truy vấn được lồng bên trong một truy vấn khác).
Đây là một ví dụ.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets );
Kết quả:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | +-------------+-----------+
Cột này trả về từ một bảng (PetTypes
), nhưng chỉ khi có ít nhất một hàng tương ứng trong một bảng khác (Pets
) khớp với PetTypeId
cột.
Để minh chứng thêm cho điều này, nội dung liên quan của hai bảng này được trình bày bên dưới.
PetTypes
bảng:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+
Pets
bảng:
+-------------+-----------+ | PetTypeId | PetName | |-------------+-----------| | 2 | Fluffy | | 3 | Fetch | | 2 | Scratch | | 3 | Wag | | 1 | Tweet | | 3 | Fluffy | | 3 | Bark | | 2 | Meow | +-------------+-----------+
Chúng ta có thể thấy rằng PetTypes
bảng chứa một loại vật nuôi là Rabbit
, nhưng không có vật nuôi nào trong Pets
bảng đã được chỉ định loại đó (tức là không có giá trị của 4
trong Pets.PetTypeId
cột).
Xem 12 Toán tử SQL thường được sử dụng và danh sách Toán tử SQL này để biết thêm thông tin về các toán tử trong SQL.
Tham gia
Có thể tranh cãi liệu các phép nối SQL có được coi là “các truy vấn SQL cơ bản” hay không, nhưng dù sao thì tôi cũng sẽ đưa vào một phép nối ở đây.
Vì vậy, để kết thúc bài viết này, đây là một ví dụ về liên kết bên trong.
SELECT
p.PetName,
pt.PetType
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Kết quả:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+
Trong trường hợp này, chúng tôi đã sử dụng INNER JOIN
để trả về tất cả các tên vật nuôi với các loại vật nuôi tương ứng của chúng. Chúng tôi đã sử dụng ON
mệnh đề để chỉ định vị từ được đánh giá cho mỗi cặp hàng đã nối. Trong trường hợp này, p.PetTypeId
là một khóa ngoại của pt.PetTypeId
, là khóa chính cho PetTypes
bảng.
Trong ví dụ này, tôi cũng sử dụng bí danh trên các bảng, điều này giúp giữ cho mã đẹp và ngắn gọn.
Xem Hướng dẫn tham gia SQL của tôi để biết thêm ví dụ về các phép nối.