Chuyển đến nội dung chính
Mô-đun 6 · Bài học 3 trong tổng số 423/57 trong khóa học~10 min
Bài học theo mô-đun (3/4)

Hàm số

PostgreSQL có tất cả các hàm số mà bạn mong đợi — cộng thêm một số hàm gõ những cạm bẫy đáng để biết ngay.

Các chức năng được sử dụng nhiều nhất

SQL
ROUND(price, 2)     -- arrotonda a 2 decimali (banker's rounding "half to even")
CEIL(price)         -- arrotonda per eccesso (verso +∞)
FLOOR(price)        -- arrotonda per difetto (verso −∞)
ABS(-5)             -- 5  (valore assoluto)
MOD(10, 3)          -- 1  (resto della divisione)  — anche 10 % 3
POWER(2, 10)        -- 1024
SQRT(16)            -- 4

ROUND(number, decimals) chỉ hoạt động nếu number là NUMERIC (không phải DOUBLE PRECISION). Trong tập dữ liệu của chúng tôi products.price là NUMERIC(10,2), vậy là chúng ta đã sẵn sàng rồi.

Số nguyên và phép chia thập phân

Cạm bẫy kinh điển:

SQL
SELECT 1 / 2;          -- 0  (entrambi interi → divisione intera!)
SELECT 1.0 / 2;        -- 0.5
SELECT 1::numeric / 2; -- 0.50000000000000000000

Khi bạn chia hai cột INTEGER bạn sẽ nhận được INTEGER. Để tránh cắt ngắn, truyền một trong số chúng thành NUMERIC hoặc nhân với 1.0:

SQL
-- Sbagliato: percentuale sempre 0 finché numeratore < denominatore
SELECT shipped / total FROM …;

-- Corretto:
SELECT shipped::numeric / total FROM …;
SELECT ROUND(shipped * 100.0 / total, 2) AS percentage FROM …;

Ví dụ về tập dữ liệu

SQL
-- Prezzo scontato del 10%, arrotondato a 2 decimali:
SELECT name,
       price,
       ROUND(price * 0.9, 2) AS discounted_price
FROM   products
ORDER BY id;

-- Prezzo "psicologico" sempre arrotondato per eccesso al multiplo di 1:
SELECT name, CEIL(price) AS rounded_price
FROM   products
WHERE  price < 100
ORDER BY price;

Hãy thử nó

tập thể dục#sql.m6.l3.e1
Nỗ lực: 0Đang tải…

Đối với mỗi sản phẩm hiển thị tên, giá (giá gốc) và giá_giảm (giá giảm 10%, làm tròn đến 2 số thập phân). Đặt hàng theo id.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Giảm giá 10% bằng cách nhân với 0,9 rồi làm tròn bằng ROUND(..., 2).

Giải pháp khả dụng sau 3 lần thử

Xem lại bài tập

tập thể dục#sql.m6.l3.e2
Nỗ lực: 0Đang tải…

Đối với mỗi đơn hàng đã giao (trạng thái = 'đã giao'), hiển thị id và wait_days dưới dạng số nguyên ngày (làm tròn xuống) giữa order_at vàship_at. Sắp xếp theo wait_days giảm dần, sau đó theo id.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

shipped_at - ordered_at returns an INTERVAL; EXTRACT(EPOCH FROM …) turns it into seconds; divide by 86400 (seconds in a day) and take the FLOOR.

Giải pháp khả dụng sau 3 lần thử