题目1084
select p.product_id,p.product_name
from Product p join Sales s
on p.product_id = s.product_id
group by product_id
having min(s.sale_date)>='2019-01-01'
and max(s.sale_date)<='2019_03_31';
问题
1、join和left join 都可以?
inner join(默认的join方式),INNER JOIN 关键字在表中P的行存在至少一个匹配S的行时返回行;用left join也不会因为右表中没有匹配,从左表返回左表的null行,返回同join。
2、P join S和S join P都可以?
left join 中不管是P在前还是S在前,都会每行都匹配到,因为左表的product_id右表都有
#测试left join 的P、S的位置对输出的影响,可能一样可能是不一样的,如果以左表为基准,右表没有把左表全覆盖到,则有null #如果两条返回一样,是因为数据中左表右表每条都能找到匹配的 select * from Product P left join Sales S on P.product_id =S.product_id; select * from Sales S left join Product P on P.product_id =S.product_id;
3、默认ONLY_FULL_GROUP_BY的设定,不允许查询字段包括非聚集列
[42000][1055] Expression #4 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'sqldatabase.S.seller_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
select * from Product P left join Sales S on P.product_id =S.product_id group by P.product_id ;#不可以 select s.product_id, p.product_name from Product P left join Sales S on P.product_id =S.product_id group by P.product_id ;#可以
扩展
sql连接
- INNER JOIN:如果表中有至少一个匹配,则返回行
- LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN:只要其中一个表中存在匹配,则返回行
group by句中的where和having
设置一个条件用来筛选数据比如where salary > 6000;当比较条件中的字段含有聚合函数时(avg;max;min;等)时得用having实现
select 选择字段 |
from 选择表:join 。。。 on多表连接条件 |
where 多表连接条件或者过滤条件 |
group by 按条件分组 |
having 过滤条件 |
order by 排序 |
limit |
__________________________________________________________________________________________________________________________________________________________________
标签:product,join,sql,group,刷题,id,select,left From: https://www.cnblogs.com/wi-Tim-n/p/16754423.html