mysql-联合查询,连接查询
表数据
#简单的商品表
create table goods(
goods_id tinyint unsigned auto_increment primary key,
goods_name varchar(30) not null,
goods_price float(6,2) not null,
brand_id tinyint unsigned not null
);
insert into goods values (null, '百事可乐汽水2L', 7, 3),
(null, '可口可乐汽水2L', 6, 4),
(null, '百事可乐汽水330ml', 63, 3),
(null, '康师傅茉莉蜜茶1L', 77, 2),
(null, '柒牌T桖x马', 88, 5),
(null, '康师傅红烧牛肉面L', 47, 2),
(null, 'iphone 6s plush', 2637, 1),
(null, '乐视超级手机m2', 1000, 6),
(null, 'iphone X', 5207, 1),
(null, '乐视超薄手机', 17, 6),
(null, '可口可乐柠檬味汽水', 5, 4),
(null, '三星手机盖乐世', 2341, 99);
#品牌表
create table brand (
brand_id tinyint unsigned auto_increment primary key,
brand_name varchar(10) not null
);
insert into brand values(null, '苹果'),
(null, '康师傅'),
(null, '百事可乐'),
(null, '可口可乐'),
(null, '柒牌'),
(null, '乐视');
联合查询, 关键字: union all | distinct
将多个查询结果进行纵向上的拼接,
select *|字段列表 from 表名
union [all | distinct] #默认值:distinct
select *|字段列表 from 表名;
应用场景1:
找出最便宜的苹果手机和最贵的百事可乐
(select * from goods where brand_id=1 order by goods_price asc limit 1)
union all
(select * from goods where brand_id=3 order by goods_price desc limit 1);
应用场景2:
存储手机用户的信息?
首先,可以根据不同的市区放在不同的表中
然后,如果此时需要查询某个省内的所有潜在的vip客户(月消费在300元以上的),此时,可以分别查询各个市区的数据,然后再进行拼接(使用union查询语句)
连接查询——交叉连接 ,关键字: cross join
从一张表中的第一条记录开始连接另外一张表中的所有记录,并且保存所有的记录,其中也包括两张表的所有字段,也就是两张表做笛卡尔积!
连接查询——内连接, 关键字: inner join
内连接要区分左表和右表,出现在join关键字左边的就是左表,反之就是右表!
数据在左表中存在,同时在右表又对应的匹配的结果才会保存,如果没有匹配上,我们就认为该数据没有意义,也就不会被保存!
连接查询——外连接
左外连接, 关键字: left outer join, outer可以省略
同样是拿左表的每一条记录按照on后面的条件去匹配右表,如果匹配成功,那么就保存两个表的所有的记录,如果匹配失败,只保留左表的记录,而右表的记录全部为NULL,此时
右外连接, 关键字: right join
同样是拿左表的每一条记录按照on后面的条件去匹配右表,如果匹配成功,那么就保存两个表的所有的记录,如果匹配失败,只保留右表的记录,而左表的记录全部为NULL,此时
连接查询——自然连接, 关键字: natural join
这里的“自然”,是指两个或多个表进行连接查询的时候,系统会自动的去匹配连接条件,而不需要人为的指定!也就是没有on关键字了!和内外连接没什么区别!!!
自然内连接会自动删除字段名相同的一列(只保留一列),并且放在最前面!
自然内连接 关键字: natural join
自然连接其实和内外连接没有什么本质的区别,只是自然连接中的连接条件由系统自动匹配罢了!只有匹配的才会保存
自然左外连接 关键字: natural left join
自然连接其实和内外连接没有什么本质的区别,只是自然连接中的连接条件由系统自动匹配罢了!如果匹配成功,那么就保存两个表的所有的记录,如果匹配失败,只保留左表的记录,而右表的记录全部为NULL
自然右外连接 关键字: natural right join
自然连接其实和内外连接没有什么本质的区别,只是自然连接中的连接条件由系统自动匹配罢了!如果匹配成功,那么就保存两个表的所有的记录,如果匹配失败,只保留右表的记录,而左表表的记录全部为NUL