Pages

Subscribe:

Ads 468x60px

Labels

顯示具有 SQL 標籤的文章。 顯示所有文章
顯示具有 SQL 標籤的文章。 顯示所有文章

2018年11月10日 星期六

2016年10月25日 星期二

SQL Server 2008 不允許儲存變更

資料來源

使用SQL SERVER 2008 當直接使用SQL Server Management Studio修改Table 欄位格式或是其他DDL定義時,就會引發跳出下列錯誤訊息
不允許儲存變更。 您所做的變更會需要下列資料表卸除並重新建立。 您有做任何變更一個資料表,無法重新建立或啟用選項會防止儲存變更,需要重新建立資料表。
SQL 不允許變更Error Message 



這是因為SQL Server 2008預設不允許由圖形介面來變更資料表格式  ,下列行為就會引發上列訊息
1.變更資料行 允許 Null 設定。
2.重新排序資料表中的資料行。
3.變更資料行資料型別。
4.加入新的資料行。



SQL Server 2008會預設不允許由圖形介面來變更資料表格式,主要是因為怕手誤與大量的資料格式異動造成資料鎖定或資料遺失,這是重要的保護,但是卻造成麻煩
如果要取消此預設設定,可以依下列步驟:
開啟SQL Server Management Studio-->工具-->選項-->Designers(設計師)-->資料表和資料庫設計工具-->防止儲存需要資料表重建的變更  
      -->取消勾選 即可!如下圖:
預設不允許直接變更資料表
  

但是MSDN上有附註說明停用這選項造成的影響如果您停用這個選項,會不警告您儲存資料表時,已變更資料表的中繼資料結構。在這種情況下儲存資料表時,可能會發生資料遺失。
所以如果可以還是建議以T-SQL命令,去變更資料表。

2016年10月14日 星期五

1010: [SQL Server] 解決log檔(ldf file)過度膨脹的實戰經驗

1010: [SQL Server] 解決log檔(ldf file)過度膨脹的實戰經驗: 背景: 公司最近把一套每天有相對大量交易 (之前公司更大很多很多倍) 的系統轉移到SQL Server去,不到一個月交易檔(ldf)已經貼近數據檔(mdf)的size,真的好可怕啊。 身為SQL Server的DBA當然  要替月行道,警惡懲奸  不能讓這種情況繼續下去...

2016年10月11日 星期二

德瑞克:SQL Server 學習筆記: 縮小 壓縮 交易記錄檔 (Shrink Transaction Log);以使用 SQL Se...

德瑞克:SQL Server 學習筆記: 縮小 壓縮 交易記錄檔 (Shrink Transaction Log);以使用 SQL Se...: 若您的資料庫因故造成交易記錄檔(Transaction Log,*.ldf)遠大於,資料檔案(例如:*.mdf)時,請參考下圖所示: 資料檔案才 10 MB,但是交易記錄檔卻已經成長為 1 GB。 那要如何 縮小 壓縮 交易記錄檔呢? 本文以使用 SQL S...

2016年9月13日 星期二

【-Ma の 筆記本-】: [MS SQL] MERGE 同步處理兩個資料表

【-Ma の 筆記本-】: [MS SQL] MERGE 同步處理兩個資料表: 今天研究了一下MS SQL SERVER 2008才新增的MERGE功能, 主要簡化了比對兩個表格差異處時的新增、修改、刪除動作, 以前需要分開撰寫INSERT、UPDATE、DELETE語法, 透過MERGE比對資料,根據設定更新資料!

MS SQL HA的4種做法

資料來源

資料庫High Availability (HA),微軟SQL Server共有4種做法。
  1. Failover Clustering
  2. Database Mirroring
  3. Log Shipping
  4. Replication

Failover Clustering
把兩台以上SQL Server組成Cluster,讓SQL Server個體(Instance)隨時保持同步的狀態。
每一台SQL Server稱為一個node,這些nodes連結在一個storage,例如san或是iscsi。

同一時間只有一個node是active,
當active node掛掉了,會failover到另一個node,以繼續提供服務。

