Skip to content

Ngày 1: Giới thiệu SQL, RDBMS và môi trường thực hành ​

Tóm tắt: SQL là ngôn ngữ để làm việc với dữ liệu trong cơ sở dữ liệu quan hệ. Hôm nay bạn tìm hiểu SQL và hệ quản trị CSDL quan hệ (RDBMS) là gì, dựng PostgreSQL 16 cùng bộ dữ liệu DSC Shop trên máy, rồi chạy những câu lệnh đầu tiên để khám phá dữ liệu.

Sau bài này bạn có thể:

  • Giải thích SQL, cơ sở dữ liệu, RDBMS là gì và vì sao khóa học chọn PostgreSQL.
  • Dựng môi trường thực hành bằng Docker (hoặc cài trực tiếp) và kết nối được bằng psql và Adminer.
  • Dùng \dt, \d tên_bảng để xem danh sách bảng và cấu trúc một bảng của DSC Shop.
  • Viết câu SELECT đơn giản để xem dữ liệu của một bảng.
  • Xếp một câu lệnh SQL vào đúng nhóm DDL, DML, DCL hoặc TCL.

SQL là gì ​

Hãy hình dung một cửa hàng đồ công nghệ ghi chép mọi thứ vào sổ: sổ khách hàng, sổ sản phẩm, sổ đơn hàng. Khi cửa hàng lớn lên, sổ giấy không còn đủ: cần tìm nhanh "khách nào mua iPhone tháng trước", cần nhiều nhân viên cùng ghi mà không giẫm chân nhau, cần không mất dữ liệu khi mất điện. Phần mềm làm những việc đó gọi là hệ quản trị cơ sở dữ liệu (DBMS, Database Management System).

SQL (Structured Query Language) là ngôn ngữ bạn dùng để "nói chuyện" với DBMS: tạo bảng, thêm dữ liệu, hỏi dữ liệu, phân quyền. SQL là ngôn ngữ khai báo: bạn mô tả muốn lấy gì, còn DBMS tự quyết định lấy như thế nào. Ví dụ "cho tôi tên và thành phố của mọi khách hàng" viết thành:

sql
SELECT full_name, city FROM customers;

SQL được dùng ở hầu hết mọi nơi có dữ liệu: backend web và mobile, phân tích dữ liệu, báo cáo kinh doanh, kho dữ liệu (BigQuery, Snowflake). SQL có chuẩn quốc tế (ISO/IEC 9075), nhưng mỗi DBMS thêm phần mở rộng riêng, gọi là dialect. Khóa học viết theo dialect của PostgreSQL và ghi chú khi các hệ khác viết khác.

Cơ sở dữ liệu quan hệ và RDBMS ​

Cơ sở dữ liệu quan hệ lưu dữ liệu thành các bảng (table). Mỗi bảng có các cột (column) cố định, mỗi dòng (row) là một bản ghi. Các bảng liên kết với nhau qua giá trị chung: dòng trong bảng orders ghi customer_id = 1 nghĩa là đơn đó của khách có mã 1 trong bảng customers.

Hai khái niệm cốt lõi (Ngày 2 học kỹ):

  • Khóa chính (primary key): cột xác định duy nhất mỗi dòng, ví dụ customers.customer_id.
  • Khóa ngoại (foreign key): cột trỏ tới khóa chính của bảng khác, ví dụ orders.customer_id.

RDBMS là phần mềm quản lý cơ sở dữ liệu quan hệ. Khi bạn gửi một câu SQL, RDBMS phân tích câu lệnh, chọn cách thực hiện nhanh nhất, rồi đọc/ghi dữ liệu trên đĩa:

Các RDBMS phổ biến ​

RDBMSĐiểm mạnhCần lưu ýHay gặp ở
PostgreSQLMã nguồn mở, bám sát chuẩn SQL, nhiều kiểu dữ liệu (JSONB, mảng, khoảng thời gian), mở rộng đượcCấu hình và vận hành có nhiều thứ cần học hơn MySQLBackend, phân tích dữ liệu, tài chính, GIS
MySQLMã nguồn mở, phổ biến, dễ bắt đầuWindow function và CTE chỉ có từ bản 8.0; có kiểu JSON nhưng ít toán tử hơn JSONBWeb (WordPress, nhiều hệ thống PHP)
SQL ServerCông cụ quản trị tốt, tích hợp hệ sinh thái MicrosoftBản thương mại tốn phí bản quyền (có bản Express/Developer miễn phí)Doanh nghiệp dùng .NET
SQLiteKhông cần server, cả database là một fileKhông có quản lý user/quyền, không có stored procedure; ghi đồng thời bị giới hạnỨng dụng mobile, desktop, thử nghiệm nhanh

