1. Trang chủ
  2. » Nông - Lâm - Ngư

Co so du lieu Chuong 4 ThS Nguyen Vuong Thinh

48 45 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Cơ Sở Dữ Liệu Và Quản Trị Cơ Sở Dữ Liệu
Tác giả Nguyễn Vương Thịnh
Trường học Trường Đại Học Hàng Hải Việt Nam
Chuyên ngành Hệ thống thông tin
Thể loại bài giảng
Năm xuất bản 2016
Thành phố Hải Phòng
Định dạng
Số trang 48
Dung lượng 1,53 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

CÂU LỆNH TRUY VẤN SELECT VÀ ĐẠI SỐ QUAN HỆ Câu lệnh truy vấn SELECT có sự tương đương một cách không hoàn toàn với một biểu thức đại số quan hệ:  Mệnh đề INNER JOIN tương ứng với phép k[r]

Trang 1

TRƯỜNG ĐẠI HỌC HÀNG HẢI VIỆT NAM KHOA CÔNG NGHỆ THÔNG TIN

BÀI GIẢNG HỌC PHẦN

CƠ SỞ DỮ LIỆU VÀ QUẢN TRỊ CƠ SỞ DỮ LIỆU

Giảng viên: ThS Nguyễn Vương Thịnh bản ghi môn: Hệ thống thông tin

Hải Phòng, 2016

Chương 4

NGÔN NGỮ TRUY VẤN CÓ CẤU TRÚC (SQL – Structured Query Language)

Trang 2

Thông tin về giảng viên

Họ và tên Nguyễn Vương Thịnh

Đơn vị công tác Bộ môn Hệ thống thông tin – Khoa Công nghệ thông tin Học vị Thạc sỹ

Chuyên ngành Hệ thống thông tin

Cơ sở đào tạo Trường Đại học Công nghệ - Đại học Quốc Gia Hà Nội Năm tốt nghiệp 2012

Điện thoại 0983283791

Email thinhnv@vimaru.edu.vn

Website http://scholar.vimaru.edu.vn/thinhnv

Trang 3

Thông tin về học phầnTên học phần Cơ sở dữ liệu và quản trị cơ sở dữ liệu

Tên tiếng Anh Database and Database Management

Mã học phần 17425

Số tín chỉ 04 tín chỉ (LT: 45 tiết, TH: 30 tiết)

Bộ môn phụ trách Hệ thống thông tin

PHƯƠNG PHÁP HỌC TẬP, NGHIÊN

PHƯƠNG PHÁP ĐÁNH GIÁ

Có 02 bài kiểm tra viết giữa học phần (X 2 = (L 1 + L 2 )/2), 01 bài kiểm tra thực hành (X 3 ) Điểm quá trình X = (X 2 + X 3 )/2.

trên máy tính (Z = 0.5X + 0.5Y).

Trang 4

Tài liệu tham khảo

1 Elmasri, Navathe, Somayajulu, Gupta, Fundamentals of Database

Systems (the 4 th Edition), Pearson Education Inc, 2004.

2 Nguyễn Tuệ, Giáo trình Nhập môn Hệ Cơ sở dữ liệu, Nhà xuất bản

Giáo dục Việt Nam, 2007

3 Nguyễn Kim Anh, Nguyên lý của các hệ Cơ sở dữ liệu, Nhà xuất bản

Đại học Quốc gia Hà Nội, 2004

Trang 5

Tài liệu tham khảo

Trang 6

NGÔN NGỮ TRUY VẤN CÓ CẤU TRÚC

4.1 TỔNG QUAN VỀ NGÔN NGỮ SQL

4.2 NGÔN NGỮ ĐỊNH NGHĨA DỮ LIỆU (DDL)

4.3 NGÔN NGỮ THAO TÁC DỮ LIỆU (DML)

4.4 CÁC DẠNG THỨC CỦA CÂU LỆNH SELECT 4.5 CÂU LỆNH SELECT VÀ ĐẠI SỐ QUAN HỆ

6

Trang 7

4.1 TỔNG QUAN VỀ NGÔN NGỮ SQL

(Structured Query Language)

4.1.1 LỊCH SỬ PHÁT TRIỂN

Squel dựa trên mô hình dữ liệu quan hệ của F.Codd.