在SQL Server個體的授權上,由於同一時間只有一個node是active,
所以只有active那個需要授權,passive的node是不需要授權的。

由於是Cluster架構,所以發生問題時,切換速度最快!
但因要綁storage,所以硬體價格最貴。


Database Mirroring
透過SQL的Mirror鏡像機制,將主Server(Principal)的資料庫,覆寫於目標Server(Mirror)中。

Mirror機制是針對資料庫進行覆寫,
不同於Cluster機制是將個SQL Server Instance進行同步。

有High-Safety Mode/High-Performance Mode兩種模式,
其中High-Safety Mode需再搭配一台Server(Witness)來進行auto failover的切換。
系統切換時,active的Server IP會變成目標Server IP,
所以在程式開發上,必需將Connection String中加入Failover_Partner的關鍵字,
以自動切換到active主機。

於Mirror機制下,目標資料庫是處理還原狀態,無法提供使用,
所以目標資料庫是不需要授權的。

參考文章http://caryhsu.blogspot.tw/2011/12/sql-s...-mirroring.html


Log Shipping
透過SQL的Log Shipping交易記錄傳送機制。
利用排程,於固定時間內,將主Server的資料庫,覆寫到目標Server中。

Log Shipping與Mirror相同,都是針對資料庫進行覆寫,而不是SQL Server Instance。
與Mirror不同的是,它只能進行資料庫覆寫,無法進行auto failover切換。

當主Server掛掉時,可藉由手動還原log方式,將資料庫上線供AP使用。
由於是透過排程於固定時間內覆寫資料,所以會資料遺失上的風險。

於Log Shipping機制下,目標資料庫是處理還原狀態,無法提供使用,
所以目標資料庫是不需要授權的。

參考文章http://caryhsu.blogspot.tw/2012/02/log-shipping.html


Replication
Replication複寫是透過SQL Agent將主Server的資料庫複製後,再發行到另一台Server上。

Replication與Log Shipping及與Mirror相同,都是針對資料庫進行覆寫,
而不是SQL Server Instance。

在Replication機制中,主Server與目標Server均可讀寫。
主Server上的異動會立即反映到目標Sever,
但目標Server的異動則不會影響主Sever。

當主Server掛掉時,必需手動修改AP對應到目標Server。

於Replication機制下,主Server與目標Server均是獨立且完整讀寫之個體;
所以不論主資料庫或是目標資料庫,都是需要授權的。

參考文章http://blog.xuite.net/tolarku/blog/41423198

SQL Server 2008 複寫實作

