mysql表的运算_sql学习笔记:表的运算

在MICK的《SQL基础教程》里读到的一章,写的很好,之前很乱的思路变清晰了很多。简单来说,表的运算主要是两种:列的运算和行的运算。

表的加减法

这里是对表的列操作(向下扩展)。因此,按照常理,我们需要注意:

作为运算对象的列的类型要一致

两个表选择出来的列的列数要相同:select a,b from tableA union select a from tableB;就不正确

order by子句只能在最后使用一次,即只能进行一次分组

关键字

表的加法UNION:选择并集(所以重复的部分就只出现一次)。如果想包含重复行,请用union all

表的公共部分intersect:选择交集(MySQL不能用)

表的减法except:差集(MySQL不能用)

MYSQL实现交集和差集

建立两张表:

create table t1(id int primary key,nickname varchar(20),playNum varchar(20));

create table t2(id int primary key,nickname varchar(20),playNum varchar(20));

insert into t1 values(1,1,10);

insert into t1 values(2,2,20);

insert into t1 values(3,3,30);

insert into t2 values(1,1,10);

insert into t2 values(2,2,200);

insert into t2 values(3,33,300);

一、实现交集:

SELECT id, nickname, playNum, COUNT(*)

FROM (SELECT id, nickname, playNum

FROM t1

UNION ALL

SELECT id, nickname, playNum

FROM t2

) as temp

GROUP BY id, nickname, playNum

HAVING COUNT(*) > 1;

思路如下:

取两个表的全集

次数大于1的就是交集

二、实现差集

对于小的数据集,可以使用not in来实现,大的数据集效率很低(可以去试试)。下面提供一种思路:

SELECT t1.id, t1.nickname, t1.playNum

FROM t1 LEFT JOIN t2 ON t1.id = t2.id

WHERE t1.nickname != t2.nickname

OR t1.playNum != t2.playNum;

联结

这里是对行进行操作(向右扩展)。

格式:select col,... from table inner/full/right/left join table2 on ...;

FULL JOIN:全连接,显示两个表的所有信息(即是没有匹配,on的条件为假)。MySQL不支持全连接

INNER JOIN:内连接。显示的是表相关的信息(on的条件为真,此时on和where形同)

LEFT JOIN:左表是主表。返回的是主表和别的表的相关信息。

RIGHT JOIN:右表是主表。

三张以上表的联结

虽然不建议这样弄,但是还是记录一下:

select TS.col ,S.col

from TS INNER JOIN S

on TS.id= S.id

INNER JOIN ZS

ON ZS.id = TS.id

;

我理解的思路就是:新生成的集合再次操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值