Cho đến nay, chúng tôi đã tạo một cơ sở dữ liệu, thêm hai bảng và chèn dữ liệu vào cả hai bảng. Bây giờ chúng ta sẽ xem xét cách truy xuất dữ liệu đó. Nhưng không chỉ truy xuất dữ liệu, nhưng để truy vấn cơ sở dữ liệu cho nó.
SQL là viết tắt của Ngôn ngữ truy vấn có cấu trúc . Đó là Truy vấn bit làm cho SQL trở nên mạnh mẽ như vậy. SQL là ngôn ngữ cho phép bạn chạy truy vấn chống lại cơ sở dữ liệu của bạn. Nó cho phép bạn truy vấn cơ sở dữ liệu cho dữ liệu mà bạn muốn.
SQL SELECT
Tuyên bố
Khi nói đến truy vấn cơ sở dữ liệu MySQL của bạn, SQL SELECT
tuyên bố làm cho tất cả có thể. Đây có thể là câu lệnh SQL được sử dụng thường xuyên nhất của bạn khi làm việc với MySQL. SELECT
câu lệnh cho phép bạn mô tả cho MySQL chính xác dữ liệu mà bạn muốn nó truy xuất.
Hãy xem xét câu lệnh SQL sau:
SELECT * FROM Fruit;
Đây là kết quả:
Đây là SELECT
câu lệnh đơn giản nhất. Câu lệnh SQL trên truy xuất tất cả các bản ghi từ
Fruit
bảng.
Dấu hoa thị (*
) yêu cầu MySQL trả về tất cả các cột. Điều này giúp chúng tôi tiết kiệm thời gian và công sức. Nếu không có điều này, chúng tôi cần viết tên của tất cả các cột mà chúng tôi muốn trả về.
Nói như vậy, bạn cũng có thể yêu cầu MySQL chỉ trả về những cột mà bạn muốn trả lại. Điều này được thực hiện bằng cách chỉ đặt tên cho những cột mà bạn muốn trả về. Như thế này:
SELECT FruitId, FruitName FROM Fruit;
Đây là kết quả:
Câu lệnh SQL trên chọn FruitId và FruitName các cột từ Fruit bảng.
Làm điều này có thể giảm bớt sự lộn xộn để bạn chỉ thấy những cột mà bạn quan tâm. Nó cũng có thể tăng hiệu suất vì MySQL (và bất kỳ ứng dụng nào bạn sử dụng) không cần sử dụng các tài nguyên có giá trị để trả về dữ liệu không cần thiết.
Một lần nữa, truy vấn này truy xuất lại tất cả bản ghi từ bảng - MySQL sẽ trả về tất cả các bản ghi trừ khi được chỉ định khác.
WHERE
Mệnh đề
Bạn có thể thêm WHERE
để thu hẹp kết quả được đặt thành chỉ những bản ghi mà bạn quan tâm. Như thế này:
SELECT * FROM Fruit WHERE UnitId = 1;
Kết quả:
Truy vấn trên trả về tất cả các bản ghi từ
Fruit
bảng trong đó
UnitId
cột có giá trị là 1
.
Truy vấn con - SELECT
lồng nhau Tuyên bố
Điều gì sẽ xảy ra nếu chúng ta không biết
UnitId
? Điều gì sẽ xảy ra nếu chúng ta chỉ biết tìm kiếm những bản ghi đó với tên đơn vị là Piece
?
Dễ dàng! Chúng ta có thể viết lại ví dụ trên để sử dụng SELECT
lồng nhau câu lệnh (hay còn gọi là một truy vấn con ) truy vấn một bảng khác (
Đơn vị
bàn). Làm điều này sẽ cho phép chúng tôi sử dụng đơn vị thực tế name (thay vì ID của nó) vì bảng thứ hai chứa cái này trong UnitName
lĩnh vực:
SELECT * FROM Fruit WHERE UnitId = (SELECT UnitId FROM Units WHERE UnitName = 'Piece');
Kết quả:
Ở đây chúng tôi sử dụng SELECT
lồng nhau câu lệnh (tức là một SELECT
câu lệnh trong SELECT
câu lệnh) để truy vấn
Đơn vị
bảng cho
UnitId
của bản ghi có chứa Piece
dưới dạng
UnitName
của nó giá trị. Chúng tôi có thể làm điều này vì
Fruit.UnitId
là một khóa ngoại đối với
Units.UnitId
cột.
Dưới đây là các ví dụ khác về truy vấn phụ nếu bạn quan tâm.
Sử dụng JOIN
trong SQL
Tiến thêm một bước nữa, chúng tôi có thể viết lại SELECT
lồng nhau của chúng tôi câu lệnh thành một INNER JOIN
.
Trong SQL, một JOIN
cho phép bạn truy vấn nhiều bảng chia sẻ dữ liệu. Trong trường hợp của chúng tôi, cả hai bảng đều chia sẻ UnitId
vì vậy bạn có thể nói rằng chúng được trường này "tham gia".
Có nhiều kiểu nối khác nhau trong SQL, tuy nhiên, chúng tôi chủ yếu quan tâm đến INNER JOIN
bây giờ.
INNER JOIN
cú pháp như sau:
SELECT * FROM table_name_1 INNER JOIN table_name_2 ON table_name_1.column_name = table_name_2.column_name
Vì vậy, chúng tôi có thể viết lại truy vấn con của mình từ ví dụ trước thành sau:
SELECT Fruit.* FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Units.UnitName = 'Piece';
Kết quả:
Chúng tôi đã chỉ định Fruit.*
thay vì chỉ *
bởi vì chúng tôi chỉ muốn trả về tất cả các cột từ
Fruit
bàn. Nếu chúng tôi đã sử dụng *
, truy vấn sẽ trả về tất cả các cột từ cả hai bảng.
Ngoài ra, hãy xem LEFT JOIN
và RIGHT JOIN
để xem bạn có thể nhận được các dữ liệu khác nhau như thế nào tùy thuộc vào loại kết hợp.
Truy vấn con so với JOIN
?
Bây giờ bạn đã thấy hai phương pháp để đạt được cùng một kết quả, có lẽ bạn đang tự hỏi phương pháp nào tốt hơn?
Truy vấn phụ có xu hướng dễ đọc hơn (và có lẽ dễ hiểu hơn), điều này có thể giúp người mới bắt đầu nắm bắt dễ dàng hơn.
Tuy nhiên, nhiều lập trình viên SQL tìm thấy JOIN
s hiệu quả hơn và hoạt động tốt hơn. Nếu bạn gặp sự cố về hiệu suất với các truy vấn của mình hoặc ứng dụng, hãy thử chuyển đổi bất kỳ truy vấn con nào thành JOIN
s hoặc ngược lại (trong một số trường hợp, một truy vấn phụ có thể hoạt động tốt hơn).
Ngoài ra, có thể có trường hợp truy vấn con là lựa chọn duy nhất của bạn, vì vậy đây cũng là một lựa chọn cần cân nhắc.
Các nhà khai thác khác
Các truy vấn của chúng tôi cho đến nay đều chứa một dấu bằng (=
). Đây được gọi là một toán tử . Cụ thể hơn, đó là một toán tử so sánh vì nó so sánh một biểu thức này với một biểu thức khác.
Có nhiều toán tử khác mà bạn có thể sử dụng trong các truy vấn của mình. Những điều này có thể hỗ trợ rất nhiều trong việc thu hẹp tập hợp kết quả thành chỉ những bản ghi mà bạn yêu cầu. Không có gì lạ khi một cơ sở dữ liệu chứa hàng triệu bản ghi. Ngay cả khi bạn chỉ có hàng nghìn bản ghi, cố gắng tìm một bản ghi (hoặc thậm chí chỉ một số ít) trong số hàng nghìn bản ghi sẽ là một nhiệm vụ rất khó khăn nếu bạn không có các toán tử này theo ý mình.
Dưới đây là một số toán tử SQL được sử dụng phổ biến hơn.
>
Nhà điều hành
Bạn có thể sử dụng >
toán tử để chọn dữ liệu lớn hơn hơn một giá trị nhất định.
SELECT * FROM Fruit WHERE Inventory > 10;
<
Nhà điều hành
Bạn có thể sử dụng <
toán tử để chọn dữ liệu ít hơn hơn một giá trị nhất định.
SELECT * FROM Fruit WHERE Inventory < 10;
<>
Nhà điều hành
Bạn có thể sử dụng <>
toán tử để chọn dữ liệu vừa nhỏ hơn và lớn hơn một giá trị nhất định.
SELECT * FROM Fruit WHERE Inventory <> 10;
>=
Nhà điều hành
Bạn có thể sử dụng >=
toán tử để chọn dữ liệu lớn hơn hoặc bằng một giá trị nhất định.
SELECT * FROM Fruit WHERE Inventory >= 10;
<=
Nhà điều hành
Bạn có thể sử dụng <=
toán tử để chọn dữ liệu nhỏ hơn hoặc bằng một giá trị nhất định.
SELECT * FROM Fruit WHERE Inventory <= 10;
AND
Nhà điều hành
Bạn có thể thêm AND
toán tử cho WHERE
để giới hạn lựa chọn của bạn chỉ với những bản ghi đáp ứng hai điều kiện (hoặc nhiều hơn nếu bạn bao gồm thêm AND
toán tử).
Đây là một ví dụ:
SELECT * FROM Fruit WHERE Inventory > 10 AND DateEntered > '2015-01-15';
OR
Nhà điều hành
Bạn có thể sử dụng OR
để mở rộng lựa chọn của bạn cho nhiều hơn một tiêu chí. Như tên cho thấy, OR
mệnh đề cho phép bạn chọn dữ liệu trong đó tiêu chí là HOẶC điều đó. Vì vậy, AND
toán tử giới hạn lựa chọn của bạn và OR
toán tử mở rộng nó.
Đây là một ví dụ:
SELECT * FROM Fruit WHERE UnitId = 1 OR UnitId = 2;
BETWEEN
Nhà điều hành
Sử dụng BETWEEN
toán tử để chọn dữ liệu nằm giữa hai giá trị nhất định.
SELECT * FROM Fruit WHERE DateEntered BETWEEN '2015-01-25' AND '2015-02-25';
NOT
Nhà điều hành
Sử dụng NOT
toán tử để chọn dữ liệu không tương đương với một điều kiện nhất định.
SELECT * FROM Fruit WHERE NOT (FruitName = 'Apple');