資料來源
你不可不知的複寫常識
複寫用來複製資料和資料庫物件的一項強大的功能,是大型資料庫或資料庫同步維持資料一致性的功能
透過各種網路、撥接連線,將資料散佈到不同地點上,即然是複寫了顧名思義,就是將資料同步的寫到各個不同的資料庫伺服器上
你不可不知的複寫常識 複寫用來複製資料和資料庫物件的一項強大的功能,是大型資料庫或資料庫同步維持資料一致性的功能
透過各種網路、撥接連線,將資料散佈到不同地點上,即然是複寫了顧名思義,就是將資料同步的寫到各個不同的資料庫伺服器上
當然在整個資料庫的複寫中,也有考量到效能處理及資料庫結構問題,又分為三種複寫架構:交易式、合併式、快照式。
快照式複寫:資料變更數量大,但次數不用太頻繁的同步複寫時,最適合使用快照式複寫。
在所有複寫功能中快照式在「發行者」端負擔較小,因為他不用追踨累加變更的資料,只需要將資料庫中的資料做快照即可。
例如,在整個整批交易中,每天共有三十萬筆資料,一天只需要傳回總部一次,那麼快照式複寫就可以較有效率的將資料複寫回去。
※此種複寫需要每一張表都有Identify欄位。
交易式複寫:當資料有任何改變時,會主動的傳遞到訂閱者,預設交易式複寫是唯讀存取,因此在訂閱者端有任何資料的改變
是不會傳遞回到發行者端的。不過交易式複寫是可以設定成訂閱者亦可更新資料。
這種複寫狀態會有較大的彈性並且於資料端有大量的更新或插入、刪除的動作,適合非MS SQL Server資料庫做同步的複寫方式。
※此種複寫在發行資料庫下會主動的配置交易記錄,透過交易記錄來執行複寫轉送,當使用這種複寫方式在資料尚未完全移動到散發資料庫前,記錄檔無法被截斷。
※所有交易式複寫的資料表上,必須包含主索引鍵,否則無法被利用來發送。
合併式複寫:與交易式複寫很類似,是在發行者上發佈後,訂閱者存資料時,之主動的交換最後一次同步處理所變更過的資料。
通常這種複寫是較適合在多個訂閱者可能會在不同時間之下更新相同的資料,較容易產生資料衝突,當資料產生衝突時,必須由DBA進行排解。
※此種複寫會自動建立一組GUID資料行,且支援Timestamp資料行,在訂閱者套用快照集時會重新產生timestamp,驗證timestamp是否為可用快照。
環境限制和需求 不論在那一種複寫狀況之下,建立快照集資料夾的安全問題都是需要被重視的,因此在資料庫複寫的過程中,快照夾實體目錄權限就必須考慮進來,
使用何種複寫則必須視你所貼近的環境來選用,若資料庫設計時,並無使用identify,或並無使用索引欄位,那麼於快照及交易複寫就不適用,除非改變資料庫內容。
實作注意事項 在實作時,必須先選擇何者為發行者、散發者、訂閱者…等等的角色定義。(總是要知道誰負責發資料、誰是來接受同步資料的角色吧)
多數的工作是著在發行者身上,其它的資料處理同步,就可以透過代理程式來決定運作在訂閱者發起同步令命,還是由訂閱者發起呢?
若是遠端的資料庫同步(跨WAN)則必須透過VPN達成複寫或是Web同步處理方式,畢竟複寫是必須透過網芳、或XML訊息傳遞來處理。
在實作的過程中,有一個問題產生了,因SQL是建置在WINDOWS之上,又有使用網芳傳遞,那麼如何確認每個資料庫的同步是沒有問題的呢?
因此在複寫的安全架構下,必須將SQL Server Agent的啟動帳戶設定為相同的實體本機帳號,另外網路上存取網芳亦必須開通由這幾台db可存取。

SQL Server 2008 數據庫同步的兩種方式 (發布、訂閱)

資料來源
時間:2012-07-30 18:03來源:Internet 作者:Internet 
1、找到數據庫服務器下的【复制】--【本地發布】,選擇【新建發布】。如下圖:   2、選擇待發布的數據庫。如下圖:   3、選擇發布類型。這裏選擇的默認類型【快照發布】。幾種發布類型的區別,SQL
1、找到數據庫服務器下的【复制】--【本地發布】,選擇【新建發布】。如下圖:
  2、選擇待發布的數據庫。如下圖:
  3、選擇發布類型。這裏選擇的默認類型【快照發布】。幾種發布類型的區別,SQL SERVER都在下面给出了說明。如下圖:
  4、選擇待發布的類容。如下圖:
  上圖中右側就是篩選的SQL語句。
  5、設置快照代理。如下圖:
  更改同步頻率如下圖:
  6、設置代理安全性。如下圖:
  7、填寫發布名稱
  8、完成發布。如下圖:
  二、訂閱。訂閱是對數據庫發布的快照進行同步,將發布的數據源數據同步到目標數據庫。具體訂閱過程如下;
  1、找到數據庫服務器下的【复制】--【本地訂閱】,選擇【新建訂閱】。如下圖:
  2、選擇訂閱的發布。如下圖:
  3、選擇分發代理的位置;如下圖:
  4、選擇訂閱服務器上的存放同步過來的數據的一個或者多個目標數據庫。如下圖:
  若要添加多個訂閱數據庫,則點擊【添加訂閱服務器】。如下圖:
  5、設置分發代理的安全性。如下圖:
  6、設置同步計劃。如下圖:
  7、完成訂閱。如下圖:
  這样就完成了發布與訂閱的整個流程。
  這裏,和上節一起就介紹完了SQL Server數據庫同步的兩種方式,希望對你有用。

