<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>石頭閒語-SQL/Database</title>
<link>http://blog.roodo.com/rocksaying/archives/cat_242547.html</link>
<description>[Licensed by GNU FDL]
Rock&#039;s Saying 
遊手好閒的石頭成的部落格 
Open Your Mind, Use the Source! 
//
</description>
<language>zh-tw</language>
<generator>Roodo Blog System</generator>
<copyright>All Rights Reserved</copyright>
<atom:link href="http://blog.roodo.com/rocksaying/archives/cat_242547.xml" rel="self" type="application/rss+xml" />
<item>
	<title>SQLite/PHP/Apache 設定筆記</title>
	<description><![CDATA[
	Tags: php sqlite database

SQLite 目前有兩種版本，一是 SQLite 2，另一為 SQLite 3。PHP 兩種都支援，但所需的擴充項(extension)並不相同。


SQLite is a software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine.
SQLite Home Page


在 PHP 中使用 SQLite2 ，必須載入 SQLite 擴充項(sqlite.so/php_sqlite.dll)。



在 PHP 中使用 SQLite3 ，必須載入 PDO_SQLite 擴充項(pdo_sqlite.so/php_pdo_sqlite.dll)。同時這也表示兩件事。一，SQLite3 是 PDO 擴充項的一個工廠(factory) ，你必須透過 PDO 介面去呼叫 SQLite3 的方法。二，PHP5 或以上的版本才支援 PDO 擴充項，故 PHP4 不能使用 SQLite3。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: php sqlite database</div>
<p>
SQLite 目前有兩種版本，一是 SQLite 2，另一為 SQLite 3。PHP 兩種都支援，但所需的擴充項(extension)並不相同。
</p>
<blockquote>
<a href="http://www.sqlite.org/">SQLite</a> is a software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine.<br/>
<cite>SQLite Home Page</cite>
</blockquote>
<p>
在 PHP 中使用 SQLite2 ，必須載入 SQLite 擴充項(sqlite.so/php_sqlite.dll)。
</p>

<p>
在 PHP 中使用 SQLite3 ，必須載入 PDO_SQLite 擴充項(pdo_sqlite.so/php_pdo_sqlite.dll)。同時這也表示兩件事。一，SQLite3 是 PDO 擴充項的一個工廠(factory) ，你必須透過 PDO 介面去呼叫 SQLite3 的方法。二，PHP5 或以上的版本才支援 PDO 擴充項，故 PHP4 不能使用 SQLite3。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/6319337.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/6319337.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/6319337.html</guid>
	<category>SQL/Database</category>
	<pubDate>Fri, 04 Jul 2008 11:23:56 +0800</pubDate>
</item>
<item>
	<title>新增資料時自動產生識別代號的一些方法</title>
	<description><![CDATA[
	Tags: sql serial max

時常接觸資料庫應用的編程人員，應該都會遇到需要新增資料後自動產生一個識別代號(ID)的設計。但遺憾的是， SQL Standard 並沒有定義任何相關型態或函數。於是各種資料庫系統都有自己的一套做法。使得這種普遍的應用設計，帶來了一個可攜性陷阱。



在不考慮使用資料庫系統特定方法的情況下，我長久以來習慣用 MAX(id) + 1 產生識別代號。至於 MySQL 的用戶，我都特別為它準備另一個 SQL Schema，改用 MySQL 特有的 AUTO_INCREMENT 欄位屬性。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: sql serial max</div>
<p>
時常接觸資料庫應用的編程人員，應該都會遇到需要新增資料後自動產生一個識別代號(ID)的設計。但遺憾的是， SQL Standard 並沒有定義任何相關型態或函數。於是各種資料庫系統都有自己的一套做法。使得這種普遍的應用設計，帶來了一個可攜性陷阱。
</p>

<p>
在不考慮使用資料庫系統特定方法的情況下，我長久以來習慣用 <code>MAX(id) + 1</code> 產生識別代號。至於 MySQL 的用戶，我都<strong>特別為它準備另一個 SQL Schema</strong>，改用 MySQL 特有的 <code>AUTO_INCREMENT</code> 欄位屬性。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/6223035.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/6223035.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/6223035.html</guid>
	<category>SQL/Database</category>
	<pubDate>Tue, 24 Jun 2008 12:04:40 +0800</pubDate>
</item>
<item>
	<title>Oracle 的表格、欄位名稱都要大寫嗎？</title>
	<description><![CDATA[
	
jaceju 說: Oracle 的表格、欄位名稱都要大寫這個限制實在很鳥...不曉得有沒有哪位 Oracle 前輩能指點一二？


關於欄位名稱，其實是可以指定大小寫的，但要用 雙引號 (") 括起來。一個「非雙引號括起的」欄位名稱都要大寫這件事，其實是 SQL Standard。而且這是內定程序。


10)The &lt;identifier body&gt; of a &lt;regular identifier&gt; is equivalent
            to an &lt;identifier body&gt; in which every letter that is a lower-
            case letter is replaced by the equivalent upper-case letter
            or letters. This treatment includes determination of equiva-
            lence, representation in the Information and Definition Schemas,
            representation in the diagnostics area, and similar uses.
SQL 92


但是 SQL Standard 也允許你用雙引號(doublequote) 字元括起名稱，這時就會抑制大小寫轉換的動作。這是 SQL Standard 配合國際字元集所定的規則。在這種情形下，也 SQL Standard 也允許你用保留字做為欄位名稱。


Oracle 在這方面完全遵循 SQL Standard 。也可以參考 Oracle reference 的內容:
Oracle Database SQL Language Reference 11g Release 1::Schema Object Names and Qualifiers。就我個人實際使用經驗， PostgresSQL, MS SQL Server, IBM DB2 以及我最不喜歡的 MySQL方言，都遵循這個作法。


話說回來， MySQL 也是一樣，你把欄位名稱輸入小寫符號，MySQL DBMS內部也是全部轉大寫在處理(還是小寫？我忘了，反正結果一樣)。除非你用雙引號括起來，才會保留大小寫差異。

	]]>
	</description>
	<content:encoded><![CDATA[
	<p>
jaceju <a href="http://blog.roodo.com/jaceju/archives/cat_446363.html">說</a>: <q>Oracle 的表格、欄位名稱都要大寫這個限制實在很鳥...不曉得有沒有哪位 Oracle 前輩能指點一二？</q>
</p>
<p>
關於欄位名稱，其實是可以指定大小寫的，但要用 雙引號 (") 括起來。一個「非雙引號括起的」欄位名稱都要大寫這件事，其實是 SQL Standard。而且這是內定程序。
</p>
<blockquote>
10)The &lt;identifier body&gt; of a &lt;regular identifier&gt; is equivalent
            to an &lt;identifier body&gt; in which every letter that is a lower-
            case letter is replaced by the equivalent upper-case letter
            or letters. This treatment includes determination of equiva-
            lence, representation in the Information and Definition Schemas,
            representation in the diagnostics area, and similar uses.
<cite><a href="http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt">SQL 92</a></cite>
</blockquote>
<p>
但是 SQL Standard 也允許你用雙引號(doublequote) 字元括起名稱，這時就會抑制大小寫轉換的動作。這是 SQL Standard 配合國際字元集所定的規則。在這種情形下，也 SQL Standard 也允許你用保留字做為欄位名稱。
</p>
<p>
Oracle 在這方面完全遵循 SQL Standard 。也可以參考 Oracle reference 的內容:
<a href="http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/sql_elements008.htm#i27561">Oracle Database SQL Language Reference 11g Release 1::Schema Object Names and Qualifiers</a>。就我個人實際使用經驗， PostgresSQL, MS SQL Server, IBM DB2 以及我最不喜歡的 MySQL方言，都遵循這個作法。
</p>
<p>
話說回來， MySQL 也是一樣，你把欄位名稱輸入小寫符號，MySQL DBMS內部也是全部轉大寫在處理(還是小寫？我忘了，反正結果一樣)。除非你用雙引號括起來，才會保留大小寫差異。
</p>		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/5935773.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/5935773.html</guid>
	<category>SQL/Database</category>
	<pubDate>Mon, 28 Apr 2008 17:47:08 +0800</pubDate>
</item>
<item>
	<title>BIT and CHAR</title>
	<description><![CDATA[
	Tags: database sql

BIT 與 CHAR 使用筆記。以 SQL92 為基準。


BIT很少用，前一陣子為了使用這種資料型態，google了不少資料，不過大部份網路資料都沒有提供什麼有用的資訊 (市面上的 SQL 書籍更是不提)。最後還是在各家資料庫系統本身的 Manual 中找到資訊。留下筆記，以供日後查閱。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: database sql</div>
<p>
BIT 與 CHAR 使用筆記。以 SQL92 為基準。
</p>
<p>
BIT很少用，前一陣子為了使用這種資料型態，google了不少資料，不過大部份網路資料都沒有提供什麼有用的資訊 (市面上的 SQL 書籍更是不提)。最後還是在各家資料庫系統本身的 Manual 中找到資訊。留下筆記，以供日後查閱。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/5762925.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/5762925.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/5762925.html</guid>
	<category>SQL/Database</category>
	<pubDate>Thu, 27 Mar 2008 11:13:53 +0800</pubDate>
</item>
<item>
	<title>以源碼探索 PHP 查詢 MySQL 後儲存資料結果的方式</title>
	<description><![CDATA[
	Tags: php mysql database 記憶體管理

基於以下系列討論內容的一大串源碼追蹤。以印證討論內容。


TWPUG同主題討論串
TWPUG - cakephp換頁效能與架構回應之二


Remember this: Open your mind, use the source.


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: php mysql database 記憶體管理</div>
<p>
基於以下系列討論內容的一大串源碼追蹤。以印證討論內容。
</p>
<ul>
<li><a href="http://twpug.net/modules/newbb/viewtopic.php?viewmode=flat&type=&topic_id=3094&forum=35">TWPUG同主題討論串</a></li>
<li><a href="http://blog.roodo.com/rocksaying/archives/4903965.html">TWPUG - cakephp換頁效能與架構回應之二</a></li>
</ul>
<p>
<strong>Remember this: Open your mind, use the source.</strong>
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/4986803.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/4986803.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/4986803.html</guid>
	<category>SQL/Database</category>
	<pubDate>Tue, 15 Jan 2008 11:35:33 +0800</pubDate>
</item>
<item>
	<title>SQL tips review</title>
	<description><![CDATA[
	Tags: SQL

jaceju 提到 一篇關於 MySQL 查詢效率的文章: PHP Mysql tips。基本上，該文所列的最快語法，我全部都不建議使用。因為都是 MySQL 特有語法，不具有可移植性。雖然該文主要就是在談 MySQL tips ，但基於可移植性的理由，這種語法能不用就不用。


其他的 SQL 系統，如 PostgreSQL, SQL Server 等等，都針對標準語法(ANSI SQL)做了最佳化。使用同樣的標準語法查詢時，它們的表現不比 MySQL 差。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: SQL</div>
<p>
jaceju <a href="http://blog.roodo.com/jaceju/archives/3719291.html">提到</a> 一篇關於 MySQL 查詢效率的文章: <a href="http://www.thespanner.co.uk/2007/07/23/php-mysql-tips/">PHP Mysql tips</a>。基本上，該文所列的最快語法，我全部都不建議使用。因為都是 MySQL 特有語法，不具有可移植性。雖然該文主要就是在談 MySQL tips ，但基於可移植性的理由，這種語法能不用就不用。
</p>
<p>
其他的 SQL 系統，如 PostgreSQL, SQL Server 等等，都針對標準語法(ANSI SQL)做了最佳化。使用同樣的標準語法查詢時，它們的表現不比 MySQL 差。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/3784555.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3784555.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3784555.html</guid>
	<category>SQL/Database</category>
	<pubDate>Sun, 29 Jul 2007 08:41:59 +0800</pubDate>
</item>
<item>
	<title>TWPUG問答 - 查詢結果附上其他資訊？</title>
	<description><![CDATA[
	Tags: SQL CASE

原問題: 查詢結果附上條件?。需求是有一個來自使用者輸入的對照表，由於其內容每次輸入都不同，故並未建立在資料庫中。現在需要在查詢結果中加入此一對照資訊。


純 SQL 的方式可配合 CASE 關鍵字，但受限於查詢句子的長度及複雜度，僅適用於少量資訊。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: SQL CASE</div>
<p>
原問題: <a href="http://twpug.net/modules/newbb/viewtopic.php?topic_id=2659&forum=13">查詢結果附上條件?</a>。需求是有一個來自使用者輸入的對照表，由於其內容每次輸入都不同，故並未建立在資料庫中。現在需要在查詢結果中加入此一對照資訊。
</p>
<p>
純 SQL 的方式可配合 <code>CASE</code> 關鍵字，但受限於查詢句子的長度及複雜度，僅適用於少量資訊。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/3459603.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3459603.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3459603.html</guid>
	<category>SQL/Database</category>
	<pubDate>Wed, 13 Jun 2007 08:55:28 +0800</pubDate>
</item>
<item>
	<title>TWPUG問答: SQL 文字搜尋</title>
	<description><![CDATA[
	Tags: sql like

I try to write a searching engine with php and mysql. Somehow I always get error messages. Here is my code:
$sql = "SELECT * FROM `General` WHERE `Item_Name` LIKE $Name";
TWPUG::資料庫討論區



SQL syntax error.


The field-name should be put in double-quote. It means case-sensitive.
The LIKE only applies for text-based type field, therefore you need to put content in single-quote. Besides, LIKE must be used with '%'.


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: sql like</div>
<blockquote>
I try to write a searching engine with php and mysql. Somehow I always get error messages. Here is my code:<br/>
<code>$sql = "SELECT * FROM `General` WHERE `Item_Name` LIKE $Name";</code><br/>
<cite><a href="http://twpug.net/modules/newbb/viewtopic.php?topic_id=2609&forum=33">TWPUG::資料庫討論區</a></cite>
</blockquote>

<p>
SQL syntax error.
</p>
<ol>
<li>The field-name should be put in double-quote. It means case-sensitive.</li>
<li>The <code>LIKE</code> only applies for text-based type field, therefore you need to put content in single-quote. Besides, <code>LIKE</code> must be used with '%'.</li>
</ol>
		<a href="http://blog.roodo.com/rocksaying/archives/3284073.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3284073.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3284073.html</guid>
	<category>SQL/Database</category>
	<pubDate>Mon, 21 May 2007 16:03:33 +0800</pubDate>
</item>
<item>
	<title>以 replace 修正整批記錄的錯字</title>
	<description><![CDATA[
	
今天修正了公司客戶資料庫中的電話資料。主要是將中間的連接線 (-) 拿掉，這是人工輸入的，但實際上根本用不著。不是很難的動作，用 replace() 就搞得定。


比較麻煩的是電話有二組，但有不少資料記錄漏掉第一組電話。起因於門市人員在建檔時，常常把第一組電話當市話號碼欄位、第二組電話當手機號碼欄位。當碰到客戶只填手機而不填家中電話時，就會空下第一組電話欄位。因為資料庫系統以第一組電話欄位為主要電話，所以這會帶來些麻煩。例如，在列印單據時，如果單據只顯示一個電話時，資料庫系統只會取紀錄中的第一組電話欄位。如此一來就有不少單據上沒有顯示客戶電話。所以這次也順便把那些沒有第一組電話欄位的紀錄一起補上 (以第二組電話補上) ，這就要用 CASE 敘述了。
 

UPDATE customer
SET
	tel1 = REPLACE(CASE WHEN tel1 IS NULL THEN tel2 ELSE tel1 END, '-', '')
	tel2 = REPLACE(tel2, '-', ''),

	]]>
	</description>
	<content:encoded><![CDATA[
	<p>
今天修正了公司客戶資料庫中的電話資料。主要是將中間的連接線 (-) 拿掉，這是人工輸入的，但實際上根本用不著。不是很難的動作，用 replace() 就搞得定。
</p>
<p>
比較麻煩的是電話有二組，但有不少資料記錄漏掉第一組電話。起因於門市人員在建檔時，常常把第一組電話當市話號碼欄位、第二組電話當手機號碼欄位。當碰到客戶只填手機而不填家中電話時，就會空下第一組電話欄位。因為資料庫系統以第一組電話欄位為主要電話，所以這會帶來些麻煩。例如，在列印單據時，如果單據只顯示一個電話時，資料庫系統只會取紀錄中的第一組電話欄位。如此一來就有不少單據上沒有顯示客戶電話。所以這次也順便把那些沒有第一組電話欄位的紀錄一起補上 (以第二組電話補上) ，這就要用 CASE 敘述了。
</p> 
<pre>
UPDATE customer
SET
	tel1 = REPLACE(CASE WHEN tel1 IS NULL THEN tel2 ELSE tel1 END, '-', '')
	tel2 = REPLACE(tel2, '-', ''),
</pre>		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2815495.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2815495.html</guid>
	<category>SQL/Database</category>
	<pubDate>Wed, 07 Mar 2007 14:45:20 +0800</pubDate>
</item>
<item>
	<title>Case study - 運動會報名表單, 多對多關聯</title>
	<description><![CDATA[
	
欲建立一個運動會報名表單，一位選手可報名參加一個以上的項目 (如100公尺、200公尺等) ，資料庫表格應如何設定？


我們通常不會在一個選手表格中建立多個比賽項目的關聯欄位，像 game1, game2, game3 這種欄位設置就不太適當。第一、如果多數選手只參與一個項目，則剩下的 game2, game3, etc. 欄位就閒置了，佔用磁碟空間。第二、限定了可參加比賽項目數的上限，如果我只定義到 game3 ，則一位選手最多只能參加 3 個比賽項目。第三、只能用複雜且僵化的查詢語句，例如 SELECT * FROM "Players"
INNER JOIN "Games" ON "Games".id = "Players".game1 OR "Games".id = "Players".game2 OR "Games".id = "Players".game3; ，欄位愈多則 OR 條件 串的愈長。當然，如果程式需求限定每位選手至少參加一個項目，最多參加 2 個，那麼用這種方法倒也無妨。

	]]>
	</description>
	<content:encoded><![CDATA[
	<blockquote>
欲建立一個運動會報名表單，一位選手可報名參加一個以上的項目 (如100公尺、200公尺等) ，資料庫表格應如何設定？
</blockquote>
<p>
我們通常不會在一個選手表格中建立多個比賽項目的關聯欄位，像 game1, game2, game3 這種欄位設置就不太適當。第一、如果多數選手只參與一個項目，則剩下的 game2, game3, etc. 欄位就閒置了，佔用磁碟空間。第二、限定了可參加比賽項目數的上限，如果我只定義到 game3 ，則一位選手最多只能參加 3 個比賽項目。第三、只能用複雜且僵化的查詢語句，例如 <code class="sql">SELECT * FROM "Players"
INNER JOIN "Games" ON "Games".id = "Players".game1 OR "Games".id = "Players".game2 OR "Games".id = "Players".game3;</code> ，欄位愈多則 <code>OR</code> 條件 串的愈長。當然，如果程式需求限定每位選手至少參加一個項目，最多參加 2 個，那麼用這種方法倒也無妨。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/2606029.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2606029.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2606029.html</guid>
	<category>SQL/Database</category>
	<pubDate>Thu, 28 Dec 2006 18:12:29 +0800</pubDate>
</item>
<item>
	<title>資料管理趨勢，檔案一如資料表，資料表一如檔案</title>
	<description><![CDATA[
	
打從人們開始使用電腦管理資料時，數位資料就一直有著兩種不同的儲存系統，一為檔案系統 (file system) ，二為資料庫系統 (database system) 。過去想使用這兩種儲存系統中的資料，也要使用兩種不同的工具軟體。例如一份儲存在檔案系統中的試算表 (spreadsheet) ，要用檔案管理員移除、複製、搬移，用 Louts-123, MS-Excel 編輯內容；而一份儲存在資料庫系統中的資料表 (table) ，則要用資料庫管理工具移除、複製、搬移，用專屬的前端系統軟體，如aa會計系統、bb進銷存系統編輯內容。即便試算表中的資料內容與資料表中的資料內容完全相同，兩種儲存系統的架構，硬是把人們使用資料的方式切成兩套不同的使用途徑。

	]]>
	</description>
	<content:encoded><![CDATA[
	<p>
打從人們開始使用電腦管理資料時，數位資料就一直有著兩種不同的儲存系統，一為檔案系統 (file system) ，二為資料庫系統 (database system) 。過去想使用這兩種儲存系統中的資料，也要使用兩種不同的工具軟體。例如一份儲存在檔案系統中的試算表 (spreadsheet) ，要用檔案管理員移除、複製、搬移，用 Louts-123, MS-Excel 編輯內容；而一份儲存在資料庫系統中的資料表 (table) ，則要用資料庫管理工具移除、複製、搬移，用專屬的前端系統軟體，如aa會計系統、bb進銷存系統編輯內容。即便試算表中的資料內容與資料表中的資料內容完全相同，兩種儲存系統的架構，硬是把人們使用資料的方式切成兩套不同的使用途徑。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/2521061.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2521061.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2521061.html</guid>
	<category>SQL/Database</category>
	<pubDate>Sat, 25 Nov 2006 14:47:08 +0800</pubDate>
</item>
<item>
	<title>分組統計的二種查詢敘述</title>
	<description><![CDATA[
	
使用 inner join 和 sum() 統計進貨數量。由於要進行分組合計，遂有兩種可行且結果相同的查詢敘述。但這兩種查詢敘述的 explain 和效能有所差異，視資料庫系統的查詢引擎而定。

	]]>
	</description>
	<content:encoded><![CDATA[
	<p>
使用 inner join 和 sum() 統計進貨數量。由於要進行分組合計，遂有兩種可行且結果相同的查詢敘述。但這兩種查詢敘述的 explain 和效能有所差異，視資料庫系統的查詢引擎而定。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/2357655.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2357655.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2357655.html</guid>
	<category>SQL/Database</category>
	<pubDate>Tue, 24 Oct 2006 10:36:22 +0800</pubDate>
</item>
<item>
	<title>SQL99 中取代子查詢表格的功能 - CTE (Common Table Expression)</title>
	<description><![CDATA[
	
隨著 IBM DB2 v8,v9; Oracle9i release 2; 以及 Microsoft SQL Server 2005 相關文件出現，我注意到它們都有提供一個由 SQL:1999 (簡稱 SQL-99 或 SQL3) 所規範的 CTE (Common Table Expression) 查詢語法。 CTE 查詢語法簡化了以往「子查詢表格」的複雜語法與難讀敘述。不妨試著解讀《一個較複雜的表格聯結 (join) 範例》一文的範例，想看出裡面有四個子查詢表格確實不是件容易的事。

	]]>
	</description>
	<content:encoded><![CDATA[
	<p>
隨著 IBM DB2 v8,v9; Oracle9i release 2; 以及 Microsoft SQL Server 2005 相關文件出現，我注意到它們都有提供一個由 SQL:1999 (簡稱 SQL-99 或 SQL3) 所規範的 CTE (Common Table Expression) 查詢語法。 CTE 查詢語法簡化了以往「<a href="http://blog.roodo.com/rocksaying/archives/1031693.html">子查詢表格</a>」的複雜語法與難讀敘述。不妨試著解讀《<a href="http://blog.roodo.com/rocksaying/archives/1186860.html">一個較複雜的表格聯結 (join) 範例</a>》一文的範例，想看出裡面有四個子查詢表格確實不是件容易的事。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/2346392.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2346392.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2346392.html</guid>
	<category>SQL/Database</category>
	<pubDate>Sat, 21 Oct 2006 23:34:15 +0800</pubDate>
</item>
<item>
	<title>SQL::Encoding-Based SQL Injection Exploit part 2</title>
	<description><![CDATA[
	
繼續第一部份內容。除了單引號 (') 外，允許使用反斜線 (\) 的字元編碼，也屬於遭受此 SQL injection 攻擊的高危險群。而且，由於部份 programmer 的不良習慣，提高了危險程度。這個不良習慣，就是不用標準的方法做 escaping ，而抄捷徑地直接使用字串替代函數。例如 PHP 的使用者，常常用 addslashes() 做 escaping 。前文中我提到的那位客戶，我在檢查他們的程式碼時，就發現到他們的 PHP 程式碼，全部都是用 addslashes() 做 escaping ，而不是用 PHP 建議的 pg_escape_string() 。該客戶的 CMS 系統是 Xoops 再加上額外的修訂以支援 PostgreSQL 。不過，當我進一步追查下去時，很驚訝地發現 Xoops 中，連 MySQL 部份的程式碼，也是用 addslashes() ，而不是用 mysql_escape_string() [Xoops 在 2006/6/26 發佈的最新版本中的 class/mysqldatabase.php 還是用 addslashes()。]。很久以前， PHP 就提供了 mysql_escape_string() 函數，甚至可能比 Xoops 的發展時間還早。儘管如此， Xoops 中仍然沒有使用 mysql_escape_string() ，真是令我無言。

	]]>
	</description>
	<content:encoded><![CDATA[
	<p>
繼續第一部份內容。除了單引號 (') 外，允許使用反斜線 (\) 的字元編碼，也屬於遭受此 SQL injection 攻擊的高危險群。而且，由於部份 programmer 的不良習慣，提高了危險程度。這個不良習慣，就是不用標準的方法做 escaping ，而抄捷徑地直接使用字串替代函數。例如 PHP 的使用者，常常用 addslashes() 做 escaping 。前文中我提到的那位客戶，我在檢查他們的程式碼時，就發現到他們的 PHP 程式碼，全部都是用 addslashes() 做 escaping ，而不是用 PHP 建議的 pg_escape_string() 。該客戶的 CMS 系統是 Xoops 再加上額外的修訂以支援 PostgreSQL 。不過，當我進一步追查下去時，很驚訝地發現 Xoops 中，連 MySQL 部份的程式碼，也是用 addslashes() ，而不是用 mysql_escape_string() [<span class="Onote">Xoops 在 2006/6/26 發佈的最新版本中的 class/mysqldatabase.php 還是用 addslashes()。</span>]。很久以前， PHP 就提供了 mysql_escape_string() 函數，甚至可能比 Xoops 的發展時間還早。儘管如此， Xoops 中仍然沒有使用 mysql_escape_string() ，真是令我無言。
</p>		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/1822714.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/1822714.html</guid>
	<category>SQL/Database</category>
	<pubDate>Tue, 27 Jun 2006 17:11:12 +0800</pubDate>
</item>
<item>
	<title>SQL::Encoding-Based SQL Injection Exploit</title>
	<description><![CDATA[
	
最近公司客戶網站的內容管理系統被惡意入侵，因為客戶是用 Linux + PostgreSQL 系統，而我恰好是公司中較熟悉這兩套系統的，公司就派我去處理。我查了一下，答案就在不遠處，我就在 PostgreSQL 的網站上找到了答案，這是一個新型態的 SQL injection 。

	]]>
	</description>
	<content:encoded><![CDATA[
	<p>
最近公司客戶網站的內容管理系統被惡意入侵，因為客戶是用 Linux + PostgreSQL 系統，而我恰好是公司中較熟悉這兩套系統的，公司就派我去處理。我查了一下，答案就在不遠處，我就在 PostgreSQL 的網站上找到了答案，這是一個新型態的 SQL injection 。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/1818394.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/1818394.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/1818394.html</guid>
	<category>SQL/Database</category>
	<pubDate>Mon, 26 Jun 2006 18:10:46 +0800</pubDate>
</item>
<item>
	<title>SQL::SQLXML data 的文章@developerWorks</title>
	<description><![CDATA[
	看了一篇文章Using the SQLXML data type，這篇文章有幾個關鍵字吸引我的注意，其中之一是 SQL:2003 ，另一個是  XML 。想想，我不久之前還在看 SQL-99 的內容，突然之間 SQL:2003 就在我眼前冒出來了，而市面上許多 SQL 書籍的內容，連 SQL-92 都說不清楚。 SQL:2003 現在直接將 XML 視為內定資料型態，更為逼進 OO-RDBMS 的目標了。近期內，更是直接支援 O/R Map (個體／關係映射) 。

	]]>
	</description>
	<content:encoded><![CDATA[
	<p>看了一篇文章<a href="http://www-128.ibm.com/developerworks/xml/library/x-sqlxml/index.html" target="_blank" class="outside">Using the SQLXML data type</a>，這篇文章有幾個關鍵字吸引我的注意，其中之一是 SQL:2003 ，另一個是  XML 。想想，我不久之前還在看 SQL-99 的內容，突然之間 SQL:2003 就在我眼前冒出來了，而市面上許多 SQL 書籍的內容，連 SQL-92 都說不清楚。 SQL:2003 現在直接將 XML 視為內定資料型態，更為逼進 OO-RDBMS 的目標了。近期內，更是直接支援 O/R Map (個體／關係映射) 。
</p>		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/1744807.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/1744807.html</guid>
	<category>SQL/Database</category>
	<pubDate>Mon, 12 Jun 2006 16:03:19 +0800</pubDate>
</item>
<item>
	<title>SQL::一個較複雜的表格聯結 (join) 範例</title>
	<description><![CDATA[
	在這個 table join 範例中，使用了 inner join, cross join, full outer join, 以 AS 將 sub-select 視為 table 再 join ，以及 group, case 等用法。這個範例雖然很長，但只是一句 SQL 查詢。拆開來是跑不出結果的。


此範例實際上取自我為了我任職的公司所寫的一個進銷存報表程式。我目前任職的公司，採用國內 飛X 公司所設計的零售業進銷存 POS 系統。這個範例中的表格及欄位名稱，直接對應該 POS 系統。另外，我是用 PHP 寫這隻報表程式，所以範例中嵌有 PHP 的變數名稱。此報表程式係依據進貨表格 (pos204) 、銷貨表格 (pos324) 及庫存表格 (product_stock) 中的貨品數量，計算出本期的期末庫存。表格 produt_stock 是我新增的，原先飛X 設計的 POS 系統中，並沒有這個表格。

	]]>
	</description>
	<content:encoded><![CDATA[
	<p>在這個 table join 範例中，使用了 inner join, cross join, full outer join, 以 AS 將 sub-select 視為 table 再 join ，以及 group, case 等用法。這個範例雖然很長，<strong>但只是一句 SQL 查詢</strong>。拆開來是跑不出結果的。
</p>
<p>
此範例實際上取自我為了我任職的公司所寫的一個進銷存報表程式。我目前任職的公司，採用國內 飛X 公司所設計的零售業進銷存 POS 系統。這個範例中的表格及欄位名稱，直接對應該 POS 系統。另外，我是用 PHP 寫這隻報表程式，所以範例中嵌有 PHP 的變數名稱。此報表程式係依據進貨表格 (pos204) 、銷貨表格 (pos324) 及庫存表格 (product_stock) 中的貨品數量，計算出本期的期末庫存。表格 produt_stock 是我新增的，原先飛X 設計的 POS 系統中，並沒有這個表格。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/1186860.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/1186860.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/1186860.html</guid>
	<category>SQL/Database</category>
	<pubDate>Tue, 28 Feb 2006 23:38:30 +0800</pubDate>
</item>
<item>
	<title>SQL::CASE, NULLIF() and ISNULL()</title>
	<description><![CDATA[
	
這是關於 SQL 中的 CASE 敘述的另一篇應用文章。前一篇為「SQL::使用 CASE 修飾資料內容，以便進行 group 操作」。


重點為：一、處理無意義的 NULL ；二、NULLIF() or ISNULL()。

	]]>
	</description>
	<content:encoded><![CDATA[
	<p>
這是關於 SQL 中的 CASE 敘述的另一篇應用文章。前一篇為「<a href="http://blog.roodo.com/rocksaying/archives/1051724.html">SQL::使用 CASE 修飾資料內容，以便進行 group 操作</a>」。
</p>
<p>
重點為：一、處理無意義的 NULL ；二、<code>NULLIF()</code> or <code>ISNULL()</code>。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/1186702.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/1186702.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/1186702.html</guid>
	<category>SQL/Database</category>
	<pubDate>Tue, 28 Feb 2006 22:35:56 +0800</pubDate>
</item>
<item>
	<title>SQL::GROUP BY, COUNT and HAVING</title>
	<description><![CDATA[
	
欲得知資源被使用次數大於 1 的報表。資源使用記錄儲存在資料表 rsu 中，其中 uno 欄位為資源代碼，資源每被使用一次 ，就會在 rsu 表中增加一筆使用記錄。故需使用 COUNT() 做計數動作，並指定搜尋條件為計數值大於 1 者。但在合計操作中 (It, '合計操作', means a query with aggregate method.) ，不能使用 WHERE 為條件表示，而應使用 HAVING 。

	]]>
	</description>
	<content:encoded><![CDATA[
	<p>
欲得知資源被使用次數大於 1 的報表。資源使用記錄儲存在資料表 rsu 中，其中 uno 欄位為資源代碼，資源每被使用一次 ，就會在 rsu 表中增加一筆使用記錄。故需使用 COUNT() 做計數動作，並指定搜尋條件為計數值大於 1 者。但在合計操作中 (It, '合計操作', means a query with aggregate method.) ，不能使用 WHERE 為條件表示，而應使用 HAVING 。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/1092066.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/1092066.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/1092066.html</guid>
	<category>SQL/Database</category>
	<pubDate>Mon, 06 Feb 2006 23:09:57 +0800</pubDate>
</item>
<item>
	<title>SQL:: 使用 CASE 修飾資料內容，以便進行 group 操作</title>
	<description><![CDATA[
	
出貨單表格 sale_orders (saleno: 出貨單號, cno: 客戶單號, sale_date: 出貨日期, amt: 訂購總金額)。有 M, PH, YA 三處通路，來自 M 通路的客戶訂單，單號為 'M' 開頭，餘類推。欲查詢 2006 年一月份，三處通路的客戶訂單總金額。

	]]>
	</description>
	<content:encoded><![CDATA[
	<p>
出貨單表格 sale_orders (saleno: 出貨單號, cno: 客戶單號, sale_date: 出貨日期, amt: 訂購總金額)。有 M, PH, YA 三處通路，來自 M 通路的客戶訂單，單號為 'M' 開頭，餘類推。欲查詢 2006 年一月份，三處通路的客戶訂單總金額。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/1051724.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/1051724.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/1051724.html</guid>
	<category>SQL/Database</category>
	<pubDate>Thu, 26 Jan 2006 17:12:53 +0800</pubDate>
</item>
<item>
	<title>SQL::About the TIMESTAMP in PostgreSQL and MySQL</title>
	<description><![CDATA[
	關於 TIMESTAMP 資料型態在 PostgreSQL (v7.2 or later) 和 MySQL (v4.1 or later) 的差異。


	]]>
	</description>
	<content:encoded><![CDATA[
	<p>關於 TIMESTAMP 資料型態在 PostgreSQL (v7.2 or later) 和 MySQL (v4.1 or later) 的差異。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/1038137.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/1038137.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/1038137.html</guid>
	<category>SQL/Database</category>
	<pubDate>Mon, 23 Jan 2006 00:12:47 +0800</pubDate>
</item>
<item>
	<title>SQL::以 AS 將子查詢結果作為主查詢的參考表格</title>
	<description><![CDATA[
	
在子查詢中，作每一訂單的個別商品銷售數量與單項價格之加總 (求個別訂單下個別商品銷售總金額) ，將子查詢結果以 AS 命名為新表格 (只存在於查詢期間的表格)，做主查詢的參考表格後，再求總店銷售額。

	]]>
	</description>
	<content:encoded><![CDATA[
	<p>
在子查詢中，作每一訂單的個別商品銷售數量與單項價格之加總 (求個別訂單下個別商品銷售總金額) ，將子查詢結果以 AS 命名為新表格 (只存在於查詢期間的表格)，做主查詢的參考表格後，再求總店銷售額。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/1031693.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/1031693.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/1031693.html</guid>
	<category>SQL/Database</category>
	<pubDate>Sat, 21 Jan 2006 09:44:21 +0800</pubDate>
</item>
<item>
	<title>SQL::表格聯接 (join)</title>
	<description><![CDATA[
	
t106 是產品名稱表 (barcode, pname, sno)，t107 (sno, sname, dno) 是小分類表，t108 是中分類表 (dno, dname, lno) ， t109 是大分類表 (lno, lname) 。 檢視大、中、小分類暨品名列表的查詢方式。

	]]>
	</description>
	<content:encoded><![CDATA[
	<p>
t106 是產品名稱表 (barcode, pname, sno)，t107 (sno, sname, dno) 是小分類表，t108 是中分類表 (dno, dname, lno) ， t109 是大分類表 (lno, lname) 。 檢視大、中、小分類暨品名列表的查詢方式。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/1026832.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/1026832.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/1026832.html</guid>
	<category>SQL/Database</category>
	<pubDate>Fri, 20 Jan 2006 11:09:49 +0800</pubDate>
</item>
</channel>
</rss>