12/08/2018, 16:46

Đố vui trong SQL

Xin chào, mình là lập trình viên Java. Trong quá trình làm việc dự án tại công ty mình, thi thoảng anh em đồng nghiệp hay quay qua hỏi đố nhau về SQL. Nay mình lượm nhặt và tổng hợp lại: vừa để chia sẻ, vừa để giải trí, cũng vừa để tự đố lại chính bản thân mình. =)) --Note: tầm 1 năm trở lại ...

Xin chào, mình là lập trình viên Java. Trong quá trình làm việc dự án tại công ty mình, thi thoảng anh em đồng nghiệp hay quay qua hỏi đố nhau về SQL. Nay mình lượm nhặt và tổng hợp lại: vừa để chia sẻ, vừa để giải trí, cũng vừa để tự đố lại chính bản thân mình. =))

--Note: tầm 1 năm trở lại đây, mình toàn dùng postgresql, nên có lẽ bài viết sẽ thiên hướng 1 chút về nó.

1. Khi viết query có cả điều kiện AND và OR, cái nào chạy trước?

a. AND trước b. OR trước c. Chạy lần lượt từ trái qua phải

-- Example:
SELECT 1 = 1 OR 1 = 2 AND 2 = 1;
-- Result = TRUE or FALSE?

Đáp án: a. AND trước Thằng bạn mình bảo là AND giống như phép nhân/chia còn OR giống như phép cộng/trừ. Mình thấy cũng có lý, nhưng mà chưa kiểm định cẩn thận lại =))

2. IN và ANY khác gì nhau?

 
| id  |  score | type  | 
1          1     A
2          NULL  C
4	       NULL  B
3	       0	 B
5	       3	 A
6	       NULL  A
--Example
SELECT
  id FROM tschema.demo
WHERE type IN ('A','B');
--vs
SELECT
  id FROM tschema.demo
WHERE type = ANY (ARRAY['A','B']);
  • ANY có thể sử dụng kèm với các toán tử : >, >=, =<, < , còn IN thì không (cùng lắm là IN và NOT IN )
  • ANY có thể được sử dụng để viết function. (Sau ANY đó là 1 mảng ARRAY, có thể truyền param này vào function được, còn IN theo mình biết là không, IN sử dụng các dấu "," để định nghĩa list, và việc này truyền vào như 1 param không được). Tản mạn: mình có tìm hiểu trên stackoverflow thấy bảo IN được hay không được sử dụng với INDEX gì đấy, nhưng mình không hiểu lắm.

3. UNION và UNION ALL khác gì nhau?

Mình có 2 bản ghi A và B cùng cấu trúc

  • UNION ALL sẽ trả về tất cả các bản ghi A + B
  • UNION không trả về tất cả, mà sau khi hợp tất cả A và B nó sẽ lọc ra các bản ghi bị trùng lặp (duplicate) và tự động xóa các row thừa.

4. INNER JOIN ON vs WHERE trong tình huống sau, cái nào nhanh hơn?

--WHERE
SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1, table2
WHERE
    table1.foreignkey = table2.primarykey
    AND (some other conditions)

vs

-- INNER JOIN ON
SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1 INNER JOIN table2
    ON table1.foreignkey = table2.primarykey
WHERE
    (some other conditions)

Cái nào nhanh hơn? a. WHERE b. INNER JOIN c. Còn tùy thuộc vào 2 bảng table1, table2

Đáp án: Mình đố vậy thôi, chứ mình cũng không biết đáp án =)). Tuy nhiên nếu bảo phải chọn 1, thì mình sẽ chọn: b. INNER JOIN nhanh hơn Tại sao? mình theo chủ nghĩa duy tâm =)) Link ref: https://stackoverflow.com/questions/1018822/inner-join-on-vs-where-clause

5. CASE WHEN với COALESCE, NVL khác gì nhau?

Ngày trước mình thường rất hay dùng CASE WHEN để xử lý cho các trường hợp xử lý ngoại lệ khi giá trị trả về là NULL. Nhưng điều này dẫn tới câu query của mình rất dài, + với nếu subquery nhiều lần => nhìn rất rối. Sau đó mình biết tới hàm COALESCE (postgresql, bên oracle là NVL), mình thấy câu query tiện đi bao nhiêu.

-- Example:
SELECT
  score,
  CASE WHEN score IS NULL
    THEN 0
  ELSE score END,
  COALESCE(score, 0)
FROM tschema.demo;

/* 
--Result
score	score	coalesce
1    	1	      1
NULL	0	      0
NULL	0	      0
0	    0	      0
3	    3	      3
NULL	0	      0
*/
  • COALESCE, NVL chỉ có ý nghĩa trong việc check NULL. Ví dụ: COALESCE( expression 1, expression 2, expression 3, …, expression n) => giá trị trả về sẽ là giá trị không NULL đầu tiên, lần lượt expression từ trái qua phải.
  • CASE WHEN trong một số trường hợp, có thể thay đổi được logic xử lý.

Thanks for reading...

0