Khóa học chỉ dùng PostgreSQL 16: có đủ mọi tính năng mà 30 ngày cần (CTE, window function, FULL JOIN, INTERSECT/EXCEPT, JSONB, partition, EXPLAIN ANALYZE, PL/pgSQL), miễn phí và chạy được trên mọi hệ điều hành. Học vững một hệ thì chuyển sang hệ khác rất nhanh, vì phần lớn SQL là giống nhau.

Dựng môi trường thực hành ​

Hướng dẫn đầy đủ (kể cả xử lý sự cố, nạp dữ liệu lớn, làm lại từ đầu) ở setup/README.md. Dưới đây là các bước chính.

Cách 1: Docker (khuyến nghị) ​

Docker chạy PostgreSQL trong một "container" tách biệt, không đụng tới máy bạn, và dữ liệu mẫu được nạp tự động.

  1. Cài Docker Desktop và mở nó lên.
  2. Tải repo khóa học về (git clone hoặc tải ZIP), mở terminal ở thư mục gốc của repo.
  3. Chạy:
sh
docker compose up -d

Lần đầu Docker tải image nên mất vài phút. Xong, bạn có hai dịch vụ:

Dịch vụĐịa chỉThông tin đăng nhập
PostgreSQL 16localhost:5432user postgres, mật khẩu postgres, database sql_challenge
Adminer (giao diện web)http://localhost:8080System: PostgreSQL, Server: db, user/mật khẩu như trên, Database: sql_challenge

Kiểm tra container đang chạy:

sh
docker compose ps

Cách 2: Cài PostgreSQL trực tiếp ​

Nếu máy không chạy được Docker:

  1. Tải và cài PostgreSQL 16 trở lên từ https://www.postgresql.org/download/. Trên Windows, trình cài đặt hỏi mật khẩu cho user postgres: hãy ghi nhớ nó. Nhớ chọn cài kèm "Command Line Tools" để có psql.
  2. Ở thư mục gốc của repo, tạo database và nạp dữ liệu:
sh
createdb -U postgres sql_challenge
psql -U postgres -d sql_challenge -f setup/init/01_schema.sql -f setup/init/02_seed.sql

Với cách này, bỏ phần docker compose exec db ở các lệnh trong khóa học và gõ thẳng psql -U postgres -d sql_challenge.

Kết nối bằng psql ​

psql là chương trình dòng lệnh đi kèm PostgreSQL. Với Docker:

sh
docker compose exec db psql -U postgres -d sql_challenge

Bạn thấy dấu nhắc sql_challenge=#. Gõ câu lệnh SQL, kết thúc bằng dấu ; rồi Enter:

sql
SELECT version();
version
PostgreSQL 16.15 (Debian 16.15-1.pgdg13+2) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit

Số phiên bản phụ (16.x) trên máy bạn có thể khác, miễn là bắt đầu bằng 16.

Ngoài câu lệnh SQL, psql có các lệnh meta bắt đầu bằng dấu \. Chúng do psql xử lý chứ không gửi lên server, nên không cần dấu ;:

LệnhTác dụng
\dtLiệt kê các bảng
\d tên_bảngXem cấu trúc một bảng
\dnLiệt kê các schema
\lLiệt kê các database
\c tên_dbChuyển sang database khác
\conninfoXem đang kết nối tới đâu
\xBật/tắt hiển thị dọc (tiện khi bảng nhiều cột)
\?Danh sách mọi lệnh meta
\qThoát psql

Mẹo: phím mũi tên lên để gọi lại lệnh cũ, phím Tab để tự hoàn thành tên bảng, tên cột.

Adminer và các công cụ đồ họa ​

Nếu thích giao diện đồ họa, mở http://localhost:8080, đăng nhập theo bảng ở trên, bấm "SQL command" để gõ lệnh. Bạn cũng có thể dùng DBeaver, pgAdmin, DataGrip hoặc extension PostgreSQL của VS Code, kết nối tới localhost:5432. Khóa học in kết quả theo kiểu psql, nhưng mọi câu SQL chạy giống nhau trên các công cụ này.

Khám phá DSC Shop ​

