# WHERE > WHERE是SELECT敘述句中的一個子句,可以為查詢特定條件來篩選表格中哪些資料應該放在輸出結果中,不符合的則排除 ```sql= SELECT [回傳資料] FROM [資料庫結構.表格] WHERE [篩選條件] ORDER BY [欲排列的欄位] ``` * 要注意資料型態 ```sql= SELECT market_date, customer_id, quantity quantity * cost_to_customer_per_qty AS price FROM farmers_market.customer_purchases WHERE customer_id = 4 ... ``` 如果customer_id欄位值是整數就是4而如果是字串的話就要是'4' ## 多重條件篩選 ```sql= AND, OR, AND NOT ``` 1. OR是使用『短路求值』- 一確認就不再檢查其他條件 2. 超過兩個條件式時,可以用小括號將個別條件式括起來。 判斷順序是小括號內條件式優先處理 ```sql= SELECT product_id, product_name, FROM farmers_market.product WHERE product_id = 10 OR (product_id > 3 AND product_id < 8) ``` ## 數種用於篩選的關鍵字 1. BETWEEN AND ```sql= SELECT * FROM farmers_market.vendor_booth_assignments WHERE vendor_id = 7 AND market_date BETWEEN '2019-04-03' AND '2019-04-16' ... ``` 2. IN ```sql= SELECT customer_id, customer_first_name, customer_last_name FROM farmers_market.customer WHERE customer_last_name IN ('Johnny', 'Kakas', 'Victor', 'Ken') ... ``` 3. LIKE %:代表不限個數的字元 ```sql= SELECT customer_id, customer_first_name, customer_last_name FROM farmers_market.customer WHERE customer_last_name LIKE 'Jer%' ... ``` _ : 代表一個未知字元 [] : 指定匹配的字符集和 -> [abc] ^ : 指定非匹配的字符集和 -> [^abc] 4. IS NULL ```sql= SELECT FROM farmers_market.product WHERE product_size IS NULL ... ``` * 空白跟NULL並不相同 * 因為NULL並非值,所以不能用=做比較 ## 透過子查詢做篩選 ```sql= SELECT market_date, customer_id, vendor_id, quantity * cost_to_customer_per_qty AS price FROM farmers_market.customer_purchases WHERE market_date IN ( SELECT market_date FROM farmers_market.market_date_info WHERE market_date >= '2019-07-01' AND market_date <= '2019-12-31' AND market_rain_flag = 1 ) ``` # CASE ```sql= SELECT ... AS CASE ... AS ``` 別名欄位:表格中原本存在的欄位所產生的新欄位 衍生欄位:經過轉換創造出來的新欄位 ```sql= CASE WHEN [條件1] THEN [指定值或做計算] WHEN [條件2] THEN [指定值或做計算] ELSE [指定值或做計算] END ``` * SQL中的別名欄位無法在當下查詢中立即使用 -> 因為SELECT是在FROM WHERE等子句後執行 ## CASE進行類別編碼 1. 類別有高低等級之分 ```sql= SELECT booth_number, booth_price_level, CASE WHEN booth_price_level = 'A' THEN 1 WHEN booth_price_level = 'B' THEN 2 WHEN booth_price_level = 'A' THEN 3 END AS booth_price_level_numeric FROM farmers_market.booth LIMIT 5 ``` 2. 類別都是平等的 -> One-hot編碼 ```sql= SELECT ProductID, ProductName, CASE WHEN Category = 'Electronics' THEN 1 ELSE 0 END AS IsElectronics, CASE WHEN Category = 'Clothing' THEN 1 ELSE 0 END AS IsClothing, CASE WHEN Category = 'Furniture' THEN 1 ELSE 0 END AS IsFurniture FROM Products; ``` | ProductID | ProductName | IsElectronics | IsClothing | IsFurniture | |-----------|-------------|---------------|------------|-------------| | 1 | ProductA | 1 | 0 | 0 | | 2 | ProductB | 0 | 1 | 0 | | 3 | ProductC | 1 | 0 | 0 | | 4 | ProductD | 0 | 0 | 1 | | 5 | ProductE | 0 | 1 | 0 |