Để làm theo hướng dẫn này, bạn cần một máy tính chạy một số loại hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) sử dụng SQL. Các hướng dẫn và ví dụ trong hướng dẫn này đã được kiểm nghiệm bằng cách sử dụng môi trường sau:
Lưu ý : Xin lưu ý nhiều RDBMS sử dụng các triển khai SQL duy nhất của riêng họ. Mặc dù các lệnh được nêu trong hướng dẫn này sẽ hoạt động trên hầu hết các RDBMS, nhưng cú pháp hoặc kết quả chính xác có thể khác nếu bạn kiểm tra chúng trên một hệ thống không phải MySQL.
Nếu hệ thống cơ sở dữ liệu SQL của bạn chạy trên một server từ xa, hãy SSH vào server từ máy cục bộ của bạn:
Sau đó, mở dấu nhắc server cơ sở dữ liệu. Nếu bạn đang sử dụng MySQL, hãy làm như vậy bằng cách chạy lệnh sau, đảm bảo thay sammy
bằng tên tài khoản user MySQL của bạn:
Từ dấu nhắc, hãy tạo cơ sở dữ liệu có tên queries_db
:
Nếu cơ sở dữ liệu được tạo thành công, bạn sẽ nhận được kết quả như sau:
Query OK, 1 row affected (0.01 sec)
Để chọn cơ sở dữ liệu queries_db
, hãy chạy câu lệnh USE
Database changed
Sau khi chọn queries_db
, hãy tạo một vài bảng bên trong nó.
Để làm theo các ví dụ được sử dụng trong hướng dẫn này, hãy tưởng tượng rằng bạn điều hành một sáng kiến dọn dẹp các công viên công cộng ở Thành phố New York. Chương trình gồm các tình nguyện viên cam kết làm sạch công viên thành phố gần nhà bằng cách thường xuyên nhặt rác. Khi tham gia sáng kiến, mỗi tình nguyện viên này đặt mục tiêu có bao nhiêu túi rác mà họ muốn nhặt mỗi tuần. Bạn quyết định lưu trữ thông tin về mục tiêu của tình nguyện viên trong cơ sở dữ liệu SQL với một bảng có năm cột:
vol_id
: số nhận dạng của mỗi tình nguyện viên, được thể hiện bằng kiểu dữ liệu int
Cột này sẽ đóng vai trò là khóa chính của bảng, nghĩa là mỗi giá trị sẽ hoạt động như một số nhận dạng duy nhất cho hàng tương ứng của nó. Bởi vì mọi giá trị trong khóa chính phải là duy nhất, cột này cũng sẽ có một UNIQUE
được áp dụng cho nóname
mỗi tình nguyện viên, được thể hiện bằng varchar
với tối đa 20 ký tựpark
: tên công viên nơi mỗi tình nguyện viên sẽ nhặt rác, được thể hiện bằng varchar
với tối đa 20 ký tự. Lưu ý nhiều tình nguyện viên có thể dọn rác trong cùng một công viênweekly_goal
: mục tiêu của mỗi tình nguyện viên về số lượng túi rác mà họ muốn nhặt trong một tuần, được biểu thị bằng kiểu int
max_bags
: kỷ lục cá nhân của mỗi tình nguyện viên về số lượng túi rác nhiều nhất mà họ nhặt được trong một tuần, được biểu thị dưới dạng int
Chạy câu CREATE TABLE
sau để tạo một bảng có tên là volunteers
có năm cột sau:
Sau đó tải volunteers
với một số dữ liệu mẫu. Chạy INSERT INTO
sau để thêm bảy hàng dữ liệu đại diện cho bảy tình nguyện viên của chương trình:
Như vậy, bạn đã sẵn sàng làm theo phần còn lại của hướng dẫn và bắt đầu học cách tạo truy vấn trong SQL.
SELECT
và FROM
Trong SQL, một câu lệnh là bất kỳ hoạt động nào được gửi đến hệ thống cơ sở dữ liệu sẽ thực hiện một số loại tác vụ, như tạo bảng, chèn hoặc xóa dữ liệu hoặc thay đổi cấu trúc của cột hoặc bảng. Truy vấn là một câu lệnh SQL lấy thông tin về dữ liệu được giữ trong cơ sở dữ liệu.
Riêng nó, một truy vấn sẽ không thay đổi bất kỳ dữ liệu hiện có nào được giữ trong bảng. Nó sẽ chỉ trả về thông tin về dữ liệu mà tác giả của truy vấn yêu cầu rõ ràng. Thông tin được trả về bởi một truy vấn nhất định được gọi là tập kết quả của nó. Tập kết quả thường bao gồm một hoặc nhiều cột từ một bảng được chỉ định và mỗi cột được trả về trong tập kết quả có thể chứa một hoặc nhiều hàng thông tin.
Đây là cú pháp chung của truy vấn SQL:
Các câu lệnh SQL được tạo thành từ các mệnh đề khác nhau, bao gồm các từ khóa nhất định và thông tin mà các từ khóa này yêu cầu. Ở mức tối thiểu, các truy vấn SQL chỉ yêu cầu bạn bao gồm hai mệnh đề: mệnh đề SELECT
và FROM
.
Lưu ý : Trong cú pháp ví dụ này, cả hai mệnh đề đều được viết trên dòng riêng của chúng. Tuy nhiên, bất kỳ câu lệnh SQL nào cũng có thể được viết trên một dòng, như sau:
Hướng dẫn này sẽ tuân theo quy ước kiểu SQL phổ biến là tách các câu lệnh thành nhiều dòng để mỗi dòng chỉ chứa một mệnh đề. Điều này nhằm mục đích làm cho mỗi ví dụ dễ đọc và dễ hiểu hơn, nhưng lưu ý miễn là bạn không bao gồm bất kỳ lỗi cú pháp nào, bạn có thể viết bất kỳ truy vấn nào trên một dòng hoặc trên nhiều dòng tùy thích.
Mọi truy vấn SQL đều bắt đầu bằng SELECT
, dẫn đến một số đề cập đến các truy vấn nói chung là SELECT
. Sau SELECT
xuất hiện danh sách bất kỳ cột nào bạn muốn được trả về trong tập kết quả. Các cột này được vẽ từ bảng được chỉ định trong mệnh đề FROM
Trong các truy vấn SQL, thứ tự thực hiện bắt đầu bằng mệnh đề FROM
Điều này có thể gây nhầm lẫn vì SELECT
được viết trước FROM
, nhưng hãy nhớ rằng RDBMS trước tiên phải biết tập dữ liệu làm việc đầy đủ được truy vấn trước khi bắt đầu truy xuất thông tin từ nó. Có thể hữu ích khi coi các truy vấn là SELECT
các cột được chỉ định FROM
bảng được chỉ định. Cuối cùng, điều quan trọng cần lưu ý là mọi câu lệnh SQL phải kết thúc bằng dấu chấm phẩy ( ;
).
Như một ví dụ, hãy chạy truy vấn sau. Thao tác này sẽ lấy cột name
từ bảng volunteers
Đây là tập hợp kết quả của truy vấn này:
+------------+
| name |
+------------+
| Gladys |
| Catherine |
| Georgeanna |
| Wanda |
| Ann |
| Juanita |
| Georgia |
+------------+
7 rows in set (0.00 sec)
Mặc dù thao tác này đã xem xét toàn bộ volunteers
, nhưng nó chỉ trả về cột, name
được chỉ định.
Bạn có thể truy xuất thông tin từ nhiều cột bằng cách tách tên của mỗi cột bằng dấu phẩy, như trong truy vấn sau. Thao tác này sẽ trả về các vol_id
, name
và park
từ bảng volunteers
+-------------------+------------+--------+
| park | name | vol_id |
+-------------------+------------+--------+
| Prospect Park | Gladys | 1 |
| Central Park | Catherine | 2 |
| Central Park | Georgeanna | 3 |
| Van Cortland Park | Wanda | 4 |
| Prospect Park | Ann | 5 |
| Riverside Park | Juanita | 6 |
| Prospect Park | Georgia | 7 |
+-------------------+------------+--------+
7 rows in set (0.00 sec)
Lưu ý tập kết quả này trả về park
đầu tiên, tiếp theo là name
và sau đó là vol_id
. Database SQL thường sẽ trả về các cột theo bất kỳ thứ tự nào mà chúng được liệt kê trong mệnh đề SELECT
Có thể có lúc bạn muốn truy xuất mọi cột từ một bảng. Thay vì viết ra tên của mọi cột trong truy vấn của bạn, thay vào đó bạn có thể nhập dấu hoa thị ( *
). Trong SQL, đây là cách viết tắt của “mọi cột”.
Truy vấn sau sẽ trả về mọi cột từ bảng volunteers
+--------+------------+-------------------+-------------+----------+
| vol_id | name | park | weekly_goal | max_bags |
+--------+------------+-------------------+-------------+----------+
| 1 | Gladys | Prospect Park | 3 | 5 |
| 2 | Catherine | Central Park | 2 | 2 |
| 3 | Georgeanna | Central Park | 2 | 1 |
| 4 | Wanda | Van Cortland Park | 1 | 1 |
| 5 | Ann | Prospect Park | 2 | 7 |
| 6 | Juanita | Riverside Park | 1 | 4 |
| 7 | Georgia | Prospect Park | 1 | 3 |
+--------+------------+-------------------+-------------+----------+
7 rows in set (0.00 sec)
Lưu ý cách các cột của tập kết quả này được liệt kê theo cùng thứ tự mà chúng được xác định trong câu CREATE TABLE
từ phần Kết nối với MySQL và Cài đặt Database Mẫu trước đó. Đây là cách hầu hết các hệ thống cơ sở dữ liệu quan hệ sẽ sắp xếp thứ tự các cột trong tập kết quả khi chạy một truy vấn sử dụng dấu hoa thị thay cho các tên cột riêng lẻ.
Lưu ý bạn có thể lấy thông tin từ nhiều bảng trong cùng một truy vấn với từ khóa JOIN
Bạn có thể làm theo hướng dẫn về Cách sử dụng tham gia trong SQL để biết chi tiết về cách thực hiện việc này.
DISTINCT
Theo mặc định, các RDBMS sẽ trả về mọi giá trị từ một cột được trả về bởi một truy vấn, bao gồm cả các giá trị trùng lặp.
Như một ví dụ, hãy chạy truy vấn sau. Kết quả sẽ trả về các giá trị từ cột park
của bảng volunteers
+-------------------+
| park |
+-------------------+
| Prospect Park |
| Central Park |
| Central Park |
| Van Cortland Park |
| Prospect Park |
| Riverside Park |
| Prospect Park |
+-------------------+
7 rows in set (0.00 sec)
Lưu ý cách tập hợp kết quả này bao gồm hai giá trị trùng lặp: Prospect Park
và Central Park
. Điều này có ý nghĩa, vì nhiều tình nguyện viên có thể dọn rác trong cùng một công viên. Tuy nhiên, có thể có lúc bạn chỉ muốn biết những giá trị duy nhất nào được giữ trong một cột. Bạn có thể đưa ra các truy vấn loại bỏ các giá trị trùng lặp bằng cách thực hiện theo SELECT
với từ khóa DISTINCT
Truy vấn sau sẽ trả về mọi giá trị duy nhất trong parks
, loại bỏ mọi trùng lặp. Nó giống với truy vấn trước đó ngoại trừ nó bao gồm từ khóa DISTINCT
+-------------------+
| park |
+-------------------+
| Prospect Park |
| Central Park |
| Van Cortland Park |
| Riverside Park |
+-------------------+
4 rows in set (0.00 sec)
Tập hợp kết quả của truy vấn này có ít hơn ba hàng so với tập hợp trước đó, vì nó đã loại bỏ một trong các Central Park
và hai trong số các giá trị Prospect Park
Lưu ý SQL xử lý mọi hàng của tập kết quả như một bản ghi riêng lẻ và DISTINCT
sẽ chỉ loại bỏ các bản sao nếu nhiều hàng chia sẻ các giá trị giống nhau trong mỗi cột
Để minh họa điều này, ban hành các truy vấn sau đây bao gồm các DISTINCT
từ khóa nhưng lợi nhuận cả name
và park
cột:
+------------+-------------------+
| name | park |
+------------+-------------------+
| Gladys | Prospect Park |
| Catherine | Central Park |
| Georgeanna | Central Park |
| Wanda | Van Cortland Park |
| Ann | Prospect Park |
| Juanita | Riverside Park |
| Georgia | Prospect Park |
+------------+-------------------+
7 rows in set (0.00 sec)
Các giá trị trùng lặp trong park
- ba lần xuất hiện của Prospect Park
và hai lần của Central Park
- xuất hiện trong tập kết quả này, ngay cả khi truy vấn bao gồm từ khóa DISTINCT
Mặc dù các cột riêng lẻ trong một tập hợp kết quả có thể chứa các giá trị trùng lặp, toàn bộ một hàng phải là một bản sao chính xác của một hàng khác để DISTINCT
loại bỏ nó. Trong trường hợp này, mọi giá trị trong name
là duy nhất nên DISTINCT
không xóa bất kỳ hàng nào khi cột đó được chỉ định trong mệnh đề SELECT
WHERE
Có thể đôi khi bạn muốn truy xuất thông tin chi tiết hơn từ các bảng trong cơ sở dữ liệu. Bạn có thể lọc ra các hàng nhất định bằng cách bao gồm WHERE
trong truy vấn của bạn sau FROM
, như trong:
Theo sau WHERE
trong cú pháp ví dụ này là điều kiện tìm kiếm , là điều kiện thực sự xác định hàng nào được lọc ra khỏi tập kết quả. Điều kiện tìm kiếm là một tập hợp một hoặc nhiều vị từ hoặc biểu thức có thể đánh giá một hoặc nhiều biểu thức giá trị. Trong SQL, một biểu thức giá trị - đôi khi còn gọi là biểu thức vô hướng - là bất kỳ biểu thức nào sẽ trả về một giá trị duy nhất. Biểu thức giá trị có thể là giá trị chữ (như chuỗi hoặc giá trị số), biểu thức toán học hoặc tên cột.
Các vị từ trong WHERE
có thể có nhiều dạng, nhưng chúng thường tuân theo cú pháp sau:
. . .
WHERE value expression OPERATOR value_expression
. . .
Sau WHERE
, bạn cung cấp một biểu thức giá trị theo sau bởi một trong một số toán tử SQL đặc biệt được sử dụng để đánh giá các giá trị của cột so với biểu thức giá trị (hoặc biểu thức giá trị) đứng sau toán tử. Có một số toán tử như vậy có sẵn trong SQL và hướng dẫn này sẽ nêu rõ một số toán tử trong số đó sau trong phần này, nhưng với mục đích minh họa, nó sẽ chỉ tập trung vào một trong những toán tử được sử dụng phổ biến nhất: dấu bằng ( =
). Toán tử này kiểm tra xem hai biểu thức giá trị có tương đương nhau hay không.
Các dự đoán luôn trả về kết quả là “true”, “false” hoặc “không xác định”. Khi chạy các truy vấn SQL có chứa WHERE
, DBMS sẽ áp dụng điều kiện tìm kiếm tuần tự cho mọi hàng trong bảng được xác định trong mệnh đề FROM
Nó sẽ chỉ trả về các hàng mà mọi vị từ trong điều kiện tìm kiếm đánh giá là “true”.
Để minh họa ý tưởng này, hãy chạy SELECT
sau. Truy vấn này trả về các giá trị từ cột name
của bảng volunteers
Tuy nhiên, thay vì đánh giá các giá trị từ một trong các cột của bảng, WHERE
này kiểm tra xem hai biểu thức giá trị - (2 + 2)
và 4
- có tương đương hay không:
Bởi vì (2 + 2)
luôn bằng 4
, điều kiện tìm kiếm này đánh giá là "đúng" cho mọi hàng trong bảng. Do đó, mọi name
của hàng được trả về trong tập kết quả:
+------------+
| name |
+------------+
| Gladys |
| Catherine |
| Georgeanna |
| Wanda |
| Ann |
| Juanita |
| Georgia |
+------------+
7 rows in set (0.00 sec)
Bởi vì điều kiện tìm kiếm này luôn trả về kết quả là "true", nên nó không hữu ích lắm. Bạn cũng có thể không bao gồm WHERE
, vì SELECT name FROM volunteers;
sẽ tạo ra cùng một tập kết quả.
Thay vì so sánh hai giá trị theo nghĩa đen như thế này, thông thường bạn sẽ sử dụng tên cột làm một trong các biểu thức giá trị trong điều kiện tìm kiếm của mệnh đề WHERE
Bằng cách đó, bạn đang yêu cầu hệ thống quản lý cơ sở dữ liệu sử dụng giá trị của mỗi hàng từ cột đó như một biểu thức giá trị cho việc lặp lại điều kiện tìm kiếm của hàng đó.
WHERE
của truy vấn sau áp dụng điều kiện tìm kiếm độc quyền hơn cho mỗi hàng. Nó sẽ trả về name
và max_bags
từ bất kỳ hàng nào có giá trị max_bags
4
:
max_bags
của một tình nguyện viên chính xác bằng 4
, vì vậy truy vấn chỉ trả về bản ghi của tình nguyện viên đó:
+---------+----------+
| name | max_bags |
+---------+----------+
| Juanita | 4 |
+---------+----------+
1 row in set (0.00 sec)
Bạn cũng có thể đánh giá các giá trị chuỗi ký tự trong các vị từ điều kiện tìm kiếm. Truy vấn sau đây trả về vol_id
và name
của mọi hàng có giá trị name
'Wanda'
:
Bởi vì chỉ có một tình nguyện viên tên là Wanda
, truy vấn chỉ trả về thông tin từ hàng đó:
+--------+-------+
| vol_id | name |
+--------+-------+
| 4 | Wanda |
+--------+-------+
1 row in set (0.00 sec)
Để nhắc lại, tất cả các ví dụ của phần này đều sử dụng cùng một toán tử điều kiện tìm kiếm - dấu bằng - để lọc dữ liệu. Tuy nhiên, có một số loại toán tử khác cho phép bạn viết nhiều vị từ khác nhau, cung cấp khả năng kiểm soát cao đối với thông tin mà truy vấn của bạn trả về.
Tiêu chuẩn SQL xác định 18 loại vị từ khác nhau, mặc dù không phải tất cả chúng đều được hỗ trợ trên mọi RDBMS. Dưới đây là năm loại vị từ điều kiện tìm kiếm được sử dụng phổ biến nhất và các toán tử chúng sử dụng:
So sánh : Các vị từ so sánh so sánh một biểu thức giá trị này với một biểu thức giá trị khác; trong các truy vấn, luôn có trường hợp ít nhất một trong những biểu thức giá trị này là tên của một cột. Sáu toán tử so sánh là:
=
: kiểm tra xem hai giá trị có tương đương nhau không<>
: kiểm tra xem hai giá trị có tương đương không<
: kiểm tra xem giá trị đầu tiên có nhỏ hơn giá trị thứ hai hay không>
: kiểm tra xem giá trị đầu tiên có lớn hơn giá trị thứ hai hay không<=
: kiểm tra xem giá trị đầu tiên nhỏ hơn hoặc bằng giá trị thứ hai>=
: kiểm tra xem giá trị đầu tiên lớn hơn hoặc bằng giá trị thứ haiNull : Các dự đoán sử dụng IS NULL
kiểm tra xem các giá trị trong một cột nhất định có phải là Null hay không
Phạm vi : Các vị từ phạm vi sử dụng BETWEEN
để kiểm tra xem một biểu thức giá trị có nằm giữa hai biểu thức giá trị khác hay không
Thành viên : Loại vị từ này sử dụng IN
để kiểm tra xem một giá trị có phải là thành viên của một tập hợp nhất định hay không
Đối sánh mẫu : Các vị từ đối sánh mẫu sử dụng LIKE
để kiểm tra xem một giá trị có trùng với mẫu chuỗi có chứa giá trị ký tự đại diện hay không
Nó nằm ngoài phạm vi của hướng dẫn này để đi sâu vào từng loại vị từ này một cách chi tiết hơn. Tuy nhiên, nếu bạn muốn tìm hiểu thêm về chúng, ta khuyến khích bạn xem các hướng dẫn sau:
BETWEEN
và IN
Để tìm hiểu thêm về WHERE
nói chung, vui lòng xem hướng dẫn về Cách sử dụng mệnh đề WHERE trong SQL .
ORDER BY
Đôi khi các truy vấn sẽ trả về thông tin theo những cách có thể không trực quan hoặc có thể không phù hợp với nhu cầu cụ thể của bạn. Bạn có thể sắp xếp kết quả truy vấn bằng cách thêm ORDER BY
vào cuối câu lệnh truy vấn của bạn.
Đây là cú pháp chung của truy vấn với mệnh đề ORDER BY
Để minh họa cách hoạt động của điều này, giả sử bạn muốn biết tình nguyện viên nào của bạn có giá trị max_bags
Bạn có thể chạy truy vấn sau để trả về name
và giá trị max_bags
từ bảng volunteers
Tuy nhiên, truy vấn này sắp xếp tập hợp kết quả theo thứ tự mỗi hàng được thêm vào:
+------------+----------+
| name | max_bags |
+------------+----------+
| Gladys | 5 |
| Catherine | 2 |
| Georgeanna | 1 |
| Wanda | 1 |
| Ann | 7 |
| Juanita | 4 |
| Georgia | 3 |
+------------+----------+
7 rows in set (0.00 sec)
Đối với một tập dữ liệu tương đối nhỏ như thế này, thứ tự của tập kết quả không quá quan trọng và bạn có thể chỉ cần quét max_bags
của tập kết quả này để tìm giá trị cao nhất. Tuy nhiên, điều này có thể nhanh chóng trở nên tẻ nhạt khi làm việc với lượng dữ liệu lớn hơn.
Thay vào đó, bạn có thể chạy cùng một truy vấn nhưng thêm ORDER BY
sắp xếp tập hợp kết quả dựa trên giá trị max_bags
+------------+----------+
| name | max_bags |
+------------+----------+
| Georgeanna | 1 |
| Wanda | 1 |
| Catherine | 2 |
| Georgia | 3 |
| Juanita | 4 |
| Gladys | 5 |
| Ann | 7 |
+------------+----------+
7 rows in set (0.00 sec)
Như kết quả này chỉ ra, hành vi mặc định của các truy vấn SQL bao gồm ORDER BY
là sắp xếp các giá trị của cột được chỉ định theo thứ tự tăng dần (tăng dần). Bạn có thể thay đổi hành vi này và sắp xếp chúng theo thứ tự giảm dần bằng cách thêm từ khóa DESC
vào mệnh đề ORDER BY
+------------+----------+
| name | max_bags |
+------------+----------+
| Ann | 7 |
| Gladys | 5 |
| Juanita | 4 |
| Georgia | 3 |
| Catherine | 2 |
| Georgeanna | 1 |
| Wanda | 1 |
+------------+----------+
7 rows in set (0.00 sec)
Bằng cách đọc hướng dẫn này, bạn đã học cách viết các truy vấn cơ bản, cũng như lọc và sắp xếp các tập kết quả truy vấn. Mặc dù các lệnh hiển thị ở đây sẽ hoạt động trên hầu hết các cơ sở dữ liệu quan hệ, nhưng hãy lưu ý mọi cơ sở dữ liệu SQL sử dụng cách triển khai ngôn ngữ duy nhất của riêng nó. Bạn nên tham khảo tài liệu chính thức của DBMS để có mô tả đầy đủ hơn về từng lệnh và tập hợp đầy đủ các tùy chọn của chúng.
Nếu bạn muốn tìm hiểu thêm về cách làm việc với SQL, ta khuyến khích bạn xem các hướng dẫn khác trong loạt bài này về Cách sử dụng SQL .