quốc tế (ISO) đã công bố các phiên bản chuẩn của SQL: SQL_86, SQL_89, SQL_92, SQL:1999, SQL:2003, SQL:2006, SQL:2008, SQL:2011

không hỗ trợ một số câu lệnh hay cú pháp)

Trang 9

4.1.3 MỘT SỐ QUY ƯỚC VỀ THUẬT NGỮ

Khi làm việc với SQL và các hệ quản trị cơ sở dữ liệu thông thường:

Dữ liệu được tổ chức dưới dạng cơ sở dữ liệu (database) Đó là

Mỗi bảng dữ liệu (data table) là tập hợp các hàng (bản ghi) và cột

Lưu ý: Một tập hợp các bản ghi là kết quả trả về của một câu lệnh truy vấn SELECT cũng được xem là một quan hệ.

mỗi bản ghi (record) của bảng là một bộ (tuple) của quan hệ.

nghĩa) bởi lược đồ quan hệ tương ứng.

Trang 11

4.1.4 CÁC KIỂU DỮ LIỆU TRONG SQL

5 bit Chứa giá trị tương ứng với 01 trong 02 trạng thái 0 hoặc 1

12 decimal(p,s) Số thực phần thập phân cố định (p: tổng số chữ số, s: số chữ số phần thập phân) Phạm vi biểu diễn: -10 38 + 1 đến 10 38 – 1.

13 numeric(p,s) Số thực phần thập phân cố định (p: tổng số chữ số, s: số chữ số phần thập phân) Phạm vi biểu diễn: -10 38 + 1 đến 10 38 – 1.

15 real Số thực dấu phẩy động (từ -3.40E+38 đến 3.40E+38)

16 datetime Thời gian (gồm ngày/tháng và giờ/phút/giây) (từ 01/01/1753 đến 31/12/9999)

17 smalldatetime Thời gian (gồm ngày/tháng và giờ/phút/giây) (từ 01/01/1900 đến 06/06/2079)

18 date Thời gian (chỉ có ngày/tháng) (từ 01/01/0001 đến 31/12/9999)

19 time Thời gian (chỉ có giờ/phút/giây)

Trang 12

4.2 NGÔN NGỮ ĐỊNH NGHĨA DỮ LIỆU (DDL – Data Definition Language)

4.2.1 CÁC LỆNH ĐỐI VỚI CƠ SỞ DỮ LIỆU

A Tạo cơ sở dữ liệu

CREATE DATABASE <tên CSDL>

Ví dụ 4.1:

CREATE DATABASE dbQuanLyBanHang

B Xóa cơ sở dữ liệu

DROP DATABASE <tên CSDL>

Ví dụ 4.2:

DROP DATABASE dbQuanLyBanHang

Lưu ý: Các hệ quản trị CSDL khác nhau có thể đưa thêm vào một số tham số tùy biến khác.

Trang 13

<tên cột> <kiểu dữ liệu> [NOT NULL ],

[<tên cột> <kiểu dữ liệu> [NOT NULL ],]

[<tên cột> <kiểu dữ liệu> [NOT NULL ],]

[ CONSTRAINT <tên ràng buộc> PRIMARY KEY (<DS cột>),]

[ CONSTRAINT <tên ràng buộc> FOREIGN KEY (<DS cột>)

REFERENCES <tên bảng được tham chiếu>(<DS cột>),]

)

B Xóa bỏ bảng dữ liệu

DROP TABLE <tên bảng>

Trang 14

C Sửa đổi cấu trúc bảng dữ liệu

Thêm cột dữ liệu mới

ALTER TABLE <tên bảng>

ADD <tên cột> <kiểu dữ liệu> [NOT NULL ]

Xóa cột dữ liệu

ALTER TABLE <tên bảng>

DROP COLUMN <danh sách cột>

Sửa kiểu dữ liệu của cột

ALTER TABLE <tên bảng>

ALTER COLUMN <tên cột> <kiểu dữ liệu mới> [NOT NULL ]

Thêm một ràng buộc đối với bảng

ALTER TABLE <tên bảng>

ADD CONSTRAINT <tên ràng buộc> <kiểu ràng buộc>

Xóa một ràng buộc đối với bảng

ALTER TABLE <tên bảng>

