mysql按条件查询left,mysql中leftjoinon后⾯and和where条件查
询的差异
在select⼦句⾥能⽀持直接嵌套⼀个select⼦查询,但是该select⼦查询返回的结果集必须是单⾏,返回多⾏时会提⽰ORA-01427:
single-row subquery returns more than one row(ORA-01427: 单⾏⼦查询返回多个⾏ )
sql⾥没有where条件,就不能写where了(否则报错), 直接 group by  order by
left join后可以连续多个and,
join和in哪个查询更快
SELECT
*
FROM
bus_stats_log bsl
INNER JOIN base_project bp ON bp.id = bsl.project_id AND bp.id='b14ea4ebbae311e8b7f13b13ac2ac974' AND
bsl.staff_id='130634************'
SELECT DATE_FORMAT(in_time,'%Y-%m-%d') date, SUM(workTime) workTime,bp.pro_name
projectName,bsc.service_company_name serviceycompanyName,
bdd.`name` teamName,bddd.`name` workKind FROM bus_stats_log bsl
INNER JOIN base_project bp ON bp.id=bsl.project_id
AND bsl.staff_id=#{staffId}
AND bp.id IN(${addSql})
INNER JOIN bus_staff bs ON bsl.staff_id=bs.id INNER JOIN bus_service_company bsc ON bsc.id=bs.service_company INNER JOIN base_dict_data bdd ON bdd.id=bs.work_kind_id
INNER JOIN base_dict_data bddd ON bddd.id=bs.staff_team
GROUP BY DATE_FORMAT(in_time,'%Y-%m-%d')
第⼀个是先对join的表进⾏数据筛选(可替换为⼦查询)再关联前⾯的主表
第⼆个是先关联了再对两张表关联在⼀起的数据进⾏筛选
-- mysql中left join on后⾯and 和where条件查询的差异
-- 说下原因:
-- (1):ON后⾯的筛选条件主要是针对的是关联表【⽽对于主表筛选条件不适⽤】。
-- (2):对于主表的筛选条件应放在where后⾯,不应该放在ON后⾯
-- (3):对于关联表我们要区分对待。如果是要条件查询后才连接应该把查询件
-- 放置于ON后。如果是想再连接完毕后才筛选就应把条件放置于where后⾯
-- (4):对于关联表我们其实可以先做⼦查询再做join (这样就不⽤ on后接 and条件了)
-- left join on后⾯and
SELECT
rsh.SiteName AS siteName,
rsh.customerNum
FROM
report_site_day rsh
LEFT JOIN site_relation sr lationid = sr.ChildId AND sr.CustomerId='GOUWU' WHERE
-- left join on后⾯and改造为⼦查询,再join
SELECT
rsh.SiteName AS siteName,
rsh.customerNum
FROM
report_site_day rsh
LEFT JOIN (SELECT ChildId FROM site_relation WHERE CustomerId='GOUWU'
) sr lationid = sr.ChildId
WHERE

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。