ORDER BY ба LIMIT
Мэдээлэл шүүж авсны дараа дараагийн асуулт гардаг — ямар дарааллаар харуулах вэ? Хамгийн ихийг эхлээд үзүүлэх үү? Хамгийн шинийг эхлээд үү? Зөвхөн 10-ыг харуулах уу? ORDER BY ба LIMIT энэ бүгдийг шийднэ — вэб дэх жагсаалт, хуудасчлал, "Top 10" шиг бүх зүйлд ашиглагддаг.
ORDER BY — эрэмбэлэх
SELECT багана1, багана2
FROM хүснэгт
ORDER BY багана [ASC | DESC];
ASC — өсөхөөр (өгөгдмөл), DESC — буурахаар:
-- Насаар өсөхөөр
SELECT нэр, нас FROM users ORDER BY нас ASC;
-- Насаар буурахаар
SELECT нэр, нас FROM users ORDER BY нас DESC;
-- Нэрээр цагаан толгойн дарааллаар
SELECT нэр FROM users ORDER BY нэр;
нэр | нас
----------------+-----
Батболд Нар | 19
Сарнай Дорж | 22
Болд Баатар | 25
Оюунаа Энх | 27
Ганбаяр Лхам | 30
Олон баганаар эрэмбэлэх
Эхний баганаар эрэмбэлж, тэнцүү байвал хоёр дахь баганаар эрэмбэлнэ:
-- Ангилалаар эрэмбэлж, дотор нь үнэ буурахаар
SELECT нэр, ангилал, үнэ
FROM products
ORDER BY ангилал ASC, үнэ DESC;
нэр | ангилал | үнэ
---------------+----------+----------
Самбар | тавилга | 450000.00
Сандал | тавилга | 85000.00
Ухаалаг утас | техник | 1200000.00
Чихэвч | техник | 95000.00
NULL утгыг эрэмбэлэх
NULL утга өгөгдмөлөөр ORDER BY DESC-д хамгийн эхэнд, ASC-д хамгийн эцэст харагдана. Үүнийг өөрчлөхөд:
-- NULL-г хамгийн эцэст байлгах (DESC хувилбарт)
SELECT нэр, нас FROM users
ORDER BY нас DESC NULLS LAST;
-- NULL-г хамгийн эхэнд байлгах (ASC хувилбарт)
SELECT нэр, нас FROM users
ORDER BY нас ASC NULLS FIRST;
LIMIT — хязгаарлах
Хамгийн их хэдэн бичлэг буцаахыг заахад LIMIT ашиглана:
-- Зөвхөн эхний 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) хийнэ:
-- 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 дээр хуудасчлал хэрэгжүүлэх жишээ:
-- 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 ашигладаг. Хоёулаа адилхан ажилладаг:
-- Эдгээр хоёр адилхан
SELECT * FROM users ORDER BY нэр LIMIT 5;
SELECT * FROM users ORDER BY нэр FETCH FIRST 5 ROWS ONLY;
Нийт хуудасны тоо тооцоолох
Хуудасчлалд нийт бичлэгийн тоо хэрэгтэй байдаг:
-- Нийт бичлэгийн тоо
SELECT COUNT(*) AS нийт FROM products WHERE идэвхтэй = TRUE;
-- Нийт хуудасны тоо = CEIL(нийт / хуудасны_хэмжээ)
SELECT CEIL(COUNT(*) / 10.0) AS нийт_хуудас
FROM products
WHERE идэвхтэй = TRUE;
Жишээ: блогийн нүүр хуудас
-- Хамгийн сүүлийн 5 нийтлэлийг нүүр хуудасд харуулах
SELECT
id,
гарчиг,
харагдсан,
DATE(нийтлэгдсэн) AS огноо
FROM posts
WHERE нийтлэгдсэн IS NOT NULL
ORDER BY нийтлэгдсэн DESC
LIMIT 5;
Дараагийн хичээлд:
Хадгалсан мэдээллийг UPDATE командаар хэрхэн шинэчлэхийг сурна — нэг баганаас эхлээд нарийн нөхцөлтэй олон шинэчлэлт хүртэл.