MySQL / ORDER BY ба LIMIT

ORDER BY ба LIMIT

ORDER BY үр дүнг эрэмбэлнэ. LIMIT буцаах мөрийн тоог хязгаарлана. Хоёулаа pagination болон гүйцэтгэл сайжруулахад зайлшгүй шаардлагатай.

ORDER BY

sql
SELECT * FROM products
ORDER BY price;
код
+----+--------------------+----------+
| id | name               | price    |
+----+--------------------+----------+
|  3 | Цэнэглэгч кабель   |  1990.00 |
|  1 | Утасны дэр         |  4990.00 |
|  2 | Bluetooth чихэвч   | 29900.00 |
|  4 | Ухаалаг цаг        | 89900.00 |
+----+--------------------+----------+

ORDER BY анхдагчаар ASC (өсөхөөр) эрэмбэлнэ.


ASC ба DESC

sql
-- Өсөхөөр (анхдагч)
SELECT * FROM products ORDER BY price ASC;

-- Буурахаар
SELECT * FROM products ORDER BY price DESC;
sql
-- Шинэ бүртгэлүүд эхэнд
SELECT * FROM users ORDER BY created_at DESC;
код
+----+------------------+------------------+---------------------+
| id | name             | email            | created_at          |
+----+------------------+------------------+---------------------+
|  3 | Мөнх Эрдэнэ      | munkh@example.com| 2024-06-01 10:02:00 |
|  2 | Дорж Гантулга    | dorj@example.com | 2024-06-01 10:01:00 |
|  1 | Болд Батбаяр     | bold@example.com | 2024-06-01 10:00:00 |
+----+------------------+------------------+---------------------+

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

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

sql
SELECT name, price, stock
FROM products
ORDER BY price ASC, stock DESC;
код
+--------------------+----------+------+
| name               | price    | stock|
+--------------------+----------+------+
| Цэнэглэгч кабель   |  1990.00 |  100 |
| Утасны дэр         |  4990.00 |   50 |
| Bluetooth чихэвч   | 29900.00 |   20 |
| Ухаалаг цаг        | 89900.00 |   10 |
+--------------------+----------+------+

Энд price тэнцүү байгаа мөрүүд байхгүй тул stock DESC нөлөөлөхгүй байна. Ижил үнэтэй бараа олон байсан бол тэдгээрийн дотор нөөцөөр буурахаар эрэмбэлэгдэнэ.


Alias-аар эрэмбэлэх

SELECT-д тодорхойлсон alias-ыг ORDER BY-д ашиглаж болно:

sql
SELECT
  name,
  price * stock AS total_value
FROM products
ORDER BY total_value DESC;
код
+--------------------+-------------+
| name               | total_value |
+--------------------+-------------+
| Ухаалаг цаг        |   899000.00 |
| Bluetooth чихэвч   |   598000.00 |
| Утасны дэр         |   249500.00 |
| Цэнэглэгч кабель   |   199000.00 |
+--------------------+-------------+

NULL утгуудын эрэмбэ

ORDER BY ASCNULL утгууд эхэнд гарна. ORDER BY DESCNULL утгууд сүүлд гарна.

sql
-- NULL утгуудыг сүүлд гаргах (ASC үед)
SELECT name, phone
FROM users
ORDER BY phone IS NULL ASC, phone ASC;

LIMIT — мөрийн тоог хязгаарлах

sql
SELECT * FROM products
ORDER BY price DESC
LIMIT 3;
код
+----+------------------+----------+
| id | name             | price    |
+----+------------------+----------+
|  4 | Ухаалаг цаг      | 89900.00 |
|  2 | Bluetooth чихэвч | 29900.00 |
|  1 | Утасны дэр       |  4990.00 |
+----+------------------+----------+

Хамгийн үнэтэй 1 барааг авах:

sql
SELECT * FROM products
ORDER BY price DESC
LIMIT 1;

LIMIT-гүйгээр том хүснэгтийн бүх өгөгдлийг татах нь сервер болон сүлжээнд ачаалал өгнө — үргэлж LIMIT ашиглах нь зүйтэй.


LIMIT n OFFSET m — pagination

OFFSET нь эхнийхийг алгасах мөрийн тоог заана:

sql
-- 1-р хуудас: 1–5 дугаарт мөрүүд
SELECT * FROM products ORDER BY id LIMIT 5 OFFSET 0;

-- 2-р хуудас: 6–10 дугаарт мөрүүд
SELECT * FROM products ORDER BY id LIMIT 5 OFFSET 5;

-- 3-р хуудас: 11–15 дугаарт мөрүүд
SELECT * FROM products ORDER BY id LIMIT 5 OFFSET 10;

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

Товч хэлбэр — LIMIT offset, count:

sql
SELECT * FROM products ORDER BY id LIMIT 0, 5;   -- 1-р хуудас
SELECT * FROM products ORDER BY id LIMIT 5, 5;   -- 2-р хуудас
SELECT * FROM products ORDER BY id LIMIT 10, 5;  -- 3-р хуудас

Node.js дахь pagination жишээ

javascript
const page = 2;
const perPage = 10;
const offset = (page - 1) * perPage;

const query = `
  SELECT * FROM products
  ORDER BY created_at DESC
  LIMIT ${perPage} OFFSET ${offset}
`;

WHERE + ORDER BY + LIMIT хослол

SELECT командын бүрэн дараалал:

sql
SELECT багана
FROM хүснэгт
WHERE нөхцөл
ORDER BY багана ASC|DESC
LIMIT тоо OFFSET тоо;

Жишээ — нөөцтэй хямд 3 бараа:

sql
SELECT name, price, stock
FROM products
WHERE stock > 0
ORDER BY price ASC
LIMIT 3;

Жишээ — сүүлийн 5 захиалга:

sql
SELECT *
FROM orders
ORDER BY created_at DESC
LIMIT 5;

Жишээ — хамгийн их нөөцтэй 10 бараа, 2-р хуудас:

sql
SELECT name, stock
FROM products
ORDER BY stock DESC
LIMIT 10 OFFSET 10;

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

UPDATE командаар байгаа өгөгдлийг өөрчлөх — нэг ба олон баганыг зэрэг шинэчлэх, WHERE заавал ашиглах аргуудыг үзнэ.