So Sánh Một Số Hàm Và Tốc Độ Load Hàm SQL

Discussion in 'Sever Building' started by Mickey, Jan 6, 2018.

  1. Mickey

    Mickey Hacking For Hacker Staff Member

    • Administrator
    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
    PHP:
    -- Example:
    SELECT 1 OR AND 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?

    PHP:
    <!-- Database mẫu như sau: (schematschema) -->
    id  |  score type  |
    1          1     A
    2          NULL  C
    4          NULL  B
    3          0     B
    5          3     A
    6          NULL  A
    --Example
    PHP:
    SELECT
      id FROM tschema
    .demo
    WHERE type IN 
    ('A','B');
    --vs--

    PHP:
    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?
    Code:
    --WHERE
    SELECT
        table1.this, table2.that, table2.somethingelse
    FROM
        table1, table2
    WHERE
        table1.foreignkey = table2.primarykey
        AND (some other conditions)
    vs

    PHP:
    -- INNER JOIN ON
    SELECT
        table1
    .thistable2.thattable2.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:
    b. INNER JOIN nhanh hơn
    Tại sao? mình theo chủ nghĩa duy tâm =))
    Link ref:
    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:
    PHP:
    SELECT
      score
    ,
      CASE 
    WHEN score IS NULL
        THEN 0
      
    ELSE score END,
      
    COALESCE(score0)
    FROM tschema.demo;

    /* 
    --Result
    PHP:
    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ý.
     

Share This Page