我可以在一个查询中进行mysql选择、更新和删除吗?

我可以在一个查询中进行mysql选择、更新和删除吗?,mysql,select,sql-delete,Mysql,Select,Sql Delete,我可以说优化mysql的许多方法之一是减少查询的数量吗 如果是这样,我可以这样做: - Select "data" => $A from table X - Update $A from table Y - Delete $A from table X 在一个查询中?否, 只能合并 删除并选择 更新并选择 对于mysql优化来说,这不是一个合适的方法,只是 因为每个查询都有不同的查询成本 在myisam中,它涉及到写操作的表级锁定 更新和选择示例 /* this will updat

我可以说优化mysql的许多方法之一是减少查询的数量吗

如果是这样,我可以这样做:

- Select "data" => $A from table X
- Update $A from table Y
- Delete $A from table X
在一个查询中?


只能合并

  • 删除并选择
  • 更新并选择
对于mysql优化来说,这不是一个合适的方法,只是
因为每个查询都有不同的查询成本

在myisam中,它涉及到写操作的表级锁定

更新和选择示例

/* this will update TABLE_A if ID in TABLE_B exist in TABLE_A */
UPDATE TABLE_A, TABLE_B
  SET TABLE_A.SOME_COLUMN=TABLE_B.SOME_COLUMN
WHERE TABLE_A.ID=TABLE_B.ID

/* or */
UPDATE TABLE_A
  SET SOME_COLUMN = (SELECT SOME_COLUMN_B FROM TABLE_B WHERE ... LIMIT 1)
DELETE FROM TABLE_A WHERE TABLE_A IN(SELECT ID FROM TABLE_B)
删除并选择的示例

/* this will update TABLE_A if ID in TABLE_B exist in TABLE_A */
UPDATE TABLE_A, TABLE_B
  SET TABLE_A.SOME_COLUMN=TABLE_B.SOME_COLUMN
WHERE TABLE_A.ID=TABLE_B.ID

/* or */
UPDATE TABLE_A
  SET SOME_COLUMN = (SELECT SOME_COLUMN_B FROM TABLE_B WHERE ... LIMIT 1)
DELETE FROM TABLE_A WHERE TABLE_A IN(SELECT ID FROM TABLE_B)

您不能减少查询的数量——它们都做不同的事情——但是您可以通过将所有查询包装为PLSQL函数来减少到数据库的往返次数和解析次数

但是,删除数据后,您无法选择该数据……但请考虑:

CREATE PROCEDURE s_u_d(a)
BEGIN

UPDATE tab_x SET tab_x.avalue=1 WHERE tab_x.another=a;

DELETE FROM tab_y WHERE tab_y.avalue=a;

SELECT * 
FROM tab_x
WHERE tab_x.another=a;

END;

注意-您还可以在同一过程中运行多个选择,并处理多个不同形状的结果集,例如创建存储过程:

DELIMITER // 

create procedure empproc(in name varchar(255),in fathername varchar(255),in password varchar(255))

begin

        Select * from xemp where uname = name and fname = fathername;

        insert into xemp values(name,fathername,password);

end //
delimiter ;
Java代码

import  java.sql.*;

public class StoredProcedure {

    public static void main(String a[])throws Exception {

        Class.forName("com.mysql.jdbc.Driver").newInstance();
        Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/01jim2010","root","");
        CallableStatement calstat=conn.prepareCall("{call empproc(?,?,?)}");
        calstat.setString(1,"Jimit");
        calstat.setString(2,"Temp");
        calstat.setString(3,"Temp");

        ResultSet rs = calstat.executeQuery();
        conn.close();
        calstat.close();

        System.out.println("Your data has been inserted into table.");
      }
}

不,还是有3个查询是伪造的