Bài viết này là một phần trong loạt bài tiếp theo của Robert Sheldon về Học MySQL. Để xem tất cả 11 mục trong sê-ri, hãy nhấp vào đây
Cho đến thời điểm này trong loạt bài này, tôi chủ yếu tập trung vào việc tạo các đối tượng lược đồ trong cơ sở dữ liệu MySQL. Các câu lệnh SQL được sử dụng để tạo các đối tượng này thường được phân loại là ngôn ngữ định nghĩa dữ liệu [DDL]. Chúng bao gồm các câu như CREATE
TABLE
, CREATE
VIEW
, và CREATE
PROCEDURE
Bắt đầu với bài viết này, tôi đang chuyển sự chú ý của mình sang ngôn ngữ thao tác dữ liệu [DML], bao gồm các câu lệnh được sử dụng để truy vấn và sửa đổi dữ liệu. Bốn trong số các câu lệnh DML phổ biến nhất là SELECT
, INSERT
, UPDATE
và DELETE
. Bạn có thể sử dụng câu lệnh SELECT
để truy xuất dữ liệu, câu lệnh INSERT
để thêm dữ liệu, câu lệnh UPDATE
để sửa đổi dữ liệu và câu lệnh DELETE
để xóa dữ liệu
Trong bài viết này, tôi tập trung vào câu lệnh SELECT
, được sử dụng nhiều khi làm việc với cơ sở dữ liệu quan hệ. Bạn có thể sử dụng câu lệnh SELECT
để trả về dữ liệu từ một hoặc nhiều bảng MySQL, cũng như để truy xuất thông tin về máy chủ và môi trường cơ sở dữ liệu. Câu lệnh SELECT
là một trong những câu lệnh SQL được sử dụng phổ biến nhất trong MySQL. Nó cũng là một trong những phức tạp nhất
Bạn đã biết về câu lệnh SELECT
trong các bài viết trước của loạt bài này, nhưng nó chỉ được đưa vào để hỗ trợ các ví dụ DDL trong các bài viết đó. Bài viết này chỉ tập trung vào câu lệnh SELECT
và các yếu tố cơ bản để xây dựng một câu lệnh. Tôi sẽ đề cập đến các câu lệnh DML khác sau trong loạt bài này
Chuẩn bị môi trường MySQL của bạn
Đối với các ví dụ trong bài viết này, tôi đã sử dụng cùng một cơ sở dữ liệu [_______1_______9] mà bạn đã thấy trong các bài viết trước và hai bảng giống nhau [CREATE
0 và CREATE
1]. Tuy nhiên, tôi đã thêm nhiều dữ liệu hơn vào khoảng thời gian này. Nếu muốn tự mình thử các ví dụ, bạn có thể tải xuống tệp MySQL_06_setup và chạy nó với phiên bản MySQL của bạn. SQL trong tệp tạo cơ sở dữ liệu, thêm hai bảng và chèn dữ liệu vào cả hai bảng
Để thuận tiện cho bạn, tôi đã bao gồm hai định nghĩa bảng ở đây để bạn có thể tham khảo chúng khi thử các câu lệnh SELECT
trong các ví dụ sau của bài viết
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
TẠO BẢNG nhà sản xuất [
manufacturer_id INT CHƯA KÝ KHÔNG NULL AUTO_INCREMENT,
nhà sản xuất VARCHAR[50] NOT NULL,
create_date DẤU THỜI GIAN NOT NULL DEFAULT CURRENT_TIMESTAMP,
last_update DẤU THỜI GIAN NOT NULL
MẶC ĐỊNH CURRENT_TIMESTAMP BẬT CẬP NHẬT CURRENT_TIMESTAMP,
CHÍNH CHÍNH KEY [manufacturer_id] ]
ENGINE=InnoDB AUTO_INCREMENT=1001;
TẠO BẢNG máy bay [
plane_id INT KHÔNG ĐƯỢC KÝ KHÔNG NULL AUTO_INCREMENT,
máy bay VARCHAR[50] NOT NULL,
manufacturer_id INT CHƯA KÝ KHÔNG NULL,
engine_type VARCHAR[50] NOT NULL,
engine_count TINYINT NOT NULL,
max_weight VỪA KHÔNG ĐƯỢC KÝ KHÔNG NULL,
sải cánh THẬP PHÂN[5,2] NOT NULL,
plane_length DECIMAL[5,2] NOT NULL,
parking_area INT ĐƯỢC TẠO LUÔN LUÔN AS [[wingspan * plane_length]] STORED,
icao_code CHAR[4] NOT NULL,
create_date DẤU THỜI GIAN NOT NULL DEFAULT CURRENT_TIMESTAMP,
last_update DẤU THỜI GIAN NOT NULL
MẶC ĐỊNH CURRENT_TIMESTAMP BẬT CẬP NHẬT CURRENT_TIMESTAMP,
CHÍNH CHÍNH KEY [plane_id],
HÀNG CHẾ fk_manufacturer_id FOREIGN KEY [manufacturer_id]
TÀI LIỆU THAM KHẢO nhà sản xuất [manufacturer_id] ]
ENGINE=InnoDB AUTO_INCREMENT=101;
Nếu bạn đã có cơ sở dữ liệu và bảng trên phiên bản MySQL của mình và không muốn tạo lại chúng, bạn chỉ có thể chạy các câu lệnh INSERT
trong MySQL_06_setup. tập lệnh sql. Tuy nhiên, trước tiên bạn nên xóa mọi dữ liệu trong bảng vì dữ liệu được thêm vào bảng CREATE
1 tham chiếu đến các giá trị cụ thể trong bảng CREATE
0. Bắt đầu với các bảng trống cũng sẽ đảm bảo rằng bạn đang thấy kết quả giống như trong ví dụ của tôi. Khi bạn chạy các câu lệnh INSERT
, hãy đảm bảo thực hiện chúng theo thứ tự được chỉ định trong tệp
Cú pháp câu lệnh CREATE
7
Câu lệnh MySQL SELECT
thường được sử dụng để truy xuất dữ liệu từ một bảng hoặc từ nhiều bảng. Câu lệnh được tạo thành từ một hoặc nhiều mệnh đề cùng nhau cung cấp logic cần thiết để truy xuất dữ liệu cần thiết. Cú pháp của câu lệnh khá phức tạp, nhưng để giúp bạn bắt đầu, tôi đã thu hẹp nó xuống các yếu tố cơ bản nhất
1
2
3
4
5
6
CHỌN [TẤT CẢ . PHÂN BIỆT] select_list
[TỪ table_ref]
[WHERE where_condition]
[GROUP BY group_list]
[CÓ có_điều kiện]
[ĐẶT HÀNG BỞI order_list]
Năm mệnh đề được hiển thị trong cú pháp rất linh hoạt và có thể được sử dụng để xây dựng nhiều loại câu lệnh
- Mệnh đề
SELECT
là mệnh đề bắt buộc duy nhất trong câu lệnhSELECT
. Mệnh đề thường chỉ định các cột để truy xuất dữ liệu từ bảng hoặc nhiều bảng mục tiêu, nhưng nó cũng có thể được sử dụng để trả về kết quả của một biểu thức, chẳng hạn như hàm hệ thống hoặc phép tính - Mệnh đề
VIEW
1 chỉ định bảng mục tiêu hoặc các bảng để truy xuất dữ liệu. Nếu bạn chỉ định nhiều bảng, bạn đang thực hiện nối - Mệnh đề
VIEW
2 hoạt động như một bộ lọc giới hạn các hàng được trả về bởi truy vấn. Mệnh đề xác định một hoặc nhiều điều kiện tìm kiếm phải được đánh giá là đúng đối với một hàng được trả về. Nhiều điều kiện tìm kiếm được liên kết với nhau bằng các toán tử logic xác định cách áp dụng các điều kiện đó - Mệnh đề
VIEW
3VIEW
4 nhóm dữ liệu dựa trên một hoặc nhiều biểu thức được chỉ định, thường là các cột trong bảng mục tiêu - Mệnh đề
VIEW
5 tương tự như mệnh đềVIEW
2 vì nó xác định một hoặc nhiều điều kiện tìm kiếm giới hạn kết quả. Tuy nhiên, mệnh đềVIEW
5 dành riêng cho dữ liệu được nhóm và được xử lý sau mệnh đềVIEW
3VIEW
9 - Mệnh đề
CREATE
0VIEW
4 sắp xếp dữ liệu dựa trên một hoặc nhiều biểu thức được chỉ định, thường là các cột trong bảng mục tiêu
Có một số mệnh đề và tùy chọn khác mà tôi chưa đưa vào đây và chúng cũng rất quan trọng để hiểu, nhưng hiện tại, năm mệnh đề này cung cấp một điểm khởi đầu tốt để học cách sử dụng câu lệnh SELECT
để truy vấn cơ sở dữ liệu
Mệnh đề CREATE
7
Ở mức tối thiểu, mệnh đề SELECT
yêu cầu từ khóa SELECT
và danh sách lựa chọn, được tạo thành từ một hoặc nhiều biểu thức. Một biểu thức có thể là tên cột, phép tính, hàm, truy vấn con, giá trị bằng chữ hoặc cấu trúc khác. Danh sách lựa chọn thường bao gồm các cột từ các bảng được tham chiếu trong mệnh đề VIEW
1 [nếu có một bảng]
Không giống như các mệnh đề khác trong câu lệnh SELECT
, mệnh đề SELECT
có thể tự đứng để tạo ra một câu lệnh rất đơn giản. Ví dụ: câu lệnh SELECT
sau chỉ bao gồm mệnh đề SELECT
và danh sách lựa chọn trong mệnh đề đó chỉ bao gồm một biểu thức
1
CHỌN CURRENT_TIMESTAMP;
Trong trường hợp này, biểu thức là hàm PROCEDURE
1, trả về ngày và giờ hiện tại. Nếu bạn chạy câu lệnh này, MySQL sẽ trả về một giá trị chứa cả ngày và giờ ở định dạng phụ thuộc vào cài đặt máy chủ và vị trí của bạn. Ví dụ: khi tôi chạy câu lệnh, tôi nhận được kết quả sau
1
2022-06-03 15:03. 13
Như bạn có thể thấy, một câu lệnh SELECT
có thể khá cơ bản, miễn là nó bao gồm mệnh đề SELECT
và một danh sách lựa chọn có ít nhất một biểu thức
Mệnh đề PROCEDURE
4
Mệnh đề VIEW
1 tham chiếu đến bảng hoặc các bảng chứa dữ liệu nguồn. Mặc dù nó là một mệnh đề tùy chọn, nhưng hầu hết các câu lệnh SELECT
đều bao gồm mệnh đề VIEW
1. Nếu bạn đang nhắm mục tiêu chỉ một bảng, bạn chỉ cần chỉ định từ khóa VIEW
1, theo sau là tên bảng. Ví dụ: câu lệnh SELECT
sau đây chỉ truy xuất dữ liệu từ bảng CREATE
1
1
CHỌN * TỪ máy bay;
Lưu ý rằng mệnh đề SELECT
chỉ xác định dấu hoa thị cho danh sách chọn. Trong MySQL, giống như nhiều hệ thống cơ sở dữ liệu quan hệ, bạn có thể sử dụng dấu hoa thị để chỉ ra rằng tất cả các cột sẽ được trả về từ bảng hoặc các bảng được tham chiếu trong mệnh đề VIEW
1, trong trường hợp này, chỉ trỏ tới bảng CREATE
1. Hình 1 cho thấy một phần kết quả được trả về bởi câu lệnh này. Tổng cộng, truy vấn sẽ trả về 241 hàng
CREATE
1Câu lệnh SELECT
trong ví dụ trước thể hiện cấu trúc cơ bản cần thiết để trả về tất cả các hàng và cột từ một bảng. Tuy nhiên, bạn có thể thu hẹp mệnh đề SELECT
của mình bằng cách chỉ định các cột chính xác để trả về. Ví dụ, câu lệnh SELECT
sau đây trả về các cột SELECT
8, SELECT
9 và INSERT
0 từ bảng CREATE
1
1
2
CHỌN máy bay, loại_động cơ, engine_count
TỪ máy bay;
Lưu ý rằng các biểu thức [tên cột] trong danh sách lựa chọn được phân tách bằng dấu phẩy, nhưng không có dấu phẩy sau chính mệnh đề SELECT
. Câu lệnh SELECT
vẫn trả về 241 hàng từ bảng CREATE
1;
Hình 2. Truy xuất các cột cụ thể từ bảng CREATE
1
Bạn có thể tinh chỉnh danh sách lựa chọn của mình hơn nữa khi truy xuất dữ liệu từ bảng mục tiêu. Ví dụ: danh sách chọn trong câu lệnh SELECT
sau đây sử dụng hàm hệ thống INSERT
7 để làm tròn giá trị INSERT
8 thành số nguyên gần nhất
1
2
CHỌN mặt phẳng, VÒNG[wingspan] AS wingspan_rnd
TỪ máy bay;
Cột INSERT
8 được chuyển vào làm đối số cho hàm INSERT
7, theo sau là từ khóa UPDATE
1 và sau đó là bí danh UPDATE
2. Bí danh được gán cho cột đầu ra được tạo bởi hàm INSERT
7, như trong Hình 3. Khi chỉ định bí danh cột, bạn có thể bỏ qua từ khóa UPDATE
1, nhưng có thể hữu ích nếu giữ lại cho rõ ràng
Hình 3. Sử dụng hàm hệ thống trong biểu thức chọn
Câu lệnh SELECT
vẫn trả về 241 hàng từ bảng CREATE
1, nhưng bây giờ nó chỉ bao gồm các cột SELECT
8 và UPDATE
2. Như bạn có thể thấy từ các ví dụ trong phần này, mệnh đề SELECT
hoạt động song song với mệnh đề VIEW
1 trong việc xác định dữ liệu cột nào cần trả về. Tuy nhiên, bản thân mệnh đề VIEW
1 vẫn không thay đổi trong tất cả các ví dụ này. Khi một mệnh đề VIEW
1 được bao gồm trong một câu lệnh SELECT
, nó đóng vai trò là nền tảng để xây dựng phần còn lại của câu lệnh SELECT
Mệnh đề DELETE
5
Trong phần trước, bạn đã thấy cách sử dụng mệnh đề SELECT
để giới hạn các cột được trả về từ bảng được chỉ định trong mệnh đề VIEW
1. Mệnh đề VIEW
2 tương tự về mặt này, ngoại trừ việc nó được sử dụng để giới hạn các hàng được trả về từ bảng mục tiêu
Khi xác định mệnh đề VIEW
2, bạn cần chỉ định ít nhất một điều kiện tìm kiếm, điều kiện này phải có giá trị đúng đối với một hàng được trả về. Ví dụ: câu lệnh SELECT
sau bao gồm mệnh đề VIEW
2 giới hạn các hàng được trả về ở những hàng có giá trị SELECT
9 bằng với TABLE
03
1
2
3
CHỌN mặt phẳng, VÒNG[wingspan] AS wingspan_rnd
TỪ máy bay
WHERE engine_type = 'turboprop'; 1000 VÀ max_weight > 10000
ĐẶT HÀNG BỞI a. parking_area DESC, m. nhà sản xuất, a. máy bay;
Câu lệnh này tạo ra một liên kết bên trong, như được chỉ ra bởi các từ khóa TABLE
62 TABLE
63 trong mệnh đề VIEW
1 [ở giữa hai tên bảng]. Mệnh đề VIEW
1 cũng bao gồm mệnh đề phụ TABLE
66, quy định rằng giá trị TABLE
61 trong bảng CREATE
0 phải bằng giá trị TABLE
61 trong bảng CREATE
1
Bởi vì đây là phép nối bên trong, MySQL sẽ tìm tất cả các hàng có giá trị TABLE
61 phù hợp. Bạn phải đảm bảo rằng các tham chiếu cột của bạn trong bất kỳ mệnh đề câu lệnh SELECT
nào không mơ hồ theo bất kỳ cách nào, điều này có thể xảy ra nếu hai bảng chứa các cột có cùng tên, như trong TABLE
61. Điều này bao gồm chính mệnh đề VIEW
1
Cách dễ nhất để giải quyết bất kỳ sự mơ hồ nào là gán bí danh cho tên bảng và sau đó sử dụng các bí danh đó khi tham chiếu các cột trong phần còn lại của câu lệnh. Ví dụ: mệnh đề VIEW
1 gán bí danh TABLE
76 cho CREATE
1, vì vậy tất cả các tham chiếu cột được đặt trước một ____1_______76, theo sau là dấu chấm và sau đó là tên cột
Hình 9 cho thấy một phần kết quả được trả về bởi câu lệnh SELECT
, bao gồm tất cả 152 hàng
Hình 9. Tạo liên kết bên trong giữa hai bảng
Có nhiều thứ để tham gia hơn những gì tôi đã chỉ cho bạn ở đây, nhưng điều này ít nhất sẽ cho bạn cảm giác về cách chúng hoạt động cho đến khi chúng ta có thể dành nhiều thời gian hơn cho chúng. Trong thời gian chờ đợi, bạn có thể muốn xem tài liệu về MySQL khi tham gia. Thông tin có thể hơi khó để lướt qua, nhưng nó có thể giúp bạn hiểu rõ hơn về cách thức hoạt động của chúng
Mệnh đề TABLE
80 TABLE
29
Một mệnh đề quan trọng khác trong câu lệnh SELECT
là VIEW
3 VIEW
4, cho phép nhóm và tổng hợp dữ liệu trong các bảng mục tiêu. Mệnh đề yêu cầu ít nhất một biểu thức ngoài các từ khóa VIEW
3 VIEW
4. Biểu thức thường là một trong các cột trong bảng đích. Ví dụ: câu lệnh SELECT
sau bao gồm mệnh đề VIEW
3 VIEW
4 nhóm dữ liệu dựa trên cột TABLE
61 trong bảng CREATE
0
1
2
3
4
5
6
CHỌN m. nhà sản xuất, ĐẾM[*] AS plane_cnt
TỪ máy bay a INNER THAM GIA manufacturers m
BẬT a. manufacturer_id = m. nhà sản xuất_id
WHERE max_weight