交叉连接
【SQL入门教程 第27集 交叉连接和自连接-哔哩哔哩】 https://b23.tv/EINZLkR
但需要两张表的全部的一一对应信息时可以用,比如:
- 一张商品信息表
- 一张商品包装表
- 交叉连接后,可以得到商品和包装的所有配对可能性。
sql
-- 创建商品表和包装表
create table goods(
gid int primary key auto_increment,
gname varchar(32)
)default charset = utf8;
create table packages(
pid int primary key auto_increment,
pname varchar(32)
)default charset = utf8;
-- 插入模拟数据
insert into goods(gname) values('A'),('B'),('C');
insert into packages(pname) values('a'),('b');
-- 交叉连接语法
select * from goods cross join packages;
自链接
https://developer.aliyun.com/article/870215 阿里
自连接就是结构和数据完全一样的两张表进行连接。
在做数据处理的时候,通常会给它们分别重命名来加以区分,然后关联
不分别起名字,sql脸盲。
使用自连接的目的并不是自己和自己关联,而是和表里的其他字段进行组合。
举例: 黑产行为筛选
- 已知同一用户在移动端(platform=21)连续点击两次时间间隔不高于2秒,则可能产生黑产行为
- 筛选出21年3月份所有有可能为黑产行为的点击记录
sql
-- 创建模拟表
create table if not exists tencent_video_click(
vuid int,
`date` date, -- 点击日期
`time` int, -- '点击时间时间戳格式',
platform int default 21 -- 21:移动端。22:网页端
);
select unix_timestamp('2021-03-01');
-- 插入造的数据
insert into tencent_video_click values
(1, '2021-03-01', 1614528000, 21),
(1, '2021-03-01', 1614528001, 22),
(1, '2021-03-01', 1614528001, 21),
(2, '2021-03-01', 1614528004, 21),
(3, '2021-03-01', 1614528000, 21),
(2, '2021-03-01', 1614528005, 21),
(3, '2021-03-01', 1614528000, 22),
(4, '2021-03-01', 1614528007, 21),
(4, '2021-03-01', 1614528009, 22),
(4, '2021-03-01', 1614528010, 21);
-- 要求:已知同一用户在移动端连续点击两次时间间隔不高于2秒,则可能产生黑产行为
-- 筛选出21年3月份所有有可能为黑产行为的点击记录
注意:
上述例子中,第一次点击表和第二次点击表只是人为命名的,并不是真的按照时间顺序产生的表
所以,自链接后,要将第二次点击时间大与第一次点击时间作为筛选条件
实际上,没有任何筛选条件下的自链接就是表的自乘,如下图
自链接前:
自链接后:
- 因此自链接的重点是利用筛选条件,达到目的。�达到目的。