DROP CONSTRAINT <tên ràng buộc>

14

Trang 15

Ví dụ 4.3: Tạo các bảng dữ liệu sau đây:

PhongBan (MaPB, TenPB, DiaDiem)

NhanVien (MaNV, TenNV, ChuyenMon, Phong)

CREATE TABLE PhongBan

(

MaPB char ( 3 ) NOT NULL ,

TenPB nvarchar ( 30 ) NOT NULL ,

MaNV char ( 5 ) NOT NULL ,

TenNV nvarchar ( 30 ) NOT NULL ,

ChuyenMon nvarchar ( 100 ),

Phong char ( 3 ) NOT NULL ,

CONSTRAINTPK_NhanVien PRIMARY KEY (MaNV),

CONSTRAINTFK_NhanVien FOREIGN KEY (Phong) REFERENCES PhongBan(MaPB) )

Trang 16

Ví dụ 4.4:

Thêm cột NgaySinh vào bảng NhanVien

ALTER TABLE NhanVien

Đổi kiểu dữ liệu của cột ChuyenMon trong bảng NhanVien từ kiểu nvarchar có độ dài 100 sang kiểu nvarchar có độ dài 150

ALTER TABLE NhanVien

ALTER COLUMN ChuyenMon nvarchar(150)

Xóa cột DiaDiem trong bảng PhongBan

ALTER TABLE PhongBan

DROP COLUMN DiaDiem

Xóa ràng buộc khóa ngoại FK_NhanVien trong bảng NhanVien

ALTER TABLE NhanVien

DROP CONSTRAINT FK_NhanVien

Trang 17

4.3 NGÔN NGỮ THAO TÁC DỮ LIỆU (DML – Data Manipulation Language)

4.3.1 THÊM BẢN GHI VÀO BẢNG – CÂU LỆNH INSERT

INSERT INTO <tên bảng>[(<DS cột>)] VALUES(<DS giá trị>)

Ví dụ 4.5:

INSERT INTO PhongBan VALUES('PTV', N'Phòng Tài vụ', N'P203 - C3')

Ví dụ 4.6:

INSERT INTO PhongBan(TenPB, MaPB) VALUES ( N'Phòng Tài vụ', 'PTV')

4.3.2 CẬP NHẬT DỮ LIỆU TRONG BẢNG – CÂU LỆNH UPDATE

UPDATE <tên bảng>

SET <tên cột 1> = <giá trị 1>, <tên cột 2> = <giá trị 2>, .

[ WHERE <điều kiện>]

Trang 18

4.3.3 XÓA DỮ LIỆU TRONG BẢNG – CÂU LỆNH DELETE

DELETE FROM <tên bảng> [WHERE <điều kiện>]

Ví dụ 4.8:

DELETE FROM NhanVien WHERE ChuyenMon = N'Kỹ sư tin học'

4.3.4 TRUY VẤN DỮ LIỆU TRONG BẢNG – CÂU LỆNH SELECT

SELECT [ DISTINCT ] [ TOP N] *|<danh sách cột>

FROM <các bảng dữ liệu>

[ WHERE <điều kiện>]

[ GROUP BY <danh sách cột> [HAVING <điều kiện>]]

[ ORDER BY <danh sách cột> [ ASC | DESC ]]

Mệnh đề FROM <các bảng dữ liệu>

có thể được kết nối (join) với nhau theo 1 cách thức nào đấy.

Trang 19

Mệnh đề WHERE <điều kiện>

thỏa mãn <điều kiện> được chỉ ra sau WHERE mới được trả về

Mệnh đề GROUP BY <danh sách cột>

Chia tập bản ghi lấy về thành các nhóm sao cho:

cột> (chỉ ra sau GROUP BY) sẽ được xếp vào cùng nhóm

dụng để tính toán trên từng nhóm.

Mệnh đề HAVING <điều kiện>

Đi kèm với GROUP BY để lọc ra các nhóm thỏa mãn <điều kiện>

cho trước

Trang 20

Mệnh đề ORDER BY <danh sách cột> [ASC|DESC]

Sắp xếp các bản ghi kết quả theo trật tự tăng dần (ASC) hay giảm

dần (DESC) của giá trị trên các cột được chỉ ra trong <danh sách

cột>.

