面试SQL题

本文分享了两个实用的SQL技巧:一是如何将多行记录合并为一行,并以逗号分隔;二是如何找出表中重复的数据行及其出现次数。通过具体实例演示了如何创建表、插入数据及编写SQL函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面试曾遇到两个小题:第一个是按格式输出(多行合并成一行),第二个是查询出重复的数据行。
第一个是按格式输出(多行合并成一行):

mid   phone               myname 
1      13751345789  aaa 
2      13751345789  bbb 
3      13751345789  ccc 
4      13321254852  ddd 
5      13321254852  fff 
6      13568421314  zzz 

要求查询结果:
phone                names
13751345789  aaa,bbb,ccc
13321254852  ddd,fff
13568421314  zzz

实现代码如下:

 

--创建表
create table ms
(
mid 
int identity(1,1),
phone 
varchar(11),
myname 
varchar(20)
)

--插入数据
insert into ms
select '13751345789','aaa' union all
select '13751345789','bbb' union all
select '13751345789','ccc' union all
select '13321254852','ddd' union all
select '13321254852','fff' union all
select '13568421314','zzz'

--查看表数据
select * from ms

--创建函数
create function f_getName(@ph varchar(11))
returns varchar(1000)
as
begin 
declare @char varchar(1000)
set @char=''
select @char = @char + myname + ',' from ms where phone =@ph
return left(@char,len(@char)-1)--去掉最后一个逗号
end
go

--使用函数并显示结果
select distinct phone,dbo.f_getName(phone) as nm from ms

第二个是查询出重复的数据行:(使用上面的表)

--使用上面的表,查询出重复的数据行(大于1行)
select phone,count(phone) as times  from ms
group by phone
having count(phone)>1


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值