maple-chen-tw / blog

0 stars 0 forks source link

SQL復健紀錄: Leetcode Study Plan - SQL 50 #1

Open maple-chen-tw opened 2 months ago

maple-chen-tw commented 2 months ago

NULL和數值的分開處理

SELECT name 
FROM customer 
WHERE referee_id != 2 OR referee_id IS NULL;

在SQL裡,null是用來標示value not exist的( 即unlnown),所以不適用於任何comparison operators(=, !=, <, >)。 舉例: NULL = NULL or NULL != NULL is unknown (neither true nor false)

怎麼處理NULL

column IS NULL 用來確認 column 的值為 NULLcolumn IS NOT NULL 用來確認 column 的值為 not NULL

maple-chen-tw commented 1 month ago

JOIN

SELECT W1.id
FROM Weather W1
JOIN Weather W2
ON W1.recordDate = DATE_ADD(W2.recordDate, INTERVAL 1 DAY)
WHERE W1.temperature > W2.temperature;
JOIN 的結果會變成下面的表格:在同一查詢中比較不同日期的氣溫 W1(當天)和 W2(前一天) W1.id W1.recordDate W1.temperature W2.id W2.recordDate W2.temperature
2 2015-01-02 25 1 2015-01-01 10
3 2015-01-03 20 2 2015-01-02 25
4 2015-01-04 30 3 2015-01-03 20

WHERE 再去比對W1.temperature > W2.temperature,所以就會選到 W1.id = 2W1.id = 4

MySQL - 處理日期的加減

在 MySQL 中,處理日期加減的函數有 DATE_ADD() 和 DATE_SUB(),其中加日期時間是用 DATE_ADD(),減日期時間則是用 DATE_SUB()。 加日期時間: DATE_ADD(datetime, INTERVAL expr unit) 減日期時間: DATE_SUB(datetime, INTERVAL expr unit)

------------------------------------------------------------------

# 取得一天後的日期時間:
mysql> SELECT DATE_ADD('2018-05-01',INTERVAL 1 DAY);
'2018-05-02'

# 取得一年後的日期時間:
mysql> SELECT DATE_ADD('2018-05-01',INTERVAL 1 YEAR);
'2019-05-01'

------------------------------------------------------------------

# 取得一天前的日期時間:
mysql> SELECT DATE_SUB('2018-05-01',INTERVAL 1 DAY);
'2018-04-30'

# 取得一年前的日期時間:
mysql> SELECT DATE_SUB('2018-05-01',INTERVAL 1 YEAR);
'2017-05-01'

------------------------------------------------------------------

參考網址: https://www.fooish.com/sql/mysql-date_add-function.html

maple-chen-tw commented 1 month ago

MySQL - DATE_FORMAT

MySQL 可以使用 DATE_FORMAT() 函數來顯示不同格式的日期時間。

DATE_FORMAT() 語法 (Syntax) DATE_FORMAT(date, format)

CASE 關鍵字 (SQL CASE Keyword)

CASE 類似於程式語言裡的 if/then/else 語句,用來作邏輯判斷。

CASE 語法 (SQL CASE Syntax)

CASE
  WHEN condition THEN result
  [WHEN···]
  [ELSE result]
END;

若省略了 ELSE 子句且洽無相符的條件則會返回 NULL。

例題 1193. Monthly Transactions I

SELECT
    DATE_FORMAT(trans_date, '%Y-%m') AS month,
    country,
    COUNT(id) AS trans_count,
    SUM(CASE WHEN state='approved' THEN 1 ELSE 0 END) AS approved_count,
    SUM(amount) AS trans_total_amount,
    SUM(CASE WHEN state='approved' THEN amount ELSE 0 END) AS approved_total_amount
FROM
    Transactions
GROUP BY 
    DATE_FORMAT(trans_date, '%Y-%m'), country