首页 > 数据库 >刷题sql

刷题sql

时间:2022-10-05 03:00:07浏览次数:51  
标签:product join sql group 刷题 id select left

题目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

相关文章