如果我没看错你的意思的话,应该是想删除两个表中所有name字段相同且pass字段相同的数据?这样可以用一条sql语句来删除,$sql
=
"delete
test1,test2
from
test1
left
join
test2
on
test1name=test2name
where
test1pass=test2pass";mysql_query($sql);表明换成你的数据表名,试试看。
它将冗余数据选择到一个游标中 并根据(LastName FirstName)来分组(在我们这个方案中) 然后打开游标然后循环地取出每一行 然后用与先前的取出的键值进行比较 如果这是第一次取出这个值 或者这个值不是冗余键 那么跳过这个记录然后取下一个 不然的话 这就是这个组中的冗余记录 所以删掉它.
让我们运行一下这个存储过程
BEGIN
DeleteDuplicates;
END;
/
SELECT LastName FirstName COUNT()
FROM Customers
GROUP BY LastName FirstName
HAVING COUNT() > ;
最后一个查询语句没有返回值 所以冗余数据没有了从表中取冗余数据的过程完全是由定义在csr_Duplicates 这个游标中的SQL语句来实现的 PL/SQl只是用来实现删除冗余数 那么能不能完全用SQL语句来实现呢?
二.SQL解决方案 使用RANK()删除冗余数据Oracle i分析函数RANK()来枚举每一个组中的元素 在我们的方案中我们应用这个方案 我们使用这个函数动态的把冗余数据连续的排列起来加上编号 组由Partintion by 这个语句来分开 然后用Order by 进行分组SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName
FirstName ORDER BY ID) SeqNumber
FROM Customers
ORDER BY LastName FirstName;
SQL
Listing Output of single SQL statement that uses RANK()
显示的是根据记录的条数的个数来显示尤其对于冗余数据
ID LASTNAME FIRSTNAME SEQNUMBER
Blake Becky
Blue Don
Bradley Tom
Chang Jim
Griffith David
Hill Larry
King Chuck
Krieger Jeff
Krieger Jeff
Krieger Jeff
Loney Julie
Lord Don
Mason Paul
Monroe John
Simon Michael
Simon Michael
Stone Tony
Stone Tony
Stone Tony
Stone Tony
Stone Tony
我们可以看一到 SeqNumber这一列中的数值 冗余数据是根据ID号由小到大进行的排序 所有的冗余数据的SqlNumber都大于一 所有的非冗余数据都等于一 所以我们取自己所需 删除那么没用的SELECT ID LastName FirstName
FROM
(SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName
FirstName ORDER BY ID) AS SeqNumber
FROM Customers)
WHERE SeqNumber > ;
SQL
Listing 冗余键的键值
有七行必须被删除
ID LASTNAME FIRSTNAME
Krieger Jeff
Krieger Jeff
Simon Michael
Stone Tony
Stone Tony
Stone Tony
Stone Tony
rows selected 这显示有七行需要删除 还是用上一个表我测试了一下这个代码 它用了77秒种就删除了所有的数据准备好了用Sql语句来删除冗余数据 版本一它执行了 秒
DELETE
FROM CUSTOMERS
WHERE ID IN
(SELECT ID
FROM
(SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName
FirstName ORDER BY ID) AS SeqNumber
FROM Customers)
WHERE SeqNumber > );
我们可以看到最后的两行语句对表中的数据进行了排序 这不是有效的 所以我们来优化一下最后一个查询语句 把Rank()函数应用到只含有冗余数据的组 而不是所有的列下面这个语句是比较有效率的 虽然它不像上一个查询那样精简SELECT ID LastName FirstName
FROM
(SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName
FirstName ORDER BY ID) AS SeqNumber
FROM
(SELECT ID LastName FirstName
FROM Customers
WHERE (LastName FirstName) IN (SELECT LastName FirstName
FROM Customers
GROUP BY LastName FirstName
HAVING COUNT() > )))
WHERE SeqNumber > ;
选择冗余数据只用了26秒钟 这样就提高了 %的性能 这样就提高了将这个作为子查询的删除查询的效率
DELETE
FROM Customers
WHERE ID IN
(SELECT ID
FROM
(SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName
FirstName ORDER BY ID) AS SeqNumber
FROM
(SELECT ID LastName FirstName
FROM Customers
WHERE (LastName FirstName) IN (SELECT LastName FirstName
FROM Customers
GROUP BY LastName FirstName
HAVING COUNT() > )))
WHERE SeqNumber > );
现在只用了 秒钟的就完成的上面的任务 比起上一个 秒 这是一个很大的进步 相比之下 存储过程用了 秒 这样存储过程有些慢了使用PL/SQL语句我们和我们以上的代码 会得到更好的更精确的代码 和提高你代码的执行效率 虽然对于从数据库中枚举数据PL/SQL对于Sql两者没有什么差别 但是对于数据的比较上 PL/SQL就比SQL要快很多 但是如果冗余数据量比较小的话 我们尽量使用SQL而不使用PL/SQL如果你的数据表没有主键的话 那么你可以参考其它技术
Rank()其它的方法
使用Rank()函数你可以对选择你所保留的数据 (或者是小ID的或者是大ID 的 就由RECDate这个列来决定这种情况下 你可以把REcdate加入到(Orderby )子句中 倒序或者正序
这是一种保留最大Id的一种解决方案
DELETE
FROM Customers
WHERE ID IN
(SELECT ID
FROM
(SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName FirstName ORDER BY RecDate DESC ID) AS SeqNumber
FROM
(SELECT ID LastName FirstName RecDate
FROM Customers
WHERE (LastName FirstName) IN (SELECT LastName FirstName
FROM Customers
GROUP BY LastName FirstName
HAVING COUNT() > )))
WHERE SeqNumber > );
这种技术保证了你可以控制每一个表中的保留的组 假设你有一个数据库 有一个促销或者有一个折扣信息 比如一个团体可以使用这种促销5次 或者个人可以使用这个折扣三次 为了指出要保留的组的个数 你可以在where 和having子句中进行设置 那么你将删除所有大于你
设置有数的冗余组
DELETE
FROM Customers
WHERE ID IN
(SELECT ID
FROM
(SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName
FirstName ORDER BY ID) AS SeqNumber
FROM
(SELECT ID LastName FirstName
FROM Customers
WHERE (LastName FirstName) IN (SELECT LastName FirstName
FROM Customers
GROUP BY LastName FirstName
HAVING COUNT() > )))
WHERE SeqNumber > );
As you can see using the RANK() function allows you to eliminate duplicates in a
single SQL statement and gives you more capabilities by extending the power of
your
queries
lishixinzhi/Article/program/Oracle/201311/18979
(1)如果想清空表里面的内容可以使用:delete from KF;
(2)如果是想删除整个表可以使用:drop table KF。
SQL中删除表中的所有数据的方法:
1、TRUNCATE TABLE 删除表中的所有行,而不记录单个行删除 *** 作。
(1)语法:TRUNCATE TABLE name;
(2)参数 name 是要截断的表的名称或要删除其全部行的表的名称。
2、DELETE语句,属于计算机软件领域,是编程中实现删除功能的命令。
(1)DELETE语句:用于创建一个删除查询,可从列在 FROM 子句之中的一个或多个表中删除记录,且该子句满足 WHERE 子句中的条件,可以使用DELETE删除多个记录。
(2)语法:DELETE [table] FROM table WHERE criteria;
(3)说明:table参数用于指定从其中删除记录的表的名称。
(4)criteria参数为一个表达式,用于指定哪些记录应该被删除的表达式。
(5)可以使用 Execute 方法与一个 DROP 语句从数据库中放弃整个表。不过,若用这种方法删除表,将会失去表的结构。不同的是当使用 DELETE,只有数据会被删除;表的结构以及表的所有属性仍然保留,例如字段属性及索引。
扩展资料:
1、SQL 的支持标准:
(1)SQL 是1986年10 月由美国国家标准局(ANSI)通过的数据库语言美国标准,接着,国际标准化组织(ISO)颁布了SQL正式国际标准。
(2)1989年4月,ISO提出了具有完整性特征的SQL89标准,1992年11月又公布了SQL92标准,在此标准中,把数据库分为三个级别:基本集、标准集和完全集。
2、数据库对象——表格:
(1)数据库中的表与我们日常生活中使用的表格类似,它也是由行(Row) 和列(Column)组成的。列由同类的信息组成,每列又称为一个字段,每列的标题称为字段名。
(2)行包括了若干列信息项。一行数据称为一个或一条记录,它表达有一定意义的信息组合。一个数据库表由一条或多条记录组成,没有记录的表称为空表。每个表中通常都有一个主关键字,用于唯一地确定一条记录。
参考资料来源:
百度百科-结构化查询语言
百度百科-DELETE语句
百度百科-数据库对象
例如你有一个学生表student 你要删除表格里面的一个叫刘慧同学的信息
你就应该敲 delete from student where name = ‘刘慧’(方法:delete from <数据表> where 学号='学生的学号')
删除关联表中信息时,要注意顺序,一般先删除从表,然后才是主表,也就是先删除有外键的表,在删除外键来源的那个表,否则会出现错误,
对于删除符合要求的信息则和楼上一样是:delete from 从表 where 满足的条件
delete from 主表 where 满足的条件
希望对你有用,诚邀交流,希望采纳!
以上就是关于数据库怎么样同时删除两个表的的信息全部的内容,包括:数据库怎么样同时删除两个表的的信息、如何删除数据库中的冗余数据(2)、删除数据库表内容等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)