View allAll Photos Tagged CodeGym
SQL hay viết tắt của Structured Query Language, là ngôn ngữ truy vấn có cấu trúc giúp bạn truy xuất và cập nhật dữ liệu ở DB. Với mỗi RDBMS thì SQL sẽ thay đổi nhỏ ở một số cú pháp, nhưng nhìn chung điều đó là không nhiều. Bài viết sau mình sẽ hướng dẫn các bạn sử dụng SQL trên hệ quản trị MySQL.
1. Kiểu dữ liệu
Với mỗi table, sẽ có nhiều column, mỗi column được xem là thuộc tính của đối tượng. Và mỗi column sẽ có mỗi kiểu dữ liệu khác nhau, thường các kiểu mà chúng ta hay gặp:
Kí tự, chuỗi (String)
Số (Numeric)
Ngày và giờ (Date and Time)
Với mỗi loại, mình có liệt kê các kiểu thường xuyên được dùng để xây dựng DB, hãy cùng xem các bảng bên dưới.
1.1. Kiểu String
Kiểu dữ liệu
Mô tả
CHAR (size)
Độ dài là cố định.
Phạm vi 0 đến 255. Mặc định là 1
VARCHAR (size)
Độ dài thay đổi được.
Phạm vi 0 đến 65,535.
TINYTEXT
Độ dài thay đổi được, tối đa là 255 kí tự
TEXT
Độ dài thay đổi được.
Phạm vi 0 đến 65,535.
MEDIUMTEXT
Độ dài tối đa đến 16,777,215.
LONGTEXT
Độ dài tối đa đến 4,294,967,295.
Ngoài ra, nếu cần lưu trữ giá trị nhị phân thì có thể sử dụng kiểu BLOB.
1.2. Kiểu Numeric
Kiểu dữ liệu
Mô tả
BIT
Kiểu số có kích thước nhỏ nhất. Giá trị mặc định là 1.
BOOL (BOOLEAN)
Kiểu TRUE/FALSE
TINYINT, SMALLINT, INT, BIGINT
Các kiểu số nguyên
FLOAT, DOUBLE, DECIMAL
Các kiểu số thực (số thập phân)
1.3. Kiểu Date
Kiểu dữ liệu
Mô tả
DATE
Kiểu ngày, định dạng là: yyyy-mm-dd
DATETIME
Kiểu ngày và giờ, định dạng là: yyyy-mm-dd hh🇲🇲ss
TIMESTAMP
Tương tự như kiểu DATETIME, nhưng lưu dữ liệu theo chuẩn UTC.
TIME
Kiểu giờ, định dạng là: hh🇲🇲ss
YEAR
Kiểu năm, lưu trữ 4 chữ số.
[Database] SQL (Part 1)
[Database] SQL (Part 2)
2. Toán tử so sánh
Được sử dụng so sánh các dữ liệu với nhau, từ đó mới lọc kết quả cuối cùng của câu lệnh SQL.
Các toán tử so sánh cũng gần giống như các phép toán học.
Toán tử
Chú thích
=
So sánh bằng
>
So sánh lớn hơn
<
So sánh nhỏ hơn
>=
So sánh lớn hơn hoặc bằng
<=
So sánh nhỏ hơn hoặc bằng
Có thể dùng !=, đây là phép so sánh khác
3. Toán tử logic
Được sử dụng để phối hợp các biểu thức điều kiện với nhau
Toán tử
Ý nghĩa
AND
Trả về TRUE nếu 2 biểu thức cùng trả về TRUE.
IN
Trả về TRUE nếu chỉ cần có biểu thức trong danh sách điều kiện là TRUE
NOT
Phủ định biểu thức trả về kiểu BOOLEAN.
OR
Trả về TRUE nếu một trong hai biểu thức là TRUE
LIKE
Kiểm tra tính gần đúng của dữ liệu.
BETWEEN
Trả về TRUE, nếu giá trị thuộc trong đoạn
ALL
Trả về TRUE nếu tất cả tập so sánh là TRUE.
ANY
Trả về TRUE nếu có bất kỳ giá trị ở tập so sánh là TRUE.
EXISTS
Trả về TRUE nếu truy vấn trả về ít nhất một dòng dữ liệu
SOME
Trả về TRUE nếu vài giá trị ở tập so sánh là TRUE.
4. NULL
Là một giá trị đặc biệt, nó thể hiện 3 ý nghĩa sau:
Thể hiện giá trị chưa được xác định rõ ràng.
Giá trị ở đây không phải là rỗng hay 0.
Không thể dùng các toán tử so sánh thông thường với NULL, mà cần sử dụng toán tử IS. Như là IS NULL hay IS NOT NULL.
Kết luận
Hôm nay mình chỉ giới thiệu lại phần SQL đến đây thôi, có thể thấy rằng SQL cũng có nhiều khái niệm tương tự như bên ngôn ngữ lập trình. Nhưng đây chỉ là ngôn ngữ để thao tác với các dữ liệu ở DB, tức là chỉ thao tác với tầng dưới cùng của một hệ thống, được xem như là phương tiện để một ứng dụng giao tiếp được với DB trong hệ thống.
Nguồn: codegym.vn/blog/2023/11/18/structured-query-language-sql/
Ở phần kiến thức hôm nay, mình tiếp tục chia sẻ về VIEW, là một khái niệm nâng cao hơn so với các bài trước đây. Và kiến thức này cũng hay được sử dụng trong khi làm dự án.
1. VIEW trong SQL là gì?
Là table ảo (virtual) dựa trên kết quả từ câu lệnh SQL SELECT. Và nó cũng có các dòng và cột nhưng là table thật. Vậy hãy cùng theo dõi tiếp bên dưới nó có gì khác với table thật hay không.
Khái niệm View
2. Mục đích sử dụng VIEW
Giúp thao tác nhanh với dữ liệu mà không cần viết lại câu lệnh SQL SELECT từ đầu. Vì nó cũng chứa các dòng và cột như table thật, nên chúng ta có thể thao tác như một table thông thường.
3. Hướng dẫn thao tác với VIEW trong SQL
3.1. Tạo VIEW
Cú pháp
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
Lưu ý: Dữ liệu ở VIEW luôn được cập nhật theo dữ liệu mới nhất ở table chính.
Ví dụ
Tạo ra VIEW để liệt kê ra toàn bộ thông tin các bác sĩ và thông tin tài khoản. Với các bác sĩ chưa có tài khoản, hay tài khoản chưa có ai sở hữu thì cũng phải liệt kê ra.
CREATE VIEW view_full_join AS
SELECT d.doctor_id, d.last_name, a.account
FROM doctor d
LEFT JOIN account_system a ON d.doctor_id = a.doctor_id
UNION ALL
SELECT d.doctor_id, d.last_name, a.account
FROM doctor d
RIGHT JOIN account_system a ON d.doctor_id = a.doctor_id;
3.2. Thao tác với VIEW
Tiếp tục ví dụ bên trên, vì VIEW là một table ảo, nên bạn có thể dùng SELECT để truy vấn như một table thật:
SELECT *
FROM view_full_join;
Nhưng bạn hãy nhớ một số lưu ý khi muốn cập nhật dữ liệu (INSERT, UPDATE, DELETE) trên VIEW:
VIEW không chứa GROUP BY, ORDER BY.
Không chứa DISTINCT.
Nên chứa cả các column NOT NULL.
Không chứa sub query.
VIEW chỉ nên được tạo từ 1 table.
3.3. Để cập nhật cấu trúc VIEW
Khi bạn muốn cập nhật cấu trúc VIEW, hãy sử dụng với cú pháp:
CREATE OR REPLACE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
3.4. Xoá VIEW
Như là các khái niệm được tạo ra bởi CREATE, thì khi xoá chúng ta cũng sẽ sử dụng DROP như bên dưới:
DROP VIEW view_name;
Kết luận
Nếu trong dự án xuất hiện nhiều câu lệnh truy vấn phức tạp, thì hãy sử dụng VIEW để giải quyết vấn đề này. Ngoài ra, VIEW cũng có nhiều loại, các bạn hãy tìm hiểu thêm để linh hoạt trong cách sử dụng nhé.
Ở các phần kiến thức trước, chúng ta đã cùng tìm hiểu nhóm lệnh DDL trong tập các nhóm lệnh ở SQL:
Nhóm định nghĩa cấu trúc dữ liệu (DDL).
Nhóm lệnh thao tác dữ liệu (DML).
Nhóm lệnh phân quyền sử dụng dữ liệu (DCL).
Nhóm lệnh thao tác với transaction (TCL).
Bài hôm nay chúng ta tiếp tục tìm hiểu nhóm lệnh thao tác dữ liệu (DML).
1. Vai trò của câu lệnh DML trong SQL
Với DDL thì nhóm lệnh này sẽ giúp người dùng định nghĩa các cấu trúc dữ liệu. Nhưng với DML thì giúp chúng ta thao tác với DB để truy xuất hoặc cập nhật dữ liệu từ ứng dụng/hệ thống bên trên.
[Database] DML 1 (Part 1)
[Database] DML 1 (Part 2)
2. Hướng dẫn sử dụng các câu lệnh phổ biến ở DML
2.1. Câu lệnh INSERT
Sử dụng để thêm mới record đến table.
Cú pháp
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
Ví dụ
Ở bài DDL, mình đã tạo ra table doctor, giờ mình sẽ thêm dữ liệu:
INSERT INTO doctor (`first_name`, `middle_name`, `last_name`, date_of_birth, qualification, specialization_id)
VALUES
('Nguyễn', 'Mạnh', 'An', '1985-01-04', 6, 2);
2.2. Câu lệnh UPDATE
Sử dụng để cập nhật giá trị của một hoặc nhiều cột
Cú pháp
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
Ví dụ
UPDATE doctor
SET qualification = 10
WHERE doctor_id = 5;
Mình đang thực hiện cập nhật lại số năm kinh nghiệm của bác sĩ có doctor_id là 5.
Nếu câu lệnh trên không có điều kiện WHERE thì nó sẽ thực hiện cập nhật toàn bộ các record ở table doctor.
2.3. Câu lệnh DELETE
Dùng để xoá một hoặc nhiều record ở table.
Cú pháp
DELETE FROM table_name
WHERE condition;
Ví dụ
DELETE FROM doctor
WHERE doctor_id = 5;
Mình đang thực hiện xoá bác sĩ có doctor_id là 5.
Nếu câu lệnh trên không có điều kiện WHERE thì nó cũng sẽ xoá toàn bộ các record ở table.
2.4. Câu lệnh SELECT
Là câu lệnh luôn được sử dụng ở SQL, giúp cho việc truy xuất dữ liệu theo nhiều cách khác nhau.
Cú pháp
SELECT column_name(s)
FROM table_name
WHERE condition
Ví dụ
SELECT last_name
FROM doctor;
Câu lệnh trên giúp lấy ra phần tên (last_name) của toàn bộ bác sĩ.
SELECT *
FROM doctor
WHERE last_name = "An";
Còn nếu các bạn muốn lấy toàn bộ thông tin thì cần sử dụng câu lệnh SELECT *
Ngoài ra, câu lệnh SELECT còn được kết hợp với các từ khoá khác để tuỳ biến trong việc lấy dữ liệu, như là:
SELECT DISTINCT last_name
FROM doctor;
Với các bác sĩ trùng tên, thì câu lệnh trên chỉ lấy ra một giá trị duy nhất.
Khi muốn giới hạn số record lấy ra, thì kết hợp SELECT và LIMIT:
SELECT *
FROM doctor
LIMIT 3;
Nó sẽ lấy ra 3 bác sĩ đầu tiên, ở các DBMS khác thì cú pháp LIMIT sẽ thay đổi, như là: TOP, FETCH, ROWNUM.
Kết luận
Trên đây là tập các câu lệnh ở DML thường xuyên được sử dụng khi thao tác với dữ liệu, nếu nắm rõ sẽ giúp các bạn xử lý dữ liệu dễ dàng hơn. Còn với câu lệnh SELECT, thì còn rất nhiều kiến thức để nghiên cứu, các bạn tiếp tục theo dõi ở các bài sau để hiểu hơn về câu lệnh SELECT nhé.
Nguồn: codegym.vn/blog/2023/11/19/cac-cau-lenh-thong-dung-o-dml-...
Chương trình không yêu cầu học viên có kiến thức công nghệ thông tin trước đó, nên phù hợp với nhiều đối tượng như: sinh viên, người đã tốt nghiệp Đại học, Cao Đẳng, Trung cấp và người đi làm muốn chuyển nghề. - fklsxzh7k0 - codegym.vn/blog/2022/08/08/hoc-tester-o-ha-noi/
Lập trình Android là gì?
Theo thống kế vào năm 2012, sau bốn năm kể từ khi ra mắt có khoảng 700.000 ứng dụng trên Android và số lượt tải ứng dụng từ Google Play. Cửa hàng ứng dụng chính của Android, ước tính khoảng 25 tỷ lượt. Chỉ trong vòng hơn 10 năm android đã trở thành một hệ điều hành phổ biến trên thế giới. Nó đã phát triển bất chấp sự bùng nổ mạnh mẽ của hệ điều iOS của Apple.
codegym.vn/blog/2018/12/22/lap-trinh-android-la-gi/
#codegym #hoclaptrinh #codingbootcamp #CNTT #laptrinhvien #daotaolaptrinh
Khóa học tester cơ bản như thế nào? - Sau khi tìm được một địa chỉ đào tạo uy tín và một khóa học tester cho người mới bắt đầu thì bạn sẽ được đào tạo từ những khái niệm cơ bản nhất. Vậy một khóa học tester cho người mới bắt đầu sẽ được học những gì? Trước khi bắt đầu khóa học các giảng viên sẽ cho bạn biết về khái niệm tester là gì? Công việc của một tester hàng ngày sẽ là làm gì? điều này sẽ khiến cho các bạn dễ hình dung hơn về công việc của mình sau khi kết thúc khóa học. Những thông tin này các bạn có thể tìm hiểu tại Đây. - 69xllbda8x - codegym.vn/blog/2022/08/02/khoa-hoc-tester-cho-nguoi-moi-...
Thường khi làm việc với dữ liệu ở tầng dưới cùng của một hệ thống hay ứng dụng, chúng ta đã quá quen thuộc với các khái niệm như DB (Database), SQL (Structured Query Language). Và các bạn cũng thường nghe đến khái niệm RDBMS, vậy các bạn đã hiểu rõ về RDBMS hay chưa. Vậy thì hôm nay chúng ta cùng tìm hiểu sâu hơn về nó.
Khái niệm RDBMS
Hay được viết tắt Relational Database Management System, là chương trình cho phép lập trình viên tạo, cập nhật, quản lý hay các xử lý khác với DB quan hệ.
Sau đây là một số RDBMS thông dụng:
MySQL
PostgreSQL
Microsoft SQL Server
Oracle Database…
1. DB quan hệ
Ở trên là ví dụ cho một DB quan hệ của một hệ thống rạp phim, bao gồm 4 table: Ratings, Users, Tags, Movies. Các table sẽ có liên kết với nhau qua các mối quan hệ 1 – 1, 1 – n, n – n. Với hình trên, thì 1-* đang biểu đạt cho mối quan hệ 1 – n.
Và các DB quan hệ sẽ được quản lý bởi các RDMS như:
2. MySQL
3. SQL Server
RDBMS là gì
Phân biệt Entity và Table
Entity là một đối tượng trong thực tế. Và table là khái niệm entity ở DB quan hệ. Table là một khái niệm rộng hơn, có thể hiểu là đại diện cho một entity, nhưng nó cũng dùng để thể hiện mối quan hệ giữa entity với nhau nữa.
4. Table
Với ví dụ trên chúng ta đang có 3 table là Employee, Work_On, Project. 3 table này được tạo ra dựa trên kết quả của mối quan hệ giữa 2 entity là Employee và Project.
Hay có thể thấy rằng với 2 entity Employee và Project, thì sẽ tạo ra được 2 table tương ứng là Employee và Project. Đồng thời, giữa 2 table này có mối quan hệ và sinh ra thêm table thứ 3 là Work_On.
Kết luận
Tóm lại khái niệm RDBMS chính là hệ quản trị các cơ sở dữ liệu, giúp cho lập trình viên thao tác với DB dễ dàng hơn. Lập trình viên có thể sử dụng các thao tác giao diện hoặc dùng SQL để làm việc với các DB.
Hôm nay chúng ta chỉ tìm hiểu đến đây thôi, hi vọng các bạn đã hiểu rõ về RDBMS và lựa chọn được RDBMS phù hợp để luyện tập với DB.
Tại SaigonTech, giảng viên luôn luôn tự hoàn thiện và nâng cao trình độ của mình, các nhà quản lý luôn biết hỗ trợ nhân viên, các sinh viên luôn biết trau dồi kiến thức để tiến bộ nhanh chóng thông qua sự hướng dẫn của giảng viên và các hoạt động hỗ trợ sinh viên. Thông tin liên hệ: - x7du08wyzt - codegym.vn/blog/2022/06/10/top-10-trung-tam-day-lap-trinh...
Chào mừng tân sinh viên Trường Đại học Kinh tế Đà Nẵng! Bài viết này sẽ giúp bạn tìm hiểu về lịch trình và thông tin quan trọng nhất trong ngày khai giảng. Hãy xem chi tiết tại đây: codegym.vn/blog/2023/09/11/chao-don-tan-sinh-vien-truong-... @CodeGym
Ở Database (DB) quan hê, đặc biệt là DB lớn, công việc chuẩn hoá database được đánh giá là một trong những giai đoạn quan trọng trước khi đưa DB vào sử dụng. Vậy chuẩn hoá DB là gì? Vì sao lại cần chuẩn hoá và làm sao để chuẩn hoá DB? Bài viết này sẽ giúp bạn giải đáp các thắc mắc này.
Chuẩn hoá Database là gì?
Là tổ chức lại dữ liệu:
Cần loại bỏ sự dư thừa dữ liệu.
Và đảm bảo lưu trữ dữ liệu có logic.
Hay chính là việc phân tách các table lớn thành các table nhỏ hơn và liên kết chúng bởi các mối quan hệ.
[Database] Normalization (Part 1)
[Database] Normalization (Part 2)
Vì sao cần chuẩn hoá Database
Ở DB quan hệ, đặc biệt là DB lớn, chúng ta cần phải tổ chức cấu trúc có logic để việc bảo trì và quản lý chúng dễ dàng hơn. Nên chuẩn hoá là một giai đoạn quan trọng trước khi đưa DB vào sử dụng.
Các cách chuẩn hoá Database
Chuẩn hoá 1
Mỗi ô dữ liệu chỉ chứa đơn giá trị.
Mỗi record phải là duy nhất (tức là phải có khoá chính).
Chuẩn hoá 2
DB hiện tại phải đạt chuẩn 1NF.
Cần loại bỏ các phụ thuộc thành phần (Partial Dependency).
Chuẩn hoá 3
DB hiện tại phải đạt chuẩn 2NF.
Cần loại bỏ các phụ thuộc bắc cầu (Transitive Dependency).
Chuẩn hoá Boyce-Codd
DB hiện tại phải đạt chuẩn 3NF.
Cần loại bỏ các khoá thành viên (candidate keys).
Tức là ngoài khoá chính (primary key) hiện tại, thì table không được phép chứa bất kỳ column nào có chức năng tương tự như primary key nữa.
Chuẩn hoá 4
DB hiện tại phải đạt chuẩn Boyce-Codd.
Cần loại bỏ các phụ thuộc đa trị (Multi-valued Dependency).
(tương tự như Quy tắc 2 ở các bước chuyển đổi ERD sang Table).
Chuẩn hoá 5
Hay còn gọi là PJNF – Project-Join Normal Form.
Cần loại bỏ phụ thuộc liên kết (Join Dependency) nếu cần thiết.
Kết luận
Vậy chúng ta đã đi qua toàn bộ các bước chuẩn hoá Database. Hầu hết các table sẽ không vượt quá 3NF, nhưng bạn cũng cần nắm thêm về 4NF, 5NF. Phụ thuộc vào yêu cầu hay độ lớn của dữ liệu mà các quy tắc đó sẽ được áp dụng.
Sau khi đã có ERD, ở kiến thức hôm nay chúng ta tiếp tục chuyển đổi ERD thành các Relations, chính là table ở Database mà chúng ta hay sử dụng để thao tác với dữ liệu, ở video mình sẽ có ví dụ cụ thể hơn.
Vì sao cần chuyển đổi từ ERD sang Relations?
Như đã biết, ERD chỉ là sơ đồ mô tả trực quan yêu cầu của khách hàng, nên chúng ta chưa thể sử dụng để chứa dữ liệu và truy xuất dữ liệu vào hệ thống/ứng dụng sau này được. Vì vậy chúng ta sẽ tiếp tục chuyển đổi từ ERD sang Relations.
Convert to ERD to relations
Các bước chuyển đổi ERD sang Relations
1. Biến đổi một kiểu thực thể thành một table
Thuộc tính khóa của thực thể chính là khoá chính của table.
Các thuộc tính thông thường của thực thể là thuộc tính của table.
2. Biến đổi thuộc tính đa trị thành một table
Tách thuộc tính đa trị thành table mới, đặt khoá chính của table mới đó vào table ban đầu, đóng vai trò là khoá ngoại tham chiếu đến table ban đầu.
3. Biểu diễn mối liên kết có lượng số 1-1
Đặt thuộc tính khóa ở phía tùy chọn sang phía bắt buộc.
4. Biểu diễn mối liên kết có lượng số 1-n
Đặt thuộc tính khóa ở phía 1 sang n.
5. Biến đổi mối liên kết có lượng số n-n
Sinh ra table trung gian và khoá chính của table này được tạo bởi sự kết hợp giữa 2 khoá của 2 thực thể tham gia vào mối quan hệ n-n, hay còn được gọi là khoá phức hợp.
Kết luận
Sau khi hoàn thành 5 quy tắc chuyển đổi ERD sang Relations, gần như chúng ta đã có được một Database hoàn chỉnh rồi. Nhưng để toàn vẹn được dữ liệu ở DB về sau, thì cần phải tiếp tục đánh giá DB qua các quy tắc ở Normalization Form.
Nguồn: codegym.vn/blog/2023/11/17/chuyen-doi-erd-sang-relations/
Download toàn bộ tài liệu lập trình C cho người mới bắt đầu
C được phổ biến khá rộng rãi và đã trở thành một công cụ lập trình khá mạnh, được sử dụng như là một ngôn ngữ lập trình chủ yếu trong việc xây dựng những phần mềm hiện nay. Ngày C chính thức ra mắt bởi Dennis M. Ritchie để phát triển hệ điều hành UNIX, nó được phát triển như một dự án mở tuyệt vời cho các nhà lập trình viên học tập. Ứng dụng chủ yếu của C để kết hợp với Assembly để viết các trình điều khiển, hệ điều hành và ngôn ngữ khác như C++, Python, Java …
codegym.vn/blog/2021/01/17/tai-lieu-lap-trinh-c-cho-nguoi...
#codegym #hoclaptrinh #codingbootcamp #CNTT #laptrinhvien #daotaolaptrinh
Ở 2 bài trước chúng ta đã cùng tìm hiểu các lệnh cơ bản trong nhóm DML (INSERT, UPDATE, DELETE và SELECT), với từ khoá dùng chung để làm đa dạng hơn cách xử lý ở câu lệnh truy vấn (IN, EXISTS, LIKE và UNION).
Trong bài hôm nay, chúng ta cùng tìm hiểu các lệnh JOIN, với nhiều kiểu khác nhau. Qua tên gọi thì các bạn cũng đã hiểu phần nào về ý nghĩa các kiểu JOIN này rồi, chúng ta cùng tiếp tục đi chi tiết hơn.
1. Vai trò của câu lệnh JOIN trong SQL
Thường hay được sử dụng với câu lệnh SELECT để giúp liên kết dữ liệu của các table.
[Database] DML 3 (Part 1)
[Database] DML 3 (Part 2)
2. Các loại câu lệnh JOIN trong SQL
Gồm 4 loại cơ bản sau:
INNER JOIN
OUTER JOIN
SELF JOIN
CROSS JOIN
3. Ý nghĩa và cách sử dụng câu lệnh JOIN trong SQL
3.1. Câu lệnh INNER JOIN
Là một kiểu JOIN để kết hợp các records từ 2 hoặc nhiều table có liên kết với nhau qua khoá ngoại (FOREIGN KEY).
Cú pháp
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name
Ví dụ
SELECT *
FROM doctor d
INNER JOIN account_system a
ON d.doctor_id = a.doctor_id;
Sử dụng câu lệnh trên để lấy ra thông tin các bác sĩ và thông tin tài khoản truy cập vào hệ thống của họ.
3.2. Câu lệnh OUTER JOIN
Cú pháp
SELECT column_name(s)
FROM table1
LEFT/RIGHT/FULL [OUTER] JOIN table2
ON table1.column_name = table2.column_name;
Ví dụ về LEFT JOIN
SELECT *
FROM doctor d
LEFT JOIN account_system a ON d.doctor_id = a.doctor_id;
Với mục đích lấy ra thông tin các bác sĩ và thông tin tài khoản truy cập vào hệ thống của họ. Và bác sĩ nào chưa có tài khoản cũng phải liệt kê ra.
Ví dụ về RIGHT JOIN
SELECT *
FROM doctor d
RIGHT JOIN account_system a ON d.doctor_id = a.doctor_id;
Ngược lại, với việc dùng RIGHT JOIN thì câu lệnh trên sẽ lấy ra các thông tin chung giữa 2 table doctor và account_system, kể cả các tài khoản không có xuất hiện ở table doctor.
Ví dụ về FULL JOIN
Với MySQL, không có hỗ trợ FULL JOIN thì chúng ta thực hiện kết hợp LEFT JOIN và RIGHT JOIN như bên dưới:
SELECT *
FROM doctor d
LEFT JOIN account_system a ON d.doctor_id = a.doctor_id
UNION ALL
SELECT *
FROM doctor d
RIGHT JOIN account_system a ON d.doctor_id = a.doctor_id;
3.3. Câu lệnh SELF JOIN
Là một kiểu JOIN mà table đó tự join với chính nó.
Cú pháp
SELECT column_name(s)
FROM table T1, table T2
WHERE condition;
Ví dụ
SELECT d1.middle_name, d1.last_name, d1.specialization_id,
d2.middle_name, d2.last_name, d2.specialization_id
FROM doctor d1, doctor d2
WHERE d1.specialization_id = d2.specialization_id
AND d1.doctor_id d2.doctor_id;
Mục đích câu lệnh truy vấn dùng để liệt kê ra các bác sĩ có cùng chuyên khoa với nhau, bằng cách join table doctor với chính nó và những bác sĩ nào có mã chuyên khoa (specialization_id) giống nhau thì hiển thị ra.
3.4. Câu lệnh CROSS JOIN
Là một kiểu JOIN mà trả về tất cả record ở các table, tức là một record ở table này sẽ join với từng record ở table còn lại mà không dựa trên điều kiện nào cả.
Lưu ý: Kết quả từ CROSS JOIN khả năng sẽ rất lớn.
Cú pháp
SELECT column_name(s)
FROM table1
CROSS JOIN table2;
Ví dụ
SELECT *
FROM doctor
CROSS JOIN account_system;
Câu lệnh trên sẽ lấy toàn bộ record của table doctor với từng record ở table account_system mà không cần bất kỳ điều kiện liên kết nào giữa các record.
Kết luận
Sơ lược lại các loại JOIN chúng ta đã tìm hiểu ở phần kiến thức hôm nay:
Khi bạn muốn lấy ra các record có liên kết giữa các table thì sử dụng INNER JOIN.
Ngoài việc lấy các record có liên kết và kể cả các record không liên kết ở một phía table thì hãy nghĩ đến OUTER JOIN, trong này sẽ có 3 loại: LEFT JOIN, RIGHT JOIN, FULL JOIN.
Còn SELF JOIN thì sử dụng khi cần liên kết các record trong chính table đó.
Cuối cùng là CROSS JOIN, dùng khi không cần bất kỳ điều kiện liên kết nào giữa các record trong các table.
Nguồn: codegym.vn/blog/2023/11/20/cach-su-dung-join-de-lien-ket-...
Ở bài hôm nay chúng ta cùng tiếp tục tìm hiểu phần kiến thức nâng cao để ứng biến xử lý trong các trường hợp đặc biệt khi xử lý dữ liệu. Đó là CURSOR.
1. CURSOR trong SQL là gì?
CURSOR hay còn gọi là con trỏ, là khái niệm giúp bạn truy cập từng dòng dữ liệu trong quá trình xử lý. Tức là với việc không thể sử dụng các khái niệm mình đã giới thiệu ở các bài vừa qua để giải quyết vấn đề, thì mới nghĩ đến CURSOR.
Khái niệm CURSOR trong SQL
2. Tại sao phải sử dụng CURSOR
Nó dùng để duyệt các record ở table hay ở các kết quả từ câu lệnh truy vấn.
Gồm 3 tính chất sau:
Read only: chúng ta không thể cập nhật dữ liệu ở table qua CURSOR.
Non scrollable: chỉ có thể duyệt qua các dòng theo thứ tự được lấy ra từ câu lệnh SELECT. Không thể duyệt theo thứ tự ngược lại. Thêm nữa, chúng ta không thể bỏ qua record hay nhảy đến record mong muốn được.
Asensitive/Insensitive: có 2 loại CURSOR. Với asensitive thì nó sẽ duyệt trên chính dữ liệu ở table, còn insensitive nó sẽ duyệt trên dữ liệu tạm, tức là dữ liệu được sao chép từ dữ liệu thật. Vì vậy, hiệu suất của asensitive sẽ nhanh hơn insensitive. Tuy nhiên, với bất kỳ sự thay đổi của data chính sẽ làm ảnh hưởng đến quá trình xử lý của asensitive, sẽ an toàn hơn nếu không có sự cập nhật nào về dữ liệu. Loại con trỏ ở MySQL là asensitive.
3. Hướng dẫn cách dùng CURSOR
Cú pháp
Để khai báo một con trỏ, ta dùng lệnh:
DECLARE cursor_name CURSOR FOR query;
Khởi tạo kết quả truy vấn để bắt đầu duyệt:
OPEN cursor_name;
Để lấy kết quả từ con trỏ đến biến:
FETCH cursor_name INTO variables list;
Dừng hoạt động và giải phóng bộ nhớ con trỏ:
CLOSE cursor_name;
Ví dụ
Để thực hiện gửi tin nhắn đến cho toàn bộ tài khoản của các bác sĩ trong hệ thống, mình tạo ra FUNCTION và đang áp dụng CURSOR để lấy ra danh sách tài khoản, theo định dạng:
[tài khoản 1];[tài khoản 2];[tài khoản 3]…
Trong bài toán này, có thể thấy CURSOR có tên là cur_account, đang đại diện cho một tài khoản. Sau đó kết quả sẽ được tổng hợp dần vào biến account_list.
delimiter //
CREATE FUNCTION sp_get_list_account()
RETURNS TEXT
DETERMINISTIC
BEGIN
DECLARE is_last_record BIT DEFAULT 0;
DECLARE account_doctor VARCHAR(30);
DECLARE account_list TEXT DEFAULT "";
DECLARE cur_account CURSOR FOR
SELECT `account` FROM account_system;
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET is_last_record = 1;
OPEN cur_account;
for_each_account: LOOP
FETCH cur_account INTO account_doctor;
IF is_last_record = 1 THEN
LEAVE for_each_account;
END IF;
SET account_list = CONCAT(account_doctor, ";", account_list);
END LOOP for_each_account;
CLOSE cur_account;
RETURN account_list;
END //
delimiter ;
Kết luận
Hơi khá phức tạp phải không? Bạn cứ hiểu thế này, CURSOR nó sẽ duyệt qua từng record được trả về từ câu lệnh truy vấn. Cứ mỗi vòng lặp, CURSOR sẽ nhảy xuống record tiếp theo, cho đến khi nhảy đến hết record cuối cùng thôi. Nếu bạn đã từng thao tác đọc file ở các ngôn ngữ lập trình rồi, thì CURSOR nó cũng gần tương tự như vậy.
Mặc dù khó để hiểu nhưng CURSOR sẽ giúp bạn linh hoạt hơn trong cách sử dụng để xử lý dữ liệu.
Hôm nay, chúng ta cùng tìm hiểu một khái niệm khá hay trong SQL, đó là INDEX, một khái niệm thường xuyên gặp khi xử lý bộ dữ liệu lớn.
1. Index trong SQL là gì?
Là kỹ thuật đánh dấu ở table, giúp truy xuất dữ liệu nhanh hơn.
Khái niệm INDEX
2. Vai trò INDEX trong SQL
Giúp truy xuất dữ liệu nhanh hơn, với dữ liệu ít trùng lặp thì sẽ cải thiện hiệu suất một cách đáng kể. Và INDEX được ứng dụng rất nhiều vào các công cụ tìm kiếm để tăng tốc độ tìm kiếm.
3. Hướng dẫn cách dùng INDEX
Cú pháp
CREATE INDEX index_name
ON table_name (column1, column2, ...);
Ví dụ
Thực hiện tạo index cho cột last_name ở table doctor.
CREATE INDEX idx_doctor_name
ON doctor(last_name);
Khi truy vấn như bên dưới thì tốc độ đã được tối ưu. Bằng cách sử dụng câu lệnh EXPLAIN để phân tích cách chạy của câu lệnh, bạn sẽ thấy rằng, nó chỉ duyệt qua các record chứa theo đúng giá trị được gán vào last_name. Chứ không phải duyệt toàn bộ như trước đây.
SELECT *
FROM doctor
WHERE last_name = 'Đại';
4. Một số lưu ý khi sử dụng INDEX
Không nên sử dụng INDEX:
Ở các table nhỏ, ít dữ liệu.
Ở các column ít xuất hiện ở điều kiện trong câu query.
Ở các column phải cập nhật dữ liệu thường xuyên.
Kết luận
Với những kiến thức đã giới thiệu ở trên thì đó là những mô tả chung nhất cho INDEX, ngoài ra cũng còn khá nhiều loại INDEX, các bạn hãy tìm hiểu thêm nhé.
[nhúng]https://youtu.be/3Fq6LAB26m8[/embed]
Nguồn: codegym.vn/blog/2023/11/22/uu-diem-va-luu-y-ve-index-tron...
Xem thêm tại: codegym.vn/blog/2022/08/04/dao-tao-tester/
#codegym #hoclaptrinh #codingbootcamp #CNTT #laptrinhvien
Xem thêm tại: codegym.vn/blog/2022/09/14/tester-can-hoc-nhung-gi/
#codegym #hoclaptrinh #codingbootcamp #CNTT #laptrinhvien
Một số lưu ý khi tham gia khóa học lập trình game mobile - Bạn chỉ nên cân nhắc làm việc trong ngành này nếu thực sự đam mê game mobile.. Không tập trung vào các giải pháp dành riêng cho bất kì nền tảng nào bởi nó sẽ hạn chế nhiều lựa chọn của bạn trên thị trường ngay từ đầu. Bạn nên sử dụng Unity và phần mềm phụ trợ không máy chủ để tạo game mobile trong thời gian rảnh nếu bạn đang muốn học thêm kiến thức nhưng lại không phải trong ngành liên quan đến game mobile Bạn nên thành thạo Photoshop nếu muốn trở thành một lập trình viên game mobile chuyên nghiệp. - svlhijh2gh - codegym.vn/blog/2022/01/20/khoa-hoc-lap-trinh-game-moblie/
"Nghiên cứu trường hợp Module 2 của học viên CodeGym Huế đã được công bố! Khám phá những thành quả đáng kinh ngạc và trình bày bởi các bạn học viên tài năng. Đặt mục tiêu thành công với CodeGym ngay bây giờ!"
Xem ngay tại: codegym.vn/blog/2023/09/11/case-study-module-2-cua-hoc-vi...
Trong khi thiết lập DB thì cần phải có các quy tắc để đảm bảo được lượng dữ liệu sẽ được chứa trong DB, bài hôm nay chúng ta cùng tìm hiểu các quy tắc này dựa qua các ràng buộc (constraints),
1. Vai trò của các ràng buộc (constraints) trong SQL
Các ràng buộc (constraints) thường được sử dụng như là quy tắc cho các dữ liệu ở table.
Ràng buộc dùng để giới hạn các dữ liệu đến table. Đảm bảo tính chính xác và rõ ràng của dữ liệu. Nếu có bất kì sự vi phạm nguyên tắc đến các ràng buộc thì thao tác đó sẽ bị huỷ.
Phạm vị của ràng buộc sẽ nằm ở mức độ cột hay table.
[Database] Constraint (Part 1)
[Database] Constraint (Part 2)
2. Các loại ràng buộc (constraints) trong SQL
Ở SQL, bao gồm các loại ràng buộc chung sau đây:
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
DEFAULT
Cú pháp chung:
CREATE TABLE table_name (
column1 datatype constraint,
column2 datatype constraint,
column3 datatype constraint,
constraint
....
);
3. Hướng dẫn sử dụng các ràng buộc (constraints)
3.1. NOT NULL
Ý nghĩa
Mặc định, các cột sẽ có giá trị là NULL.
Khi định nghĩa cột là NOT NULL, thì sẽ bảo đảm người dùng không nhập được giá trị NULL đến cột, tức là cột phải có giá trị rõ ràng.
Ví dụ
CREATE TABLE doctor (
doctor_id INT,
first_name VARCHAR(10) NOT NULL,
middle_name VARCHAR(10)
);
Với ví dụ trên, bạn hãy thử INSERT hay UPDATE một record ở doctor với giá trị ở cột first_name là NULL, thì sẽ bị lỗi và không thể thực hiện các thao tác đó.
3.2. UNIQUE
Ý nghĩa
Ràng buộc UNIQUE sẽ đảm bảo giá trị các cột luôn khác nhau.
Với PRIMARY KEY thì cũng đảm bảo việc này, với PRIMARY KEY thì các column mặc định sẽ là khác nhau mà không cần phải khai báo.
Sử dụng UNIQUE sẽ áp dụng nhiều lần ở một table, nhưng với PRIMARY KEY thì không.
Ví dụ
CREATE TABLE doctor (
doctor_id INT,
first_name VARCHAR(10),
middle_name VARCHAR(10),
id_card VARCHAR(15),
UNIQUE (id_card)
);
Từ đó, đảm bảo id_card (căn cước công dân) sẽ không bị trùng lặp giữa các bác sĩ.
3.3. PRIMARY KEY
Ý nghĩa
Đảm bảo tính duy nhất ở mỗi record trong table.
Với primary key, thì nó sẽ là UNIQUE và NOT NULL.
Mỗi table chỉ có một khoá chính, khoá chính có thể chứa 1 hoặc nhiều cột.
Ví dụ
CREATE TABLE doctor (
doctor_id INT PRIMARY KEY,
first_name VARCHAR(10),
middle_name VARCHAR(10)
);
Hoặc có thể dùng cách 2 bên dưới.
CREATE TABLE doctor (
doctor_id INT,
first_name VARCHAR(10),
middle_name VARCHAR(10),
CONSTRAINT pk_doctor PRIMARY KEY (doctor_id)
);
Với cách 2 thì có thể tạo khoá chính với nhiều cột.
3.4. FOREIGN KEY
Ý nghĩa
Đảm bảo dữ liệu luôn được liên kết giữa 2 table, nếu khác thì quá trình INSERT, UPDATE sẽ bị huỷ.
FOREIGN KEY là một cột ở table, nó tham chiếu đến PRIMARY KEY ở table khác.
Ví dụ
CREATE TABLE specialization (
specialization_id INT PRIMARY KEY,
specialization_name VARCHAR(50)
);
CREATE TABLE doctor (
doctor_id INT PRIMARY KEY,
`first_name` VARCHAR (10),
`middle_name` VARCHAR (10),
`last_name` VARCHAR (10),
date_of_birth DATE,
qualification INT,
specialization_id INT,
FOREIGN KEY (specialization_id) REFERENCES specialization(specialization_id)
);
Với cột specialization_id (chuyên khoa) ở table doctor, thì giá trị sẽ chỉ thuộc ở table specialization, nếu cố tình nhập giá trị khác thì sẽ bị lỗi và thao tác bị huỷ bỏ.
3.5. CHECK
Ý nghĩa
Giới hạn phạm vi giá trị ở cột.
Hay nói cách khác, ràng buộc này sẽ giúp kiểm tra giá trị nhập vào phải khớp với điều kiện đã được khai báo với cột đó.
Ví dụ
CREATE TABLE doctor (
doctor_id INT PRIMARY KEY,
first_name VARCHAR(10),
middle_name VARCHAR(10),
qualification INT,
CHECK (qualification >= 0)
);
Với cách khai báo như trên, thì số năm kinh nghiệm (qualification) của doctor phải lớn hơn hoặc bằng 0, nếu nhập số âm sẽ báo lỗi.
3.6. DEFAULT
Ý nghĩa
Dùng để gán giá trị mặc định đến một cột, trong trường hợp người dùng không nhập giá trị cho cột này.
Ví dụ
CREATE TABLE doctor (
doctor_id INT PRIMARY KEY,
first_name VARCHAR(10),
middle_name VARCHAR(10),
qualification INT DEFAULT 1
);
Nếu người dùng không nhập giá trị cho cột qualification, thì giá trị mặc định sẽ là 1.
Kết luận
Để giữ được dữ liệu luôn chuẩn xác, dễ thao tác và bảo trì trong tương lai, thì các ràng buộc (constraints) cũng là một yếu tố khá quan trọng.
TẠO BẢNG bác sĩ (
bác sĩ_id INT,
first_name VARCHAR(10),
tên đệm VARCHAR(10),
Ràng buộc pk_doctor KHÓA CHÍNH (doctor_id)
);
Nguồn: codegym.vn/blog/2023/11/19/cac-rang-buoc-nen-biet-constra...
Khóa học lập trình web Online - Chỉ với 2,5 tháng bạn hoàn toàn có thể làm chủ các kiến thức căn bản về HTML và CSS. Khóa học HTML & CSS căn bản Online tại CodeGym sẽ giúp bạn sử dụng thành tạo Framework Bootstrap, Sass, có kiến thức căn bản về UX/UI. Bạn có thể thiết kế website căn bản, website hoàn chỉnh… ===> Xem thêm bài viết: Các trang web học lập trình miễn phí cho người mới bắt đầu Với lộ trình giảng dạy rõ ràng – Thời gian linh động, khoá học nền tảng lập trình Online tại CodeGym sẽ cung cấp các kiến thức lập trình web nền tảng cho học viên. Nội dung khóa học rõ ràng liên quan đến các bài giảng về tổng quan lập trình, cấu trúc cơ bản, hàm và đối tượng, thực hành dự án cuối khoá. Khoá học lập trình web tại CodeGym Với khóa học này, bạn có thể thành thạo kiến thức Front – End nói riêng và kiến thức lập trình web nói chung. Kết thúc khóa học web Front – End Online trong 9 tháng đào tạo, học viên sẽ có đủ năng lực tham gia trực tiếp vào các dự án xây dựng website, phần mềm website và ứng dụng. ===> Xem thêm chi tiết các khóa học Online khác tại CodeGym: Khóa học web Back – End Online Khóa học Python căn bản Online - jq13ky9dpd - codegym.vn/blog/2022/05/13/hoc-lap-trinh-vien-web/
Học lập trình online miễn phí thông qua các trang web học lập trình là một phương pháp học tiết kiệm mà hiệu quả được rất nhiều người mới học áp dụng. Tuy nhiên, hiện nay có rất nhiều các trang web học lập trình, các khóa học lập trình miễn phí xuất hiện tràn lan trên Internet. Vì vậy, rất nhiều người không biết phải làm thế nào để tìm được các trang học lập trình uy tín, chất lượng tốt.
#codegymhanoi #php #java #hoclaptrinh #tuhoclaptrinhtudau
Công nghệ thông tin nên học trường nào ở Hà Nội? – Câu trả lời
Nếu bạn là sinh viên lớp 12, đang phân vân không biết nên lựa chọn thế nào cho phù hợp. Liệu lĩnh vực công nghệ thông tin bạn muốn làm bây giờ có thật sự là đam mê không? Đây là bài viết dành cho bạn! Trong bài viết này, CodeGym sẽ gợi ý cho bạn công nghệ thông tin nên học trường nào ở Hà Nội. Đặc biệt là những điều cần biết thêm về chuyên ngành này.
#codegym #hoclaptrinh #codingbootcamp #CNTT #laptrinhvien #daotaolaptrinh
codegym.vn/blog/2021/01/19/cong-nghe-thong-tin-nen-hoc-tr...
Với các kiến thức bài trước thì câu lệnh câu lệnh truy vấn cũng đã được hỗ trợ khá nhiều thứ như IN/EXISTS, LIKE, UNION và JOIN. Thì ở phần bài hôm nay, chúng ta cùng tiếp tục tìm hiểu các khái niệm khác, cũng sẽ hỗ trợ nhiều hơn cho câu lệnh truy vấn như là SQL FUNCTIONS, bộ đôi GROUP BY và HAVING, cuối cùng là ORDER BY.
1. Vai trò của FUNCTION, GROUP BY và ORDER BY trong SQL
Các từ khoá hôm nay cũng sẽ được sử dụng với câu lệnh SELECT để giúp truy xuất dữ liệu đa dạng hơn. Ta có thể thấy rõ ý nghĩa của các từ khoá này qua tên gọi của nó như FUNCTION là cách áp dụng hàm vào câu truy vấn, GROUP BY dùng để gộp nhóm các dòng dữ liệu, ORDER BY sử dụng để sắp xếp dữ liệu.
[Database] DML 4 (Part 3)
[Database] DML 4 (Part 2)
2. Ý nghĩa và cách sử dụng câu lệnh JOIN trong SQL
2.1. SQL FUNCTIONS
Mỗi DBMS sẽ có sư thay đổi về cú pháp SQL và bộ FUNCTIONS được sử dụng ở các SQL cũng sẽ có khác nhau đôi chút, hãy tham khảo FUNCTIONS ở MySQL:
www.w3schools.com/mysql/mysql_ref_functions.asp
Nếu bạn muốn sử dụng FUNCTION ở DBMS nào thì hãy tìm kiếm theo tên DBMS đó.
FUNCTION có 3 loại chính sau:
Dùng để xử lý chuỗi (String).
Dùng để xử lý số.
Thao tác với ngày, tháng, năm.
Và một số FUNCTION nâng cao.
Ví dụ
Muốn tính độ dài tên của mỗi bác sĩ.
SELECT last_name, CHAR_LENGTH(last_name)
FROM doctor;
Để liệt kê đầy đủ Họ và Tên các bác sĩ
SELECT CONCAT(first_name, ' ', middle_name, ' ', last_name) as full_name
FROM doctor;
2.2. Câu lệnh GROUP BY
Là câu lệnh để gộp nhóm các record có cùng giá trị column.
Thường được sử dụng chung với các hàm gộp (aggregate):
COUNT()
MAX()
MIN()
SUM()
AVG()
Cú pháp
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);
Ví dụ
Để lấy ra số lượng bác sĩ của mỗi chuyên khoa, thì thực hiện như bên dưới. Mình sử dụng GROUP BY để phân nhóm các bác sĩ cùng chuyên khoa, sau đó thực hiện đếm số lượng bác sĩ ở mỗi nhóm bằng cách dùng hàm COUNT.
SELECT specialization_id, COUNT(*)
FROM doctor
GROUP BY specialization_id;
2.3. Câu lệnh HAVING
Được sử dụng để chứa các điều kiện là hàm gộp.
Bởi vì WHERE không làm được điều này.
Cú pháp
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);
Ví dụ
SELECT specialization_id, COUNT(*) quantity
FROM doctor
GROUP BY specialization_id
HAVING quantity >= 3;
Tiếp tục ví dụ ở phần 2, muốn lấy ra các chuyên khoa với nhiều hơn 3 bác sĩ thì kết hợp HAVING sau GROUP BY.
2.4. Câu lệnh ORDER BY
Câu lệnh để sắp xếp các records.
Với 2 điều kiện sắp xếp:
ASC: ascending (mặc định)
DESC: descending
Cú pháp
SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;
Ví dụ
SELECT *
FROM doctor
ORDER BY date_of_birth DESC;
Câu lệnh trên dùng để lấy ra danh sách các bác sĩ theo thứ tự: ai lớn tuổi nhất thì hiển thị ra trước.
Kết luận
Với việc nắm được toàn bộ các câu lệnh được sử dụng với DML thì bạn có thể tự tin truy vấn thoải mái rồi, nếu phần nào chưa rõ thì có thể xem kĩ ở phần video.
Did you mean www.w3schools.cơm/mysql/mysql_ref_functions.asp
Nguồn: codegym.vn/blog/2023/11/20/truy-van-qua-function-group-by...