Trong hướng dẫn SQL dành cho người mới bắt đầu này, bạn sẽ tạo cơ sở dữ liệu của riêng mình, chèn dữ liệu vào cơ sở dữ liệu đó và sau đó chạy các truy vấn đối với cơ sở dữ liệu đó.
Hướng dẫn SQL này sẽ giúp bạn chạy các truy vấn SQL ngay lập tức!
Ví dụ SQL
Đây là một câu lệnh SQL mẫu:
SELECT *
FROM Pets;
Đây là một ví dụ hoàn hảo về việc viết SQL dễ dàng như thế nào. Câu lệnh SQL đơn giản này thực sự làm được rất nhiều điều. Nó trả về toàn bộ bảng. Nó trả về tất cả các cột và tất cả các hàng từ bảng được gọi là Pets
.
Dấu hoa thị (*
) là một ký tự đại diện, có nghĩa là "tất cả các cột". Đó là một cách nhanh chóng và dễ dàng để lấy tất cả các cột mà không cần phải gõ hết chúng.
Đó là một trong những điều tuyệt vời về SQL. Các truy vấn SQL đơn giản nhất thường là các truy vấn mạnh mẽ nhất. Nếu chúng tôi muốn trả lại ít dữ liệu hơn, chúng tôi thực sự cần viết thêm .
Ví dụ:nếu chúng tôi chỉ muốn vật nuôi có tên Tìm nạp , chúng tôi sẽ thêm một WHERE
điều khoản quy định yêu cầu đó.
Như thế này:
SELECT *
FROM Pets
WHERE PetName = 'Fetch';
WHERE
mệnh đề lọc truy vấn của chúng tôi để chỉ các hàng có PetName
cột có giá trị là Fetch
.
Truy vấn này giả định rằng có một cột được gọi là PetName
và một bảng có tên là Pets
trong cơ sở dữ liệu.
Trong hướng dẫn SQL này, tôi sẽ chỉ cho bạn cách tạo cơ sở dữ liệu như vậy bằng SQL.
Tôi cũng sẽ chỉ cho bạn cách chèn dữ liệu vào cơ sở dữ liệu đó, cập nhật dữ liệu, xóa dữ liệu và chạy các truy vấn dựa trên nó.
SQL là gì?
SQL là từ viết tắt của Ngôn ngữ truy vấn có cấu trúc.
SQL là ngôn ngữ truy vấn tiêu chuẩn được sử dụng để làm việc với cơ sở dữ liệu quan hệ.
SQL được sử dụng bởi tất cả các Hệ thống quản lý cơ sở dữ liệu quan hệ (RDBMS) chính, bao gồm:
- Microsoft Access
- Máy chủ SQL
- Oracle
- PostgreSQL
- MySQL
- SQLite
Tôi có thể làm gì với SQL?
Bạn có thể sử dụng SQL để chạy các truy vấn dựa trên cơ sở dữ liệu, chèn bản ghi, cập nhật bản ghi và xóa bản ghi. Bạn cũng có thể tạo các đối tượng cơ sở dữ liệu mới như cơ sở dữ liệu và bảng. Bạn cũng có thể thực hiện các tác vụ quản trị cơ sở dữ liệu, chẳng hạn như tạo thông tin đăng nhập, công việc tự động, sao lưu cơ sở dữ liệu và hơn thế nữa.
Ngay cả khi bạn thực hiện công việc bằng Giao diện người dùng đồ họa (GUI), Hệ thống quản lý cơ sở dữ liệu (DBMS) của bạn gần như chắc chắn sẽ sử dụng SQL đằng sau hậu trường để thực hiện nhiệm vụ đó.
Ví dụ:khi bạn tạo cơ sở dữ liệu bằng cách nhấp vào Tạo cơ sở dữ liệu và nhập chi tiết của cơ sở dữ liệu mới vào một hộp thoại, sau khi bạn nhấp vào OK hoặc Tạo hoặc bất cứ điều gì nút đọc, hệ thống cơ sở dữ liệu của bạn sẽ sử dụng CREATE DATABASE
của SQL để tiếp tục và tạo cơ sở dữ liệu như đã chỉ định.
Điều này cũng đúng với các tác vụ khác, chẳng hạn như chạy truy vấn, chèn dữ liệu, v.v.
SQL cũng cho phép bạn thực hiện các hành động nâng cao hơn như tạo các thủ tục được lưu trữ (các tập lệnh độc lập), các dạng xem (các truy vấn được tạo trước) và đặt quyền trên các đối tượng cơ sở dữ liệu (chẳng hạn như bảng, các thủ tục được lưu trữ và dạng xem).
Điều đó nói rằng, bạn không cần phải học tất cả những thứ nâng cao để bắt đầu với SQL. Điều tốt về SQL là một số tác vụ phổ biến nhất lại dễ viết nhất.
Chuẩn SQL
SQL được chuẩn hóa trong ANSI X3.135 vào năm 1986, và trong vòng vài tháng, nó đã được ISO chấp nhận với tên gọi ISO 9075-1987. Tiêu chuẩn quốc tế (nay là ISO / IEC 9075) đã được sửa đổi định kỳ kể từ đó và hiện có 9 phần.
Hầu hết các nhà cung cấp cơ sở dữ liệu lớn có xu hướng tuân theo tiêu chuẩn SQL. Điều tốt về điều đó là bạn không phải học một ngôn ngữ truy vấn mới mỗi khi bạn học một DBMS mới.
Tuy nhiên, trong thực tế, có những khác biệt giữa cách mỗi nhà cung cấp cơ sở dữ liệu triển khai tiêu chuẩn SQL. Do đó, mã mà bạn viết trong một DBMS có thể không phải lúc nào cũng hoạt động trong một DBMS khác mà không cần phải sửa đổi.
Tin tốt là tất cả các DBMS chính đều hỗ trợ các tác vụ phổ biến nhất nói chung theo cùng một cách.
Cách phát âm của SQL
SQL thường được phát âm theo một trong hai cách:
- “ ess-que-el ”(Tức là viết chính tả từng chữ cái)
- “ phần tiếp theo ”(Như trong chính tả / cách phát âm gốc).
Hãy xem Nó được phát âm S-Q-L hay Phần tiếp theo nếu bạn đang thắc mắc tại sao.
Tôi cần gì cho Hướng dẫn SQL này?
Để thực sự hưởng lợi từ hướng dẫn SQL này, bạn nên làm theo các ví dụ. Điều đó có nghĩa là bạn sẽ cần một nơi nào đó để nhập các truy vấn SQL. Bạn sẽ cần phải có một cái gì đó như sau:
Nếu định chạy các truy vấn SQL, bạn sẽ cần:
- Đã cài đặt RDBMS (chẳng hạn như SQL Server, MySQL, PostgreSQL, SQLite, v.v.).
- Một công cụ cơ sở dữ liệu cho phép bạn chạy các truy vấn SQL dựa trên RDBMS đó (chẳng hạn như MySQL WorkBench, Azure Data Studio (trong hình), DBeaver và SSMS).
Nếu bạn đã cài đặt một trong mỗi cái, thật tuyệt! Bạn có thể tiếp tục với hướng dẫn.
Nếu bạn chưa cài đặt những thứ này, hãy xem Tôi cần làm gì để chạy SQL? để biết hướng dẫn về cách cài đặt RDBMS và công cụ quản lý cơ sở dữ liệu liên quan của nó, trước khi quay lại hướng dẫn SQL này.
Tạo cơ sở dữ liệu
Khi bạn đã cài đặt RDBMS của mình và công cụ cơ sở dữ liệu thích hợp, bạn đã sẵn sàng tạo cơ sở dữ liệu:
CREATE DATABASE PetHotel;
Xong!
Tuyên bố đó thực sự đã tạo ra một cơ sở dữ liệu. Một cơ sở dữ liệu trống, nhưng vẫn là một cơ sở dữ liệu.
Cơ sở dữ liệu này sẽ chứa các bảng và dữ liệu được sử dụng trong hướng dẫn SQL này. Khi chúng tôi tạo bảng hoặc chèn dữ liệu, chúng tôi sẽ thực hiện việc đó bên trong cơ sở dữ liệu này.
Tôi nên đề cập rằng SQLite sử dụng một cú pháp khác để tạo cơ sở dữ liệu. Nếu bạn đang sử dụng SQLite, đây là cách tạo cơ sở dữ liệu trong SQLite.
Kết nối với Cơ sở dữ liệu
Trước khi bắt đầu tạo bảng, chèn dữ liệu, v.v., bạn cần đảm bảo rằng mình đang ở trong cơ sở dữ liệu phù hợp. Tạo cơ sở dữ liệu (như chúng tôi vừa làm) không nhất thiết phải kết nối bạn với cơ sở dữ liệu đó.
Trong nhiều DBMS (chẳng hạn như SQL Server , MySQL và MariaDB ), chúng tôi có thể sử dụng những điều sau để chuyển sang cơ sở dữ liệu được chỉ định:
USE PetHotel;
Điều đó tạo nên PetHotel
cơ sở dữ liệu hiện tại.
Trong SQLite , bạn có thể đã ở trong cơ sở dữ liệu sau khi tạo nó. Nếu không, bạn có thể đính kèm cơ sở dữ liệu (cũng sẽ tạo cơ sở dữ liệu nếu nó chưa tồn tại):
ATTACH DATABASE 'PetHotel.db' AS Pets;
Trong PostgreSQL , nếu bạn đang sử dụng công cụ psql, bạn có thể sử dụng các công cụ sau:
\connect PetHotel
Hoặc phiên bản rút gọn:
\c PetHotel
Tôi nên đề cập rằng quá trình tạo và kết nối với cơ sở dữ liệu có thể rất khác nhau giữa các DBMS.
May mắn thay, hầu hết các công cụ GUI cho phép bạn kết nối với cơ sở dữ liệu bằng cách nhấp đúp vào cơ sở dữ liệu hoặc nhấp chuột phải vào tên cơ sở dữ liệu và chọn tab truy vấn mới từ menu ngữ cảnh. Nếu bạn thấy mình bị mắc kẹt ở bước này, chỉ cần sử dụng GUI để tạo và / hoặc kết nối với DB của bạn.
Tạo bảng
Bây giờ bạn đã kết nối với cơ sở dữ liệu phù hợp, bạn có thể tiếp tục và tạo một số bảng.
Để tạo bảng trong SQL, hãy sử dụng CREATE TABLE
tuyên bố.
Khi bạn tạo bảng, bạn cần chỉ định các cột sẽ có trong bảng, cũng như kiểu dữ liệu của chúng. Bạn cũng có thể chỉ định các chi tiết khác, nhưng đừng tự hiểu.
Hãy tạo một bảng:
CREATE TABLE PetTypes
(
PetTypeId int NOT NULL PRIMARY KEY,
PetType varchar(60) NOT NULL
);
Trong trường hợp này, chúng tôi tạo một bảng có tên PetTypes
. Chúng tôi biết điều đó, vì tên bảng đứng ngay sau CREATE TABLE
chút.
Sau đó là danh sách các cột, được đặt trong dấu ngoặc đơn.
Bảng trên chứa các cột sau:
-
PetIdId
-
PetType
Mỗi cột được theo sau bởi kiểu dữ liệu của nó:
-
int
có nghĩa là cột này chấp nhận số nguyên. Theo như tôi được biết, hầu hết các DBMS chính đều hỗ trợ khai báo các cột làint
. Nếu bạn gặp bất kỳ sự cố nào, hãy thử sử dụnginteger
. -
varchar(60)
có nghĩa là cột này chấp nhận các chuỗi dài tối đa 60 ký tự.varchar
cột là các chuỗi có độ dài thay đổi. Một kiểu dữ liệu chuỗi khác làchar
(là một chuỗi có độ dài cố định). Nếu bạn gặp sự cố khi cố gắng xác định một cột làvarchar(60)
, hãy thử sử dụngchar(60)
.
NOT NULL
Ràng buộc
Trong ví dụ này, cả hai cột đều được xác định bằng NOT NULL
hạn chế. NOT NULL
ràng buộc có nghĩa là cột này không được để trống. Khi một hàng mới được chèn, bất kỳ NOT NULL
nào cột phải chứa một giá trị. Các cột khác có thể vẫn trống nếu không có dữ liệu cho các cột đó.
Nếu NULL
giá trị được phép trong cột, bạn có thể bỏ qua NOT NULL
hoặc khai báo nó là NULL
(nghĩa là, NULL
giá trị được phép trong cột này).
Một số DBMS (chẳng hạn như DB2) không hỗ trợ NULL
dù sao thì từ khóa và vì vậy bạn sẽ cần phải bỏ qua từ khóa đó khi làm việc với các DBMS như vậy.
Khóa chính
Chúng tôi cũng đã tạo PetTypeId
cột khóa chính. Khóa chính là một hoặc nhiều cột xác định duy nhất mỗi hàng trong bảng. Bạn chỉ định / các cột đã chọn của mình làm khóa chính bằng cách sử dụng ràng buộc khóa chính. Bạn có thể thực hiện việc này trong CREATE TABLE
(như chúng tôi đã làm ở đây) hoặc bạn có thể thêm một câu lệnh sau bằng ALTER TABLE
tuyên bố.
Khóa chính phải chứa các giá trị duy nhất. Nghĩa là, đối với mỗi hàng trong bảng đó, giá trị trong cột / s khóa chính phải khác nhau trong mỗi hàng. Điều này có thể đơn giản như có các số tăng dần (như 1, 2, 3… vv) hoặc nó có thể là một mã sản phẩm (như pr4650, pr2784, pr5981… vv).
Ngoài ra, khóa chính phải chứa một giá trị. Nó không thể là NULL
.
Mặc dù khóa chính là không bắt buộc, nhưng thường được coi là phương pháp hay để xác định khóa chính trên mỗi bảng.
Tạo thêm bảng
Hãy tạo thêm hai bảng:
CREATE TABLE Owners
(
OwnerId int NOT NULL PRIMARY KEY,
FirstName varchar(60) NOT NULL,
LastName varchar(60) NOT NULL,
Phone varchar(20) NOT NULL,
Email varchar(254)
);
CREATE TABLE Pets
(
PetId int NOT NULL PRIMARY KEY,
PetTypeId int NOT NULL REFERENCES PetTypes (PetTypeId),
OwnerId int NOT NULL REFERENCES Owners (OwnerId),
PetName varchar(60) NOT NULL,
DOB date NULL
);
Cả hai bảng này đều tương tự như bảng đầu tiên, ngoại trừ chúng có nhiều hàng hơn và một vài phần bổ sung, tôi sẽ giải thích bên dưới.
Nếu bạn quan tâm, hãy xem SQL CREATE TABLE cho người mới bắt đầu để biết thêm một số ví dụ đơn giản về cách tạo bảng trong SQL.
Mối quan hệ
Khi chúng tôi tạo Pets
của mình bảng, chúng tôi thực sự đã tạo mối quan hệ giữa ba bảng.
Mối quan hệ đó được mô tả trong sơ đồ sau.
Mối quan hệ cơ sở dữ liệu là một phần quan trọng của SQL. Mối quan hệ cho phép chúng tôi truy vấn nhiều bảng để tìm dữ liệu liên quan và nhận được kết quả chính xác và nhất quán.
Trong trường hợp của chúng tôi, chúng tôi muốn có thể tìm kiếm vật nuôi theo chủ sở hữu hoặc vật nuôi theo loại vật nuôi, v.v. Và chúng tôi muốn kết quả của mình chính xác và nhất quán.
Để đạt được điều này, chúng tôi cần nhấn mạnh rằng tất cả vật nuôi đều được nhập cùng với chủ nhân và loại vật nuôi của chúng. Do đó, chúng tôi cần đảm bảo rằng, bất cứ khi nào thú cưng mới được thêm vào Pets
, đã có một chủ sở hữu tương ứng trong Owners
và loại vật nuôi tương ứng trong PetTypes
bàn.
Về cơ bản, các yêu cầu của chúng tôi như sau:
- Bất kỳ giá trị nào trong
Pets.PetTypeId
cột phải khớp với một giá trị trongPetTypes.PetTypeId
cột. - Bất kỳ giá trị nào trong
Pets.OwnerId
cột phải khớp với một giá trị trongOwners.OwnerId
cột.
Chúng tôi có thể đảm bảo các yêu cầu trên bằng cách tạo ràng buộc khóa ngoại đối với các cột áp dụng. Một khóa ngoại ràng buộc được sử dụng để chỉ định rằng một cột nhất định tham chiếu đến khóa chính của bảng khác.
Đoạn mã trên đã thực sự tạo ra hai ràng buộc khóa ngoại trên Pets
bảng.
Lưu ý rằng PetTypeId
và OwnerId
các cột có một số mã phụ bắt đầu bằng REFERENCES...
. Đó là những phần đã tạo ra hai khóa ngoại.
Khi chúng tôi tạo Pets
bảng, PetTypeId
của nó cột có một bit đi REFERENCES PetTypes (PetTypeId)
. Điều này có nghĩa là Pets.PetTypeId
cột tham chiếu đến PetTypeId
trong PetTypes
bảng.
Đó là cùng một giao dịch cho OwnerId
cột. Nó tham chiếu đến OwnerId
cột của Owners
bảng.
Trong hầu hết các DBMS, khóa ngoại cũng có thể được tạo trên một bảng hiện có bằng cách sử dụng ALTER TABLE
nhưng chúng tôi sẽ không xem xét vấn đề đó ở đây. Xem Cách tạo mối quan hệ trong SQL để biết thêm về điều đó.
Dù sao thì khóa ngoại của chúng ta cũng đã được tạo. Bây giờ, bất cứ khi nào ai đó chèn một con vật cưng mới vào Pets
bảng, PetTypeId
và OwnerId
giá trị sẽ cần phải có giá trị tương ứng trong PetTypes
và Owners
bảng tương ứng. Nếu bất kỳ lỗi nào trong số đó không có, cơ sở dữ liệu sẽ trả về lỗi.
Đây là lợi ích của khóa ngoại. Nó giúp ngăn chặn việc nhập dữ liệu xấu. Nó giúp duy trì tính toàn vẹn của dữ liệu và cụ thể hơn là tính toàn vẹn của tham chiếu.
Kiểm tra các ràng buộc
Một ràng buộc kiểm tra là một loại ràng buộc khác mà bạn nên biết. Ràng buộc kiểm tra kiểm tra dữ liệu trước khi nó đi vào cơ sở dữ liệu. Khi bảng đã bật giới hạn kiểm tra, dữ liệu chỉ có thể vào bảng nếu nó không vi phạm giới hạn đó. Dữ liệu vi phạm ràng buộc không thể vào bảng.
Ví dụ:bạn có thể tạo ràng buộc séc đối với Price
để đảm bảo rằng nó chỉ chấp nhận các giá trị lớn hơn 0. Hoặc chúng tôi có thể áp dụng ràng buộc kiểm tra cho Pets
của chúng tôi để đảm bảo rằng DOB
không có trong tương lai.
Ví dụ:hãy xem Ràng buộc KIỂM TRA là gì?
Khoảng trắng
Bạn có thể nhận thấy rằng các ví dụ của tôi bao gồm khoảng trắng. Ví dụ:tôi đã giãn cách mã trên nhiều dòng và tôi đã sử dụng các tab để thụt lề các loại dữ liệu, v.v.
Điều này hoàn toàn hợp lệ trong SQL. Bạn có thể làm điều này một cách an toàn và nó sẽ không ảnh hưởng đến kết quả. SQL cho phép bạn trải rộng mã của mình trên nhiều dòng nếu bạn muốn và nó cho phép bạn sử dụng nhiều dấu cách hoặc tab để cải thiện khả năng đọc.
Nhận xét
Bạn cũng có thể bao gồm các nhận xét trong mã của bạn. Nhận xét có thể hữu ích khi bạn bắt đầu viết các tập lệnh SQL dài hơn. Khi một kịch bản trở nên khá dài, các nhận xét có thể giúp bạn nhanh chóng xác định chức năng của từng phần dễ dàng hơn.
Nhận xét nội tuyến
Bạn có thể tạo nhận xét nội dòng bằng cách đặt trước nhận xét của mình bằng hai ký tự gạch nối (--
):
SELECT * FROM Pets; --This is a comment
-- This is a comment
SELECT * FROM Owners;
Trong ví dụ này, cả hai truy vấn sẽ chạy mà không gặp bất kỳ sự cố nào. Các nhận xét sẽ bị DBMS bỏ qua.
Nhận xét nhiều dòng
Bạn có thể trải rộng các nhận xét trên nhiều dòng bằng cách bao quanh nhận xét bằng /*
và */
:
/*
This is a longer comment so
it's spread across multiple lines
*/
SELECT * FROM Pets;
Trong ví dụ này, cả hai truy vấn sẽ chạy mà không gặp bất kỳ sự cố nào. Các nhận xét sẽ bị DBMS bỏ qua.
MySQL
Nếu đang sử dụng MySQL, bạn cũng có thể sử dụng ký hiệu số / ký hiệu băm (#
) cho các nhận xét dòng đơn.
# This is a comment
SELECT * FROM Pets;
Viết bình luận về mã
Một lợi ích thú vị khác của nhận xét là bạn có thể nhận xét ra mã số. Ví dụ:nếu bạn có một tập lệnh SQL dài thực hiện nhiều việc, nhưng bạn chỉ muốn chạy một hoặc hai phần của nó, bạn có thể nhận xét ra phần còn lại của tập lệnh.
Đây là một ví dụ:
-- SELECT * FROM Pets;
SELECT * FROM Owners;
Trong trường hợp này, SELECT
đầu tiên câu lệnh đã được nhận xét và vì vậy chỉ có SELECT
thứ hai câu lệnh sẽ chạy.
Bạn cũng có thể sử dụng các nhận xét nhiều dòng cho kỹ thuật này.
Chèn dữ liệu
Bây giờ chúng tôi đã tạo ba bảng và tạo các khóa ngoại thích hợp, chúng tôi có thể tiếp tục và thêm dữ liệu.
Cách phổ biến nhất để chèn dữ liệu trong SQL là với INSERT
tuyên bố. Nó diễn ra như thế này:
INSERT INTO MyTable( Column1, Column2, Column3, ... )
VALUES( Value1, Value2, Value3, ... );
Bạn chỉ cần thay thế MyTable
với tên của bảng mà bạn đang chèn dữ liệu vào. Tương tự như vậy, bạn thay thế Column1
, v.v. với tên cột và Value1
, v.v. với các giá trị đi vào các cột đó.
Ví dụ, chúng tôi có thể làm điều này:
INSERT INTO Pets( PetId, PetTypeId, OwnerId, PetName, DOB )
VALUES( 1, 2, 3, 'Fluffy', '2020-12-20' );
Mỗi giá trị theo cùng một thứ tự mà cột được chỉ định.
Lưu ý rằng tên cột khớp với tên chúng tôi đã sử dụng khi tạo bảng.
Bạn có thể bỏ qua tên cột nếu bạn đang chèn dữ liệu vào tất cả các cột. Vì vậy, chúng ta có thể thay đổi ví dụ trên thành như sau:
INSERT INTO Pets
VALUES( 1, 2, 3, 'Fluffy', '2020-12-20' );
Đối với hướng dẫn này, chúng tôi sẽ thêm một vài hàng nữa, vì vậy chúng tôi sẽ thêm nhiều INSERT INTO
câu lệnh - một câu lệnh cho mỗi hàng mà chúng tôi muốn chèn.
Vì vậy, hãy tiếp tục và điền vào các bảng của chúng ta.
INSERT INTO Owners( OwnerId, FirstName, LastName, Phone, Email )
VALUES( 1, 'Homer', 'Connery', '(308) 555-0100', '[email protected]' );
INSERT INTO Owners(OwnerId, FirstName, LastName, Phone, Email)
VALUES( 2, 'Bart', 'Pitt', '(231) 465-3497', '[email protected]' );
INSERT INTO Owners(OwnerId, FirstName, LastName, Phone)
VALUES( 3, 'Nancy', 'Simpson', '(489) 591-0408' );
INSERT INTO Owners(OwnerId, FirstName, LastName, Phone)
VALUES( 4, 'Boris', 'Trump', '(349) 611-8908' );
INSERT INTO PetTypes( PetTypeId, PetType )
VALUES( 1, 'Bird' );
INSERT INTO PetTypes( PetTypeId, PetType )
VALUES( 2, 'Cat' );
INSERT INTO PetTypes( PetTypeId, PetType )
VALUES( 3, 'Dog' );
INSERT INTO PetTypes( PetTypeId, PetType )
VALUES( 4, 'Rabbit' );
INSERT INTO Pets( PetId, PetTypeId, OwnerId, PetName, DOB )
VALUES( 1, 2, 3, 'Fluffy', '2020-11-20' );
INSERT INTO Pets( PetId, PetTypeId, OwnerId, PetName, DOB )
VALUES( 2, 3, 3, 'Fetch', '2019-08-16' );
INSERT INTO Pets( PetId, PetTypeId, OwnerId, PetName, DOB )
VALUES( 3, 2, 2, 'Scratch', '2018-10-01' );
INSERT INTO Pets( PetId, PetTypeId, OwnerId, PetName, DOB )
VALUES( 4, 3, 3, 'Wag', '2020-03-15' );
INSERT INTO Pets( PetId, PetTypeId, OwnerId, PetName, DOB )
VALUES( 5, 1, 1, 'Tweet', '2020-11-28' );
INSERT INTO Pets( PetId, PetTypeId, OwnerId, PetName, DOB )
VALUES( 6, 3, 4, 'Fluffy', '2020-09-17' );
INSERT INTO Pets( PetId, PetTypeId, OwnerId, PetName )
VALUES( 7, 3, 2, 'Bark' );
INSERT INTO Pets( PetId, PetTypeId, OwnerId, PetName )
VALUES( 8, 2, 4, 'Meow' );
Lưu ý rằng chúng tôi đã điền Pets
bảng cuối cùng. Có một lý do cho điều này.
Nếu chúng tôi đã cố gắng chèn dữ liệu vào Pets
trước khi điền hai bảng còn lại, chúng tôi sẽ nhận được lỗi do ràng buộc khóa ngoại của chúng tôi. Và vì lý do chính đáng. Sau cùng, chúng tôi sẽ cố gắng chèn các giá trị vào các cột khóa ngoại chưa tồn tại trong các cột khóa chính trên các bảng khác. Đó là một "không không" lớn khi nói đến khóa ngoại.
Vì vậy, bằng cách điền Owners
và PetTypes
trước tiên, chúng tôi đảm bảo rằng các giá trị thích hợp đã có trong các cột khóa chính trước khi chúng tôi điền các cột khóa ngoại vào Pets
bảng.
Xem SQL INSERT dành cho người mới bắt đầu để biết thêm ví dụ về cách chèn dữ liệu vào bảng.
Kiểm tra dữ liệu của chúng tôi
Phù! Cuối cùng, chúng tôi có thể bắt đầu chạy các truy vấn đối với cơ sở dữ liệu của mình.
Hãy kiểm tra dữ liệu trong tất cả các bảng của chúng ta.
SELECT * FROM Pets;
SELECT * FROM PetTypes;
SELECT * FROM Owners;
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 | +---------+-------------+-----------+-----------+------------+ (8 rows affected) +-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected) +-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Simpson | (489) 591-0408 | NULL | | 4 | Boris | Trump | (349) 611-8908 | NULL | +-----------+-------------+------------+----------------+-------------------+ (4 rows affected)
Tuyệt vời, có vẻ như dữ liệu đã được chèn thành công.
Chọn các cột cụ thể
Thông thường, việc chọn tất cả các hàng và tất cả các cột từ một bảng (như chúng ta đã làm trong ví dụ trước) thường được coi là phương pháp không tốt, trừ khi bạn thực sự cần. Làm điều này có thể ảnh hưởng đến hiệu suất của máy chủ cơ sở dữ liệu của bạn, đặc biệt nếu có nhiều hàng trong bảng.
Đó không phải là vấn đề khi bạn đang sử dụng các tập dữ liệu nhỏ như chúng tôi đang ở đây hoặc nếu bạn đang ở trong môi trường phát triển hoặc môi trường tương tự. Nếu không, tốt hơn là chỉ chọn các cột bạn yêu cầu.
Do đó, nếu chúng tôi muốn có ID, tên và ngày sinh của tất cả vật nuôi, chúng tôi có thể thực hiện điều này:
SELECT PetId, PetName, DOB
FROM Pets;
Kết quả:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 2 | Fetch | 2019-08-16 | | 3 | Scratch | 2018-10-01 | | 4 | Wag | 2020-03-15 | | 5 | Tweet | 2020-11-28 | | 6 | Fluffy | 2020-09-17 | | 7 | Bark | NULL | | 8 | Meow | NULL | +---------+-----------+------------+
Nếu chúng tôi muốn có ID và ngày sinh của tất cả vật nuôi có tên Fluffy, chúng tôi có thể sử dụng cái này:
SELECT PetId, DOB
FROM Pets
WHERE PetName = 'Fluffy';
Kết quả:
+---------+------------+ | PetId | DOB | |---------+------------| | 1 | 2020-11-20 | | 6 | 2020-09-17 | +---------+------------+
Bạn cũng có thể sử dụng SELECT
câu lệnh để trả về dữ liệu không có bảng. Nghĩa là, nó có thể trả về dữ liệu không được lưu trữ trong bảng. Xem SQL SELECT
Tuyên bố cho người mới bắt đầu xem một ví dụ.
Sắp xếp
SQL cung cấp ORDER BY
mệnh đề cho phép chúng tôi sắp xếp dữ liệu.
Chúng ta có thể thêm ORDER BY
vào ví dụ trước đó của chúng tôi để các vật nuôi được sắp xếp theo tên của chúng:
SELECT PetId, PetName, DOB
FROM Pets
ORDER BY PetName ASC;
Kết quả:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 7 | Bark | NULL | | 2 | Fetch | 2019-08-16 | | 1 | Fluffy | 2020-11-20 | | 6 | Fluffy | 2020-09-17 | | 8 | Meow | NULL | | 3 | Scratch | 2018-10-01 | | 5 | Tweet | 2020-11-28 | | 4 | Wag | 2020-03-15 | +---------+-----------+------------+
ASC
một phần có nghĩa là tăng dần . Khi bạn sử dụng ORDER BY
, nó mặc định là tăng dần, vì vậy bạn có thể bỏ qua ASC
một phần nếu bạn muốn.
Để sắp xếp nó theo giảm dần đặt hàng, sử dụng DESC
.
SELECT PetId, PetName, DOB
FROM Pets
ORDER BY PetName DESC;
Kết quả:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 4 | Wag | 2020-03-15 | | 5 | Tweet | 2020-11-28 | | 3 | Scratch | 2018-10-01 | | 8 | Meow | NULL | | 1 | Fluffy | 2020-11-20 | | 6 | Fluffy | 2020-09-17 | | 2 | Fetch | 2019-08-16 | | 7 | Bark | NULL | +---------+-----------+------------+
Bạn cũng có thể sắp xếp kết quả bằng nhiều cột. Nó sẽ sắp xếp theo cột đầu tiên được chỉ định, sau đó nếu có bất kỳ bản sao nào trong cột đó, nó sẽ sắp xếp các bản sao đó theo cột thứ hai được chỉ định, v.v.
SELECT PetId, PetName, DOB
FROM Pets
ORDER BY PetName DESC, DOB ASC;
Kết quả:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 4 | Wag | 2020-03-15 | | 5 | Tweet | 2020-11-28 | | 3 | Scratch | 2018-10-01 | | 8 | Meow | NULL | | 6 | Fluffy | 2020-09-17 | | 1 | Fluffy | 2020-11-20 | | 2 | Fetch | 2019-08-16 | | 7 | Bark | NULL | +---------+-----------+------------+
Hãy xem hai con Fluffy đã hoán đổi vị trí của chúng như thế nào.
Nếu bạn không sử dụng ORDER BY
, không có gì đảm bảo kết quả của bạn sẽ theo thứ tự. Mặc dù nó có thể trông giống như cơ sở dữ liệu của bạn đang sắp xếp các kết quả theo một cột cụ thể, điều này có thể không thực sự đúng như vậy. Nói chung, không có ORDER BY
, dữ liệu sẽ được sắp xếp theo thứ tự mà nó được tải vào bảng. Tuy nhiên, nếu các hàng đã bị xóa hoặc cập nhật, thứ tự sẽ bị ảnh hưởng bởi cách DBMS sử dụng lại không gian lưu trữ đã thu hồi.
Do đó, đừng dựa vào DBMS để sắp xếp kết quả theo bất kỳ thứ tự có ý nghĩa nào.
Điểm mấu chốt:Nếu bạn muốn sắp xếp kết quả của mình, hãy sử dụng ORDER BY
.
Xem SQL ORDER BY
Mệnh đề dành cho người mới bắt đầu để có thêm ví dụ.
Đếm các hàng trong một tập hợp kết quả
Bạn có thể sử dụng COUNT()
hàm tổng hợp để đếm các hàng sẽ được trả về trong một truy vấn.
SELECT COUNT(*) AS Count
FROM Pets;
Kết quả:
+---------+ | Count | |---------| | 8 | +---------+
Điều này cho chúng ta biết rằng có 8 hàng trong bảng. Chúng tôi biết điều đó vì chúng tôi đã chọn tất cả các hàng và tất cả các cột.
Bạn có thể sử dụng COUNT()
trên bất kỳ truy vấn nào, ví dụ:các truy vấn sử dụng WHERE
mệnh đề để lọc kết quả.
Bạn cũng có thể chỉ định một cột cụ thể để đếm. COUNT()
hàm chỉ đếm không phải NULL
kết quả, vì vậy nếu bạn chỉ định một cột chứa NULL
giá trị, những giá trị đó sẽ không được tính.
Đây là một ví dụ để chứng minh ý tôi muốn nói.
SELECT COUNT(DOB) AS Count
FROM Pets;
Kết quả:
+---------+ | Count | |---------| | 6 | +---------+ Warning: Null value is eliminated by an aggregate or other SET operation.
Bạn có thể nhớ lại rằng Pets
bảng chứa hai NULL
các giá trị trong DOB
cột (hai vật nuôi chưa cung cấp ngày sinh của chúng) và COUNT(DOB)
trả về 6, thay vì 8 khi chúng tôi sử dụng COUNT(*)
. Lý do COUNT(*)
đã trả lại tất cả các hàng, là do hai hàng đó đã làm có dữ liệu trong các cột khác.
Trong ví dụ của tôi, DBMS của tôi cũng trả về một cảnh báo về điều này. Bạn có thể nhận được cảnh báo hoặc không, tùy thuộc vào DBMS và cấu hình cụ thể của bạn.
Xem SQL COUNT
cho người mới bắt đầu để biết thêm ví dụ.
Các hàm tổng hợp khác bao gồm:AVG()
, SUM()
, MIN()
và MAX()
.
Nhóm Theo
Một mệnh đề hữu ích khác là GROUP BY
mệnh đề. Điều này thực hiện khá nhiều những gì tên của nó hứa hẹn. Nó cho phép bạn nhóm các kết quả theo một cột nhất định.
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
ORDER BY Count DESC;
Kết quả:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | | 1 | 1 | +-------------+---------+
Trong ví dụ này, chúng tôi đang đếm số lượng vật nuôi mà chúng tôi có cho mỗi loại vật nuôi, sau đó sắp xếp nó theo thứ tự giảm dần (với số lượng cao nhất ở trên cùng).
Xem SQL GROUP BY
Mệnh đề dành cho người mới bắt đầu để có thêm ví dụ.
HAVING
Mệnh đề
Chúng ta có thể sử dụng HAVING
mệnh đề để lọc kết quả trong GROUP BY
mệnh đề. HAVING
mệnh đề trả về các hàng trong đó các giá trị tổng hợp đáp ứng các điều kiện đã chỉ định.
Đây là một ví dụ.
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
HAVING COUNT(PetTypeId) > 2
ORDER BY Count DESC;
Kết quả:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | +-------------+---------+
Trong trường hợp này, chúng tôi chỉ trả lại dữ liệu cho các loại vật nuôi có nhiều hơn 2 vật nuôi được chỉ định cho loại đó.
Xem SQL HAVING
Mệnh đề dành cho người mới bắt đầu để có thêm ví dụ.
Tham gia
Trong SQL, một tham gia là nơi bạn chạy một truy vấn kết hợp dữ liệu từ nhiều bảng.
Hai ví dụ trước là OK, nhưng sẽ tốt hơn nếu trả về loại vật nuôi thực tế (ví dụ:Mèo, Chó, Chim, v.v.) thay vì ID (ví dụ:1, 2, 3, v.v.).
Vấn đề duy nhất là, Pets
bảng không chứa dữ liệu đó. Dữ liệu đó nằm trong PetTypes
bảng.
May mắn thay cho chúng tôi, chúng tôi có thể thực hiện một phép nối giữa hai bảng này. Dưới đây là một ví dụ sử dụng LEFT JOIN
:
SELECT
PetTypes.PetType,
COUNT(Pets.PetTypeId) AS Count
FROM Pets
LEFT JOIN PetTypes
ON Pets.PetTypeId = PetTypes.PetTypeId
GROUP BY PetTypes.PetType
ORDER BY Count DESC;
Kết quả:
+-----------+---------+ | PetType | Count | |-----------+---------| | Dog | 4 | | Cat | 3 | | Bird | 1 | +-----------+---------+
Bộ kết quả này dễ đọc hơn nhiều so với các bộ trước. Dễ hiểu hơn có bao nhiêu loại vật nuôi trong bảng.
Cú pháp sử dụng kiểu kết hợp (trong trường hợp này là LEFT JOIN
), tiếp theo là bảng đầu tiên (bên trái), tiếp theo là ON
, theo sau là điều kiện tham gia.
Hãy sử dụng INNER JOIN
để trả lại tất cả tên vật nuôi cùng với loại vật nuôi tương ứng của chúng.
SELECT
Pets.PetName,
PetTypes.PetType
FROM Pets
INNER JOIN PetTypes
ON Pets.PetTypeId = PetTypes.PetTypeId;
Kết quả:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+
Việc tham gia thực sự mở ra các tùy chọn của chúng tôi, vì giờ đây chúng tôi có thể lấy dữ liệu từ nhiều bảng và trình bày nó như thể nó là một bảng duy nhất.
Bạn sẽ nhận thấy rằng trong các ví dụ tham gia, chúng tôi xác định tên cột của mình với tên bảng. Lý do chúng tôi làm điều này là để tránh bất kỳ sự mơ hồ nào liên quan đến tên các cột cột giữa các bảng. Cả hai bảng đều có thể có các cột cùng tên (như trong ví dụ của chúng tôi) và trong những trường hợp như vậy, DBMS sẽ không biết bạn đang đề cập đến cột nào. Đặt tiền tố tên cột bằng tên bảng của chúng đảm bảo rằng bạn đang tham chiếu đến cột bên phải và ngăn chặn bất kỳ lỗi nào có thể phát sinh từ bất kỳ sự mơ hồ nào về cột mà bạn đang tham chiếu.
Xem Hướng dẫn tham gia SQL của tôi để biết thêm ví dụ và giải thích về các kiểu kết hợp khác nhau.
Bí danh
Chúng tôi có thể tiến thêm một bước nữa và chỉ định một bí danh cho từng tên bảng và tên cột.
SELECT
p.PetName AS Pet,
pt.PetType AS "Pet Type"
FROM PetTypes pt
LEFT JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;
Kết quả:
+---------+------------+ | Pet | Pet Type | |---------+------------| | Tweet | Bird | | Fluffy | Cat | | Scratch | Cat | | Meow | Cat | | Fetch | Dog | | Wag | Dog | | Fluffy | Dog | | Bark | Dog | | NULL | Rabbit | +---------+------------+
Điều này đã dẫn đến các tiêu đề cột mới, cộng với mã ngắn gọn hơn.
Bí danh cho phép bạn tạm thời gán một tên khác cho bảng hoặc cột trong thời gian của SELECT
truy vấn. Điều này có thể đặc biệt hữu ích khi bảng và / hoặc cột có tên rất dài hoặc phức tạp.
Bí danh được chỉ định thông qua việc sử dụng AS
từ khóa, mặc dù từ khóa này là tùy chọn, vì vậy bạn có thể bỏ qua nó một cách an toàn. Lưu ý rằng Oracle không hỗ trợ AS
từ khóa trên bí danh bảng (nhưng nó có trên bí danh cột).
Trong ví dụ trên, tôi đã bao gồm AS
từ khóa khi chỉ định bí danh cột, nhưng đã bỏ qua khi gán bí danh bảng.
Tên bí danh có thể là bất cứ thứ gì, nhưng thường được viết tắt cho mục đích dễ đọc.
Trong trường hợp của chúng tôi, chúng tôi đã thay đổi hai bảng thành p
và pt
và các tên cột thành Pet
và Pet Type
. Lưu ý rằng tôi đã bao quanh Pet Type
trong dấu ngoặc kép. Tôi đã làm điều này, vì có một khoảng trống trong tên. Đối với các bí danh không có dấu cách, bạn không cần phải làm điều này. Trong SQL Server, bạn có thể sử dụng dấu ngoặc vuông ([]
) thay vì dấu ngoặc kép (mặc dù nó cũng hỗ trợ dấu ngoặc kép).
Việc sử dụng dấu cách trong cột và bí danh thường không được khuyến khích, vì nó có thể gây ra tất cả các loại vấn đề với một số ứng dụng khách.
Lưu ý rằng chúng tôi vẫn cần sử dụng tên đầy đủ của cột khi tham chiếu chúng trong phép nối (sau ON
từ khóa).
Tôi nên chỉ ra rằng việc gán bí danh không thực sự đổi tên cột hoặc bảng.
Xem Giải thích bí danh SQL để biết thêm ví dụ.
Cập nhật dữ liệu
Bạn có thể sử dụng UPDATE
để cập nhật dữ liệu trong bảng của bạn.
Cú pháp cơ bản khá đơn giản:
UPDATE Owners
SET LastName = 'Stallone'
WHERE OwnerId = 3;
Trong ví dụ đó, chúng tôi cập nhật LastName
cột có giá trị mới là Stallone
trong đó OwnerId
là 3
.
Để cập nhật nhiều cột, hãy sử dụng dấu phẩy để phân tách từng cặp cột / giá trị.
Nhưng dù bạn làm gì, đừng quên WHERE
mệnh đề (trừ khi bạn thực sự có ý định cập nhật mọi hàng trong bảng với cùng một giá trị).
Xem SQL UPDATE
dành cho Người mới bắt đầu để biết thêm ví dụ và giải thích chi tiết hơn.
Xóa dữ liệu
Bạn có thể sử dụng DELETE
tuyên bố xóa dữ liệu khỏi bảng của bạn.
Cú pháp cơ bản thậm chí còn đơn giản hơn UPDATE
tuyên bố:
DELETE FROM Owners
WHERE OwnerId = 5;
Ở đây, chúng tôi đang xóa chủ sở hữu số 5 khỏi Owners
bảng.
Như với UPDATE
tuyên bố, đừng quên WHERE
clause (unless you intend to delete every row in the table ).
See SQL DELETE
for Beginners for more examples and a detailed explanation.
Dropping Objects
While we’re on the subject of deleting things, when you delete a database object (such as a table, view, stored procedure, etc), it’s said that you “drop” that object. For example, if you no longer need a table, you “drop it”.
The syntax is extremely simple, and it goes like this:
DROP TABLE Customers;
Those three words completely obliterated a table called Customers
. The table and all its data is now gone.
As you can imagine, this can be a very dangerous statement, and should be used with extreme caution.
The same syntax can be used for other object types, except you would replace table
with the object type (for example DROP VIEW vPets
drops a view called vPets
).
If you try to drop a table that is referenced by a foreign key, you’ll probably get an error. In this case, you’ll need to either drop the foreign key (using the ALTER TABLE
statement) or the child table itself.
SQL Operators
In SQL, an operator is a symbol specifying an action that is performed on one or more expressions.
Operators manipulate individual data items and return a result. Các mục dữ liệu được gọi là toán hạng hoặc đối số . In SQL, operators are represented by special characters or by keywords.
We’ve already seen some operators in action. Some of our previous example queries had a WHERE
clause that included the Equals operator (=
). We also ran a query that used the Greater Than operator (>
). These are both comparison operators – they compare two expressions.
See 12 Commonly Used Operators in SQL for examples of operators that you’re likely to need when working with SQL.
You can also use this list of SQL Operators as a reference for the operators available in SQL.
SQL Views
In SQL, a view is a query that’s saved to the database as a database object (just like a table). The term can also be used to refer to the result set of a stored query. Views are often referred to as virtual tables .
To create a view, you write a query, then save it as a view. You do this using the CREATE VIEW
cú pháp.
Here’s an example of creating a view:
CREATE VIEW vPetTypeCount AS
SELECT
PetTypes.PetType,
COUNT(Pets.PetTypeId) AS Count
FROM Pets
LEFT JOIN PetTypes
ON Pets.PetTypeId = PetTypes.PetTypeId
GROUP BY PetTypes.PetType;
Running that code creates the view and stores it as an object in the database.
We can now query the view, just like we’d query a table.
Kết quả:
SELECT * FROM vPetTypeCount;
+-----------+---------+ | PetType | Count | |-----------+---------| | Bird | 1 | | Cat | 3 | | Dog | 4 | +-----------+---------+
So we get the same result as we would have got if we’d run the original query, but saving it in a view made it a lot easier to query.
This benefit would become greater, the more complex the query is.
Views and the ORDER BY Clause
One thing I should point out is that the original query had an ORDER BY
clause, but I didn’t include that in the view. The SQL standard does not allow the ORDER BY
clause in any view definition. Also, most RDBMSs will raise an error if you try to include an ORDER BY
mệnh đề.
This isn’t a problem though, because you can sort the results when you query the view. Therefore, we can do something like this:
SELECT * FROM vPetTypeCount
ORDER BY Count DESC;
Kết quả:
+-----------+---------+ | PetType | Count | |-----------+---------| | Dog | 4 | | Cat | 3 | | Bird | 1 | +-----------+---------+
Most RDBMSs also include a large set of system views that you can use to retrieve information about the system.
For more about views, see What is a View?
Stored Procedures
A stored procedure is a series of SQL statements compiled and saved to the database. Stored procedures are similar to views in some respects, but very different in other respects.
One of the benefits of stored procedures is that they allow you to store complex scripts on the server. Stored procedures often contain conditional programming such as IF... ELSE
statements, for example. Stored procedures can also accept parameters.
Here’s an example of creating a simple stored procedure in SQL Server to get pet information from our database:
CREATE PROCEDURE uspGetPetById
@PetId int
AS
SET NOCOUNT ON;
SELECT
p.PetName,
p.DOB,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS OwnerName
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
INNER JOIN Owners o
ON o.OwnerId = p.OwnerId
WHERE p.PetId = @PetId;
This stored procedure accepts a parameter called @PetId
. This means that when you call the procedure, you need to pass the ID of the pet that you’d like information about. The procedure then selects data from various tables and returns it.
To call the stored procedure, use the EXECUTE
tuyên bố. You can alternatively shorten it to EXEC
. In PostgreSQL, use the CALL
tuyên bố.
EXEC uspGetPetById @PetId = 3;
Kết quả:
+-----------+------------+-----------+-------------+ | PetName | DOB | PetType | OwnerName | |-----------+------------+-----------+-------------| | Scratch | 2018-10-01 | Cat | Bart Pitt | +-----------+------------+-----------+-------------+
In this case I was interested in pet number 3, and so that’s the info that I got.
I should mention that the syntax for creating stored procedures can differ quite significantly between DBMSs (as well as their implementations of various SQL statements and commands that you’d use inside a procedure), so I would suggest that you look at the documentation for your particular DBMS if you want to create a stored procedure.
Most RDBMSs also include a large set of system stored procedures that you can use to perform various administration tasks, and to retrieve information about the system.
For a basic overview of stored procedures, including their benefits, see What is a Stored Procedure?
Also, if you’re interested, see How to Create a Stored Procedure in SQL Server to see another example of creating a stored procedure in SQL Server. That example includes some screenshots.
SQL Triggers
A trigger is a special type of stored procedure that automatically executes when an event occurs in the database server.
Most major RDBMSs support DML triggers, which execute when a user tries to modify data through a data manipulation language (DML) event. DML events are INSERT
, UPDATE
, or DELETE
statements.
Some DBMSs (such as SQL Server and PostgreSQL) allow triggers to be associated with both tables and views. Others only allow triggers to be associated with tables.
SQL Server also supports DDL triggers and logon triggers.
DDL triggers execute in response to DDL events, such as CREATE
, ALTER
, and DROP
statements, and certain system stored procedures that perform DDL-like operations.
Logon triggers are fired in response to the LOGON
event that’s raised when a user’s session is being established.
Here are some articles explaining how to do various things with triggers in SQL Server:
- Create a DML Trigger in SQL Server
- Create a “last modified” column
- Automatically send an email when someone tries to delete a record
- Update a column’s value whenever another column is updated
- Update a column’s value whenever certain other columns are updated
SQL Transactions
SQL transactions are an important part of transactional databases, where data consistency is paramount.
A transaction manages a sequence of SQL statements that must be executed as a single unit of work. This is to ensure that the database never contains the results of partial operations.
When a transaction makes multiple changes to the database, either all the changes succeed when the transaction is committed, or all the changes are undone when the transaction is rolled back.
Transactions help maintain data integrity by ensuring that a sequence of SQL statements execute completely or not at all.
A classic example of a transaction is to move money from one bank account to another. You wouldn’t want money to be deducted from the first bank account, but not appear in the second bank account.
Therefore, you could use a transaction which goes along the lines of this:
START TRANSACTION
Debit account 1
Credit account 2
Record transaction in transaction journal
END TRANSACTION
You could write conditional logic inside that transaction that rolls back the transaction if anything goes wrong.
The end result is that, either the transaction is completed in its entirety, or it’s not completed at all. It’s never half-done.
See my SQL Transactions Tutorial for examples of SQL transactions.
SQL Functions
A function is a routine that can take parameters, perform calculations or other actions, and return a result.
Most DBMSs provide you with the ability to create your own functions, while also providing a range of inbuilt functions.
User-Defined Functions
A user-defined function (UDF) is a function that you create for a specific purpose, and save to the database. You would create such a function for tasks that aren’t catered for by an inbuilt function.
See Introduction to User-Defined Functions in SQL Server for an overview. Although that article is written for SQL Server, most of the general concepts also apply to other DBMSs.
Inbuilt Functions
Most DBMSs have a large range of inbuilt functions that you can use in your SQL queries. For example, there are functions that return the current date and time, functions that format dates and numbers, functions that convert data from one data type to another, and more.
The range of inbuilt functions can be pretty extensive, and depend on the DBMS in use, so I won’t go over them in this SQL tutorial. But I would encourage you to try to find out what inbuilt functions your DBMS supports.
To get you started, the following articles contain some of the most commonly used functions in SQL programming.
SQL Server
- SQL Server String Functions
- SQL Server Mathematical Functions
- SQL Server Date &Time Functions
MySQL
- MySQL String Functions
- MySQL Mathematical Functions
PostgreSQL
- PostgreSQL Date &Time Functions
- PostgreSQL Math Functions
SQLite
- SQLite Aggregate Functions
- SQLite Date &Time Functions