-
Thông tin
-
Quiz
Những lưu ý trong SQL | Cơ sở dữ liệu | Trường Đại học Công nghiệp TP.HCM
Những lưu ý trong SQL môn Cơ sở dữ liệu của Trường Đại học Công nghiệp Thành phố Hồ Chí Minh. Hi vọng tài liệu này sẽ giúp các bạn học tốt, ôn tập hiệu quả, đạt kết quả cao trong các bài thi, bài kiểm tra sắp tới. Mời các bạn cùng tham khảo chi tiết bài viết dưới đây nhé.
Cơ sở dữ liệu (ĐHCN) 19 tài liệu
Đại học Công nghiệp Thành phố Hồ Chí Minh 386 tài liệu
Những lưu ý trong SQL | Cơ sở dữ liệu | Trường Đại học Công nghiệp TP.HCM
Những lưu ý trong SQL môn Cơ sở dữ liệu của Trường Đại học Công nghiệp Thành phố Hồ Chí Minh. Hi vọng tài liệu này sẽ giúp các bạn học tốt, ôn tập hiệu quả, đạt kết quả cao trong các bài thi, bài kiểm tra sắp tới. Mời các bạn cùng tham khảo chi tiết bài viết dưới đây nhé.
Môn: Cơ sở dữ liệu (ĐHCN) 19 tài liệu
Trường: Đại học Công nghiệp Thành phố Hồ Chí Minh 386 tài liệu
Thông tin:
Tác giả:
Tài liệu khác của Đại học Công nghiệp Thành phố Hồ Chí Minh
Preview text:
NHỮNG LƯU Ý KHI TRONG SQL
Question:
tôi có 2 bảng như sau: bảng 1 (tên: HoaDon): gồm có: maHD (khóa chính), ngayLapHD, ngayGiao, noiChuyen, maKH (khóa ngoại, gồm có các dữ liệu 'KH1', 'KH2', 'KH3')
bảng 2 (tên: KhachHang): gồm có: maKH (khóa chính), tenKH, loaiKH, diaChi, phone, dcMail, diemTL.
Khi tôi cập nhật maKH trên bảng KhachHang 'KH3' thành 'VI003' thì lại bị lỗi. Làm sao để cập nhật được maKH này?
Answer:
Khi bạn cố gắng cập nhật giá trị của `maKH` từ `'KH3'` thành `'VI003'` trong bảng `KhachHang`, bạn gặp lỗi do có ràng buộc khóa ngoại giữa bảng `HoaDon` và bảng `KhachHang`. Khóa ngoại `maKH` trong bảng `HoaDon` đang tham chiếu tới giá trị `'KH3'` trong bảng `KhachHang`. Do đó, nếu bạn thay đổi `maKH` trong bảng `KhachHang` mà không xử lý giá trị tương ứng trong bảng `HoaDon`, hệ quản trị cơ sở dữ liệu sẽ ngăn chặn việc thay đổi này để bảo vệ tính toàn vẹn của dữ liệu.
Để giải quyết vấn đề này, bạn có thể làm theo các bước sau:
- **Cập nhật các bản ghi trong bảng `HoaDon` trước**: Trước khi thay đổi giá trị `maKH` trong bảng `KhachHang`, bạn cần cập nhật tất cả các bản ghi trong bảng `HoaDon` đang tham chiếu tới `'KH3'` thành `'VI003'`.
```sql
UPDATE HoaDon
SET maKH = 'VI003'
WHERE maKH = 'KH3';
```
- **Cập nhật giá trị `maKH` trong bảng `KhachHang`**: Sau khi đã cập nhật các bản ghi trong bảng `HoaDon`, bạn có thể thay đổi `maKH` trong bảng `KhachHang`.
```sql
UPDATE KhachHang
SET maKH = 'VI003'
WHERE maKH = 'KH3';
```
- **Kiểm tra xem có ràng buộc ON UPDATE CASCADE hay không**: Nếu bạn muốn tự động cập nhật các giá trị `maKH` trong bảng `HoaDon` khi giá trị tương ứng trong bảng `KhachHang` thay đổi, bạn có thể định nghĩa khóa ngoại với tùy chọn `ON UPDATE CASCADE`. Điều này sẽ đảm bảo rằng khi bạn thay đổi `maKH` trong bảng `KhachHang`, các giá trị tương ứng trong bảng `HoaDon` sẽ được tự động cập nhật.
Ví dụ về việc thêm ràng buộc với `ON UPDATE CASCADE`:
```sql
ALTER TABLE HoaDon
ADD CONSTRAINT FK_maKH
FOREIGN KEY (maKH)
REFERENCES KhachHang(maKH)
ON UPDATE CASCADE;
```
Sau khi thực hiện các bước này, bạn sẽ có thể cập nhật giá trị `maKH` trong bảng `KhachHang` mà không gặp lỗi.
Question: cách để cập nhật giá trị mà không sử dụng 'ON UPDATE CASCADE' Answer:
Nếu bạn muốn cập nhật giá trị của `maKH` mà không sử dụng tùy chọn `ON UPDATE CASCADE`, bạn có thể thực hiện các bước thủ công sau:
### 1. **Tạm thời xóa ràng buộc khóa ngoại**:
Bạn có thể tạm thời xóa ràng buộc khóa ngoại giữa hai bảng để tránh lỗi khi cập nhật giá trị `maKH`.
```sql
ALTER TABLE HoaDon
DROP CONSTRAINT [Tên_ràng_buộc_khóa_ngoại];
```
> Lưu ý: Bạn cần xác định tên của ràng buộc khóa ngoại (`[Tên_ràng_buộc_khóa_ngoại]`) để xóa đúng ràng buộc.
### 2. **Cập nhật giá trị `maKH` trong bảng `HoaDon`**:
Cập nhật tất cả các bản ghi trong bảng `HoaDon` từ `'KH3'` thành `'VI003'`.
```sql
UPDATE HoaDon
SET maKH = 'VI003'
WHERE maKH = 'KH3';
```
### 3. **Cập nhật giá trị `maKH` trong bảng `KhachHang`**:
Sau khi đã cập nhật bảng `HoaDon`, bạn có thể thay đổi giá trị `maKH` trong bảng `KhachHang`.
```sql
UPDATE KhachHang
SET maKH = 'VI003'
WHERE maKH = 'KH3';
```
### 4. **Khôi phục lại ràng buộc khóa ngoại**:
Sau khi đã cập nhật cả hai bảng, bạn có thể thêm lại ràng buộc khóa ngoại để duy trì tính toàn vẹn của dữ liệu.
```sql
ALTER TABLE HoaDon
ADD CONSTRAINT FK_maKH
FOREIGN KEY (maKH)
REFERENCES KhachHang(maKH);
```
### 5. **Kiểm tra và xác nhận lại dữ liệu**:
Cuối cùng, kiểm tra lại dữ liệu trong cả hai bảng để đảm bảo rằng tất cả các giá trị `maKH` đã được cập nhật đúng cách và ràng buộc khóa ngoại đã được khôi phục thành công.
Thực hiện các bước này sẽ giúp bạn cập nhật giá trị `maKH` mà không sử dụng tùy chọn `ON UPDATE CASCADE`, nhưng vẫn đảm bảo rằng dữ liệu trong cả hai bảng là nhất quán và chính xác.
Question: update HoaDon set maKH = N'VI003' where maKH = null trong bảng HoaDon có dòng có maKH là null, nhưng khi set lại giá trị thành N'VI003' thì nó lại không áp dụng được (0 row(s) affected)?
Answer:
Lý do bạn không thể cập nhật các dòng có giá trị `maKH` là `NULL` bằng cách sử dụng câu lệnh SQL như sau:
```sql
UPDATE HoaDon SET maKH = N'VI003' WHERE maKH = null;
```
là do trong SQL, phép so sánh `=` với `NULL` không hoạt động như các giá trị khác. `NULL` trong SQL biểu thị giá trị không xác định, và bất kỳ phép so sánh trực tiếp nào với `NULL` (ví dụ `maKH = NULL`) sẽ luôn trả về `FALSE`.
### Cách khắc phục:
Bạn nên sử dụng toán tử `IS NULL` để kiểm tra xem một cột có giá trị `NULL` hay không. Câu lệnh chính xác để cập nhật các bản ghi có `maKH` là `NULL` sẽ như sau:
```sql
UPDATE HoaDon SET maKH = N'VI003' WHERE maKH IS NULL;
```
### Giải thích:
- **`IS NULL`**: Đây là toán tử dùng để kiểm tra xem giá trị của cột có phải là `NULL` hay không. Khi bạn sử dụng `WHERE maKH IS NULL`, SQL sẽ tìm tất cả các dòng mà cột `maKH` có giá trị là `NULL`.
- **`UPDATE`**: Câu lệnh này sẽ cập nhật tất cả các dòng thỏa mãn điều kiện `maKH IS NULL` thành giá trị `VI003`.
Khi bạn sử dụng câu lệnh trên, tất cả các bản ghi trong bảng `HoaDon` mà `maKH` hiện đang là `NULL` sẽ được cập nhật thành `'VI003'`.
Cách sử dụng truy vấn con:
Câu truy vấn của bạn bị lỗi vì bạn đã sử dụng câu lệnh con lồng nhau (`subquery`) không hợp lệ. Cụ thể, bạn đang sử dụng một phép tính `max()` bên trong `having`, nhưng cấu trúc của câu truy vấn con này không chính xác. Vấn đề chính nằm ở cách lồng câu truy vấn con hai lần không cần thiết, đồng thời cần sửa cú pháp để câu truy vấn con trả về kết quả hợp lệ.
### Lỗi chính:
- Bạn đã viết một câu lệnh `max()` lồng bên trong một câu `subquery` khác, và điều này không cần thiết.
- Sử dụng cú pháp `max()` không đúng cách trong truy vấn con.
### Cách sửa:
Bạn cần sửa câu lệnh con để chỉ trả về tổng số lượng cao nhất của bất kỳ sản phẩm nào trong năm 1998. Dưới đây là câu lệnh đã được sửa lại:
```sql
SELECT p.ProductID, SUM(od.Quantity) AS TotalQuantitySold FROM
[dbo].[Products] AS p
INNER JOIN [dbo].[Order Details] AS od ON p.ProductID = od.ProductID
INNER JOIN [dbo].[Orders] AS o ON od.OrderID = o.OrderID
WHERE YEAR(o.OrderDate) = 1998
GROUP BY p.ProductID
HAVING SUM(od.Quantity) > (
SELECT MAX(TotalSold)
FROM (
SELECT SUM(od.Quantity) AS TotalSold FROM
[dbo].[Products] AS p
INNER JOIN [dbo].[Order Details] AS od ON p.ProductID =
od.ProductID
INNER JOIN [dbo].[Orders] AS o ON od.OrderID = o.OrderID
WHERE YEAR(o.OrderDate) = 1998
GROUP BY p.ProductID
) AS Subquery
);
```
### Giải thích về cách sửa:
- **Câu truy vấn chính**:
- Lấy `ProductID` và tổng số lượng (`SUM(od.Quantity)`) của từng sản phẩm được bán trong năm 1998.
- **HAVING SUM(od.Quantity) > ...**:
- Dùng `HAVING` để lọc ra những sản phẩm có tổng số lượng bán lớn hơn kết quả của câu truy vấn con.
- **Truy vấn con**:
- Truy vấn con trong phần `HAVING` sẽ tìm ra tổng số lượng bán lớn nhất (`MAX(TotalSold)`) của bất kỳ sản phẩm nào trong năm 1998.
- Truy vấn này lồng một câu `SELECT` con để lấy `SUM(od.Quantity)` cho mỗisản phẩm, sau đó dùng `MAX()` để lấy tổng số lớn nhất.
### Kết quả:
Câu truy vấn này sẽ trả về danh sách các sản phẩm có tổng số lượng bán được lớn hơn sản phẩm bán nhiều nhất trong năm 1998.