天天看點

MySQL入門-11:資料的增、删、改

1、資料插入

2、資料更新

3、資料删除

4、更新和删除的指導原則

1、資料插入-INSERT

    插入資料可以使用以下幾種方式:

  • 插入完整的行
  • 插入行的一部分
  • 插入多行
  • 插入某些查詢的結果
Syntax:
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] ... ]
        
通常我們最常使用的 INSERT INTO 語句是這樣的:
INSERT INTO table_name(column1, column2, column3, ...)
VALUES(value1, value2, value3,...)      

總是使用列的清單:

    一般不要使用沒有明确給出列的清單的INSERT語句。使用列的清單能使SQL代碼繼續發揮作用,即使表結構發生了變化。

    什麼意思呢?舉個例子就明白了。

# 假設我的表結構如下
mysql> DESC t1;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
# 那麼當我想插入一條資料
# 方式一:沒有使用清單(不推薦)
mysql> INSERT INTO t1 VALUES(1, 'zhangsan');

# 方式二:使用列的清單
mysql> INSERT INTO t1(id, name) VALUES(1, 'zhangsan');      

    這麼做有什麼好處呢?方式一 高度依賴于表中列預設定義的次序,不能保證下一次表結構變動後各個列保持完全相同的次序。是以,編寫這種語句很不安全,應該避免使用。

省略列:

    如果表的定義允許,則可以在INSERT操作中省略某些列。省略的列必須滿足以下某個條件。

  • 該列定義為允許NULL值
  • 在表定義中給出預設值。

    如果對表中不允許NULL值且沒有預設值的列不給出值,則mysql将産生一條錯誤消息,并且相應的行插入不成功。

插入檢索出的資料:

INSERT INTO table1(MM, MM) SELECT NN, NN FROM table2 WHERE xx      

MySQL不關心SELECT傳回的列名是否和要插入表的列名相同,它使用的是列的位置,是以SELECT中的第一列(不管其列名)将用來填充表列中指定的第一個列,第二列将用來填充第二個列,依次類推。

提高整體性能:

1、指定INSERT語句的優先級

    資料庫經常被多個客戶同時通路,對處理什麼請求以及用什麼次序處理進行管理是mysql的任務。INSERT操作可能很耗時(特别是有很多索引需要更新時),而且它可能降低等待處理的SELECT(通常是最重要)的性能。

    可以在INSERT 和 INTO 之間添加關鍵字 LOW_PRIORITY, 訓示MYSQL降低INSERT語句的優先級,這也适用于UPDATE / DELETE語句。

2、一次插入多個列

INSERT INTO table_name(col1, col2 ..) VALUES(val1, val2, ...) [,(val1, val2), ...]      

    單條INSERT語句可以有多組值,每組值用一對圓括号括起來,用逗号分隔。單條INSERT語句處理多個插入比使用多條INSERT語句更快。

執行個體:

# 為了示範,我們建立一個表,友善示例
mysql> CREATE TABLE t2(id INT NOT NULL AUTO_INCREMENT,
    -> name VARCHAR(30) NOT NULL,
    -> email VARCHAR(200) DEFAULT '',
    -> PRIMARY KEY(id));
# 插入一條資料, 可以通過select語句檢視是否插入成功
mysql> INSERT INTO t2(name, email) 
    -> VALUES('zhangsan', '[email protected]');
Query OK, 1 row affected (0.08 sec)

mysql> SELECT * FROM t2;
+----+----------+-----------------+
| id | name     | email           |
+----+----------+-----------------+
|  1 | zhangsan | [email protected] |
+----+----------+-----------------+
1 row in set (0.00 sec)
# 插入多條資料
mysql> INSERT INTO t2(name, email) 
    -> VALUES('lisi', '[email protected]'),('wangwu', '[email protected]');
Query OK, 2 rows affected (0.04 sec)
Records: 2  Duplicates: 0  Warnings: 0      

關于insert語句的幾點說明:

    其實也不是啥說明了,都是書上面的例子,不過懶的敲了,而且感覺沒有啥太大意義,都是需要大家了解的。給不給例子是一樣的。

1.因為之前我在日志中介紹建立表結構的時候,字段是可以有預設值的,在MySQL4.0.3及更高版本都支援一個DEFAULT關鍵字,在我們使用 insert 語句的時候,可以使字段的值等于DEFAULT關鍵字,來使其等于資料庫建立的時候的default值。

2.AUTOINCREMENT自增字段,這個我們是不用給出值的,因為系統會自動為該字段來進行自增,但是如果您願意,也是可以給出值的。

