如何查询关联表中满足特定条件的两组数据?

是的,这就是问题所在。
首先说第一组,即检查表A没有链接到表B,或者链接了但类型不是9 9
SQL语句为:
SELECT a。
FROM a LEFT JOIN b ON b.id = a.outer_id WHERE b.id IS NULL OR (b.id IS NOT NULL AND b.type != 9 9 );
关键点是LEFT JOIN保证A表中所有数据都存在,然后WHERE条件过滤掉两种情况:要么B表没有匹配,要么有匹配但类型不是9 9
第二组检查表A和表B之间的关系和类型等于9 9
SQL语句:
SELECT a。
FROM a INNER JOIN b ON b.id = a.outer_id AND b.type = 9 9 ;
这里INNER JOIN只保留两个表中匹配的记录,所以只有A表和B表中的记录,类型必须为9 9
为了性能优化,在B表的ID和类型列上创建复合索引,例如:B.INDEX idx_id_type(id, type),这样查询效率更高。
如果A表的outer_id列使用频繁,也建议创建索引。

数据一致性检查:例如,在运行第二组查询之前,可以先检查B表中是否有9 9 类型的记录。

如果要添加更多条件,例如A表的状态等于1 ,则将它们添加到WHERE子句中。

你自己看看,这些方法可以帮助你准确查询你需要的数据。

使用 SQL 查询多对多关系表中满足所有条件的记录

说实话,这个方法对于理解多对多关系表查询非常有用。
想一想,例如,如果你检查一个菜谱的成分,其中需要鸡蛋和牛奶,你如何检查?
首先连接表。
连接配方表、成分列表和中间表。
中间的桌子就像一座桥梁,连接着菜谱和食材。
SQL 是这样写的: SQL 选择 r.id、r.name 食谱来自R 在 r.id = ri.rid 上加入 Recipe_ingredient ri Join 组件 i ON i.id = ri.iid
这样,数据就完整了。

然后过滤。
在WHERE后面写条件,比如检查鸡蛋和牛奶: SQL WHERE i.name IN('egg', 'milk')
请注意,这是 IN,不等于。
因为一个食谱中可能会多次使用鸡蛋,而你只想知道其中是否含有鸡蛋,而不管使用了多少次。

然后创建组。
使用 GROUP BY 将食谱分组: SQL 按 r.id 分组
每个堆栈都是一个配方。

最后,使用 HAVING 检查条件。
这个HAVING必须符合之前的过滤条件。
例如,如果您过滤两个条件(鸡蛋和牛奶),则可以在 HAVING 中写入: SQL 有 count(DISTINCT i.id) = 2
什么是 DISTINCT?只是为了减肥。
例如,如果鸡蛋在食谱中添加两次,则 COUNT(i.id) 将计为 2 ,但 COUNT(DISTINCT i.id) 将仅计为 1 这将确保过滤后的食谱包含您指定的所有成分,不多也不少。

完整的SQL如下所示是: SQL 选择 r.id、r.name 食谱来自R 在 r.id = ri.rid 上加入 Recipe_ingredient ri 加入 i.id = ri.iid 上的内容 我的名字在哪里('鸡蛋','牛奶') 按 r.id 分组 出现次数(不同的 i.id)= 2
结果是包含鸡蛋和牛奶的食谱,例如煎饼。

这些是要点。
如果使用模糊匹配,例如组件名称中包含“ilk”或“eg”,则WHERE应改为分号: SQL 其中我的名字像'%ilk%'或者我的名字像'%eg%'
但是注意此时需要改变HAVING的数量。
例如,如果三种成分匹配,则 HAVING 需要更改为=3
还应该添加索引。
例如,在recipe_ingredient表的rid和id以及成分表的名称上添加索引可以大大加快速度。
数据较多时不要使用LIKE,使用=。

这个技巧不仅仅是寻找食谱。
顾客买的东西和员工学到的技能都可以这样使用。
例如,查看购买 A 和 B 的客户: SQL 选择 c.id、c.name C 来自客户 在 c.id = p.customer_id 上加入购买 p 将产品 PR 连接到 p.product_id = pr.id WHERE pr.name IN('A','B') 按 ID 分组 HAVING COUNT(DISTINCT pr.id) = 2
事实是一样的。

仅此而已。
您将了解如何在实践中使用它。

sql筛选出记录数大于2的记录

说实话,你的解释很清楚,但我想补充一些细节。
上次我在电商后端运行这个查询时,表中的ID字段有几千万条数据。
您编写的 SQL 导致服务冻结几秒钟。
后来技术人员告诉我,在 ID 中添加索引是个好主意,这样会更快。
所以仅仅会写 SQL 是不够的;您需要对性能有一定的了解。

有趣的是,我踩进了一个陷阱。
以前以为have和where一样可以过滤预先分组的数据,但是我发现既然have是分组后的结果,所以需要先过滤where。
我查资料的时候看到一个例子。
例如,过滤销售数量 > 2 000 的记录时,使用 where 会从数量 > 2 000 按 id 分组的一组订单中选择 id,但使用 have 则会根据 id count() > 2 000 的一组订单中选择 id。
两种写法效果相同,但后者更符合逻辑。
首先,您需要选择符合条件的项目,然后将它们分组。

在运行用户活动分析时,我们发现使用count()直接导致统计空值,导致结果不准确。
后来改成了count(id)或者count(column_name)这样null值就不统计了。
如果您的表允许空值,则此详细信息尤其重要。

还有一个场景给我留下了深刻的印象。
经过对社区论坛的分析,我们发现有些用户ID只发了一次帖子,但都是垃圾帖子,所以我们想过滤掉至少发过两次深度帖子(至少有1 0条回复)的用户。
在这种情况下,您不能简单地使用 count()。
我需要用 count()>=2 且 count(parent_id)>1 0 的 ID 重写它,并从 Parent_id 为 null 且组长度(content)> 5 0 的帖子中选择 ID。
你必须添加条件,逻辑就会变得更加复杂。

对于大数据集,建议使用分页查询+索引。
例如,要获取并运行第一批数据,请使用限制为1 0000,偏移量为0。
获取满足条件的ID列表后,创建并存储单独的临时表,最后使用Inner Join将它们关联起来。
上次我们处理十亿条数据时,我们使用了这个巧妙的操作,并在 5 轮内完成了它,这比直接扫描整个表快了 1 0 倍以上。

但是,在电子商务领域,您说您要寻找购买次数超过两次的用户,但是有一个问题需要小心。
如果A购买了同一款产品不同规格,是否属于重复购买?我们团队当时对此进行了争论,最终决定采用更准确的 SKU 进行计数。
因此,在编写SQL之前,首先要确定你的业务定义。

用sql代码查询课程成绩大于80分的所有学生成绩

使用直接SQL查询查找成绩超过8 0分的学生。
表名:学生成绩表,ID:学号,姓名:学生姓名,成绩:考试成绩。
使用 7 0 到 8 0 点的条件查询,或添加中断或时间条件。
确保字段名和表名正确,并且需要学习SQL来优化大数据。
你自己掂量一下吧。