PostgreSQL / ORDER BY ба LIMIT

ORDER BY ба LIMIT

Мэдээлэл шүүж авсны дараа дараагийн асуулт гардаг — ямар дарааллаар харуулах вэ? Хамгийн ихийг эхлээд үзүүлэх үү? Хамгийн шинийг эхлээд үү? Зөвхөн 10-ыг харуулах уу? ORDER BY ба LIMIT энэ бүгдийг шийднэ — вэб дэх жагсаалт, хуудасчлал, "Top 10" шиг бүх зүйлд ашиглагддаг.

ORDER BY — эрэмбэлэх

sql
SELECT багана1, багана2
FROM хүснэгт
ORDER BY багана [ASC | DESC];

ASC — өсөхөөр (өгөгдмөл), DESC — буурахаар:

sql
-- Насаар өсөхөөр
SELECT нэр, нас FROM users ORDER BY нас ASC;

-- Насаар буурахаар
SELECT нэр, нас FROM users ORDER BY нас DESC;

-- Нэрээр цагаан толгойн дарааллаар
SELECT нэр FROM users ORDER BY нэр;
код
      нэр       | нас
----------------+-----
 Батболд Нар    |  19
 Сарнай Дорж    |  22
 Болд Баатар    |  25
 Оюунаа Энх     |  27
 Ганбаяр Лхам   |  30

Олон баганаар эрэмбэлэх

Эхний баганаар эрэмбэлж, тэнцүү байвал хоёр дахь баганаар эрэмбэлнэ:

sql
-- Ангилалаар эрэмбэлж, дотор нь үнэ буурахаар
SELECT нэр, ангилал, үнэ
FROM products
ORDER BY ангилал ASC, үнэ DESC;
код
    нэр        | ангилал  |   үнэ
---------------+----------+----------
 Самбар        | тавилга  | 450000.00
 Сандал        | тавилга  |  85000.00
 Ухаалаг утас  | техник   | 1200000.00
 Чихэвч        | техник   |  95000.00

NULL утгыг эрэмбэлэх

NULL утга өгөгдмөлөөр ORDER BY DESC-д хамгийн эхэнд, ASC-д хамгийн эцэст харагдана. Үүнийг өөрчлөхөд:

sql
-- NULL-г хамгийн эцэст байлгах (DESC хувилбарт)
SELECT нэр, нас FROM users
ORDER BY нас DESC NULLS LAST;

-- NULL-г хамгийн эхэнд байлгах (ASC хувилбарт)
SELECT нэр, нас FROM users
ORDER BY нас ASC NULLS FIRST;

LIMIT — хязгаарлах

Хамгийн их хэдэн бичлэг буцаахыг заахад LIMIT ашиглана:

sql
-- Зөвхөн эхний 5 бичлэг
SELECT * FROM posts LIMIT 5;

-- Хамгийн их харагдсан 3 нийтлэл
SELECT гарчиг, харагдсан
FROM posts
ORDER BY харагдсан DESC
LIMIT 3;
код
         гарчиг          | харагдсан
--------------------------+----------
 SQL JOIN тайлбар         |      320
 PostgreSQL сурах нь      |      150
 Index яагаад чухал       |       85

OFFSET — хуудасчлал

OFFSET нь эхний n бичлэгийг алгасдаг. LIMIT-тэй хослуулан хуудасчлал (pagination) хийнэ:

sql
-- 1-р хуудас: бичлэг 1-10
SELECT * FROM products ORDER BY id LIMIT 10 OFFSET 0;

-- 2-р хуудас: бичлэг 11-20
SELECT * FROM products ORDER BY id LIMIT 10 OFFSET 10;

-- 3-р хуудас: бичлэг 21-30
SELECT * FROM products ORDER BY id LIMIT 10 OFFSET 20;

Хуудасчлалын томъёо:

код
OFFSET = (хуудасны_дугаар - 1) × хуудасны_хэмжээ

Node.js backend дээр хуудасчлал хэрэгжүүлэх жишээ:

sql
-- page=3, pageSize=10 гэж дамжуулвал:
-- OFFSET = (3-1) * 10 = 20
SELECT *
FROM products
WHERE идэвхтэй = TRUE
ORDER BY үүсгэсэн DESC
LIMIT 10
OFFSET 20;

FETCH FIRST — стандарт хувилбар

LIMIT нь PostgreSQL-ийн өргөтгөл боловч SQL стандарт нь FETCH FIRST ашигладаг. Хоёулаа адилхан ажилладаг:

sql
-- Эдгээр хоёр адилхан
SELECT * FROM users ORDER BY нэр LIMIT 5;
SELECT * FROM users ORDER BY нэр FETCH FIRST 5 ROWS ONLY;

Нийт хуудасны тоо тооцоолох

Хуудасчлалд нийт бичлэгийн тоо хэрэгтэй байдаг:

sql
-- Нийт бичлэгийн тоо
SELECT COUNT(*) AS нийт FROM products WHERE идэвхтэй = TRUE;

-- Нийт хуудасны тоо = CEIL(нийт / хуудасны_хэмжээ)
SELECT CEIL(COUNT(*) / 10.0) AS нийт_хуудас
FROM products
WHERE идэвхтэй = TRUE;

Жишээ: блогийн нүүр хуудас

sql
-- Хамгийн сүүлийн 5 нийтлэлийг нүүр хуудасд харуулах
SELECT
    id,
    гарчиг,
    харагдсан,
    DATE(нийтлэгдсэн) AS огноо
FROM posts
WHERE нийтлэгдсэн IS NOT NULL
ORDER BY нийтлэгдсэн DESC
LIMIT 5;

Дараагийн хичээлд:

Хадгалсан мэдээллийг UPDATE командаар хэрхэн шинэчлэхийг сурна — нэг баганаас эхлээд нарийн нөхцөлтэй олон шинэчлэлт хүртэл.