3. UNIQUE這個我們也說過,就是字段唯一的意思,比如說使用者的id設定UNIQUE,已經存在一條使用者id為1的資料,如果此時您再想插入一條使用者id為1的資料是不會成功的,系統會出錯的。

4.如果資料庫字段允許存在NULL值的話,我們在insert插入語句中,也是可以将字段值設為NULL的。

可使用兩種方式使用UPDATE:

  • 更新表中的特定行
  • 更新表中的所有行

文法: UPDATE 表名 SET 字段=值,字段=值 WHERE 條件

Syntax:
Single-table syntax:

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]
    
我們通常使用的UPDATE 語句如下
UPDATE table_name
SET column1=value, column2=value2, ...
WHERE some_column=some_value      

    SET子句訓示修改哪些列和要給予哪些值。 WHERE子句指定應更新哪些行。如果省略了WHERE子句,表中每一個單獨的行都會受到UPDATE語句的影響,這是相當危險的,其後果是讓你欲哭無淚。

在UPDATE語句中使用子查詢:

    UPDATE語句中可以使用子查詢,使得能用SELECT語句檢索出的資料更新列資料。

mysql 多表 update sql語句總結

假定我們有兩張表,一張表為Product表存放産品資訊,其中有産品價格列Price;另外一張表是ProductPrice表,我們要将ProductPrice表中的價格字段Price更新為Price表中價格字段的80%。

在Mysql中我們有幾種手段可以做到這一點,一種是update table1 t1, table2 t2 ...的方式:

UPDATE product p, productPrice pp
SET pp.price = pp.price * 0.8 WHERE p.productId = pp.productId
AND p.dateCreated < '2004-01-01'      

另外一種方法是使用inner join然後更新:

UPDATE product p
INNER JOIN productPrice pp
ON p.productId = pp.productId
SET pp.price = pp.price * 0.8 WHERE p.dateCreated < '2004-01-01'      

另外我們也可以使用left outer join來做多表update,比方說如果ProductPrice表中沒有産品價格記錄的話,将Product表的isDeleted字段置為1,如下sql語句:

UPDATE product p
LEFT JOIN productPrice pp
ON p.productId = pp.productId
SET p.deleted = 1 WHERE pp.productId IS null      

另外,上面的幾個例子都是兩張表之間做關聯,但是隻更新一張表中的記錄,其實是可以同時更新兩張表的,如下sql:

UPDATE product p
INNER JOIN productPrice pp
ON p.productId = pp.productId
SET pp.price = pp.price * 0.8, p.dateUpdate = CURDATE() WHERE p.dateCreated < '2004-01-01'      

兩張表做關聯,更新了ProductPrice表的price字段和Product表字段的dateUpdate兩個字段。

可使用兩種方式使用DELETE:

  • 從表中删除特定的行
  • 從表中删除所有行

文法:DELETE FROM 表名 WHERE 條件(oracal中就可以不要from)

DELETE不需要列名或通配符。DELETE删除整行而不是删除列。

Syntax:
Single-table syntax:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]
    
通常使用的文法是:
DELETE FROM table_name
WHERE some_column = some_value      

 文法是清晰明了的,和日常口語類似,指出想從哪個表中删除資料,還有要删除哪些資料。和UPDATE語句一樣,不要使用沒有WHERE子句的DELETE,這是一個危險的做法。因為如果不指定WHERE子句,DELETE将删除表中所有的記錄,而且是立即删除。

    連哭的時間都沒有,因為你需要馬上向老大彙報情況,并且立即找出MySQL日志,復原記錄。

DELETE删除表的内容而不是表結構

 DELETE語句從表中删除行,甚至是删除表中的所有行。但是,DELETE不删除表本身。

更快的删除:

  如果想從表中删除所有行,不要使用DELETE。可使用TRUNCATE TABLE語句,它完成相同的工作,但速度更快(TRUNCATE實際是删除原來的表并重新建立一個表,而不是逐行删除表中的行)

       如果想要删除表中的所有資料,TRUNCATE 語句要比 DELETE語句塊。因為TRUNCATE删除表,然後根據表結構重建立立它。而DELETE是一條一條的删除表中的記錄而已。這也是為什麼當向一個使用DELETE清空的表中插入資料時,MySQL會記住前面産生的AUTO_INCREMENT序列,并且繼續使用後續的編号。而TRUNCATE删除表并重建後,AUTO_INCREMENT從1重新編号。

繼續閱讀