SELECT [fields list] FROM [tables list]
JOIN [tables] ON [conditions]
WHERE [conditions]
GROUP BY [columns]
HAVING [conditions]
ORDER BY [columns]
(1) 從product資料表中, 擷取prod_id與prod_name的資料
SELECT prod_id, prod_name FROM product;
(2) 從product, customer資料表中, 擷取prod_name與cus_name的資料
SELECT product.prod_name, customer.cus_name FROM product, customer;
但是這樣子的指令會產生什麼結果呢?
這是product, customer的資料
如果以 SELECT product.prod_name, customer.cus_name FROM customer, product; 之
的資料如下圖
上面兩個指令的差異在哪裡呢? 為什麼FROM後面的表單順序不同,會造成不同結果呢?
有沒有看出來,其實product與customer這兩個資料表根本沒有關聯。
(3) SELECT cus_name, ord_id FROM customer, order_head; 會產生什麼結果呢?
以下是order_head的資料:
SELECT cus_name, ord_id FROM customer, order_head; 的結果如下:
這個結果其實也是沒有意義的,除非我們給一些條件。
看看如下的結果:
最後的SQL結果就是: 從客戶跟訂單資料表中,找出客戶編號X並且訂購日期X的客戶名稱,訂單編號。
你也可以試看看:
從客戶跟訂單資料表中,找出訂購日期X的客戶名稱,訂單編號。
SELECT cus_name, ord_id FROM customer, order_head
WHERE ord_date='20130201'
AND ord_cus_id=cus_id;
結果如下
(4) 在上例中,我們還可以寫成
SELECT customer.cus_name, order_head.ord_id
FROM customer, order_head
WHERE order_head.ord_date='20130201'
AND order_head.ord_cus_id='1'
AND order_head.ord_cus_id=customer.cus_id;
或是
SELECT a.cus_name, b.ord_id
FROM customer a, order_head b
WHERE b.ord_date='20130201'
AND b.ord_cus_id='1'
AND b.ord_cus_id=a.cus_id;
或是
SELECT a.cus_name AS cname, b.ord_id AS oid
FROM customer a, order_head b
WHERE b.ord_date='20130201'
AND b.ord_cus_id='1'
AND b.ord_cus_id=a.cus_id;
當兩個資料表有相同的欄位名稱時,以 tableName.fieldName 來表示就不會出錯。
(5) 關於排序 ORDER BY
SELECT * FROM product ORDER BY prod_inventory;
SELECT * FROM product
ORDER BY CASE WHEN prod_price>30 THEN prod_name ELSE prod_no END;
(6) SELECT * FROM customer WHERE cus_name LIKE [conditions]
[conditions]
'A%' 以A開頭的所有字串
'%s' 以s結尾的所有字串
'%in%' 在字串任意位置有in的所有字串
'_ _ _ _' 字串長度為4的所有字串
'Qua_' 以Qua開頭的任一長度為5的所有字串
'_re_' 以re為第2, 3字元的任一長度為4的所有字串
'_re%' 以re為第2, 3字元開頭,並至少長度為3的所有字串
'%re_' 以re為倒數第2, 3字元結尾,並至少長度為3的所有字串
(7) escape字元
因為%跟_都有特殊意義,但是如果我們要判斷字串中有%或是_,怎麼辦?
可以使用如下:
使用 '100!%' 來比對 100%這個字串; '!_op' 來比對 _op 這個字串;
(8) pattern 比對
'[a-c]at' 表示 bat, cat都符合,但是fat不符合。
'[bcf]at 表示 bat, cat, fat都符合。
'[^c]at' 表示只有cat不符合。
'se[^n]%' 表示以se開頭,並且第3字元不能是n。
(9) BETWEEN使用 (適用於數字/字串/日期)
SELECT * FROM product WHERE prod_inventory BETWEEN 100 AND 1000;
SELECT * FROM product WHERE prod_inventory NOT BETWEEN 100 AND 1000;
(10) IN的使用
SELECT * FROM product WHERE prod_id IN (1,2,3);
SELECT * FROM product WHERE prod_no IN ('1','2','3');
或是
SELECT * FROM product WHERE prod_id IN (另外一個SELECT子句)
(11) NULL的使用
SELECT * FROM product WHERE prod_id IS NULL;
SELECT * FROM product WHERE prod_id IS NOT NULL;
0 留言