2014年3月11日 星期二

MySQL/Pivot table

"pivot table" or a "crosstab report"
(Note: this page needs to be wikified)
SQL Characteristic Functions: Do it without "if", "case", or "GROUP_CONCAT". Yes, there is use for this..."if" statements sometimes cause problems when used in combination.
The simple secret, and it's also why they work in almost all databases, is the following functions:
  • sign (x) returns -1,0, +1 for values x < 0, x = 0, x > 0 respectively
  • abs( sign( x) ) returns 0 if x = 0 else, 1 if x > 0 or x < 0
  • 1-abs( sign( x) ) complement of the above, since this returns 1 only if x = 0
   Quick example:   sign(-1) = -1,  abs( sign(-1) ) = 1,  1-abs( sign(-1) ) = 0

Data for full example:
      CREATE TABLE exams (
        pkey int(11) NOT NULL auto_increment,
        name varchar(15),
        exam int,
        score int,
        PRIMARY KEY  (pkey)
      );

      insert into exams (name,exam,score) values ('Bob',1,75);
      insert into exams (name,exam,score) values ('Bob',2,77);
      insert into exams (name,exam,score) values ('Bob',3,78);
      insert into exams (name,exam,score) values ('Bob',4,80);

      insert into exams (name,exam,score) values ('Sue',1,90);
      insert into exams (name,exam,score) values ('Sue',2,97);
      insert into exams (name,exam,score) values ('Sue',3,98);
      insert into exams (name,exam,score) values ('Sue',4,99);

mysql> select * from exams;
+------+------+------+-------+
| pkey | name | exam | score |
+------+------+------+-------+
|    1 | Bob  |    1 |    75 |
|    2 | Bob  |    2 |    77 |
|    3 | Bob  |    3 |    78 |
|    4 | Bob  |    4 |    80 |
|    5 | Sue  |    1 |    90 |
|    6 | Sue  |    2 |    97 |
|    7 | Sue  |    3 |    98 |
|    8 | Sue  |    4 |    99 |
+------+------+------+-------+
8 rows in set (0.00 sec)

mysql> select name,
sum(score*(1-abs(sign(exam-1)))) as exam1,
sum(score*(1-abs(sign(exam-2)))) as exam2,
sum(score*(1-abs(sign(exam-3)))) as exam3,
sum(score*(1-abs(sign(exam-4)))) as exam4
from exams group by name;

+------+-------+-------+-------+-------+
| name | exam1 | exam2 | exam3 | exam4 |
+------+-------+-------+-------+-------+
| Bob  |    75 |    77 |    78 |    80 |
| Sue  |    90 |    97 |    98 |    99 |
+------+-------+-------+-------+-------+
2 rows in set (0.00 sec)

Note, the above pivot table was created with one select statement.
Let's decompose to make the trick clearer, for the second exam:
mysql> select name, score, exam, exam-2, sign(exam-2), abs(sign(exam-2)), 1-abs(sign(exam-2)),
       score*(1-abs(sign(exam-2))) as exam2 from exams;
+------+-------+------+--------+--------------+-------------------+---------------------+-------+
| name | score | exam | exam-2 | sign(exam-2) | abs(sign(exam-2)) | 1-abs(sign(exam-2)) | exam2 |
+------+-------+------+--------+--------------+-------------------+---------------------+-------+
| Bob  |    75 |    1 |     -1 |           -1 |                 1 |                   0 |     0 |
| Bob  |    77 |    2 |      0 |            0 |                 0 |                   1 |    77 |
| Bob  |    78 |    3 |      1 |            1 |                 1 |                   0 |     0 |
| Bob  |    80 |    4 |      2 |            1 |                 1 |                   0 |     0 |
| Sue  |    90 |    1 |     -1 |           -1 |                 1 |                   0 |     0 |
| Sue  |    97 |    2 |      0 |            0 |                 0 |                   1 |    97 |
| Sue  |    98 |    3 |      1 |            1 |                 1 |                   0 |     0 |
| Sue  |    99 |    4 |      2 |            1 |                 1 |                   0 |     0 |
+------+-------+------+--------+--------------+-------------------+---------------------+-------+
8 rows in set (0.00 sec)

