一:insert語句
1.介紹
在執行插入語句前,需要具有執行INSERT
語句的INSERT
許可權。
2.準備環境
3.簡單insert語句
4.插入多行
在這種形式中,每行的值列表用逗號分隔。
如果為表中的所有列指定相應列的值,則可以忽略INSERT
語句中的列列表
5.具有SELECT子句的MySQL INSERT
可以使用INSERT
和SELECT
子句完全或部分複製表。
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.示例