现在的位置: 首页 > 综合 > 正文

再谈删除数据的SQL语句

2018年04月09日 ⁄ 综合 ⁄ 共 1962字 ⁄ 字号 评论关闭

        无论是刚毕业的大学生还是已经在软件领域拼杀多年的老手,只要提及删除数据的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是用于删除数据表中行的敲打

抱歉!评论已关闭.