You may think IF's would be clean but WATCH OUT! Look what the following gives (INCORRECT !!):
mysql> select name,
if(exam=1,score,null) as exam1,
if(exam=2,score,null) as exam2,
if(exam=3,score,null) as exam3,
if(exam=4,score,null) as exam4
from exams group by name;

+------+-------+-------+-------+-------+
| name | exam1 | exam2 | exam3 | exam4 |
+------+-------+-------+-------+-------+
| Bob  |    75 |  NULL |  NULL |  NULL |
| Sue  |    90 |  NULL |  NULL |  NULL |
+------+-------+-------+-------+-------+
2 rows in set (0.00 sec)

Note: the following does work - is all the maths necessary after all?
mysql> SELECT name,
       SUM(IF(exam=1,score,NULL)) AS exam1,
       SUM(IF(exam=2,score,NULL)) AS exam2,
       SUM(IF(exam=3,score,NULL)) AS exam3,
       SUM(IF(exam=4,score,0)) AS exam4
       FROM exams GROUP BY name;
+------+-------+-------+-------+-------+
| name | exam1 | exam2 | exam3 | exam4 |
+------+-------+-------+-------+-------+
| Bob  |    75 |    77 |    78 |    80 |
| Sue  |    90 |    97 |    98 |    99 |
+------+-------+-------+-------+-------+
2 rows in set (0.00 sec)


mysql> select name,
       sum(score*(1-abs(sign(exam-1)))) as exam1,
       sum(score*(1-abs(sign(exam-2)))) as exam2,
       sum(score*(1-abs(sign(exam-3)))) as exam3,
       sum(score*(1-abs(sign(exam-4)))) as exam4,
         sum(score*(1-abs(sign(exam- 2)))) -   sum(score*(1-abs(sign(exam- 1)))) as delta_1_2,
         sum(score*(1-abs(sign(exam- 3)))) -   sum(score*(1-abs(sign(exam- 2)))) as delta_2_3,
         sum(score*(1-abs(sign(exam- 4)))) -   sum(score*(1-abs(sign(exam- 3)))) as delta_3_4
       from exams group by name;
+------+-------+-------+-------+-------+-----------+-----------+-----------+
| name | exam1 | exam2 | exam3 | exam4 | delta_1_2 | delta_2_3 | delta_3_4 |
+------+-------+-------+-------+-------+-----------+-----------+-----------+
| Bob  |    75 |    77 |    78 |    80 |         2 |         1 |         2 |
| Sue  |    90 |    97 |    98 |    99 |         7 |         1 |         1 |
+------+-------+-------+-------+-------+-----------+-----------+-----------+
2 rows in set (0.00 sec)

Above delta_1_2 shows the difference between the first and second exams, with the numbers being positive because both Bob and Sue improved their score with each exam. Calculating the deltas here shows it's possible to compare two rows, not columns which is easily done with the standard SQL statements but rows in the original table.
mysql>select name,
sum(score*(1-abs(sign(exam-1)))) as exam1,
sum(score*(1-abs(sign(exam-2)))) as exam2,
sum(score*(1-abs(sign(exam-3)))) as exam3,
sum(score*(1-abs(sign(exam-4)))) as exam4,
  sum(score*(1-abs(sign(exam- 2)))) -   sum(score*(1-abs(sign(exam- 1)))) as delta_1_2,
  sum(score*(1-abs(sign(exam- 3)))) -   sum(score*(1-abs(sign(exam- 2)))) as delta_2_3,
  sum(score*(1-abs(sign(exam- 4)))) -   sum(score*(1-abs(sign(exam- 3)))) as delta_3_4,

  sum(score*(1-abs(sign(exam- 2)))) -   sum(score*(1-abs(sign(exam- 1))))  +
  sum(score*(1-abs(sign(exam- 3)))) -   sum(score*(1-abs(sign(exam- 2))))  +
  sum(score*(1-abs(sign(exam- 4)))) -   sum(score*(1-abs(sign(exam- 3))))  as TotalIncPoints
  from exams group by name;

