几道SQL面试题——附解题方法

1.一道SQL语句面试题,关于groupby

表内容:

rq

shengfu

2005-05-09

2005-05-09

2005-05-09

2005-05-09

2005-05-10

2005-05-10

2005-05-10

如果要生成下列结果, 该如何写sql语句?

rq

2005-05-09

2

2

2005-05-10

1

2


--第一种解法:
SELECT rq,(SELECT COUNT(1) FROM tbl_shengfu x WHERE x.rq = a.rq AND x.shengfu = '胜') AS 胜,(SELECT COUNT(1) FROM tbl_shengfu y WHERE y.rq = a.rq AND y.shengfu = '负') AS 负 FROM tbl_shengfu a GROUP BY rq;

--第二种解法:
SELECT rq,SUM(CASE WHEN shengfu = '胜' THEN 1 ELSE 0 END) 胜,SUM(CASE WHEN shengfu = '负' THEN 1 ELSE 0 END) 负 FROM tbl_shengfu GROUP BY rq;

2.华为一道面试题

一个表中的 Id 有多个记录,把所有这个 id 的记录查出来,并显示共有多少条记录数。

3.请用一个sql语句得出结果

从table1,table2中取出如table3所列格式数据,注意提供的数据及结果不准确,只是作为一个格式向大家请教。

如使用存储过程也可以。

table1

月份mon

部门dep

业绩yj

一月份

01

10

一月份

02

10

一月份

03

5

二月份

02

8

二月份

04

9

三月份

03

8

table2

部门dep 

部门名称dname

01

国内业务一部

02

国内业务二部

03

国内业务三部

04 

国际业务部

table3 (result)

部门dname

一月份

二月份

三月份

国内业务一部

10

null

null

国内业务二部

10

null

国内业务三部

5

null

国际业务部

null

9

null



SELECT 
	dname,
	(SELECT yj FROM dbo.table2 a WHERE a.mon = '一月份' AND a.dep = d.dep) 一月份,
	(SELECT yj FROM dbo.table2 b WHERE b.mon = '二月份' AND b.dep = d.dep) 二月份,
	(SELECT yj FROM dbo.table2 c WHERE c.mon = '三月份' AND c.dep = d.dep) 三月份
FROM dbo.table1 d;


4.一个面试中遇到的SQL语句的查询问题

表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。


SELECT (CASE WHEN a>b THEN a ELSE b END) x,(CASE WHEN b>c THEN b ELSE c END) y FROM tbl;

5.SQL面试题

假设只有一个table,名为pages,有四个字段,id, url,title,body。里面储存了很多网页,网页的url地址,title和网页的内容,然后你用一个sql查询将url匹配的排在最前,title匹配的其次,body匹配最后,没有任何字段匹配的,不返回。


select a.[id],a.mark from
(
select [page].[id],100 as mark from [page] where [page].[url] like '%abc%'
union
select [page].[id],50 as mark from [page] where [page].[title] like '%abc%'
union
select [page].[id],10 as mark from [page] where [page].[body] like '%abc%'
) as a  order by mark DESC

6.sql面试题

有以下三张表,

Class表

classid 

classname

1

高三(一)班

2

高三(二)班

3

高三(三)班

 Student表

studentid

studentName

classid 

1

张三

2

2

李四

1

3

王五

1

4

赵六

3

5

钱七

2

6

孙九

3

score表

scoreid

course

studentid

score

1

数学

2

99

2

数学

3

60

3

数学

4

80

4

语文

5

79

5

语文

6

58

6

语文

1

66

7

英语

6

76

8

英语

4

87

9

英语

3

100

10

英语

2

69

 

要求:

编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数


--Class
create table #class
(
	classid int,
	classname nvarchar(20)
)

insert into #class
select 1,'高三(一)班' union all
select 2,'高三(二)班' union all
select 3,'高三(三)班';

--Student
create table #student
(
	studentid int,
	studentname nvarchar(20),
	classid int
)

insert into #student
select 1,'张三',2 union all
select 2,'李四',1 union all
select 3,'王五',1 union all
select 4,'赵六',3 union all
select 5,'钱七',2 union all
select 6,'孙九',3;

--Score
create table #score
(
	scoreid int,
	course nvarchar(20),
	studentid int,
	score int
)

insert into #score
select 1,'数学',2,99 union all
select 2,'数学',3,60 union all
select 3,'数学',4,80 union all
select 4,'语文',5,79 union all
select 5,'语文',6,58 union all
select 6,'语文',1,66 union all
select 7,'英语',6,76 union all
select 8,'英语',4,87 union all
select 9,'英语',3,100 union all
select 10,'英语',2,69;

SELECT * FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY className,course ORDER BY score DESC) rn,className,studentName,course,score 
FROM dbo.#score a,dbo.#student b,dbo.#class c 
WHERE a.studentId = b.studentId AND b.classId = c.classId) 
e WHERE e.rn = 1;


 

注:第二道题愣是没读懂,不知道什么意思。最后一道题写法似乎有点麻烦,不知道是否还有更简单的写法。如果有,大家可以一起交流哦。)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值