子查詢可以應用在INSERT、UPDATE以及DELETE等語句中,合理的使用子查詢將能夠簡化功能的實現並且極大的提高SQL語句執行的效率
用到的表:
CREATE TABLE `t_readerfavorite` ( `FCategoryId` int(11) DEFAULT NULL, `FReaderId` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of t_readerfavorite -- ---------------------------- INSERT INTO `t_readerfavorite` VALUES ('1', '1'); INSERT INTO `t_readerfavorite` VALUES ('5', '2'); INSERT INTO `t_readerfavorite` VALUES ('2', '3'); INSERT INTO `t_readerfavorite` VALUES ('3', '4'); INSERT INTO `t_readerfavorite` VALUES ('5', '5'); INSERT INTO `t_readerfavorite` VALUES ('1', '6'); INSERT INTO `t_readerfavorite` VALUES ('1', '7'); INSERT INTO `t_readerfavorite` VALUES ('4', '8'); INSERT INTO `t_readerfavorite` VALUES ('6', '9'); INSERT INTO `t_readerfavorite` VALUES ('5', '10'); INSERT INTO `t_readerfavorite` VALUES ('2', '11'); INSERT INTO `t_readerfavorite` VALUES ('2', '12'); INSERT INTO `t_readerfavorite` VALUES ('1', '12'); INSERT INTO `t_readerfavorite` VALUES ('3', '1'); INSERT INTO `t_readerfavorite` VALUES ('1', '3'); INSERT INTO `t_readerfavorite` VALUES ('4', '4');
1,子查詢在INSERT語句中的應用
一般我們insert是一行數據,有時可能需要將數據批量插入表中,比如創建一個和T_ReaderFavorite表結構完全相同的表T_ReaderFavorite2,然后將T_ReaderFavorite中的輸入復制插入到T_ReaderFavorite2表
創建T_ReaderFavorite2表
CREATE TABLE `t_readerfavorite2` ( `FCategoryId` int(11) DEFAULT NULL, `FReaderId` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
批量插入,數據量大的時候提高效率 格式:INSERT……SELECT…… ,注意上下的列順序必須是一一對應的
insert into t_readerfavorite2(fcategoryId,freaderid) select fcategoryid,freaderid from t_readerfavorite
使用INSERT……SELECT……不僅能夠實現簡單的將一個表中的數據導出到另外一個表中的功能,還能在將輸入插入目標表之前對數據進行處理
比如下面的SQL語句用於將T_ReaderFavorite表中的數據復制到T_ReaderFavorite2表中,但是如果T_ReaderFavorite表中的FReaderId列的值大於10,則將FReaderId的值減去FCategoryId的值后再復制到T_ReaderFavorite2表中
INSERT INTO t_readerfavorite2 (fcategoryId, freaderid) SELECT fcategoryid, CASE WHEN freaderid > 10 THEN freaderid - fcategoryid ELSE freaderid END FROM t_readerfavorite
使用這種插入前的數據處理可以完成諸如“將數據從A表導出到B表,並且將B表的主鍵全部加上bak前綴”、“將A公司的所有員工插入到我們的會員表,自動導入所有的客戶信息,並且為其自動生成會員編號”等復雜的任務。
因為可以在插入目標表前可以對數據進行處理,所以INSERT……SELECT……語句不局限於同結構表間的數據插入,也可以實現異構表間輸數據的插入。
2,子查詢在UPDATE語句中的應用
在UPDATE語句中可以在更新列表中以及WHERE語句使用子查詢。
下面演示一個將圖書的出版日期全部更新為所有圖書中的最新出版日期,SQL語句如下:
UPDATE t_book SET FYearPublished = (SELECT max(FYearPublished) FROM t_book)
注意,在MYSQL中是不支持使用子查詢來更新一個列的
下面的SQL語句用來將所有同類書本書超過3本的圖書的出版日期更新為2005:
update t_book set fyearpublished = 2005 where fcategoryid in ( select fcategoryid from t_book t group by t.fcategoryid having count(*)>3 )
3,子查詢在DELETE語句中的應用
子查詢在DELETE中唯一可以應用的位置就是WHERE子句,使用子查詢可以完成復雜的數據刪除控制。其使用方式與SELECT語句中的子查詢基本相同,而且也可以使用相關子查詢等高級的特性。下面的SQL語句用來將所有同類書本書超過3本的圖書刪除:
delete from t_book where fcategoryid in ( select fcategoryid from t_book t group by t.fcategoryid having count(*)>3 )