+------+-------+-------+-------+-------+-----------+-----------+-----------+----------------+
| name | exam1 | exam2 | exam3 | exam4 | delta_1_2 | delta_2_3 | delta_3_4 | TotalIncPoints |
+------+-------+-------+-------+-------+-----------+-----------+-----------+----------------+
| Bob  |    75 |    77 |    78 |    80 |         2 |         1 |         2 |              5 |
| Sue  |    90 |    97 |    98 |    99 |         7 |         1 |         1 |              9 |
+------+-------+-------+-------+-------+-----------+-----------+-----------+----------------+
2 rows in set (0.00 sec)

TotalIncPoints shows the sum of the deltas.
select name,
sum(score*(1-abs(sign(exam-1)))) as exam1,
sum(score*(1-abs(sign(exam-2)))) as exam2,
sum(score*(1-abs(sign(exam-3)))) as exam3,
sum(score*(1-abs(sign(exam-4)))) as exam4,
  sum(score*(1-abs(sign(exam- 2)))) -   sum(score*(1-abs(sign(exam- 1)))) as delta_1_2,
  sum(score*(1-abs(sign(exam- 3)))) -   sum(score*(1-abs(sign(exam- 2)))) as delta_2_3,
  sum(score*(1-abs(sign(exam- 4)))) -   sum(score*(1-abs(sign(exam- 3)))) as delta_3_4,


  sum(score*(1-abs(sign(exam- 2)))) -   sum(score*(1-abs(sign(exam- 1))))  +
  sum(score*(1-abs(sign(exam- 3)))) -   sum(score*(1-abs(sign(exam- 2))))  +
  sum(score*(1-abs(sign(exam- 4)))) -   sum(score*(1-abs(sign(exam- 3))))  as TotalIncPoints,

(sum(score*(1-abs(sign(exam-1)))) +
sum(score*(1-abs(sign(exam-2)))) +
sum(score*(1-abs(sign(exam-3)))) +
sum(score*(1-abs(sign(exam-4)))))/4 as AVG

from exams group by name;

+------+-------+-------+-------+-------+-----------+-----------+-----------+----------------+-------+
| name | exam1 | exam2 | exam3 | exam4 | delta_1_2 | delta_2_3 | delta_3_4 | TotalIncPoints | AVG   |
+------+-------+-------+-------+-------+-----------+-----------+-----------+----------------+-------+
| Bob  |    75 |    77 |    78 |    80 |         2 |         1 |         2 |              5 | 77.50 |
| Sue  |    90 |    97 |    98 |    99 |         7 |         1 |         1 |              9 | 96.00 |
+------+-------+-------+-------+-------+-----------+-----------+-----------+----------------+-------+
2 rows in set (0.00 sec)

It's possible to combine Total Increasing Point TotalIncPoints with AVG. In fact, it's possible to combine all of the example cuts of the data into one SQL statement, which provides additional options for displaying data on your page
select name,
sum(score*(1-abs(sign(exam-1)))) as exam1,
sum(score*(1-abs(sign(exam-2)))) as exam2,
sum(score*(1-abs(sign(exam-3)))) as exam3,
sum(score*(1-abs(sign(exam-4)))) as exam4,

(sum(score*(1-abs(sign(exam-1)))) +
sum(score*(1-abs(sign(exam-2)))))/2  as AVG1_2,

(sum(score*(1-abs(sign(exam-2)))) +
sum(score*(1-abs(sign(exam-3)))))/2 as AVG2_3,

(sum(score*(1-abs(sign(exam-3)))) +
sum(score*(1-abs(sign(exam-4)))))/2 as AVG3_4,

