MySQL 圖解 LEFT JOIN, INNER JOIN,RIGHT JOIN 的差異及範例

C.L. Moffatt 發表 Visual Representation of SQL Joins 用圖示來解釋各種 SQL Join 非常清楚,本文僅節錄MySQL常用的三種Johin方式,說明其中差異及提供使用範例,主要也是讓我自己清楚這幾種 Join 的用法,有更多Johin 需求的朋友可於文章結尾找到原文網址。

Inner Join

該查詢將返回左表(表A)中所有與右表(表B)中具有匹配記錄的記錄。

範例如下:

Left Join

無論這些記錄與右表(表B)中是否匹配,查詢都返回左表(表A)中的所有記錄及與(表B)匹配的記錄。

Right Join

無論這些記錄與左表(表A)中是否匹配,查詢都返回右表(表B)中的所有記錄及與(表A)匹配的記錄。

本文作者:C.L. Moffatt
原文網址:Visual Representation of SQL Joins

[……]

閱讀更多

[mysql] 外鍵 Foreign Key 速查

當關聯父資料表的主鍵紀錄行被刪除或修改時,InnoDB 對子資料表中紀錄行的處理方式:
CASCADE – 會將有所關聯的紀錄行也會進行刪除或修改。
SET NULL –
會將有所關聯的紀錄行設定成 NULL
NO ACTION –
有存在的關聯紀錄行時,會禁止父資料表的刪除或修改動作。
RESTRICT –
 NO ACTION 相同。[……]

閱讀更多

MIS WAMP手動安裝及設定教學 Apache2.4 + PHP7 for windows10

手動安裝 Apache2.4 + PHP7 for windows10

首先,我該選x64或x86安裝呢?

何謂 x64 和 x86,可閱讀下方網址文章,本篇不多做解釋
x86和x64到底有什麼差異? http://www.ithome.com.tw/node/56880

注意 !!!

若安裝x64版本,PHP & Apache 都需要選擇x64版本,反之亦然

安裝 PHP7 for windows

本例下載 PHP 7.0 VC14 x64 Thread Safe

php-7.0.10-Win32-VC14-x64.zip

解壓縮至 PHP 的存放目錄
本例解壓縮至 C:php-7.0.10-Win32-VC14-x64

設定 php.ini PHP.ini 為PHP的設定檔

PHP安裝目錄中尚無 PHP.ini
但於安裝目錄中有下列2個檔案
php.ini-development 為開發環境用參考設定檔
php.ini-production    為正式環境用參考設定檔
本例複製 php.ini-development 更名為 php.ini 置於於PHP安裝目錄中 文字編輯器開啟 php.ini

以下為常用設定

視需求調整參數,至於設定內容就不於本篇討論

「C:/php-7.0.10-Win32-VC14-x64/」為PHP安裝目錄

注意!!!!!!!!!!

分隔路徑的斜線,要用「/」而不是 windows 檔案總管的「\」

所以是
「C:/php-7.0.10-Win32-VC14-x64/」

不是
「C:\php-7.0.10-Win32-VC14-x64\

儲存 httpd.conf

Apache安裝為 windows 服務,開機自動啟動

開啟 Win10 的 「命令提示字元(系統管理員)」

// 測試設定檔是否正確

錯誤會跳錯誤訊息,正確會顯示syntax OK,接著安裝服務

// 安裝服務,反之解除安裝為 httpd.exe -k uninstall

測試是否正確運行

在網站根目錄C:/AppServ/www下建立一個index.php檔案

運行 http://127.0.0.1
看到下列畫面,代表安裝成功

呼~打完收工!!

[……]

閱讀更多

[SQL] MySQL to PostgreSQL 好痛轉移,SQL語法差異

換資料庫真的好機掰,會有一堆未知問題,見招拆招,紀錄於下

LIMIT OFFSET

/* MySQL */
SELECT * FROM abc WHERE status=1 ORDER BY create_time DESC LIMIT 0 , 10
/* PostgreSQL */
SELECT * FROM abc WHERE status=1 ORDER BY create_time DESC LIMIT 10 OFFSET 0

# UPDATE 不能加 ORDER BY and LIMIT
/* MySQL */
UPDATE abc SET aaa=1 WHERE id<=100 ORDER BY status DESC LIMIT 10

/* PostgreSQL */
/* 若有需求要用子句解決 */
UPDATE abc main SET aaa=1
FROM
 ( SELECT id FROM page_builder WHERE id<=100 ORDER BY status DESC LIMIT 10 ) sub
WHERE main.id = sub.id

PHP

//mysql 取新增的id
mysql_insert_id() mysqli_insert_id();
//PostgreSQL

$re = pg_query($conn, "INSERT INTO foo (bar) values (123);");
$re
= pg_query("SELECT lastval();");
$row
= pg_fetch_row($re);
$insert_id
= $row
[0];

[……]

閱讀更多

MySQL 判斷兩個時間區間是否重疊 Determine Whether Two Date Ranges Overlap

判斷兩個時間區間是否重疊

<?php

/* 判斷兩個時間區間是否重疊 */
/* that it is sufficient to say that the two ranges overlap */
WHERE (StartDate1 <= EndDate2) AND (StartDate2 <= EndDate1)

?>


http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap[……]

閱讀更多

PHP SQL 篩選時間

需要用日期來篩選指定日期區間的資料,剛好看到艾倫郭寫的這一篇,用了BETWEEN我覺得還蠻好用的,此篇文章也寫了好幾種方式,十分受用~


若SQL Server裡的 table 裡有一個日期欄位,只會放日期,那麼您可以寫成
SELECT …. FROM xxx WHERE xxx=’2008/1/15′SELECT …. FROM xxx WHERE xxx BETWEEN ‘2008/1/15’ AND ‘2008/1/20’

若日期欄位有包含時間, 由於時間可能值為 2008/1/15 23:59:59.50 如果您想找 2008/1/15 這一天裡的所有記錄(不拘時間), 卻將篩選條件寫成
SELECT …. FROM xxx WHERE xxx=’2008/1/15′ –>會找不到符合的記錄
SELECT …. FROM xxx WHERE xxx BETWEEN ‘2008/1/15’ AND ‘2008/1/16’ –>會連 2008/1/16 的記錄也被找到
SELECT …. FROM xxx WHERE xxx >= ‘2008/1/15’ AND xxx<= ‘2008/1/15 23:59:59’ –>若記錄值是2008/1/15 23:59:59.50 ,會找不到
因此,可以寫成
SELECT …. FROM xxx WHERE xxx >= ‘2008/1/15’ AND xxx < ‘2008/1/16’
就沒什麼問題了

本文出自
http://www.allenkuo.com/EBook5/view.aspx?TreeNodeID=13&id=374
[……]

閱讀更多

SQL GROUP BY SUBSTR 用分割字串來群組資料

有時候我們會用一定的規則來訂義產品編號
例如:

2014(年)+001(款號)+01(規格) = 
201400101(產品編號)
所以在列表中,其實我們是要顯示款列表,但不同規格其實還是同一款,大同小異,
此時我們會希望用款號來把相同款式的商品群組起來,秀一筆就好,GROUP BY可以搭配SUBSTR()來實現這效果,實際實作方式如下

product_id ( 產品編號欄 )
201400101
201400102
201400201
201400202
201400301
201400302
GROUP BY SUBSTR(product_id,5,3)

取出之產品編號 
201400101
201400201

201400301

參考
http://www.1keydata.com/tw/sql/sql-substring.html

[……]

閱讀更多