再談刪除資料的SQL語句,資料sql語句
無論是剛畢業的大學生還是已經在軟體領域拼殺多年的老手,只要提及刪除資料的SQL語句無人不知無人不曉,再談刪除資料的SQL語句不免顯得賣弄,呵呵呵,不要好高騖遠:
有如下兩個表:
表1:
CREATE TABLE `lm_r_user_info` ( `id` CHAR(36) NOT NULL COMMENT '使用者基礎資訊ID', `real_name` VARCHAR(30) NOT NULL COMMENT '真實姓名', `gender` INT(11) DEFAULT NULL COMMENT '性別', `birthday` DATE DEFAULT NULL COMMENT '出生日期', `nation` INT(11) DEFAULT NULL COMMENT '民族', `telephone` VARCHAR(20) DEFAULT NULL COMMENT '固定電話', `mobile` VARCHAR(20) DEFAULT NULL COMMENT '行動電話', `email` VARCHAR(100) DEFAULT NULL COMMENT '電子郵件', `qq` VARCHAR(20) DEFAULT NULL COMMENT 'QQ號', `wechat` VARCHAR(100) DEFAULT NULL COMMENT '', `address` VARCHAR(100) DEFAULT NULL COMMENT '聯絡地址', `summary` VARCHAR(4000) DEFAULT NULL COMMENT '簡歷', `remark` VARCHAR(4000) DEFAULT NULL COMMENT '備忘', PRIMARY KEY (`id`), KEY `idx_user_info_realName` (`real_name`) USING BTREE ) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='使用者基礎資訊'
表2:
CREATE TABLE `lm_r_user` ( `id` CHAR(36) NOT NULL COMMENT '使用者ID', `user_info_id` CHAR(36) NOT NULL COMMENT '使用者基礎資訊ID', `user_name` VARCHAR(50) DEFAULT NULL COMMENT '使用者名稱', `password` VARCHAR(100) NOT NULL COMMENT '使用者密碼', PRIMARY KEY (`id`), UNIQUE KEY `user_idx_userInfoId` (`user_info_id`) USING HASH ) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='使用者資訊'
表1和表2之間的關係:表2通過user_info_id欄位和表1關聯。
需求:刪除使用者名稱為“admin”的使用者資訊及其基本資料。
最傻的方式:
根據使用者名稱先從表2中擷取相應的使用者基本資料的標識(即表2中對應的user_info_id欄位),然後執行delete from lm_r_user where user_name = 'admin',再執行delete from lm_r_user_info where id= '查詢出來的使用者資訊標識'
這種方式的缺陷:如果使用這種方式進行資料的刪除恐怕需要三次資料庫連接,這無形中增加了伺服器端的壓力
最可取的方式:
delete u, ui from lm_r_user_info ui inner join lm_r_user u on u.user_info_id = ui.id where u.user_name = 'admin'
這種方式的優點:只需要串連一次資料。
其實第二種方式之所以不容易想到是因為大家用慣了“delete from 表名”這種刪除資料的SQL語句的方式,這種方式可以用另一種方式代替:“delete 別名.* from 表名 別名”(你看清了嗎?),部落格寫到這裡有人可能會心生疑問——
1、這傻逼,“delete 別名.* from 表名 別名”不就是“delete * from 表名”嗎,幹嘛還要別名,呵呵呵,如果你認為這裡的別名多餘,那麼只能證明你是多麼的白癡——“delete * from 表名”是不能執行的,一定要有別名(至少在MySQL資料庫中無法執行),不過這種方式(“delete * from 表名”)在w3cschool中認為是對的。
2、既然刪除資料的SQL語句可寫成“delete 別名.* from 表名 別名”,那麼我可不可以通過這樣的SQL語句(“delete 別名.列名 from 表名 別名”)刪除一列或多列呢?呵呵呵,別開玩笑了,要知道delete是用於刪除資料表中行的。