Bên dưới Hàm SQL phân tích cú pháp [Theo cách không được tối ưu hóa] một chuỗi cho một số và nếu nó tìm thấy, nó sẽ trả về nó dưới dạng một số nguyên
CREATE FUNCTION dbo.fn_GetNumbers[@strInput NVARCHAR[500]] RETURNS INT AS BEGIN DECLARE @strOut NVARCHAR[500] = '', @intCounter INT = 1, @OutValue INT WHILE @intCounter 0] SELECT @OutValue = cast[@strOut as int] else SELECT @OutValue = null RETURN @OutValue END
Khi bạn có chức năng đó, bạn có thể sử dụng nó trong SQL bên dưới để nhận được kết quả mong muốn.
SELECT GoodDescription, dbo.fn_GetNumbers[GoodDescription] FROM [ SELECT '3 Bleaching' as GoodDescription UNION ALL SELECT 'hair lotions' UNION ALL SELECT 'dentifrices' UNION ALL SELECT '9 Glasses' UNION ALL SELECT 'eyeglass lens' UNION ALL SELECT '14 Precious metals and their alloys' UNION ALL SELECT '18 Leather and imitations of leather' ] T WHERE dbo.fn_GetNumbers[GoodDescription] IN [3, 18]
Bạn muốn nối các bảng trên nhiều cột bằng cách sử dụng khóa ghép chính trong một bảng và khóa ghép ngoại trong bảng khác
Thí dụ
Cơ sở dữ liệu của chúng tôi có ba bảng tên là student
, enrollment
và payment
. Bảng student
có dữ liệu trong các cột sau. id
[khóa chính], first_name
và last_name
Bảng enrollment
có dữ liệu trong các cột sau. khóa chính [student_id
và student
0], student
1 và student
2
Bảng payment
có dữ liệu trong các cột sau. khóa ngoại [student_id
và student
0, khóa chính của bảng enrollment
], student
7 và student
8
Hãy hiển thị tên, mã khóa học, trạng thái và số tiền thanh toán của từng sinh viên
Giải pháp
SELECT s.last_name, s.first_name, p.course_code, p.status, p.amount FROM enrollment e JOIN student s ON s.id=e.student_id JOIN payment p ON p.course_code=e.course_code AND p.student_id=e.student_id;last_namefirst_namecourse_codestatusamountWillsonEllieGD03paid230WillsonEllieAP01pending100BrownTomSL01pending80MillerSandraSL01pending110
Thảo luận
Nếu bạn muốn lấy dữ liệu được lưu trữ trong các bảng được nối bởi một khóa phức hợp, là khóa chính trong một bảng và khóa ngoại trong một bảng khác, chỉ cần sử dụng điều kiện nối trên nhiều cột
Trong một bảng đã nối [trong ví dụ của chúng tôi, enrollment
], chúng tôi có một khóa chính được tạo từ hai cột [student_id
và student
0]. Trong bảng thứ hai [payment
], chúng tôi có các cột là khóa ghép ngoại [student_id
và student
0]. Làm thế nào chúng ta có thể nối các bảng với các phím ghép này?
Dễ dàng. Chúng ta chỉ cần sử dụng mệnh đề enrollment
5 với nhiều hơn một điều kiện bằng cách sử dụng toán tử AND sau điều kiện đầu tiên. Trong ví dụ của chúng tôi, chúng tôi sử dụng điều kiện này
enrollment
6
Trong phần đầu tiên, chúng tôi sử dụng cột student_id
từ bảng enrollment
và student_id
từ bảng payment
. Trong điều kiện tiếp theo, chúng ta lấy cột student
0 từ bảng enrollment
và student
0 từ bảng payment
Lưu ý rằng các cột ________ 23 _______ và student
0 từ khóa chính trong bảng enrollment
. Do đó, chúng được sử dụng trong bảng payment
làm khóa ngoại
Trong SQL, nhiều trường cũng có thể được thêm vào với mệnh đề DISTINCT. DISTINCT sẽ loại bỏ những hàng có tất cả các trường đã chọn giống hệt nhau
nội dung
Thí dụ. Câu lệnh CHỌN mẫu
Đây là một truy vấn đơn giản trên một số cột đã chọn trong bảng đơn đặt hàng trong đó agent_code='A002'
Mã SQL
SELECT agent_code, ord_amount, cust_code, ord_num
FROM orders
WHERE agent_code='A002';
Biểu thức đại số quan hệ
Cây đại số quan hệ
bảng mẫu. mệnh lệnh
đầu ra
AGENT_CODE ORD_AMOUNT CUST_CODE ORD_NUM ---------- ---------- ---------- ---------- A002 2500 C00005 200106 A002 500 C00022 200123 A002 500 C00009 200120 A002 500 C00022 200126 A002 3500 C00009 200128 A002 1200 C00009 200133 A002 4000 C00022 200113
Kết quả trên cho thấy cùng một agent_code, ord_amount và cust_code xuất hiện nhiều lần trong bảng đơn hàng
Thí dụ. CHỌN với DISTINCT trên hai cột
Để lấy các hàng giống hệt nhau [dựa trên hai cột agent_code và ord_amount] một lần từ bảng đơn hàng, có thể sử dụng câu lệnh SQL sau
Mã SQL
SELECT DISTINCT agent_code,ord_amount
FROM orders
WHERE agent_code='A002';
Biểu thức đại số quan hệ
Cây đại số quan hệ
đầu ra
AGENT_CODE ORD_AMOUNT ---------- ---------- A002 3500 A002 1200 A002 4000 A002 500 A002 2500
trình bày bằng hình ảnh
Thí dụ. CHỌN với DISTINCT trên ba cột
Để lấy các hàng giống hệt nhau [dựa trên ba cộtagent_code, ord_amount và cust_code] một lần từ bảng đơn hàng, có thể sử dụng câu lệnh SQL sau
Mã SQL
SELECT DISTINCT agent_code, ord_amount,cust_code
FROM orders
WHERE agent_code='A002';
Biểu thức đại số quan hệ
Cây đại số quan hệ
đầu ra
________số 8_______trình bày bằng hình ảnh
Thí dụ. CHỌN với DISTINCT trên tất cả các cột của truy vấn đầu tiên
Để lấy các hàng giống hệt nhau [trên bốn cột agent_code, ord_amount, cust_code và ord_num] một lần từ bảng đơn hàng, có thể sử dụng câu lệnh SQL sau
Mã SQL
SELECT DISTINCT agent_code,ord_amount,cust_code,ord_num
FROM orders
WHERE agent_code='A002';
Biểu thức đại số quan hệ
Cây đại số quan hệ
đầu ra
AGENT_CODE ORD_AMOUNT CUST_CODE ORD_NUM ---------- ---------- ---------- ---------- A002 500 C00022 200126 A002 2500 C00005 200106 A002 500 C00009 200120 A002 1200 C00009 200133 A002 4000 C00022 200113 A002 3500 C00009 200128 A002 500 C00022 200123
Trong kết quả ở trên, tất cả các hàng có agent_code là 'A002' đã trả về vì không có hàng nào giống nhau trên agent_code, ord_amount, cust_code và ord_num. Xem phần trình bày sau.
trình bày bằng hình ảnh
CHỌN với DISTINCT trên nhiều cột và mệnh đề ORDER BY
Bạn có thể sử dụng mệnh đề theo thứ tự trong câu lệnh chọn với sự khác biệt trên nhiều cột. Đây là một ví dụ
Mã SQL
SELECT DISTINCT agent_code,ord_amount
FROM orders
WHERE agent_code='A002'
ORDER BY ord_amount;
Biểu thức đại số quan hệ
Cây đại số quan hệ
đầu ra
AGENT_CODE ORD_AMOUNT ---------- ---------- A002 500 A002 1200 A002 2500 A002 3500 A002 4000
trình bày bằng hình ảnh
Hàm COUNT[] và CHỌN với DISTINCT trên nhiều cột
Bạn có thể sử dụng hàm đếm [] trong một câu lệnh chọn có sự khác biệt trên nhiều cột để đếm các hàng riêng biệt. Đây là một ví dụ
AGENT_CODE ORD_AMOUNT CUST_CODE ORD_NUM ---------- ---------- ---------- ---------- A002 2500 C00005 200106 A002 500 C00022 200123 A002 500 C00009 200120 A002 500 C00022 200126 A002 3500 C00009 200128 A002 1200 C00009 200133 A002 4000 C00022 2001130
đầu ra
AGENT_CODE ORD_AMOUNT CUST_CODE ORD_NUM ---------- ---------- ---------- ---------- A002 2500 C00005 200106 A002 500 C00022 200123 A002 500 C00009 200120 A002 500 C00022 200126 A002 3500 C00009 200128 A002 1200 C00009 200133 A002 4000 C00022 2001131
trình bày bằng hình ảnh
Thực hành bài tập SQL
- Bài tập SQL, Thực hành, Lời giải
- SQL Lấy dữ liệu từ bảng [33 Bài tập]
- SQL Boolean và Toán tử quan hệ [12 Bài tập]
- SQL Wildcard và toán tử đặc biệt [22 bài tập]
- Hàm tổng hợp SQL [25 bài tập]
- Đầu ra truy vấn định dạng SQL [10 Bài tập]
- Truy vấn SQL trên nhiều bảng [8 bài tập]
- LỌC và SẮP XẾP trên cơ sở dữ liệu nhân sự [38 bài tập]
- SQL THAM GIA
- SQL THAM GIA [29 Bài tập]
- SQL THAM GIA trên cơ sở dữ liệu nhân sự [27 bài tập]
- CÁC CÂU HỎI THƯỜNG GẶP SQL
- SQL SUBQUERIES [39 Bài tập]
- SQL SUBQUERIES trên Cơ sở dữ liệu nhân sự [55 Bài tập]
- SQL Union[9 Bài tập]
- Chế độ xem SQL[16 Bài tập]
- Quản lý tài khoản người dùng SQL [16 Bài tập]
- Cơ sở dữ liệu phim
- Các truy vấn CƠ BẢN trên Cơ sở dữ liệu phim [10 Bài tập]
- SUBQUERIES trên Cơ sở dữ liệu phim [16 Bài tập]
- THAM GIA trên Cơ sở dữ liệu phim [24 Bài tập]
- Cơ sở dữ liệu bóng đá
- Giới thiệu
- Các truy vấn CƠ BẢN trên Cơ sở dữ liệu bóng đá [29 Bài tập]
- SUBQUERIES trên Cơ sở dữ liệu bóng đá [33 Bài tập]
- THAM GIA các truy vấn trên Cơ sở dữ liệu bóng đá [61 Bài tập]
- cơ sở dữ liệu bệnh viện
- Giới thiệu
- CƠ BẢN, CÂU HỎI PHỤ và THAM GIA [39 Bài tập]
- cơ sở dữ liệu nhân viên
- Truy vấn CƠ BẢN trên Database nhân viên [115 Bài tập]
- SUBQUERIES trên Cơ sở dữ liệu nhân viên [77 Bài tập]
- Nhiều hơn để đến
Bạn muốn cải thiện bài viết trên?
Theo dõi chúng tôi trên Facebook và Twitter để cập nhật thông tin mới nhất.
SQL. Lời khuyên trong ngày
MySQL SELECT chỉ không có giá trị null
Bạn nên sử dụng IS NOT NULL. [Các toán tử so sánh = và cả hai đều cho UNKNOWN với NULL ở hai bên của biểu thức. ]