Mệnh đề SELECT *|<danh sách cột>

dấu * sau SELECT nếu muốn hiển thị tất cả các cột của tập kết quả.

ghi trùng lắp trong tập kết quả.

trong tập kết quả

cú pháp <tên cột> AS <bí danh>.

Trang 21

4.4 CÁC DẠNG THỨC CỦA CÂU LÊNH

TRUY VẤN SELECT

4.4.1 LỌC CÁC BẢN GHI TRẢ VỀ VỚI MỆNH ĐỀ WHERE

SELECT *|<danh sách cột> FROM <tên bảng> WHERE <điều kiện>

Lưu ý: <điều kiện> là biểu thức logic gồm các phép toán so sánh

(<,>,>=,<=, <>, BETWEEN, LIKE) kết hợp với các phép toán logic (AND,

OR, NOT)

Ví dụ 4.9: HocSinh ( MaHS , TenHS , NamSinh , Lop , DiemThi )

Liệt kê các học sinh của lớp 10A5 có điểm trên 8 hoặc dưới 5

SELECT MaHS, TenHS, Diem FROM HocSinh

WHERE ((Diem >= 8 ) OR (Diem < 5 )) AND (Lop = '10A5' )

Liệt kê toàn bản ghi thông tin về các học sinh của lớp 10A5 và 10A7

có điểm trong khoảng từ 7 đến 9

SELECT * FROM HocSinh

WHERE (Diem BETWEEN 7 AND 9) AND (Lop = '10A5' OR Lop = '10A7')

Trang 22

Toán tử so sánh mờ LIKE:

trước hay không.

Ký tự "%": Đại diện cho một đoạn chuỗi ký tự bất kỳ.

Ký tự "_": Đại diện cho một ký tự bất kỳ.

Ví dụ 4.10: HocSinh ( MaHS , TenHS , NamSinh , Lop , DiemThi )

Liệt kê tất cả các học sinh có họ "Nguyễn"

SELECT * FROM HocSinh WHERE TenHS LIKE N 'Nguyễn% '

Liệt kê tất cả các học sinh có phần họ và đệm là "Nguyễn Văn" còn phần tên gồm 3 ký tự kết thúc bằng "n"

SELECT * FROM HocSinh WHERE TenHS LIKE N 'Nguyễn Văn _ _n'

Trang 23

4.4.2 TRUY VẤN GỘP NHÓM VỚI MỆNH ĐỀ GROUP BY VÀ HAVING

SELECT *|<danh sách cột> FROM <tên bảng> [WHERE <điều kiện>]

GROUP BY <danh sách cột> [HAVING <điều kiện>]

Chia dữ liệu lấy về thành các nhóm (group) sao cho các bản ghi trong cùng nhóm thì sẽ có giá trị trên các cột dùng để gộp nhóm là giống nhau.

Mỗi bản ghi của kết quả sẽ mang các giá trị đại diện cho một nhóm Đó có thể là một số các giá trị của cột gộp nhóm hoặc là kết quả khi áp dụng một

hàm thống kê trên nhóm đó (các hàm thống kê thường được sử dụng kèm trong mệnh đề SELECT để thực hiện tính toán trên từng nhóm).

Mệnh đề HAVING giúp lọc ra các nhóm (group) thỏa mãn <điều kiện>

Lưu ý: Chỉ những cột có mặt trong mệnh đề GROUP BY hoặc các hàm thống

kê (tức là những giá trị đại diện cho cả nhóm) mới được phép xuất hiện trong mệnh đề SELECT và HAVING.

Trang 24

CÁC HÀM THỐNG KÊ THƯỜNG DÙNG:

COUNT(*): Đếm số bản ghi có trong 1 nhóm.

COUNT(A i ): Đếm số giá trị tương ứng với cột A i của các bản ghi trong nhóm.

SUM(A i ): Tính tổng các giá trị tương ứng với cột A i của các bản ghi trong nhóm.

MAX(A i ): Tìm giá trị lớn nhất trong số các giá trị tương ứng với cột A i của các bản ghi trong nhóm.

MIN(A i ): Tìm giá trị nhỏ nhất trong số các giá trị tương ứng với cột A i của các bản ghi trong nhóm.

