SQL查询国籍仅出现一次的艺术家姓名的实现方法
SQL需求说明
现有一张名为artist的示例表,存储艺术家姓名与对应国籍信息,表结构与样例数据如下:
name | nationality -------------------------------------- Nura Nal | Naltorian Susan Storm | American Tyson Gilford | American Kendra Sanders | American Natasha Romanoff | Russian T'Challa | Wakandan Matthew Michael Murdoch | American Karen Beecher-Duncan | American Kathy Kane | American Kimberley Ann Hart | American Reed Richards | American Barbara Gordon | American Ethan Morris | Droolian Barry Allen | American
需要实现的查询逻辑:返回国籍在表中仅出现一次的艺术家姓名。以上述样例数据为例,需排除所有国籍为American的记录,仅返回其余国籍对应的艺术家姓名。
实现方案
通用兼容写法(支持所有SQL版本)
SELECT name FROM artist WHERE nationality IN ( SELECT nationality FROM artist GROUP BY nationality HAVING COUNT(*) = 1 );
逻辑说明:
- 内层子查询按国籍字段分组,通过
HAVING子句筛选出总出现次数为1的国籍集合 - 外层查询匹配国籍属于该集合的艺术家,返回对应的姓名字段
针对上述样例数据,查询返回结果为:
- Nura Nal
- Natasha Romanoff
- T'Challa
- Ethan Morris
窗口函数写法(支持MySQL8.0+、PostgreSQL、SQL Server等主流新版本数据库)
大表数据场景下该写法性能更优:
SELECT name FROM ( SELECT name, COUNT(*) OVER (PARTITION BY nationality) AS nationality_count FROM artist ) AS stat WHERE nationality_count = 1;
逻辑说明:
- 内层通过窗口函数,在不改变原表行粒度的前提下,计算每个国籍对应的总记录数
- 外层直接筛选出国籍计数为1的行,提取艺术家姓名即可,返回结果和通用写法完全一致。
内容的提问来源于stack exchange,提问作者Chris Jones
相关产品推荐
相关产品推荐