DSC Shop là cửa hàng đồ công nghệ giả lập, dùng cho cả khóa. Các bảng nằm trong schema shop (schema là một "thư mục" chứa bảng bên trong database). Database đã được cấu hình để bạn viết customers thay vì shop.customers.

sql
\dn
NameOwner
perfpostgres
publicpg_database_owner
shoppostgres

Schema perf chứa dữ liệu lớn cho các bài hiệu năng; nếu bạn chưa chạy setup/perf_seed.sql thì chưa có dòng này. Xem các bảng của cửa hàng:

sql
\dt
SchemaNameTypeOwner
shopcategoriestablepostgres
shopcustomerstablepostgres
shopemployeestablepostgres
shoporder_itemstablepostgres
shoporderstablepostgres
shoppaymentstablepostgres
shopproductstablepostgres

Bảy bảng, ý nghĩa như sau:

BảngSố dòngChứa gì
categories13Danh mục sản phẩm, dạng cây (Máy tính > Laptop > Laptop gaming)
products24Sản phẩm, giá bán (VNĐ), tồn kho, thông số kỹ thuật
customers18Khách hàng
employees8Nhân viên, ai quản lý ai
orders40Đơn hàng từ 01/2025 đến 10/2026
order_items60Từng dòng hàng trong mỗi đơn
payments37Các lần thanh toán

Sơ đồ quan hệ giữa các bảng có ở setup/README.md. Xem cấu trúc bảng customers:

sql
\d customers
text
                                    Table "shop.customers"
   Column    |           Type           | Collation | Nullable |           Default
-------------+--------------------------+-----------+----------+------------------------------
 customer_id | integer                  |           | not null | generated always as identity
 full_name   | character varying(100)   |           | not null |
 email       | character varying(255)   |           |          |
 phone       | character varying(20)    |           |          |
 city        | character varying(100)   |           |          |
 birth_date  | date                     |           |          |
 created_at  | timestamp with time zone |           | not null | now()
Indexes:
    "customers_pkey" PRIMARY KEY, btree (customer_id)
    "customers_email_key" UNIQUE CONSTRAINT, btree (email)
Referenced by:
    TABLE "orders" CONSTRAINT "orders_customer_id_fkey" FOREIGN KEY (customer_id) REFERENCES customers(customer_id)

Đọc nhanh: mỗi cột có một kiểu dữ liệu (integer, character varying(100) tức VARCHAR(100), date, ...). Cột Nullable ghi not null nghĩa là bắt buộc có giá trị. customer_id là khóa chính và tự sinh số; email không được trùng; bảng orders trỏ tới bảng này qua customer_id. Ngày 2 sẽ giải thích từng chi tiết.

Câu SELECT đầu tiên ​

SELECT ... FROM ... lấy dữ liệu từ một bảng. Dấu * nghĩa là "mọi cột":

sql
SELECT * FROM categories;
category_idnameparent_id
1Máy tính
2Laptop1
3Laptop gaming2
4Laptop văn phòng2
5PC & Màn hình1
6Điện thoại & Tablet
7Điện thoại6
8Máy tính bảng6
9Phụ kiện
10Chuột & Bàn phím9
11Tai nghe & Loa9
12Sạc & Cáp9
13Thiết bị mạng

Ô trống ở parent_id là giá trị NULL, nghĩa là "không có giá trị": danh mục gốc thì không có cha. NULL rất quan trọng và sẽ được học kỹ ở Ngày 3.

Chỉ lấy vài cột thì liệt kê tên cột, cách nhau bởi dấu phẩy:

sql
SELECT full_name, email, city FROM customers;
full_nameemailcity
Nguyễn Văn An[email protected]TP. Hồ Chí Minh
Trần Thị Bình[email protected]Hà Nội
Lê Hoàng Cường[email protected]Đà Nẵng
Phạm Minh Duy[email protected]TP. Hồ Chí Minh
Hoàng Thị EmCần Thơ
Võ Quốc Phong[email protected]Hồ Chí Minh
.........

(... tổng 18 dòng)

Để ý: cùng là TP. Hồ Chí Minh nhưng có dòng ghi TP. Hồ Chí Minh, có dòng ghi Hồ Chí Minh; có khách không có email. Dữ liệu thật thường "bẩn" như vậy, và DSC Shop cố ý giữ những điểm này để bạn luyện cách xử lý ở các bài sau.

Khi không có ORDER BY (Ngày 4), PostgreSQL không hứa trả về các dòng theo thứ tự nào. Trên dữ liệu gốc, bạn thường thấy thứ tự như trên, nhưng đừng dựa vào điều đó.

