Archive

文章標籤 ‘SQL’

如何於MYSQL下SQL指令資料從另一個TABLE更新

2011年5月4日 尚無評論

如何下SQL指令從另一個TABLE取資料更新要更新的TABLE呢?
以下介紹三種指令都可以達到:

  1. 標準的ANSI-SQL 用INNER JOIN的作法
    UPDATE target_table INNER JOIN source_table SET title=source_table.title WHERE target_table. id=source_table.id;
  2. 採用舊版的JOIN 方式(這是不正統的~但小弟蠻常用的)
    UPDATE target_table, source_table SET title=source_table.title  WHERE target_table. id=source_table.id;
  3. 使用sub query 的方式,也是可以做到哦!
    UPDATE target_tableSET title = (  SELECT title  FROM source_table WHERE target_table. id=source_table.id );

雖然很簡單,不過還是寫出來分享給大家~^^

Categories: Database, 程式開發 Tags: ,

SQL constraint 外鍵(Foreign Key)

2008年5月7日 2 則評論

先前開發的小系統,都不太喜歡用constraint,怕在匯入或一些從db 下手作業時會很麻煩,不過系統愈做愈大
還是一定要用constraint 這樣才不會因為程式漏做了而造成資料失去完整性或關連

根據 ANSI SQL92 的標準來看,在違 反 integrity constraint 時,資料庫系統可以採取 4 種動作 :

  • set NULL,即當 parent table 中 delete 或 update 一筆資料時,foreign table 上的資料是設為 NULL。
  • set default,設 foreign key 為 最初的default value。
  • cascade,即當 delete 或 update parent table 時,對 foreign table也做 同樣的 delete 或 update。有了cascade 的功能之後,在我們開發 application 就可以節省處理 integrity constraint 的時間了。
  • no action (restrict),即當此筆資料存在有 foreign key 時,不允許做 delete 或 update。也就是說必須將此 integrity constraint 除去後才能做 delete 或 update。

Mysql

在INNODB型態下才有支援外來鍵,不然會是設假的,INNODB型態才會檢查是否有違反外來鍵限制,會依ON UPDATE CASCADE(參考主鍵修改,外來鍵會跟著改),ON DELETE SET NULL(參考主鍵刪除,外來鍵會變空值)…等等的CASCADE 限制對table處理

以下的語法是檢查是否符合外來鍵限制條件。0是關掉檢查,1是打開檢查。
SET FOREIGN_KEY_CHECKS = 0;
SET FOREIGN_KEY_CHECKS = 1;

以下的例子則是在建立表格時指定外來鍵:
MySQL:
CREATE TABLE ORDERS
(Order_ID integer,
Order_Date date,
Customer_SID integer,
Amount double,
Primary Key (Order_ID),
Foreign Key (Customer_SID) references CUSTOMER(SID));

Oracle:
CREATE TABLE ORDERS
(Order_ID integer primary key,
Order_Date date,
Customer_SID integer references CUSTOMER(SID),
Amount double);

SQL Server:
CREATE TABLE ORDERS
(Order_ID integer primary key,
Order_Date datetime,
Customer_SID integer references CUSTOMER(SID),
Amount double);

以下的例子則是藉著改變表格架構來指定外來鍵:

MySQL:
ALTER TABLE ORDERS
ADD FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid);

Oracle:
ALTER TABLE ORDERS
ADD (CONSTRAINT fk_orders1) FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid);

SQL Server:
ALTER TABLE ORDERS
ADD FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid);

Categories: Database Tags: ,

SQL 計算排名

2008年4月14日 尚無評論

最近有用到計算排名的sql 語法
找了一下才知 mysql  本身是沒有提供類似的函式
只能用sql 語法 組出來以下語法就行啦

more..

Categories: Database Tags: ,

Oracle 排序欄位 有NULL值處理方法

2007年11月2日 尚無評論

 
Oracle在Order by 時會預設認為null是最大值,所以如果是ASC升序則排在最後,DESC降序則排在最前

有幾種方式可以處理排序欄位有 null 值,大致如下:

1.使用nulls first 或者nulls last 語法

Nulls first和nulls last是Oracle Order by支援的語法 (mysql 不支援 ,但此為  SQL 99 standard 語法)

如果Order by 中指定了運算式 Nulls first則表示null值的記錄將排在最前(不管是asc 還是 desc)
反之  Nulls last則表示null值的記錄將排在最後 (不管是asc 還是 desc)
使用語法如下:

–將nulls始終放在最後
select * from products order by order_date desc nulls last

2、使用nvl函數

nvl函數可以將輸入參數為空時轉換為一特定值,如
nvl(employee_name,’張三’)表示當employee_name為空時則返回’張三’,如果不為空則返回employee_name
通過這個函數可以定制null的排序位置。

3、使用decode函數

decode函數比nvl函數更強大,同樣它也可以將輸入參數為空時轉換為一特定值,如
decode(employee_name,null,’張三’, employee_name)表示當employee_name為空時則返回’張三’,如果不為空則返回employee_name
通過這個函數可以定制null的排序位置。

4、使用case 語法

Case語法是Oracle 9i後開始支援的,是一個比較靈活的語法,同樣在排序中也可以應用
如:
select *
from employee
order by  (case employee_name
           when null then
            '張三'
           else
            employee_name
         end)
表示當employee_name為空時則返回’張三’,如果不為空則返回employee_name
通過case語法同樣可以定制null的排序位置。

文章出處 :http://211.147.225.34/gate/big5/oracle.chinaitlab.com/induction/727571.html

Categories: Database Tags: , , ,