(sum(score*(1-abs(sign(exam-1)))) +
sum(score*(1-abs(sign(exam-2)))) +
sum(score*(1-abs(sign(exam-3)))) +
sum(score*(1-abs(sign(exam-4)))))/4 as AVG

from exams group by name;

+------+-------+-------+-------+-------+--------+--------+--------+-------+
| name | exam1 | exam2 | exam3 | exam4 | AVG1_2 | AVG2_3 | AVG3_4 | AVG   |
+------+-------+-------+-------+-------+--------+--------+--------+-------+
| Bob  |    75 |    77 |    78 |    80 |  76.00 |  77.50 |  79.00 | 77.50 |
| Sue  |    90 |    97 |    98 |    99 |  93.50 |  97.50 |  98.50 | 96.00 |
+------+-------+-------+-------+-------+--------+--------+--------+-------+
2 rows in set (0.00 sec)

Exam scores are listing along with moving averages...again it's all with one select statement.
Good article on "Cross tabulations" or de-normalizing data to show stats: http://dev.mysql.com/tech-resources/articles/wizard/print_version.html
ADOdb (PHP) can generate pivot tables using PivotTableSQL().
For Perl, check DBIx-SQLCrosstab.

如何用單一SELECT 語法完成樞紐分析表,

SELECT p1.*, ( p1.Sum_a1+p1.Sum_a2+p1.Sum_b1) as Sum_All
from (select item,
    SUM(CASE class WHEN 'a1' THEN qty ELSE 0 END) AS Sum_a1,
    SUM(CASE class WHEN 'a2' THEN qty ELSE 0 END) AS Sum_a2,
    SUM(CASE class WHEN 'b1' THEN qty ELSE 0 END) AS Sum_b1
FROM testdata as p
GROUP BY item WITH ROLLUP
 ) as p1 


資料來源

2013年6月18日 星期二

PHP+MySQL資料庫研習資料

http://www.js1es.tnc.edu.tw/~phptest/index.php

SQL語法

一般而言,資料庫的語法 ( SQL ) 分為三大類別: 

1. DDL ( Data Definition Language ):定義資料庫物件使用的語法,常看到的關鍵字有:
Create:建立資料庫的物件。
Alter:變更資料庫的物件。
Drop:刪除資料庫的物件。
2. DCL ( Data Control Language ):控制資料庫物件使用狀況的語法,常看到的關鍵字有:
Grant:賦予使用者使用物件的權限。
Revoke:取消使用者使用物件的權限。
Commit:Transaction 正常作業完成。
Rollback:Transaction 作業異常,異動的資料回復到 Transaction 開始的狀態。
3. DML ( Data Manipulation Language ):維護資料庫資料內容的語法,常看到的關鍵字有:
Insert:新增資料到 Table 中。
Update:更改 Table 中的資料。
Delete:刪除 Table 中的資料。
Select:選取資料庫中的資料。

詳見

MySQL 5.0 Reference Manual

MySQL 5.0 features.  This manual describes features that are not included in every edition of MySQL 5.0 and such features may not be included in the edition of MySQL 5.0 licensed to you. If you have any questions about the features included in your edition of MySQL 5.0, refer to your MySQL 5.0 license agreement or contact your Oracle representative.

詳見

MS SQL的常用字串函數

使用SQL語法時,有時候會需要某一個欄位的特定字元,就會使用到字串函數,底下介紹幾個常用的函數
substring(欄位名稱,開始字元,取得字元字數)=>取欄位從第幾字元開始取幾位字元
left(欄位名稱,取得字元字數)=>取欄位左邊開始幾位字元
right(欄位名稱,取得字元字數)=>取欄位右邊開始幾位字元
ltrim(欄位名稱)=>去除欄位左邊空白
rtrim(欄位名稱)=>去除欄位右邊空白
1.MS SQL的常用字串函數執行結果,其中r的值沒顯示,
是因為該欄位的右邊有空白

SQL語法教學

http://www.1keydata.com/tw/sql/sql.html