2012年8月16日 星期四

學習 MySQL 常用指令

最近工作內容之一是寫 php + mySQL, 因為客戶的即有系統是這個環境, 跟承辦聊天幾次, 發現他在開發這個系統時是完全是門外漢, 之前也只寫過 c語言, 而且還是半路出家去資策會上課學的, 所以很多地方都是以 c語言的楖念來寫, 我發現他的系統和程式有這幾個問題:

1. Table 完全沒使用 index, 我使用 MySQL 指令:
SHOW INDEXES FROM account;

查詢帳號 table 裡, 沒有 index, 於是透過下面指令手動幫他加上,
CREATE INDEX account_id ON account (id desc, password desc);
(其他 Table 依此類推...)

2. 程式碼裡看不到多個 table 的join, 完全純手工把第1 table 裡的資料放到陣列裡處理, 再開啟第2個 table, 再處理陣列裡的值.

3. 完全沒有使用到聚合函數, 例如 sum(...), count(...) 等, 也是純手工, 把欄位們一一放到陣列裡, 再透過 php 一個個讀出來加總.

----------------------------------

MySQL 要看欄位 schema 的指令為, 同 MS T-SQL 的 sp_columns:
DESCRIBE table_name;

----------------------------------

MySQL 的只列出前幾筆, 是 Limit , 類似 MS T-SQL 的 Top N

Microsoft SQL Server:
SELECT TOP 10 column FROM table

PostgreSQL and MySQL
SELECT column FROM table LIMIT 10

MySQL 有一個 OFFSET 的指令, 如下指令如下的話會傳回第 21~30筆資料.
SELECT column FROM table LIMIT 10 OFFSET 20

----------------------------------

MySQL 在 select 句裡的欄位合併, 要使用 concat 指令, 直接使用 + (加號) 會變成數字運算.
例如, 欄位 Col_A 和 Col_B 型別都是 char(9)
Col_A 內容是 305152033
Col_A 內容是 305152971

SELECT Col_A + '-' + Col_B;
答案是 --> 610305004

SELECT CONCAT(Col_A, '-', Col_B);
答案是 --> 305152033-305152971


附註: CONCAT() 會傳回  NULL 如果有任何一個被合併的值是 NULL.


SELECT CONCAT('My', NULL, 'QL');

答案是 --> NULL


----------------------------------





相關文章:
Show indexes for a table with MySQL
http://www.electrictoolbox.com/mysql-show-indexes-table/

Get a MySQL table structure with DESCRIBE
http://www.electrictoolbox.com/mysql-table-structure-describe/

MySQL CREATE INDEX Syntax
http://dev.mysql.com/doc/refman/5.0/en/create-index.html

沒有留言:

張貼留言

Facebook 留言板