AVG(A i ): Tính giá trị trung bình của các giá trị tương ứng với cột A i của các bản ghi trong nhóm.

Trang 25

ID Valu

e

Typ e

Inventory ( ID , Value , Type )

Thống kê số lượng và tổng giá trị các đồ vật thuộc về mỗi loại

SELECT Type, COUNT(*) , SUM(Value)

FROM Inventory GROUP BY Type

Trang 26

ID Valu

e

Typ e

COUNT(

*)

SUM(Val ue)

Typ e

COUNT(

*)

SUM(Val ue)

Typ e

COUNT(

*)

SUM(Val ue)

Trang 27

Ví dụ 4.12: HocSinh ( MaHS , TenHS , NamSinh , Lop , DiemThi )

Liệt kê số lượng học sinh có trong từng lớp mà có điểm thi từ 5 điểm trở lên

SELECT Lop , COUNT(*) AS SoLuong FROM HocSinh

WHERE DiemThi >= 5.0 GROUP BY Lop

Liệt kê các lớp có số lượng học sinh trong bảng lớn hơn 30

SELECT Lop, COUNT(*) AS SoLuong FROM HocSinh

GROUP BY Lop HAVING COUNT(*) > 30

Thống kê điểm số cao nhất và thấp nhất mà học sinh trong mỗi lớp đạt được

SELECT Lop, MAX(DiemThi) AS CaoNhat, MIN(DiemThi) AS ThapNhat

FROM HocSinh GROUP BY Lop

Thống kê điểm thi bình quân của học sinh mỗi lớp

SELECT Lop, AVG(DiemThi) AS DiemBinhQuan FROM HocSinh

GROUP BY Lop

Trang 28

Ví dụ 4.13: MatHang ( MaMH , TenMH , LoaiHang , SoLuong , DonGia )

Thống kê ứng với mỗi loại hàng có bao nhiêu mặt hàng

SELECT LoaiHang , COUNT(*) AS SL_MatHang FROM MatHang

GROUP BY LoaiHang

Thống kê các mặt hàng số lượng lớn hơn 10

SELECT MaMH, TenMH, SoLuong FROM MatHang

WHERE SoLuong >10

Thống kê các loại hàng có số lượng mặt hàng lớn hơn 3

SELECT LoaiHang, COUNT(*) AS SL_MatHang FROM MatHang

GROUP BY LoaiHang HAVING COUNT(*) > 3

Thống kê tổng số sản phẩm ứng với mỗi loại hàng (tính tổng số lượng sản phẩm của các mặt hàng thuộc về loại đó)

SELECT LoaiHang, SUM(SoLuong) AS TongSoSP FROM MatHang

GROUP BY LoaiHang

Trang 29

Thống kê giá trị (bằng tiền) ứng với mỗi mặt hàng (lưu ý: chỉ thống kê các mặt hàng có số lượng trên 10 chiếc) Biết Giá trị =

Số lượng * Đơn giá

SELECT MaMH, TenMH, SoLuong * DonGia AS GiaTri

FROM MatHang WHERE SoLuong > 10

Thống kê giá trị bằng tiền ứng với mỗi loại hàng (tổng tiền các mặt hàng thuộc về loại hàng đó)

SELECT LoaiHang, SUM(SoLuong * DonGia) AS GiaTri

FROM MatHang GROUP BY LoaiHang

Trang 30

4.4.3 SẮP XẾP CÁC BẢN GHI KẾT QUẢ VỚI MỆNH ĐỀ ORDER BY

SELECT *|<danh sách cột> FROM <tên bảng> [WHERE <điều kiện>]

[ GROUP BY <danh sách cột> [HAVING <điều kiện>]]

ORDER BY <danh sách cột> [ASC | DESC ]

Ví dụ 4.14: HocSinh ( MaHS , TenHS , NamSinh , Lop , DiemThi )

Liệt kê các học sinh theo thứ tự giảm dần của điểm thi

SELECT MaHS, Ten HS, DiemThi FROM HocSinh

ORDER BY DiemThi DESC

Liệt kê các học sinh theo thứ tự lớp tăng dần (10A1, 10A2, 10A3 , 11A1, 11A2, 11A3 )

SELECT * FROM HocSinh ORDER BY DiemThi

