跟我一起学习MySQL技术内幕(第五版):(第二章学习日记9)

2.10使用union实现多表检索
2.11多表删除和更新

2.10
如果你想把多个表结果合并成一个结果集,那么需要使用union语句。编写一条union语句,需要多条select语句,把union关键字放置到他们的中间。

select i from t1 union select i from t2 union select i from t3;

union有以下几种特性。
1.列名和数据类型

union结果集里边的列名来自第一个select语句里的列名。union中的第二个及后面的select必须选取相同个数的列,但是对应列不必具有相同的名字和数据类型。

列的匹配是根据相对位置,而不是根据名字。

数据类型是根据所选值得类型来确定的。

2.重复行处理。
默认情况下union结果集会将重复行自动剔除(union = union distinct)

如果你想保留重复的行,则需要把所有的union改为union all

如果混合使用了三种关键字
所有的不同联合将会拥有比左边更高的优先级

3.order by 和limit处理

order by:

如果想把union结果作为一个整体进行排序,需要用括号把每一个select语句括号起来
并在最后一个select语句后面加上一个order by子句。

(select i,c from i)union(select i,d from t3) order by c; 

如果某个排序列是别名,那么在union末尾的order by 子句必须引用这个别名。

order 不能引用表名。如果第一个select语句里以table_name.column_name的形式出现,则需要给这个列赋予别名,然后再order by后边引用这个别名

limit:
用于限制返回行的数量:

(select * from t1 ) union (select * from t2 )union (select * from t3) limit 2;

此外,order by 和limit还可以用在被括号括起来的单个select 语句里,从而只对这条select语句起作用:

(select * from t1c order by i limit 2) union (select * from t2 order by j limit 1) union (select * from t3 order by d limit 2);

在用括号括起来的单个select语句里,order by只能与limit 一起使用,用以确定limit将作用于那些行。

2.11多表删除或更新

delete from t where id>100;

这个命令会把t表里的id值大于100的所有行删除掉

当我们需要根据一个表里的行与另一个表里的行之间的关系,而不是根据他们自身的特性,这时就需要连接

delete t1 from t1 inner join t2 on t1.id =t2.id;

delete t1,t2 from t1 inner join t2 on t1.id =t2.id;

第一个语句吧t1中与t2重复的行删掉
第二个语句把两个表中重复的行全部删掉

在涉及多个表的delete语句里,可以使用任何一种select语句支持的连接操作。
下面实现删除那些没有匹配上的行

select t1.* from t1 left join t2 on t1.id = t2. id is null;

delete t1 from t1 left join t2 on t1.id = t2. id where t2.id is null;

第二句实现删除,第一句是我们查找时的用例。

MySQL还支持另一种多表delete语法。这种语法会使用一个from子句,列出那些需要删除行的表,使用一个using 语句来连接这些表,从而确定出哪些行是需要删除的。采用这种语法,可以将上述几条语句改成如下:

delete from t1 using t1 inner join t2 on t1.id =t2.id;

delete from t1,t2 using t1 inner join t2 on t1.id =t2.id;

delete from t1 using t1 left join t2 on t1.id =t2.id where t2.id is null;

编写多个表的update语句涉及的原则,与delete涉及的原则相似,

为所有学生成绩加一

updata score,grade_event set score .score=score.score+1 where score.event_id = grade_event .event_id and grade_event .date ='2012_09_23' and grade_event .catogory='Q';

单表更新和子查询实现:

update score set score=score+1 where event_id(select event_id from grade_evevt where date = '2012-09-23' and grade_event .catogory= 'Q');

把id值相匹配的各行从t1.a列复制到t2.1列:(子查询无法实现)

update t1,t2 set t2.a = t1.a where t2.id = t1.id;

你可能感兴趣的:(mysql)