SELECT : 從資料表中擷取資料

語法
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 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 留言