SQL là một ngôn ngữ truy vấn có cấu trúc, được sử dụng để truy vấn và thao tác dữ liệu trong cơ sở dữ liệu quan hệ. SQL là một ngôn ngữ tiêu chuẩn, được hỗ trợ bởi hầu hết các hệ quản trị cơ sở dữ liệu quan hệ (RDBMS), bao gồm MySQL, PostgreSQL, Oracle, SQL Server, v.v.
Cơ bản về SQL
Dưới đây là một số khái niệm cơ bản về SQL:
- Cơ sở dữ liệu: Là một tập hợp dữ liệu được tổ chức theo một cách nhất quán, để có thể truy cập và sử dụng dễ dàng.
- Bảng: Là một tập hợp các dữ liệu được tổ chức thành các hàng và cột.
- Kiểu dữ liệu: Là loại dữ liệu mà một trường có thể chứa.
- Truy vấn SQL: Là một câu lệnh được sử dụng để truy vấn dữ liệu từ cơ sở dữ liệu.
Các câu lệnh SQL cơ bản
Dưới đây là một số câu lệnh SQL cơ bản:
- SELECT: Lấy dữ liệu từ cơ sở dữ liệu.
- INSERT: Thêm dữ liệu vào cơ sở dữ liệu.
- UPDATE: Cập nhật dữ liệu trong cơ sở dữ liệu.
- DELETE: Xóa dữ liệu khỏi cơ sở dữ liệu.
Các toán tử SQL cơ bản
Dưới đây là một số toán tử SQL cơ bản:
- Toán tử so sánh: So sánh hai giá trị.
- Toán tử logic: Kết hợp hai hoặc nhiều mệnh đề.
- Toán tử toán học: Thực hiện các phép toán số học.
Các hàm SQL cơ bản
Dưới đây là một số hàm SQL cơ bản:
- Hàm COUNT: Đếm số lượng bản ghi trong một tập hợp.
- Hàm SUM: Tính tổng của các giá trị trong một tập hợp.
- Hàm AVG: Tính trung bình của các giá trị trong một tập hợp.
Các câu lệnh SQL nâng cao
Dưới đây là một số câu lệnh SQL nâng cao:
- JOIN: Kết hợp dữ liệu từ nhiều bảng.
- GROUP BY: Nhóm dữ liệu theo một thuộc tính.
- HAVING: Lọc dữ liệu trong một nhóm.
- WITH: Tạo một subquery.
Luyện tập SQL
Để học SQL hiệu quả, bạn nên luyện tập thường xuyên. Có rất nhiều tài nguyên trực tuyến và ngoại tuyến có thể giúp bạn luyện tập SQL. Bạn cũng có thể tham gia các cộng đồng SQL để được hỗ trợ và chia sẻ kiến thức.
Bài tập SQL cơ bản:
Dưới đây là một loạt các bài tập SQL Server cơ bản. Tôi tin rằng sau khi bạn hoàn thành tất cả các bài tập này, bạn sẽ có kiến thức cơ bản về cách sử dụng SQL Server. Bạn có thể tìm đáp án cho mỗi bài tập ở phần dưới.
Dưới đây là một số truy vấn SQL cơ bản và giải đáp cho từng truy vấn:
- SELECT - Lựa chọn dữ liệu từ bảng
Truy vấn để lấy tất cả dữ liệu từ một bảng:
SELECT * FROM TenBang;
- WHERE - Lọc dữ liệu dựa trên điều kiện
Truy vấn để lấy tất cả dữ liệu từ bảng có một điều kiện cụ thể:
SELECT * FROM TenBang WHERE DieuKien;
Ví dụ: Lấy tất cả những người có tuổi lớn hơn 30 từ bảng "People":
SELECT * FROM People WHERE Age > 30;
- ORDER BY - Sắp xếp dữ liệu
Truy vấn để lấy dữ liệu từ bảng và sắp xếp theo một cột cụ thể:
SELECT * FROM TenBang ORDER BY TenCot ASC/DESC;
Ví dụ: Lấy danh sách các sản phẩm từ bảng "Products" và sắp xếp theo giá từ thấp đến cao:
SELECT * FROM Products ORDER BY Price ASC;
- GROUP BY - Nhóm dữ liệu
Truy vấn để nhóm dữ liệu dựa trên giá trị của một cột:
SELECT TenCot, COUNT(*) FROM TenBang GROUP BY TenCot;
Ví dụ: Đếm số lượng đơn hàng của mỗi khách hàng từ bảng "Orders" và nhóm theo tên khách hàng:
SELECT CustomerName, COUNT(*) FROM Orders GROUP BY CustomerName;
- JOIN - Kết nối dữ liệu từ nhiều bảng
Truy vấn để kết nối dữ liệu từ hai hoặc nhiều bảng:
SELECT CacCot FROM Bang1 INNER JOIN Bang2 ON Bang1.KhoaChung = Bang2.KhoaChung;
Ví dụ: Lấy thông tin sản phẩm và tên nhà cung cấp từ bảng "Products" và "Suppliers" bằng cách kết nối chúng qua cột "SupplierID":
SELECT Products.ProductName, Suppliers.SupplierName FROM Products INNER JOIN Suppliers ON Products.SupplierID = Suppliers.SupplierID;
- INSERT INTO - Thêm dữ liệu mới vào bảng
Truy vấn để thêm dữ liệu mới vào bảng:
INSERT INTO TenBang (CacCot) VALUES (GiaTri);
Ví dụ: Thêm một khách hàng mới vào bảng "Customers":
INSERT INTO Customers (CustomerName, ContactName, City) VALUES ('Tên khách hàng', 'Tên liên hệ', 'Thành phố');
- UPDATE - Cập nhật dữ liệu trong bảng
Truy vấn để cập nhật dữ liệu trong bảng:
UPDATE TenBang SET TenCot = GiaTriMoi WHERE DieuKien;
Ví dụ: Cập nhật giá sản phẩm có ID là 1 trong bảng "Products" thành 1000:
UPDATE Products SET Price = 1000 WHERE ProductID = 1;
- DELETE - Xóa dữ liệu từ bảng
Truy vấn để xóa dữ liệu từ bảng:
DELETE FROM TenBang WHERE DieuKien;
Ví dụ: Xóa khách hàng có ID là 5 từ bảng "Customers":
DELETE FROM Customers WHERE CustomerID = 5;
Câu 9: Đưa ra thông tin gồm mã số, họ tên và tên khoa của tất cả các giảng viên.
SELECT GiangVien.magv, GiangVien.hotengv, Khoa.tenkhoa FROM GiangVien INNER JOIN Khoa ON GiangVien.makhoa = Khoa.makhoa;
Câu 10: Đưa ra thông tin gồm mã số, họ tên và tên khoa của các giảng viên của khoa 'DIA LY va QLTN'.
SELECT GiangVien.magv, GiangVien.hotengv, Khoa.tenkhoa FROM GiangVien INNER JOIN Khoa ON GiangVien.makhoa = Khoa.makhoa WHERE Khoa.tenkhoa = 'DIA LY va QLTN';
Câu 11: Cho biết số sinh viên của khoa 'CONG NGHE SINH HOC'.
SELECT COUNT(SinhVien.masv) AS SoSinhVien FROM SinhVien INNER JOIN Khoa ON SinhVien.makhoa = Khoa.makhoa WHERE Khoa.tenkhoa = 'CONG NGHE SINH HOC';
Câu 12: Đưa ra danh sách gồm mã số, họ tên và tuổi của các sinh viên khoa 'TOAN'.
SELECT SinhVien.masv, SinhVien.hotensv, YEAR(GETDATE()) - SinhVien.namsinh AS Tuoi FROM SinhVien INNER JOIN Khoa ON SinhVien.makhoa = Khoa.makhoa WHERE Khoa.tenkhoa = 'TOAN';
Câu 13: Cho biết số giảng viên của khoa 'CONG NGHE SINH HOC'.
SELECT COUNT(GiangVien.magv) AS SoGiangVien FROM GiangVien INNER JOIN Khoa ON GiangVien.makhoa = Khoa.makhoa WHERE Khoa.tenkhoa = 'CONG NGHE SINH HOC';
Câu 14: Cho biết thông tin về sinh viên không tham gia thực tập.
SELECT SinhVien.masv, SinhVien.hotensv FROM SinhVien LEFT JOIN HuongDan ON SinhVien.masv = HuongDan.masv WHERE HuongDan.masv IS NULL;
Câu 15: Đưa ra mã khoa, tên khoa và số giảng viên của mỗi khoa.
SELECT Khoa.makhoa, Khoa.tenkhoa, COUNT(GiangVien.magv) AS SoGiangVien FROM Khoa LEFT JOIN GiangVien ON Khoa.makhoa = GiangVien.makhoa GROUP BY Khoa.makhoa, Khoa.tenkhoa;
Câu 16: Cho biết số điện thoại của khoa mà sinh viên có tên 'Le van son' đang theo học.
SELECT Khoa.dienthoai FROM Khoa INNER JOIN SinhVien ON Khoa.makhoa = SinhVien.makhoa WHERE SinhVien.hotensv = 'Le van son';
Câu 17: Cho biết mã số và tên của các đề tài do giảng viên 'Tran son' hướng dẫn.
SELECT DeTai.madt, DeTai.tendt FROM DeTai INNER JOIN HuongDan ON DeTai.madt = HuongDan.madt INNER JOIN GiangVien ON HuongDan.magv = GiangVien.magv WHERE GiangVien.hotengv = 'Tran son';
Câu 18: Cho biết tên đề tài không có sinh viên nào thực tập.
SELECT DeTai.tendt FROM DeTai LEFT JOIN HuongDan ON DeTai.madt = HuongDan.madt WHERE HuongDan.madt IS NULL;
Câu 19: Cho biết mã số, họ tên, tên khoa của các giảng viên hướng dẫn từ 3 sinh viên trở lên.
SELECT GiangVien.magv, GiangVien.hotengv, Khoa.tenkhoa FROM GiangVien INNER JOIN Khoa ON GiangVien.makhoa = Khoa.makhoa INNER JOIN (SELECT magv, COUNT(masv) AS SoSinhVien FROM HuongDan GROUP BY magv HAVING COUNT(masv) >= 3) AS GiangVien_SinhVien ON GiangVien.magv = GiangVien_SinhVien.magv;
Câu 20: Cho biết mã số, tên đề tài của đề tài có kinh phí cao nhất.
SELECT DeTai.madt, DeTai.tendt FROM DeTai WHERE DeTai.kinhphi = (SELECT MAX(kinhphi) FROM DeTai);
Câu 21: Cho biết mã số và tên các đề tài có nhiều hơn 2 sinh viên tham gia thực tập.
SELECT DeTai.madt, DeTai.tendt FROM DeTai INNER JOIN HuongDan ON DeTai.madt = HuongDan.madt GROUP BY DeTai.madt, DeTai.tendt HAVING COUNT(HuongDan.masv) > 2;
Câu 22: Đưa ra mã số, họ tên và điểm của các sinh viên khoa 'DIA LY va QLTN'.
SELECT SinhVien.masv, SinhVien.hotensv, HuongDan.ketqua FROM SinhVien INNER JOIN HuongDan ON SinhVien.masv = HuongDan.masv INNER JOIN GiangVien ON HuongDan.magv = GiangVien.magv INNER JOIN Khoa ON GiangVien.makhoa = Khoa.makhoa WHERE Khoa.tenkhoa = 'DIA LY va QLTN';
Câu 23: Đưa ra tên khoa và số lượng sinh viên của mỗi khoa.
SELECT Khoa.tenkhoa, COUNT(SinhVien.masv) AS SoLuongSinhVien FROM Khoa LEFT JOIN SinhVien ON Khoa.makhoa = SinhVien.makhoa GROUP BY Khoa.tenkhoa;
Câu 24: Cho biết thông tin về các sinh viên thực tập tại quê nhà.
SELECT SinhVien.masv, SinhVien
Đây là một số truy vấn SQL cơ bản. SQL là một ngôn ngữ mạnh mẽ cho việc truy vấn và quản lý dữ liệu trong cơ sở dữ liệu. Hãy tập truy vấn và thao tác với cơ sở dữ liệu để nâng cao kỹ năng của bạn.
Bài tập SQL nâng cao có đáp án
Dưới đây là một số bài tập SQL nâng cao cùng với đáp án của chúng:
Bài tập 1: Lấy tất cả sản phẩm có giá cao nhất trong bảng "Products".
SELECT * FROM Products WHERE Price = (SELECT MAX(Price) FROM Products);
Bài tập 2: Tạo một truy vấn để tính tổng số sản phẩm của mỗi nhà cung cấp và hiển thị kết quả bằng cột "TotalProducts".
SELECT Suppliers.SupplierName, COUNT(Products.ProductID) AS TotalProducts FROM Suppliers LEFT JOIN Products ON Suppliers.SupplierID = Products.SupplierID GROUP BY Suppliers.SupplierName;
Bài tập 3: Tạo một truy vấn để lấy tên của tất cả khách hàng mà họ đã đặt hàng từ cả hai nguồn cung cấp "Supplier A" và "Supplier B".
SELECT Customers.CustomerName FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID INNER JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID INNER JOIN Products ON OrderDetails.ProductID = Products.ProductID INNER JOIN Suppliers ON Products.SupplierID = Suppliers.SupplierID WHERE Suppliers.SupplierName IN ('Supplier A', 'Supplier B') GROUP BY Customers.CustomerName;
Bài tập 4: Tạo một truy vấn để lấy tên của tất cả những khách hàng không có đơn hàng trong bảng "Orders".
SELECT Customers.CustomerName FROM Customers LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID WHERE Orders.OrderID IS NULL;
Bài tập 5: Tạo một truy vấn để lấy một danh sách các sản phẩm mà không có ai mua từ bảng "OrderDetails".
SELECT Products.ProductName FROM Products LEFT JOIN OrderDetails ON Products.ProductID = OrderDetails.ProductID WHERE OrderDetails.ProductID IS NULL;
Bài tập 6: Tạo một truy vấn để tính tổng doanh số bán hàng của mỗi nhân viên từ bảng "Employees" và "Orders".
SELECT Employees.EmployeeName, SUM(OrderDetails.Quantity * Products.Price) AS TotalSales FROM Employees LEFT JOIN Orders ON Employees.EmployeeID = Orders.EmployeeID LEFT JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID LEFT JOIN Products ON OrderDetails.ProductID = Products.ProductID GROUP BY Employees.EmployeeName;
Bài tập 7: Tạo một truy vấn để lấy các sản phẩm có giá trung bình lớn hơn giá trung bình của tất cả sản phẩm trong bảng "Products".
SELECT ProductName, Price FROM Products WHERE Price > (SELECT AVG(Price) FROM Products);
Bài tập 8: Tạo một truy vấn để lấy tên của khách hàng đặt hàng nhiều nhất từ bảng "Customers" và "Orders".
SELECT Customers.CustomerName FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID GROUP BY Customers.CustomerName ORDER BY COUNT(Orders.OrderID) DESC LIMIT 1;
Bài tập 9: Tạo một truy vấn để lấy danh sách tất cả các nhà cung cấp và tổng số sản phẩm mà họ đã cung cấp, sắp xếp theo tổng số sản phẩm giảm dần.
SELECT Suppliers.SupplierName, COUNT(Products.ProductID) AS TotalProductsSupplied FROM Suppliers LEFT JOIN Products ON Suppliers.SupplierID = Products.SupplierID GROUP BY Suppliers.SupplierName ORDER BY TotalProductsSupplied DESC;
Bài tập 10: Tạo một truy vấn để lấy danh sách các sản phẩm có tồn kho ít hơn 10 đơn vị từ bảng "Products".
SELECT ProductName, UnitsInStock FROM Products WHERE UnitsInStock < 10;
Nhớ kiểm tra kết quả của từng truy vấn để đảm bảo tính đúng đắn. Chúc bạn học tốt và thành công với SQL nâng cao!
Xem những bài tập nâng cao hơn tại đây.
Kết luận
SQL là một ngôn ngữ quan trọng đối với bất kỳ ai muốn làm việc với cơ sở dữ liệu. Bằng cách nắm vững các khái niệm và câu lệnh SQL cơ bản, bạn có thể truy cập và thao tác dữ liệu một cách hiệu quả.