一:insert語句html
1.介紹mysql
在執行插入語句前,須要具備執行INSERT
語句的INSERT
權限。sql
2.準備環境數據庫
3.簡單insert語句安全
4.插入多行服務器
在這種形式中,每行的值列表用逗號分隔。yii
若是爲表中的全部列指定相應列的值,則能夠忽略INSERT
語句中的列列表性能
5.具備SELECT子句的MySQL INSERTui
可使用INSERT
和SELECT
子句徹底或部分複製表。url
6.INSERT與ON DUPLICATE KEY UPDATE
若是新行違反主鍵(PRIMARY KEY)或UNIQUE
約束,MySQL會發生錯誤。
可是,若是在INSERT
語句中指定ON DUPLICATE KEY UPDATE選項,MySQL將插入新行或使用新值更新原行記錄。
=》
=》問題
這個取決與on duplicate key update後面的值,若是id是2,由於後面加1,id的值變成3,在表中id=3是有的,因此還會繼續報錯。
二:insert ignore
1.介紹
當使用INSERT語句向表中添加一些行數據而且在處理期間發生錯誤時,INSERT
語句將被停止,並返回錯誤消息。所以,可能不會向表中沒有插入任何行。
可是,若是使用INSERT INGORE
語句,則會忽略致使錯誤的行,並將其他行插入到表中。
請注意,IGNORE
子句是MySQL對SQL標準的擴展。
因此當使用INSERT IGNORE
語句來執行插入數據時,MySQL只發出警告而不是發出錯誤,以防發生錯誤退出其它數據沒法插入。
2.準備數據
UNIQUE約束確保電子郵件列中不存在重複的電子郵件。
3.示例
先插入一條記錄
使用ignore:
結果:
4.strict模式
當STRICT
模式打開時,若是您嘗試將無效值插入到表中,MySQL將返回錯誤並停止INSERT
語句。
可是,若是使用INSERT IGNORE
語句,則MySQL將發出警告而不是錯誤。 此外,它將嘗試調整值以使其在插入表以前有效。
說明:
例如表中的字段的長度限制是6.
當數據插入的時候是7。
不會報錯,只會將字符串截取,剩下6個字符被插入。
三:Update語句
1.介紹
使用UPDATE
語句來更新表中的現有數據。也可使用UPDATE
語句來更改表中單個行,一組行或全部行的列值。
- 首先,在
UPDATE
關鍵字後面指定要更新數據的表名。 - 其次,
SET
子句指定要修改的列和新值。要更新多個列,請使用以逗號分隔的列表。以字面值,表達式或子查詢的形式在每列的賦值中來提供要設置的值。 - 第三,使用WHERE子句中的條件指定要更新的行。
WHERE
子句是可選的。 若是省略WHERE
子句,則UPDATE
語句將更新表中的全部行。
支持的修飾符:
LOW_PRIORITY
修飾符指示UPDATE
語句延遲更新,直到沒有從表中讀取數據的鏈接。LOW_PRIORITY
對僅使用表級鎖定的存儲引擎(例如MyISAM,MERGE,MEMORY)生效。- 即便發生錯誤,IGNORE修飾符也可使UPDATE語句繼續更新行。致使錯誤(如重複鍵衝突)的行不會更新。
2.示例
使用yiibaidb數據庫中的emplee表。
修改數據:
驗證數據
3.update多列
要更新多列中的值,須要在SET
子句中指定分配。
四:update join
1.介紹
使用MySQL UPDATE JOIN
語句來執行跨表更新。
2.相同的意思的語句
在這個UPDATE
語句與具備隱式INNER JOIN
子句的UPDATE JOIN
工做相同
3.準備數據
1 CREATE DATABASE IF NOT EXISTS empdb; 2 3 USE empdb; 4 -- create tables 5 CREATE TABLE merits ( 6 performance INT(11) NOT NULL, 7 percentage FLOAT NOT NULL, 8 PRIMARY KEY (performance) 9 ); 10 11 CREATE TABLE employees ( 12 emp_id INT(11) NOT NULL AUTO_INCREMENT, 13 emp_name VARCHAR(255) NOT NULL, 14 performance INT(11) DEFAULT NULL, 15 salary FLOAT DEFAULT NULL, 16 PRIMARY KEY (emp_id), 17 CONSTRAINT fk_performance FOREIGN KEY (performance) 18 REFERENCES merits (performance) 19 ); 20 -- insert data for merits table 21 INSERT INTO merits(performance,percentage) 22 VALUES(1,0), 23 (2,0.01), 24 (3,0.03), 25 (4,0.05), 26 (5,0.08); 27 -- insert data for employees table 28 INSERT INTO employees(emp_name,performance,salary) 29 VALUES('Mary Doe', 1, 50000), 30 ('Cindy Minsu', 3, 65000), 31 ('Sue Greenspan', 4, 75000), 32 ('Grace Dell', 5, 125000), 33 ('Nancy Johnson', 3, 85000), 34 ('John Doe', 2, 45000), 35 ('Lily Bush', 3, 55000);
4.INNER JOIN子句的示例
假設想根據員工的工做表現來調整員工的工資。
所以,優勢百分比存儲在merits
表中,您必須使用UPDATE INNER JOIN
語句根據存儲在merits
表中的百分比來調整employees
表中員工的工資。
5.具備LEFT JOIN的MySQL UPDATE JOIN示例
假設公司又僱用了兩名新員工:
由於這些員工是新員工,因此他們的績效(performance
)數據不可用或爲NULL
。如今 employees
表中的數據。
這時:
要計算新員工的工資,不能使用UPDATE INNER JOIN
語句,由於它們的績效數據在merits
表中不可用。
要使用UPDATE LEFT JOIN
來實現了。
當UPDATE LEFT JOIN
語句在另外一個表中沒有相應行時,就會更新表中的一行。
作法:
您可使用如下語句將新僱員的工資增長1.5%。
五:delete語句
1.介紹
使用MySQL DELETE
語句從單個表中刪除數據。
2.示例
3.與limit結合
若是要限制要刪除的行數,則使用LIMIT子句。
這個時候會刪除開始的m行。
六:on delete cascade語句
1.介紹
使用MySQL ON DELETE CASCADE
引用操做來執行外鍵從多個相關表中刪除數據。
ON DELETE CASCADE
對於外鍵的引用操做,能夠實如今從父表中刪除數據時自動刪除子表中的數據。
ON DELETE CASCADE
僅支持使用存儲引擎支持外鍵(如InnoDB
)的表上工做。 某些表類型不支持諸如MyISAM
的外鍵,所以應該在使用MySQL ON DELETE CASCADE
引用操做的表上選擇適當的存儲引擎。
2.需求
假設有兩張表:建築物(buildings
)和房間(rooms
)。 在這個數據庫模型中,每一個建築物都有一個或多個房間。
當咱們從buildings
表中刪除一行時,還要刪除rooms
表中引用建築物表中行的行。
3.準備數據
1 USE testdb; 2 3 CREATE TABLE buildings ( 4 building_no INT PRIMARY KEY AUTO_INCREMENT, 5 building_name VARCHAR(255) NOT NULL, 6 address VARCHAR(255) NOT NULL 7 )ENGINE=InnoDB DEFAULT CHARSET=utf8; 8 9 CREATE TABLE rooms ( 10 room_no INT PRIMARY KEY AUTO_INCREMENT, 11 room_name VARCHAR(255) NOT NULL, 12 building_no INT NOT NULL, 13 FOREIGN KEY (building_no) 14 REFERENCES buildings (building_no) 15 ON DELETE CASCADE 16 )ENGINE=InnoDB DEFAULT CHARSET=utf8; 17 18 INSERT INTO buildings(building_name,address) 19 VALUES('海南大廈','海口市國興大道1234號'), 20 ('萬達水城','海口市大同路1200號'); 21 22 INSERT INTO rooms(room_name,building_no) 23 VALUES('Amazon',1), 24 ('War Room',1), 25 ('Office of CEO',1), 26 ('Marketing',2), 27 ('Showroom',2);
4.示例
DELETE FROM buildings WHERE building_no = 2;
5.查找受MySQL ON DELETE CASCADE操做影響的表的技巧
有時,當要從表中刪除數據時,知道哪一個表受到MySQL ON DELETE CASCADE
參考操做的影響是有用的。 可從information_schema
數據庫中的referential_constraints
表中查詢此數據。
七:delete join
1.介紹
使用MySQL DELETE JOIN
語句來從多個表中刪除數據。
2.示例
每一個用戶有多個訂單,每一個訂單屬於一個惟一的用戶。
示例一:
可使用DELETE
語句與LEFT JOIN
子句來清理客戶數據。 如下聲明刪除未下訂單的客戶:
八:replace語句
1.介紹
REPLACE
語句是標準SQL的MySQL擴展。 MySQL REPLACE
語句的工做原理以下:
要使用MySQL REPLACE
語句,至少須要具備INSERT
和DELETE
權限。
MySQL使用PRIMARY KEY或UNIQUE KEY
索引來要肯定表中是否存在新行。
2.準備數據
USE testdb; CREATE TABLE cities ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), population INT NOT NULL ); INSERT INTO cities(name,population) VALUES('New York',8008278), ('Los Angeles',3694825), ('Shanghai',1923400);
3.示例
如今name
列爲NULL
。 您可能指望name
列的值保持不變。可是,REPLACE
語句不這樣作。
4.示例二
5.注意:
請注意,沒有出如今REPLACE
語句中的列將使用默認值插入相應的列。
若是列具備NOT NULL
屬性而且沒有默認值,而且您若是沒有在REPLACE
語句中指定該值,則MySQL將引起錯誤。這是REPLACE
和INSERT
語句之間的區別。
6.對於有update意思的replace的其餘寫法。
請注意,REPLACE
語句中沒有WHERE子句。
例如:
7.注意點
-
若是您開發的應用程序不只支持MySQL數據庫,並且還支持其餘關係數據庫管理系統(RDBMS),則應避免使用
REPLACE
語句,由於其餘RDBMS可能不支持。代替的做法是在事務中使用DELETE和INSERT語句的組合。 -
若是在具備觸發器的表中使用了
REPLACE
語句,而且發生了重複鍵錯誤的刪除,則觸發器將按如下順序觸發:在刪除前刪除,刪除以後,刪除後,若是REPLACE
語句刪除當前 行並插入新行。 若是REPLACE
語句更新當前行,則觸發BEFORE UPDATE
和AFTER UPDATE
觸發器。
九:Prepared語句
1.介紹
以前的MySQL版本4.1,查詢以文本格式發送到MySQL服務器。
以後,MySQL服務器使用文本協議將數據返回給客戶端。MySQL必須徹底解析查詢,並將結果集轉換爲字符串,而後再將其返回給客戶端。
文本協議具備嚴重的性能問題。
爲了解決這個問題,MySQL自版本4.1以來添加了一個名爲prepare
語句的來實現一些新功能。
prepare
語句利用客戶端/服務器二進制協議。 它將包含佔位符(?
)的查詢傳遞給MySQL服務器。
2.說明
當MySQL使用不一樣的productcode
值執行此查詢時,沒必要徹底解析查詢。
所以,這有助於MySQL更快地執行查詢,特別是當MySQL屢次執行查詢時。
由於prepare
語句使用佔位符(?
),這有助於避免SQL注入的問題,從而使您的應用程序更安全一些。
3.語法
4.示例