mysql之delect语法

时间:2024-01-23 22:54:23

一:DELETE语法

  以往用delect删除表数据是都是单表(一个表)删除。对于关联表,往往都是先删除第一个表的数据,然后再写另一个delect语句删除另一个表的数据(浪费时间,又影响性能,与数据库交互两次)。通过查阅官方文档的delect语法。有一些新的感悟。

1.1:单表语法(完整语法)  

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name  #()
       [PARTITION (partition_name [, partition_name] ...)] #(分区)
       [WHERE where_condition]  #(删除条件)
       [ORDER BY ...] #(删除顺序)
       [LIMIT row_count]  #(现在一次删除的数量)

 对于[]里面都是一些可选阐述,对于每个参数的意思我也是大概了解,在此我就不多做解释了,有兴趣的课参考官方文档:https://dev.mysql.com/doc/refman/5.7/en/delete.html

 1.2:多表语法(本次重点)

  语法1:  

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    tbl_name[.*] [, tbl_name[.*]] ...
    FROM table_references
    [WHERE where_condition]

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    FROM tbl_name[.*] [, tbl_name[.*]] ...
    USING table_references
    [WHERE where_condition]

1.3:多表删除

  您可以在DELETE语句中指定多个表,以 根据WHERE子句中的条件从一个或多个表中删除行 您不能使用ORDER BYLIMIT在多表中 DELETE该 table_references子句列出了连接中涉及的表。

  对于第一个多表语法,仅FROM删除子句之前列出的表中的匹配行对于第二个多表语法,仅删除FROM子句(在USING子句之前)中列出的表中的匹配行结果是您可以同时从多个表中删除行,并具有仅用于搜索的其他表:

  语法1

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

  语法2:

DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

   例如:删除一班班集(id =1)和一班所有的学生(学生的班级classes.id=1)

  DELETE classes ,students FROM students INNER JOIN classes WHERE classes.id = 1 AND students.`class_id` = 1;

注意:我上面用的是inner join 关联也可用outer join(是默认关联语法),但推荐用inner join因为inner join是取得两表的交集(outer join也可以取交集),省去了一些麻烦,也可规避一些误操作。具体细节可关联查询细节

备注:前面的示例使用INNER JOIN,但多表DELETE语句可以使用语句中允许的其他类型的连接 SELECT,例如 LEFT JOIN例如,要删除不存在t1匹配项的行 t2,请使用LEFT JOIN

 1.4:使用别名(alise)

  多表中的表别名 DELETE只应table_references在语句部分声明。在其他地方,允许别名引用但不允许别名声明。

  语法:

DELETE a1, a2 FROM t1 AS a1 INNER JOIN t2 AS a2
WHERE a1.id=a2.id;

DELETE FROM a1, a2 USING t1 AS a1 INNER JOIN t2 AS a2
WHERE a1.id=a2.id;


注意不要写成:(定义标的别名要在from后面)
DELETE t1 AS a1, t2 AS a2 FROM t1 INNER JOIN t2
WHERE a1.id=a2.id;

DELETE FROM t1 AS a1, t2 AS a2 USING t1 INNER JOIN t2
WHERE a1.id=a2.id;