一、数据库基本集合查询
首先我们创建两个表
create table R(A char(2),B char(2),C char(2));
create table S(A char(2),B char(2),C char(2));
然后导入数据
insert into R values ('a1','b3','c2');
insert into R values ('a1','b2','c2');
insert into R values ('a2','b2','c1');
insert into S values ('a1','b1','c1');
insert into S values ('a1','b2','c2');
insert into S values ('a2','b2','c1');
(一).并、交、差(注意:只有相同的元组(元组就是一组数据,如R表中的‘a1’‘b3’‘c2’就是一个元组,这儿的相同指的是属性个数类型相同)才能并交差)
1. 并
在mysql中并操作有直接的关键字支持,那就是union 和union all ,但是他俩是有区别的,union得到的结果会把重复的元组去掉,而union all 会保留所有元组
code:select * from R union select * from S ;
2.交
在sql语法定义中有except关键字,但是mysql没有。但是我们可以通过基本操作来实现,思路就是,把两个集合的数据并在一起,如果某个元组的出现次数大于1那么这个元组就是两个集合共有的(注意先用distinct去重,虽然在理论上元组是不允许重复出现但是现实数据库中是有重复元组的)
code: select * from (select distinct * from R union all select distinct * from S) as R_S group by A,B,C having count(*)>1;
3.差
在mysql中也不支持直接的差操作,只能通过其他操作组合,我的思路是,先把两个集合所有的元素组合起来再排除另一个集合的元素这之中就包含了exsits的使用,之前一直没有使用过不知道他的正确用法,下面粘出查询语句
code:select * from (select distinct * from R union select distinct * from S) as a where not exists (select * from S where a.A=A and a.B = B and a.c = C) ;
至于为什么要在第二个where条件加这么多条件判断(博主之前看到的都没加,结果我试了返回的是和不加所有where语句是一样的,所以我们可以由此推断,两个嵌套查询就像两个for循环,前一个拿一组值给后面,问“在不在你这个集合里面(返回的是布尔值)”,后面的where遍历过后给出回答)
4.笛卡尔积相对于就比较简单了
select * from R,S;这就是一个最简单的作积的操作,当然你还可以作筛选过后再积那样可以节省时间和空间
其他的操作我会在下一篇写出来,毕竟之后会越来越复杂,一起写篇幅会太大。