Các nhóm lệnh SQL ​

Câu lệnh SQL chia thành bốn nhóm theo việc chúng làm:

NhómViết tắt củaLàm gìLệnh tiêu biểuHọc ở
DDLData Definition LanguageĐịnh nghĩa cấu trúc: tạo, sửa, xóa bảng và các đối tượng khácCREATE, ALTER, DROP, TRUNCATENgày 2, 6
DMLData Manipulation LanguageĐọc và thay đổi dữ liệu trong bảngSELECT, INSERT, UPDATE, DELETENgày 3-14
DCLData Control LanguageCấp và thu hồi quyềnGRANT, REVOKENgày 30
TCLTransaction Control LanguageGom nhiều lệnh thành một giao dịch (transaction): hoặc tất cả thành công, hoặc không gì cảBEGIN, COMMIT, ROLLBACK, SAVEPOINTNgày 6, 16

Nhiều tài liệu tách SELECT ra một nhóm riêng là DQL (Data Query Language), vì nó chỉ đọc chứ không thay đổi dữ liệu. Hai cách chia đều gặp, bạn chỉ cần biết cả hai.

Chạy thử khối dưới đây để thấy ba nhóm DDL, DML, TCL làm việc cùng nhau. Chưa cần hiểu từng lệnh, chỉ cần quan sát:

sql
BEGIN;                                          -- TCL: mở giao dịch
CREATE TABLE thu_nghiem (ghi_chu TEXT);         -- DDL: tạo bảng
INSERT INTO thu_nghiem VALUES ('Xin chào SQL'); -- DML: thêm dữ liệu
SELECT * FROM thu_nghiem;                       -- DML/DQL: đọc dữ liệu
ROLLBACK;                                       -- TCL: hủy mọi thứ từ BEGIN

Câu SELECT trả về:

ghi_chu
Xin chào SQL

Sau ROLLBACK, cả bảng lẫn dữ liệu biến mất như chưa từng tồn tại:

sql
SELECT * FROM thu_nghiem;
text
ERROR:  relation "thu_nghiem" does not exist
LINE 1: SELECT * FROM thu_nghiem;
                      ^

PostgreSQL cho phép hủy cả lệnh tạo bảng trong transaction, điều mà không phải RDBMS nào cũng làm được (MySQL tự động commit khi gặp CREATE TABLE). Mẹo BEGIN ... ROLLBACK này sẽ giúp bạn thử nghiệm an toàn ở Ngày 6.

-- bắt đầu một chú thích (comment): phần còn lại của dòng bị bỏ qua khi chạy.

Lỗi thường gặp ​

Quên dấu ;. Trong psql, câu SQL chỉ được gửi đi khi gặp ;. Nếu quên, dấu nhắc đổi từ sql_challenge=# thành sql_challenge-# và psql chờ bạn gõ tiếp. Chỉ cần gõ ; rồi Enter. Ngược lại, lệnh meta như \dt không cần ;.

Dùng nháy kép cho chuỗi. Trong SQL chuẩn, chuỗi ký tự nằm trong nháy đơn '...'; nháy kép "..." dành cho tên cột, tên bảng.

sql
SELECT "Hà Nội";
text
ERROR:  column "Hà Nội" does not exist
LINE 1: SELECT "Hà Nội";
               ^

Cách đúng:

sql
SELECT 'Hà Nội';
?column?
Hà Nội

Ghi chú dialect: MySQL mặc định chấp nhận cả nháy kép cho chuỗi, nên thói quen này hay mang sang PostgreSQL và gây lỗi.

Kết nối nhầm database hoặc mất search_path. Nếu bạn kết nối vào database postgres (mặc định) thay vì sql_challenge, hoặc đổi search_path, PostgreSQL không tìm thấy bảng:

sql
SET search_path = public;
SELECT * FROM customers;
text
ERROR:  relation "customers" does not exist
LINE 1: SELECT * FROM customers;
                      ^

Kiểm tra bằng \conninfo, chuyển database bằng \c sql_challenge, hoặc đưa search_path về mặc định:

sql
RESET search_path;

Tên database, bảng có chữ hoa. PostgreSQL tự đổi tên không nằm trong nháy kép thành chữ thường: CREATE DATABASE ShopDB; tạo ra database tên shopdb. Nhưng \c ShopDB của psql dùng đúng chuỗi bạn gõ, nên báo database "ShopDB" không tồn tại. Cách tránh đơn giản nhất: luôn đặt tên bằng chữ thường, nối các từ bằng dấu gạch dưới (snake_case), như mọi bảng trong DSC Shop. Ngày 2 có ví dụ chi tiết.