Liệt kê các học sinh theo thứ tự lớp tăng dần (10A1, 10A2, ), nếu các học sinh cùng lớp thì xếp giảm dần theo điểm

SELECT * FROM HocSinh ORDER BY Lop ASC, DiemThi DESC

Trang 31

4.4.4 TRUY VẤN DỮ LIỆU TỪ NHIỀU BẢNG

SELECT *|<danh sách cột> FROM <các bảng dữ liệu>

[ WHERE ] [ GROUP BY ] [ ORDER BY .]

mệnh đề join

A Mệnh đề INNER JOIN

<bảng 1> INNER JOIN <bảng 2> ON <điều kiện 1-2>

Trả về 01 tập các bản ghi Mỗi bản ghi là kết quả của việc kết nối

một bản ghi của <bảng 1> với một bản ghi của <bảng 2> nếu chúng thỏa mãn <điều kiện 1-2>

<bảng 1> INNER JOIN <bảng 2> ON <điều kiện 1-2>

INNER JOIN <bảng 3> ON <điều kiện 1-2-3>

INNER JOIN <bảng n> ON <điều kiện 1-2- -n>

Trang 33

B Các mệnh đề OUTER JOIN

LEFT OUTER JOIN

<bảng 1> LEFT OUTER JOIN <bảng 2> ON <điều kiện 1-2>

Trả về 01 tập các bản ghi gồm:

Các bản ghi là kết quả của việc kết nối các bản ghi của <bảng 1> với các bản ghi của <bảng 2> nếu chúng thỏa mãn <điều kiện 1-2>

(chính là kết quả của INNER JOIN).

bản ghi nào của <bảng 2>) sau khi đã bổ sung thêm các giá trị NULL vào vị trí tương ứng với các cột của <bảng 2>.

<bảng 1> <bảng 2>

Trang 35

B Các mệnh đề OUTER JOIN

RIGHT OUTER JOIN

<bảng 1> RIGHT OUTER JOIN <bảng 2> ON <điều kiện 1-2>

Trả về 01 tập các bản ghi gồm:

Các bản ghi là kết quả của việc kết nối các bản ghi của <bảng 1> với các bản ghi của <bảng 2> nếu chúng thỏa mãn <điều kiện 1-2>

(chính là kết quả của INNER JOIN).

bản ghi nào của <bảng 1>) sau khi đã bổ sung thêm các giá trị NULL vào vị trí tương ứng với các cột của <bảng 1>.

<bảng 1> <bảng 2>

Trang 37

B Các mệnh đề OUTER JOIN

FULL OUTER JOIN

<bảng 1> FULL OUTER JOIN <bảng 2> ON <điều kiện 1-2>

Trả về 01 tập các bản ghi gồm:

Các bản ghi là kết quả của việc kết nối các bản ghi của <bảng 1> với các bản ghi của <bảng 2> nếu chúng thỏa mãn <điều kiện 1-2>

(chính là kết quả của INNER JOIN).

bản ghi nào của <bảng 2>) sau khi đã bổ sung thêm các giá trị NULL vào vị trí tương ứng với các cột của <bảng 2>.

bản ghi nào của <bảng 1>) sau khi đã bổ sung thêm các giá trị NULL vào vị trí tương ứng với các cột của <bảng 1>.

<bảng 1> <bảng 2>

Ngày đăng: 03/11/2021, 12:09

HÌNH ẢNH LIÊN QUAN

(Cập nhật dữ liệu vào các bảng, truy vấn (đọc) dữ liệu từ các bảng,...) - Co so du lieu Chuong 4 ThS Nguyen Vuong Thinh
p nhật dữ liệu vào các bảng, truy vấn (đọc) dữ liệu từ các bảng,...) (Trang 8)
4.2.2. CÁC LỆNH ĐỐI VỚI BẢNG DỮ LIỆU - Co so du lieu Chuong 4 ThS Nguyen Vuong Thinh
4.2.2. CÁC LỆNH ĐỐI VỚI BẢNG DỮ LIỆU (Trang 13)
Ví dụ 4.11: Cho bảng dữ liệu: - Co so du lieu Chuong 4 ThS Nguyen Vuong Thinh
d ụ 4.11: Cho bảng dữ liệu: (Trang 25)

🧩 Sản phẩm bạn có thể quan tâm

w