SQL เจตเจฟเฉฑเจ, เจคเฉเจธเฉเจ เจตเจฐเจฃเจจ เจเจฐเจฆเฉ เจนเฉ เจเจฟ เจคเฉเจธเฉเจ "เจเฉ" เจชเฉเจฐเจพเจชเจค เจเจฐเจจเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจนเฉ, เจจเจพ เจเจฟ "เจเจฟเจตเฉเจ" เจเจน เจเฉเจคเจพ เจเจพเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉเฅค เจเจธ เจฒเจ, "เจเจฟเจตเฉเจ เจเจฟ เจเจน เจธเฉเจฃเจฟเจ เจเจพเจเจฆเจพ เจนเฉ เจเจฟ เจเจน เจเจฟเจตเฉเจ เจฒเจฟเจเจฟเจ เจเจพเจเจฆเจพ เจนเฉ" เจฆเฉ เจธเจผเฉเจฒเฉ เจตเจฟเฉฑเจ SQL เจธเจตเจพเจฒเจพเจ เจจเฉเฉฐ เจตเจฟเจเจธเจค เจเจฐเจจ เจฆเฉ เจธเจฎเฉฑเจธเจฟเจ, เจเจธเจฆเฉ เจจเจพเจฒ, เจธเจจเจฎเจพเจจ เจฆเฉ เจเจเฉเจนเจพ เจฒเฉเจเจฆเฉ เจนเฉ.
เจ
เฉฑเจ, เจฌเจนเฉเจค เจนเฉ เจธเจงเจพเจฐเจจ เจเจฆเจพเจนเจฐเจฃเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ, เจเจ เจฆเฉเจเฉเจ เจเจฟ เจเจธ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฆเฉ เจธเฉฐเจฆเจฐเจญ เจตเจฟเฉฑเจ เจเฉ เจนเฉ เจธเจเจฆเจพ เจนเฉ GROUP/DISTINCT
ะธ LIMIT
เจเจนเจจเจพเจ เจจเจพเจฒ.
เจเฉเจเจฐ เจคเฉเจธเฉเจ เจฌเฉเจจเจคเฉ เจตเจฟเฉฑเจ เจฒเจฟเจเจฟเจ เจนเฉ เจคเจพเจ เจเจน เจนเฉ "เจชเจนเจฟเจฒเจพเจ เจเจนเจจเจพเจ เจเฉเจฒเฉเจเจ เจจเฉเฉฐ เจเฉเฉเฉ, เจ เจคเฉ เจซเจฟเจฐ เจธเจพเจฐเฉ เจกเฉเจชเจฒเฉเจเฉเจเจธ เจจเฉเฉฐ เจฌเจพเจนเจฐ เจธเฉเฉฑเจ เจฆเจฟเจ, เจธเจฟเจฐเจซเจผ เจเฉฑเจ เจนเฉ เจนเฉเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ เจนเจฐเฉเจ เจเฉเฉฐเจเฉ เจฒเจ เจเจฆเจพเจนเจฐเจจ" - เจเจน เจฌเจฟเจฒเจเฉเจฒ เจเจธ เจคเจฐเฉเจนเจพเจ เจเฉฐเจฎ เจเจฐเฉเจเจพ, เจญเจพเจตเฉเจ เจเฉเจจเฉเจเจธเจผเจจ เจฆเฉ เจฌเจฟเจฒเจเฉเจฒ เจฒเฉเฉ เจจเจนเฉเจ เจธเฉเฅค
เจ เจคเฉ เจเจ เจตเจพเจฐ เจคเฉเจธเฉเจ เจเฉเจธเจผเจเจฟเจธเจฎเจค เจนเฉเฉฐเจฆเฉ เจนเฉ เจ เจคเฉ เจเจน "เจธเจฟเจฐเจซเจผ เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉ", เจเจ เจตเจพเจฐ เจเจธเจฆเจพ เจชเฉเจฐเจฆเจฐเจธเจผเจจ 'เจคเฉ เจเฉฑเจ เจเฉเจเจพ เจชเฉเจฐเจญเจพเจต เจนเฉเฉฐเจฆเจพ เจนเฉ, เจ เจคเฉ เจเจ เจตเจพเจฐ เจเจน เจชเฉเจฐเจญเจพเจต เจฆเจฟเฉฐเจฆเจพ เจนเฉ เจเฉ เจตเจฟเจเจพเจธเจเจฐเจคเจพ เจฆเฉ เจฆเฉเจฐเจฟเจธเจผเจเฉเจเฉเจฃ เจคเฉเจ เจฌเจฟเจฒเจเฉเจฒ เจ เจฃเจเจฟเจเจธเฉ เจนเฉเฉฐเจฆเฉ เจนเจจเฅค
เจเฉเจฐ, เจธเจผเจพเจเจฆ เจเฉฐเจจเจพ เจธเจผเจพเจจเจฆเจพเจฐ เจจเจนเฉเจ, เจชเจฐโฆ
"เจฎเจฟเฉฑเจ เจพ เจเฉเฉเจพ": JOIN + DISTINCT
SELECT DISTINCT
X.*
FROM
X
JOIN
Y
ON Y.fk = X.pk
WHERE
Y.bool_condition;
เจเจน เจเจฟเจตเฉเจ เจธเจชเฉฑเจธเจผเจ เจนเฉเจตเฉเจเจพ เจเจฟ เจเจน เจเฉ เจเจพเจนเฉเฉฐเจฆเฉ เจนเจจ เจ
เจเจฟเจนเฉ เจฐเจฟเจเจพเจฐเจก X เจฆเฉ เจเฉเจฃ เจเจฐเฉ, เจเจฟเจธ เจฒเจ Y เจตเจฟเฉฑเจ เจชเฉเจฐเฉ เจนเฉเจ เจธเจผเจฐเจค เจจเจพเจฒ เจธเจฌเฉฐเจงเจฟเจค เจนเจจ. เจฐเจพเจนเฉเจ เจฌเฉเจจเจคเฉ เจเฉเจคเฉ JOIN
- pk เจฆเฉ เจเฉเจ เจฎเฉเฉฑเจฒ เจเจ เจตเจพเจฐ เจชเฉเจฐเจพเจชเจค เจเฉเจคเฉ (เจฌเจฟเจฒเจเฉเจฒ เจเจฟเฉฐเจจเฉ เจขเฉเจเจตเฉเจ เจฐเจฟเจเจพเจฐเจก Y เจตเจฟเฉฑเจ เจจเจฟเจเจฒเฉ)เฅค เจเจฟเจตเฉเจ เจนเจเจพเจเจฃเจพ เจนเฉ? เจฏเจเฉเจจเจจ DISTINCT
!
เจเจน เจเจพเจธ เจคเฉเจฐ 'เจคเฉ "เจธเฉเจนเจพเจตเจฃเจพ" เจนเฉเฉฐเจฆเจพ เจนเฉ เจเจฆเฉเจ เจนเจฐเฉเจ เจเจเจธ-เจฐเจฟเจเจพเจฐเจก เจฒเจ เจเจ เจธเฉ เจธเฉฐเจฌเฉฐเจงเจฟเจค Y-เจฐเจฟเจเจพเจฐเจก เจนเฉเฉฐเจฆเฉ เจนเจจ, เจ
เจคเฉ เจซเจฟเจฐ เจกเฉเจชเจฒเฉเจเฉเจ เจฌเจนเจพเจฆเจฐเฉ เจจเจพเจฒ เจนเจเจพ เจฆเจฟเฉฑเจคเฉ เจเจพเจเจฆเฉ เจนเจจ ...
เจเจฟเจตเฉเจ เจ เฉเจ เจเจฐเจจเจพ เจนเฉ? เจธเจผเฉเจฐเฉ เจเจฐเจจ เจฒเจ, เจเจน เจฎเจนเจฟเจธเฉเจธ เจเจฐเฉ เจเจฟ เจเฉฐเจฎ เจจเฉเฉฐ เจเจธ เจตเจฟเฉฑเจ เจธเฉเจงเจฟเจ เจเจพ เจธเจเจฆเจพ เจนเฉ "เจเจจเฉเจนเจพเจ เจฐเจฟเจเจพเจฐเจกเจพเจ เจฆเฉ เจเฉเจฃ เจเจฐเฉ X เจเจฟเจจเฉเจนเจพเจ เจฒเจ Y เจตเจฟเฉฑเจ เจเฉฑเจเฉ-เจเฉฑเจ เจเฉฑเจ เจฆเฉ เจชเฉเจฐเจคเฉ เจนเฉเจฃ เจตเจพเจฒเฉ เจธเจผเจฐเจค เจจเจพเจฒ เจธเจฌเฉฐเจงเจฟเจค เจนเฉ" - เจเจเจผเจฐเจเจพเจฐ, เจธเจพเจจเฉเฉฐ Y-เจฐเจฟเจเจพเจฐเจก เจคเฉเจ เจเจฟเจธเฉ เจเฉเจเจผ เจฆเฉ เจฒเฉเฉ เจจเจนเฉเจ เจนเฉเฅค
เจจเฉเจธเจเจก เจฎเฉเจเฉเจฆ เจนเฉ
SELECT
*
FROM
X
WHERE
EXISTS(
SELECT
NULL
FROM
Y
WHERE
fk = X.pk AND
bool_condition
LIMIT 1
);
PostgreSQL เจฆเฉ เจเฉเจ เจธเฉฐเจธเจเจฐเจฃ เจธเจฎเจเจฆเฉ เจนเจจ เจเจฟ เจฎเฉเจเฉเจฆ เจตเจฟเฉฑเจ เจเจน เจชเจนเจฟเจฒเจพ เจฐเจฟเจเจพเจฐเจก เจฒเฉฑเจญเจฃ เจฒเจ เจเจพเจซเฉ เจนเฉ เจเฉ เจธเจพเจนเจฎเจฃเฉ เจเจเจเจฆเจพ เจนเฉ, เจชเฉเจฐเจพเจฃเฉ เจฒเฉเจ เจจเจนเฉเจ เจเจฐเจฆเฉเฅค เจเจธ เจฒเจ, เจฎเฉเจ เจนเจฎเฉเจธเจผเจพเจ เจธเฉฐเจเฉเจค เจฆเฉเจฃเจพ เจชเจธเฉฐเจฆ เจเจฐเจฆเจพ เจนเจพเจ LIMIT 1
เจ
เฉฐเจฆเจฐ EXISTS
.
เจฒเฉเจเจฐเจฒ เจเฉเจเจเจจ
SELECT
X.*
FROM
X
, LATERAL (
SELECT
Y.*
FROM
Y
WHERE
fk = X.pk AND
bool_condition
LIMIT 1
) Y
WHERE
Y IS DISTINCT FROM NULL;
เจเจนเฉ เจตเจฟเจเจฒเจช, เจเฉเจเจฐ เจฒเฉเฉ เจนเฉเจตเฉ, เจเจธเฉ เจธเจฎเฉเจ เจฎเจฟเจฒเฉ เจธเจฌเฉฐเจงเจฟเจค Y-เจฐเจฟเจเจพเจฐเจก เจคเฉเจ เจเฉเจ เจกเจพเจเจพ เจคเฉเจฐเฉฐเจค เจตเจพเจชเจธ เจเจฐเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค เจเฉฑเจ เจธเจฎเจพเจจ เจตเจฟเจเจฒเจช เจฒเฉเจ เจตเจฟเฉฑเจ เจเจฐเจเจพ เจเฉเจคเฉ เจเจ เจนเฉ
"PostgreSQL เจเจเจเฉเจชเฉเจเจฐเจจ: เจฆเฉเจฐเจฒเฉฑเจญ เจฐเจฟเจเจพเจฐเจก เจธเจผเจพเจฎเจฒ เจนเฉเจฃ เจฆเฉ เจฎเฉฑเจง เจคเฉฑเจ เจชเจนเฉเฉฐเจ เจเจพเจตเฉเจเจพ" .
"เจนเฉเจฐ เจญเฉเจเจคเจพเจจ เจเจฟเจเจ เจเจฐเฉ": DISTINCT [ON] + LIMIT 1
เจ เจเจฟเจนเฉ เจชเฉเฉฑเจเจเจฟเฉฑเจ เจชเจฐเจฟเจตเจฐเจคเจจ เจฆเจพ เจเฉฑเจ เจตเจพเจงเฉ เจซเจพเจเจฆเจพ เจฐเจฟเจเจพเจฐเจกเจพเจ เจฆเฉ เจเจฟเจฃเจคเฉ เจจเฉเฉฐ เจเจธเจพเจจเฉ เจจเจพเจฒ เจธเฉเจฎเจค เจเจฐเจจ เจฆเฉ เจธเจฎเจฐเฉฑเจฅเจพ เจนเฉ เจเฉเจเจฐ เจเจนเจจเจพเจ เจตเจฟเฉฑเจเฉเจ เจธเจฟเจฐเจซ เจเฉฑเจ / เจเฉเจ เจฆเฉ เจฒเฉเฉ เจนเฉ, เจเจฟเจตเฉเจ เจเจฟ เจนเฉเจ เจพเจ เจฆเจฟเฉฑเจคเฉ เจเฉเจธ เจตเจฟเฉฑเจ:
SELECT DISTINCT ON(X.pk)
*
FROM
X
JOIN
Y
ON Y.fk = X.pk
LIMIT 1;
เจนเฉเจฃ เจ เจธเฉเจ เจฌเฉเจจเจคเฉ เจจเฉเฉฐ เจชเฉเฉเจนเจฆเฉ เจนเจพเจ เจ เจคเฉ เจเจน เจธเจฎเจเจฃ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเจฆเฉ เจนเจพเจ เจเจฟ DBMS เจจเฉเฉฐ เจเฉ เจเจฐเจจเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ:
- เจ เจธเฉเจ เจชเจฒเฉเจเจพเจ เจจเฉเฉฐ เจเฉเฉเจฆเฉ เจนเจพเจ
- X.pk เจฆเฉเจเจฐเจพ เจตเจฟเจฒเฉฑเจเจฃ
- เจฌเจพเจเฉ เจฌเจเฉ เจฐเจฟเจเจพเจฐเจกเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจเฉเจฃเฉ
เจคเจพเจ เจคเฉเจนเจพเจจเฉเฉฐ เจเฉ เจฎเจฟเจฒเจฟเจ? "เจเฉเจ เจเฉฑเจ เจฐเจฟเจเจพเจฐเจก" เจตเจฟเจฒเฉฑเจเจฃ เจคเฉเจ - เจ เจคเฉ เจเฉ เจคเฉเจธเฉเจ เจเจธ เจจเฉเฉฐ เจเฉเจฐ-เจตเจฟเจฒเฉฑเจเจฃ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจฒเฉเจเจฆเฉ เจนเฉ, เจคเจพเจ เจเฉ เจจเจคเฉเจเจพ เจเจฟเจธเฉ เจคเจฐเฉเจนเจพเจ เจฌเจฆเจฒ เจเจพเจตเฉเจเจพ? .. "เจ เจคเฉ เจเฉ เจเฉเจ เจ เฉฐเจคเจฐ เจจเจนเฉเจ เจนเฉ, เจคเจพเจ เจนเฉเจฐ เจญเฉเจเจคเจพเจจ เจเจฟเจเจ เจเจฐเฉ?"
SELECT
*
FROM
(
SELECT
*
FROM
X
-- ััะดะฐ ะผะพะถะฝะพ ะฟะพะดััะฝััั ะฟะพะดั
ะพะดััะธั
ััะปะพะฒะธะน
LIMIT 1 -- +1 Limit
) X
JOIN
Y
ON Y.fk = X.pk
LIMIT 1;
เจ
เจคเฉ เจจเจพเจฒ เจฌเจฟเจฒเจเฉเจฒ เจเจนเฉ เจฅเฉเจฎ GROUP BY + LIMIT 1
.
"เจฎเฉเจจเฉเฉฐ เจนเฉเจฃเฉ เจชเฉเฉฑเจเจฃเจพ เจนเฉ": เจ เจชเฉเจฐเจคเฉฑเจ GROUP + LIMIT
เจเจนเฉ เจเจฟเจนเฉเจเจ เจเฉเจเจผเจพเจ เจตเฉฑเจเฉ-เจตเฉฑเจเจฐเฉเจเจ เจตเจฟเฉฑเจ เจตเจพเจชเจฐเจฆเฉเจเจ เจนเจจ เจ เจงเฉเจฐเฉเจชเจฃ เจฆเฉ เจเจพเจเจ เจฒเฉเจฌเจฒ เจเจพเจ CTEs เจเจฟเจตเฉเจ เจเจฟ เจฌเฉเจจเจคเฉ เจ เฉฑเจเฉ เจตเจงเจฆเฉ เจนเฉ:
...
CASE
WHEN (
SELECT
count(*)
FROM
X
LIMIT 1
) = 0 THEN ...
เจเฉเฉฑเจฒ เจซเฉฐเจเจธเจผเจจ (count/min/max/sum/...
) เจจเฉเฉฐ เจชเฉเจฐเฉ เจธเฉเฉฑเจ 'เจคเฉ เจธเจซเจฒเจคเจพเจชเฉเจฐเจตเจ เจฒเจพเจเฉ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ, เจญเจพเจตเฉเจ เจธเจชเฉฑเจธเจผเจ เจคเฉเจฐ 'เจคเฉ เจจเจฟเจฐเจงเจพเจฐเจฟเจค เจเฉเจคเฉ เจฌเจฟเจจเจพเจ GROUP BY
. เจธเจฟเจฐเจซ เจเฉฑเจฅเฉ เจจเจพเจฒ LIMIT
เจเจน เจฌเจนเฉเจค เจฆเฉเจธเจคเจพเจจเจพ เจจเจนเฉเจ เจนเจจเฅค
เจกเจฟเจตเฉเจฒเจชเจฐ เจธเฉเจ เจธเจเจฆเจพ เจนเฉ "เจนเฉเจฃ, เจเฉ เจเฉฑเจฅเฉ เจฐเจฟเจเจพเจฐเจก เจนเจจ, เจคเจพเจ เจฎเฉเจจเฉเฉฐ เจธเฉเจฎเจพ เจคเฉเจ เจตเฉฑเจง เจฆเฉ เจฒเฉเฉ เจจเจนเฉเจ เจนเฉ". เจชเจฐ เจคเฉเจนเจพเจจเฉเฉฐ เจเจน เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจจเจนเฉเจ เจนเฉ! เจเจฟเจเจเจเจฟ เจ เจงเจพเจฐ เจฒเจ เจเจน เจนเฉ:
- เจเจน เจเฉ เจเจพเจนเฉเฉฐเจฆเฉ เจนเจจ เจเจฟเจฃเฉ เจธเจพเจฐเฉ เจฐเจฟเจเจพเจฐเจกเจพเจ 'เจคเฉ
- เจเจฟเฉฐเจจเฉเจเจ เจฒเจพเจเจจเจพเจ เจเจน เจชเฉเฉฑเจเจฆเฉ เจนเจจ เจฆเจฟเจ
เจเฉเจเฉ เจฆเฉเจเจ เจธเจฅเจฟเจคเฉเจเจ 'เจคเฉ เจจเจฟเจฐเจญเจฐ เจเจฐเจฆเจฟเจเจ, เจนเฉเจ เจพเจ เจฆเจฟเฉฑเจคเฉ เจฌเจฆเจฒเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจฌเจฃเจพเจเจฃเจพ เจเจเจฟเจค เจนเฉ:
(count + LIMIT 1) = 0
'เจคเฉNOT EXISTS(LIMIT 1)
(count + LIMIT 1) > 0
'เจคเฉEXISTS(LIMIT 1)
count >= N
'เจคเฉ(SELECT count(*) FROM (... LIMIT N))
"เจเฉเจฐเจพเจฎ เจตเจฟเฉฑเจ เจเจฟเฉฐเจจเจพ เจฒเจเจเจฃเจพ เจนเฉ": DISTINCT + LIMIT
SELECT DISTINCT
pk
FROM
X
LIMIT $1
เจเฉฑเจ เจญเฉเจฒเจพ เจตเจฟเจเจพเจธเจเจพเจฐ เจเจฎเจพเจจเจฆเจพเจฐเฉ เจจเจพเจฒ เจตเจฟเจธเจผเจตเจพเจธ เจเจฐ เจธเจเจฆเจพ เจนเฉ เจเจฟ เจเฉฑเจ เจฌเฉเจจเจคเฉ เจจเฉเฉฐ เจฒเจพเจเฉ เจเจฐเจจเจพ เจฌเฉฐเจฆ เจนเฉ เจเจพเจตเฉเจเจพ, เจเจฟเจตเฉเจ เจนเฉ เจธเจพเจจเฉเฉฐ เจชเจนเจฟเจฒเฉ $1 เจตเฉฑเจ-เจตเฉฑเจ เจฎเฉเฉฑเจฒ เจฎเจฟเจฒเจฆเฉ เจนเจจ เจเฉ เจธเจพเจนเจฎเจฃเฉ เจเจเจเจฆเฉ เจนเจจ.
เจญเจตเจฟเฉฑเจ เจตเจฟเฉฑเจ เจเจฟเจธเฉ เจธเจฎเฉเจ, เจเจน เจเฉฑเจ เจจเจตเฉเจ เจจเฉเจก เจฆเจพ เจงเฉฐเจจเจตเจพเจฆ เจเจฐ เจธเจเจฆเจพ เจนเฉ เจ เจคเฉ เจเฉฐเจฎ เจเจฐเฉเจเจพ เจธเฉเจเจเจพเจเจ เจเฉฑเจกเฉ เจธเจเฉเจจ, เจเจฟเจธ เจจเฉเฉฐ เจฒเจพเจเฉ เจเจฐเจจ เจฒเจ เจซเจฟเจฒเจนเจพเจฒ เจเฉฐเจฎ เจเฉเจคเจพ เจเจพ เจฐเจฟเจนเจพ เจนเฉ, เจชเจฐ เจ เจเฉ เจคเฉฑเจ เจจเจนเฉเจเฅค
เจนเฉเจฃ เจคเฉฑเจ เจชเจนเจฟเจฒเฉ เจธเจพเจฐเฉ เจฐเจฟเจเจพเจฐเจก เจฎเฉเฉ เจชเฉเจฐเจพเจชเจค เจเฉเจคเฉ เจเจพเจฃเจเฉ, เจตเจฟเจฒเฉฑเจเจฃ เจนเจจ, เจ เจคเฉ เจเจนเจจเจพเจ เจตเจฟเฉฑเจเฉเจ เจเจฟเฉฐเจจเฉ เจนเฉ เจฌเฉเจจเจคเฉ เจเฉเจคเฉ เจเจ เจนเจจ เจตเจพเจชเจธ เจเฉเจคเฉ เจเจพเจฃเจเฉเฅค เจเจน เจเจพเจธ เจคเฉเจฐ 'เจคเฉ เจเจฆเจพเจธ เจนเฉ เจเฉเจเจฐ เจ เจธเฉเจ เจเฉเจ เจ เจเจฟเจนเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจนเจพเจ $1 = 4, เจ เจคเฉ เจธเจพเจฐเจฃเฉ เจตเจฟเฉฑเจ เจธเฉเจเจเฉเฉ เจนเจเจผเจพเจฐเจพเจ เจฐเจฟเจเจพเจฐเจก เจนเจจ ...
เจตเจฟเจ
เจฐเจฅ เจตเจฟเฉฑเจ เจเจฆเจพเจธ เจจเจพ เจนเฉเจฃ เจฒเจ, เจ
เจธเฉเจ เจเฉฑเจ เจฆเฉเจนเจฐเจพเจเจฃ เจตเจพเจฒเฉ เจชเฉเฉฑเจเจเจฟเฉฑเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจพเจเจเฉ
เจธเจฐเฉเจค: www.habr.com