Cổng 5432 đã bị chiếm. Nếu máy đã cài sẵn PostgreSQL, docker compose up -d có thể báo lỗi cổng 5432 đang dùng. Tắt dịch vụ PostgreSQL cài sẵn, hoặc đổi dòng "5432:5432" trong docker-compose.yml thành "5433:5432" và kết nối công cụ đồ họa qua cổng 5433 (lệnh docker compose exec db psql ... không bị ảnh hưởng).

Bài tập ​

Cơ bản ​

Bài 1. Kết nối vào sql_challenge bằng psql, kiểm tra bạn đang kết nối tới database nào và phiên bản PostgreSQL là bao nhiêu.

Đáp án
sql
\conninfo
SELECT version();

Kết quả: \conninfo in dòng You are connected to database "sql_challenge" as user "postgres" ...; SELECT version(); trả về một dòng bắt đầu bằng PostgreSQL 16.

Bài 2. Xem cấu trúc bảng products. Trả lời: (a) cột giá bán tên gì, kiểu gì; (b) những cột nào được phép để trống (NULL); (c) cột nào không được trùng giá trị giữa các sản phẩm.

Đáp án
sql
\d products

Kết quả:

text
                                      Table "shop.products"
     Column     |           Type           | Collation | Nullable |           Default
----------------+--------------------------+-----------+----------+------------------------------
 product_id     | integer                  |           | not null | generated always as identity
 sku            | character varying(20)    |           | not null |
 name           | character varying(200)   |           | not null |
 category_id    | integer                  |           | not null |
 price          | numeric(12,0)            |           | not null |
 cost_price     | numeric(12,0)            |           |          |
 stock_quantity | integer                  |           | not null | 0
 attributes     | jsonb                    |           |          |
 is_active      | boolean                  |           | not null | true
 created_at     | timestamp with time zone |           | not null | now()
Indexes:
    "products_pkey" PRIMARY KEY, btree (product_id)
    "products_category_id_idx" btree (category_id)
    "products_sku_key" UNIQUE CONSTRAINT, btree (sku)
Check constraints:
    "products_cost_price_check" CHECK (cost_price >= 0::numeric)
    "products_price_check" CHECK (price >= 0::numeric)
    "products_stock_quantity_check" CHECK (stock_quantity >= 0)
Foreign-key constraints:
    "products_category_id_fkey" FOREIGN KEY (category_id) REFERENCES categories(category_id)
Referenced by:
    TABLE "order_items" CONSTRAINT "order_items_product_id_fkey" FOREIGN KEY (product_id) REFERENCES products(product_id)

(a) price, kiểu numeric(12,0). (b) cost_price và attributes (cột Nullable để trống). (c) sku (có UNIQUE CONSTRAINT), và tất nhiên cả khóa chính product_id.

Bài 3. Liệt kê họ tên, chức danh và ngày vào làm của mọi nhân viên.

Đáp án
sql
SELECT full_name, title, hire_date FROM employees;

Kết quả:

full_nametitlehire_date
Nguyễn Thành LongGiám đốc2020-01-15
Lê Thị HạnhTrưởng phòng Kinh doanh2021-03-01
Trần Quốc BảoTrưởng phòng Kỹ thuật2021-06-15
Phạm Thị ThuNhân viên bán hàng2022-02-10
Đỗ Minh TuấnNhân viên bán hàng2023-07-01
Vũ Hoài NamNhân viên bán hàng2024-09-01
Lâm Gia HuyKỹ thuật viên2022-11-20
Kiều Anh ThưThực tập sinh bán hàng2026-06-01

Vận dụng ​

Bài 4. Xem tên, giá bán và số lượng tồn kho của mọi sản phẩm. Nhìn kết quả và cho biết có bao nhiêu sản phẩm đang hết hàng (tồn kho bằng 0).

Đáp án
sql
SELECT name, price, stock_quantity FROM products;

Kết quả (vài dòng đầu):

namepricestock_quantity
ASUS ROG Strix G16329900005
Lenovo Legion 5299900003
Acer Nitro V 15219900000
Dell Inspiron 14184900008
MacBook Air M2 13 inch249900006

(... tổng 24 dòng)

