iT邦幫忙

DAY 11
2

只談MySQL系列 第 11

只談MySQL (第十一天) MySQL的資料處理指令

今天的分享會讓各位覺得MySQL怎麼和其他資料庫系統一樣呢? 那為何一定要用MySQL, 用MS-SQL或Oracle行不行? 當然行, 其實今天的SQL指令集已經標準化了, 不管那個資料庫系統都會宣稱他們支援SQL的那一個標準...所以, 談到資料庫處理指令, 也就是SELECT、INSERT、UPDATE、DELETE這四個指令集, 大家都大同小異.....
MySQL在資料庫引擎系統層面有些不同的做法, 因而在一些應用上也會有比MS-SQL或Oracle優異的地方, 我會在最後幾次分享中討論這些系統上的差異點, 以及其優勢
四個基本的資料處理指令的語法如下:

  1. SELECT:
    SELECT
    [ALL | DISTINCT | DISTINCTROW ]
    [HIGH_PRIORITY]
    [STRAIGHT_JOIN]
    [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
    [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr ...]
    [FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
    [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
    [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [PROCEDURE procedure_name(argument_list)]
    [INTO OUTFILE 'file_name'
    [CHARACTER SET charset_name]
    export_options
    | INTO DUMPFILE 'file_name'
    | INTO var_name [, var_name]]
    [FOR UPDATE | LOCK IN SHARE MODE]]
    我們常會用的, 就是WHERE、GROUP BY和ORDER BY三個子句...啨不要問我FROM呢? 那是必要的...
    mysql> SELECT SalesID, SalesDate, DueSate, ShipDate, Status
    FROM Sales_Order_Header
    WHERE CustomerName = 'Simon'
    AND Status NOT IN ("X", "R", "C")
    ORDER BY SalesDate DESC;
    這要查詢客戶'Simon'目前在處理中的訂單, 而且以訂單日期由最近到最久排序..昨天的例子
    mysql> SELECT SH.SalesID, SH.CustomerName, SH.DueDate, SH.ShipDate,
    SH.Status, SD.ItemID, SD.ItemName, SD.Unit, SD.Quantity,
    SD.Price, SD.Amount
    FROM Sales_Order_Header SH, Sales_Order_Detail SD
    WHERE SH.SalesID = SD.SalesID
    AND SH.Status NOT IN ("R", "X", "C");
    ORDER BY SH.SalesID, SH.CustomerName, SD.ItemID
    查詢未結案的銷售訂單...
    GROUP BY子句, 我下回介紹更複雜的資料運用時再討論
  2. INSERT:
    INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
    [ ON DUPLICATE KEY UPDATE
    col_name=expr
    [, col_name=expr] ... ]
    例如:
    mysql> INSERT INTO Sales_Order_Header
    VALUES('2009100001', 'Simon', '20091023', '', '', 'N');
    INSERT指令一次只能對一個資料表做新增資料的動作, 要一次對多個資料表做新增資料, 要利用View...這個, 還是擺到以後再說...
  3. UPDATE:
    UPDATE [LOW_PRIORITY] [IGNORE] table_reference
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]
    例如:
    mysql> UPDATE Sales_Order_Header
    SET DueDate = '20091027'
    WHERE SalesID = '2009100001';
    這是對Sales_Order_Header資料表中訂單編號為'2009100001'者, 更新DueDate欄位內容
    和INSERT指令一樣, UPDATE一次只能對一個資料表做UPDATE動作, 要一次對多個資料表, 就必需用到View, 這個, 今天先不談
  4. DELETE
    DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]
    例如:
    mysql> DELETE FROM Sales_Order_Header WHERE SalesID = '2009100001';
    刪掉訂單'2009100001'

    mysql> DELETE FROM Sales_Order_Header WHERE Status = "X";
    刪掉已取消的訂單
    使用DELETE指令, 一定要加WHERE條件, 不然會刪掉整個資料表中的資料...
    DELETE指令可以針對多個資料表處理, 不能是View...但對多個資料表處理時, 建議一定要先用SELECT指令看看刪掉的資料有那些...確定才刪
    DELETE指令有兩個問題:
  5. 例如這裏的舉例, 刪掉Sales_Order_Header中的表頭資料, 如果在Sales_Header_Detail的表身中有相關資料怎麼辦, 為了惟持資料一致性, 就必需限定如果表身中已存在與表頭相關的資料時, 不同刪表頭的資料記錄, 這要靠所謂Reference Key來限制, 明天我們會談到Reference Key...
  6. 資料由資料表中刪掉了, 佔用的硬碟空間會釋放嗎? 答案是不會. 如果只是刪掉一部份資料, 資料表佔用的硬碟空間還是一樣不會減少...如果用DELETE FROM A, 把A資料表中的資料都刪掉了, 空間還是被佔用著, 只是其他資料表增加資料時, 會先利用這些空間來儲存.
    那, 可能有人會問, 有沒有辦法釋放空間呢? 可以, 用
    mysql> TRUNCATE TABLE A;
    TRUNCATE指令可以刪掉Table中的資料, 同時將資料表佔用的硬碟空間釋放出來

上一篇
只談MySQL (第十天) View...
下一篇
只談MySQL (第十二天) Reference Key...
系列文
只談MySQL30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言