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重新編号。