Có 3 sản phẩm hết hàng: Acer Nitro V 15, Nokia 105 4G, Loa JBL Flip 6. Đếm bằng mắt chỉ ổn với 24 dòng; Ngày 3 bạn sẽ dùng WHERE stock_quantity = 0 để lọc, Ngày 8 dùng COUNT để đếm.

Bài 5. Dựa vào kết quả SELECT * FROM categories; ở trên, vẽ cây danh mục ra giấy. Danh mục nào là gốc (không có cha)? Laptop gaming nằm dưới những danh mục nào?

Đáp án

Bốn danh mục gốc có parent_id là NULL: Máy tính (1), Điện thoại & Tablet (6), Phụ kiện (9), Thiết bị mạng (13). Laptop gaming (3) có cha là Laptop (2), và Laptop có cha là Máy tính (1): Máy tính > Laptop > Laptop gaming. Ngày 29 bạn sẽ viết truy vấn đệ quy để máy tự đi theo cây này.

Bài 6. Xếp mỗi câu lệnh sau vào nhóm DDL, DML, DCL hoặc TCL: DROP TABLE carts; · UPDATE products SET price = 0; · COMMIT; · GRANT SELECT ON customers TO intern; · ALTER TABLE customers ADD COLUMN gender TEXT; · SELECT * FROM orders;

Đáp án
Câu lệnhNhóm
DROP TABLE carts;DDL
UPDATE products SET price = 0;DML
COMMIT;TCL
GRANT SELECT ON customers TO intern;DCL
ALTER TABLE customers ADD COLUMN gender TEXT;DDL
SELECT * FROM orders;DML (hoặc DQL theo cách chia tách riêng)

Bài này chỉ phân loại, đừng chạy các câu lệnh trên vào database.

Thử thách ​

Bài 7. Dùng lệnh meta để tìm: bảng nào trỏ tới bảng orders qua khóa ngoại, và khi xóa một đơn hàng thì bảng nào được cấu hình để tự xóa các dòng liên quan? (Gợi ý: xem phần "Referenced by".)

Đáp án
sql
\d orders

Phần cuối của kết quả:

text
Referenced by:
    TABLE "order_items" CONSTRAINT "order_items_order_id_fkey" FOREIGN KEY (order_id) REFERENCES orders(order_id) ON DELETE CASCADE
    TABLE "payments" CONSTRAINT "payments_order_id_fkey" FOREIGN KEY (order_id) REFERENCES orders(order_id)

Hai bảng order_items và payments trỏ tới orders. Chỉ order_items có ON DELETE CASCADE: xóa đơn thì các dòng hàng của đơn bị xóa theo. Ngày 2 giải thích vì sao payments không được thiết kế như vậy.

Bài 8. Mở Adminer (http://localhost:8080), đăng nhập vào sql_challenge, chọn schema shop và xem dữ liệu bảng payments. Sau đó vào "SQL command", chạy câu lệnh lấy mã đơn, số tiền và phương thức thanh toán của mọi lần thanh toán. So sánh số dòng với bảng ở mục "Khám phá DSC Shop".

Đáp án
sql
SELECT order_id, amount, method FROM payments;

Kết quả: 37 dòng, khớp với bảng tổng quan. Ba dòng đầu:

order_idamountmethod
1699000momo
226990000cash
35780000bank_transfer

(... tổng 37 dòng)

Tóm tắt ​

  • SQL là ngôn ngữ khai báo để làm việc với cơ sở dữ liệu quan hệ; RDBMS là phần mềm lưu trữ và thực thi SQL.
  • Khóa học dùng PostgreSQL 16 và bộ dữ liệu DSC Shop (7 bảng trong schema shop), dựng bằng docker compose up -d hoặc cài trực tiếp theo setup/README.md.
  • psql: câu SQL kết thúc bằng ;; lệnh meta bắt đầu bằng \ (\dt, \d bảng, \conninfo, \q) không cần ;.
  • SELECT cột1, cột2 FROM bảng; lấy dữ liệu; * là mọi cột; ô trống là NULL.
  • Bốn nhóm lệnh: DDL (cấu trúc), DML (dữ liệu), DCL (quyền), TCL (giao dịch).
  • Chuỗi dùng nháy đơn; tên đặt bằng chữ thường snake_case.

Đọc thêm ​


⬅️ Lộ trình 30 ngày học SQL | 📚 Mục lục | Ngày 2: Bảng, kiểu dữ liệu và ràng buộc ➡️

Phát hành theo giấy phép MIT.