SQL语句考题

1.一道SQL语句面试题,关于group by
表内容:
2005-05-09 胜
2005-05-09 胜
2005-05-09 负
2005-05-09 负
2005-05-10 胜
2005-05-10 负
2005-05-10 负

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

            胜 负
2005-05-09 2 2
2005-05-10 1 2
------------------------------------------
create table #tmp(rq varchar(10),shengfu nchar(1))

insert into #tmp values('2005-05-09','胜')
insert into #tmp values('2005-05-09','胜')
insert into #tmp values('2005-05-09','负')
insert into #tmp values('2005-05-09','负')
insert into #tmp values('2005-05-10','胜')
insert into #tmp values('2005-05-10','负')
insert into #tmp values('2005-05-10','负')

1)select rq, sum(case when shengfu='胜' then 1 else 0 end)'胜',sum(case when shengfu='负' then 1 else 0 end)'负' from #tmp group by rq
2) select N.rq,N.勝,M.負 from (
select rq,勝=count(*) from #tmp where shengfu='胜'group by rq)N inner join
(select rq,負=count(*) from #tmp where shengfu='负'group by rq)M on N.rq=M.rq
3)select a.col001,a.a1 胜,b.b1 负 from
(select col001,count(col001) a1 from temp1 where col002='胜' group by col001) a,
(select col001,count(col001) b1 from temp1 where col002='负' group by col001) b
where a.col001=b.col001

2.请教一个面试中遇到的SQL语句的查询问题
表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
------------------------------------------
select (case when a>b then a else b end ),
(case when b>c then b esle c end)
from table_name

3.面试题:一个日期判断的sql语句?
请取出tb_send表中日期(SendTime字段)为当天的所有记录?(SendTime字段为datetime型,包含日期与时间)
------------------------------------------
select * from tb where datediff(dd,SendTime,getdate())=0

4.有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):  
   大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。  
       显示格式:  
       语文              数学                英语  
       及格              优秀                不及格    
------------------------------------------
select
(case when 语文>=80 then '优秀'
        when 语文>=60 then '及格'
else '不及格') as 语文,
(case when 数学>=80 then '优秀'
        when 数学>=60 then '及格'
else '不及格') as 数学,
(case when 英语>=80 then '优秀'
        when 英语>=60 then '及格'
else '不及格') as 英语,
from table

5.在sqlserver2000中请用sql创建一张用户临时表和系统临时表,里面包含两个字段ID和IDValues,类型都是int型,并解释下两者的区别?
------------------------------------------
用户临时表:create table #xx(ID int, IDValues int)
系统临时表:create table ##xx(ID int, IDValues int)

区别:
用户临时表只对创建这个表的用户的Session可见,对其他进程是不可见的.
当创建它的进程消失时这个临时表就自动删除.

全局临时表对整个SQL Server实例都可见,但是所有访问它的Session都消失的时候,它也自动删除.

6.sqlserver2000是一种大型数据库,他的存储容量只受存储介质的限制,请问它是通过什么方式实现这种无限容量机制的。
------------------------------------------
它的所有数据都存储在数据文件中(*.dbf),所以只要文件够大,SQL    Server的存储容量是可以扩大的.

SQL Server 2000 数据库有三种类型的文件:

主要数据文件
主要数据文件是数据库的起点,指向数据库中文件的其它部分。每个数据库都有一个主要数据文件。主要数据文件的推荐文件扩展名是 .mdf。

次要数据文件
次要数据文件包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件。次要数据文件的推荐文件扩展名是 .ndf。

日志文件
日志文件包含恢复数据库所需的所有日志信息。每个数据库必须至少有一个日志文件,但可以不止一个。日志文件的推荐文件扩展名是 .ldf。

7.请用一个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)

部门dep 一月份      二月份      三月份
--------------------------------------
      01      10        null      null
      02      10         8        null
      03      null       5        8
      04      null      null      9

------------------------------------------
1)
select a.部门名称dname,b.业绩yj as '一月份',c.业绩yj as '二月份',d.业绩yj as '三月份'
from table1 a,table2 b,table2 c,table2 d
where a.部门dep = b.部门dep and b.月份mon = '一月份' and
a.部门dep = c.部门dep and c.月份mon = '二月份' and
a.部门dep = d.部门dep and d.月份mon = '三月份' and
2)
select a.dep,
sum(case when b.mon=1 then b.yj else 0 end) as '一月份',
sum(case when b.mon=2 then b.yj else 0 end) as '二月份',
sum(case when b.mon=3 then b.yj else 0 end) as '三月份',
sum(case when b.mon=4 then b.yj else 0 end) as '四月份',
sum(case when b.mon=5 then b.yj else 0 end) as '五月份',
sum(case when b.mon=6 then b.yj else 0 end) as '六月份',
sum(case when b.mon=7 then b.yj else 0 end) as '七月份',
sum(case when b.mon=8 then b.yj else 0 end) as '八月份',
sum(case when b.mon=9 then b.yj else 0 end) as '九月份',
sum(case when b.mon=10 then b.yj else 0 end) as '十月份',
sum(case when b.mon=11 then b.yj else 0 end) as '十一月份',
sum(case when b.mon=12 then b.yj else 0 end) as '十二月份',
from table2 a left join table1 b on a.dep=b.dep

8.华为一道面试题
一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数。
------------------------------------------
select id, Count(*) from tb group by id having count(*)>1
select * from(select count(ID) as count from table group by ID)T where T.count>1

 
表形式如下: 
Year      Salary 
2000        1000 
2001        2000 
2002        3000 
2003        4000 
想得到如下形式的查询结果 
Year      Salary 
2000      1000 
2001      3000 
2002      6000 
2003      10000 
sql语句怎么写? 
连接查询 
SELECT b.YEAR, SUM(a.salary) salary FROM hello a, hello b WHERE a.YEAR <= b.YEAR GROUP BY b.YEAR 

子查询 
select year ,(select sum(salary) from hello as B where B.year<=A.year ) from hello as A
 
 

1.用一条SQL语句查询出每门课都大于80分的学生姓名

name   kecheng   fenshu
张三     语文       81
张三     数学
       75
李四     语文
       76
李四     数学
       90
王五     语文
       81
王五     数学
       100
王五     英语
       90

A: select distinct name from table where name not in (select distinct name from table where fenshu<=80)

2.
学生表 如下:
自动编号   学号   姓名课程编号课程名称分数

       2005001 张三 0001      数学    69
       2005002 李四 0001      数学
    89
       2005001 张三 0001      数学
    69
删除除了自动编号不同,其他都相同的学生冗余信息


A: delete tablename where 自动编号 not in(select min(自动编号) from tablename group by 学号,姓名,课程编号,课程名称,分数)

一个叫department的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球对,现在四个球对进行比赛,用一条sql语句显示所有可能的比赛组合.
你先按你自己的想法做一下,看结果有我的这个简单吗?

答:select a.name, b.name
from team a, team b
where a.name < b.name

 

请用SQL语句实现:从TestDB数据表中查询出所有月份的发生额都比101科目相应月份的发生额高的科目。请注意:TestDB中有很多科目,都有1-12月份的发生额。
AccID:科目代码,Occmonth:发生额月份,DebitOccur:发生额。
数据库名:JcyAudit,数据集:Select * from TestDB

答:select a.*
from TestDB a
,(select Occmonth,max(DebitOccur) Debit101ccur from TestDB where AccID='101' group by Occmonth) b
where a.Occmonth=b.Occmonth and a.DebitOccur>b.Debit101ccur

************************************************************************************

面试题:怎么把这样一个表儿
year   month amount
1991   1     1.1
1991   2     1.2
1991   3     1.3
1991   4     1.4
1992   1     2.1
1992   2     2.2
1992   3     2.3
1992   4     2.4
查成这样一个结果
year m1   m2   m3   m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4

答案一、
select year,
(select amount from   aaa m where month=1   and m.year=aaa.year) as m1,
(select amount from   aaa m where month=2   and m.year=aaa.year) as m2,
(select amount from   aaa m where month=3   and m.year=aaa.year) as m3,
(select amount from   aaa m where month=4   and m.year=aaa.year) as m4
from aaa   group by year

 

这个是Oracle  中做的:
select * from (select name, year b1, lead(year) over
(partition by name order by year) b2, lead(m,2) over(partition by name order by year) b3,rank()over(
partition by name order by year) rk from t) where rk=1;

<think>嗯,用户想要找关于SQL语句的选择题或者练习题及答案。首先,我需要确定用户的需求是什么。他们可能在准备考试,或者在学习SQL,需要练习题来巩固知识。用户提到“选择题”和“练习题及答案”,所以我需要提供一些典型的选择题,并附上答案和解析。 接下来,我要考虑用户的水平。可能是初学者或中级学习者,所以题目难度要适中,涵盖基础知识点,比如SELECT语句、JOIN操作、聚合函数、子查询等。同时,要确保题目和答案的准确性,避免错误。 然后,我需要参考提供的引用内容。引用[1]和[2]涉及基本的SQL查询,比如子查询、排序、聚合函数。引用[3]是多查询的例子。这些可以作为题目设计的依据,确保题目覆盖这些知识点。例如,子查询比较薪水、多连接查询、聚合函数的使用等。 设计题目时,每个问题应该有一个正确选项和几个常见的错误选项,帮助用户识别常见错误。例如,关于JOIN的类型,可能会有人混淆INNER JOIN和LEFT JOIN的区别。或者关于聚合函数,是否可以使用在WHERE子句中,这也是常见的考点。 另外,答案的解析部分需要详细,说明为什么正确选项是对的,错误选项错在哪里。这样用户才能理解背后的原理,而不仅仅是记住答案。比如,在子查询题目中,解释WHERE子句不能直接使用聚合函数,必须使用子查询或HAVING子句。 还要注意题目的多样性,覆盖不同的SQL操作,如SELECT、JOIN、WHERE、GROUP BY、HAVING等。同时,可以包括一些实际应用场景,比如统计部门平均工资,多关联查询学生成绩等,这样用户能将理论应用于实践。 最后,检查题目的语法是否正确,确保SQL语句的写法符合标准,没有拼写错误或语法错误。例如,名、字段名是否正确,是否使用了正确的关键字,如“AS”用于别名,JOIN的正确用法等。 总结来说,需要设计涵盖基础知识点、常见错误点、实际应用的题目,并附上清晰的解析,帮助用户巩固SQL知识。同时,参考提供的引用内容,确保题目与用户的学习材料相关,提高练习的针对性。</think>### SQL语句练习题及答案解析 --- #### **题目1:基础查询与聚合函数** 下列哪个SQL语句查询`emp`中工资高于部门平均工资的员工信息? A. `SELECT ename, sal FROM emp WHERE sal > AVG(sal)` B. `SELECT ename, sal FROM emp WHERE sal > (SELECT AVG(sal) FROM emp)` C. `SELECT ename, sal FROM emp HAVING sal > AVG(sal)` D. `SELECT ename, AVG(sal) FROM emp GROUP BY deptno` **答案与解析** 正确答案:**B** - **A**错误,`AVG(sal)`不能在`WHERE`子句中直接使用,需通过子查询实现[^1]。 - **B**正确,子查询计算整体平均工资并与员工工资比较[^1]。 - **C`HAVING`用于分组后的筛选,此处不适用。 - **D`AVG(sal)`未与员工工资比较,仅计算部门平均值。 --- #### **题目2:多连接查询** 查询学生姓名、课程名及成绩时,需连接`student`、`course`、`sc`三张,正确的条件是: A. `student.sno = sc.sno AND sc.cno = course.cno` B. `student.sno = course.cno AND sc.cno = student.sno` C. `student.sno = sc.sno OR sc.cno = course.cno` D. `student.sno = course.cno` **答案与解析** 正确答案:**A** - 学生(`student`)与成绩(`sc`)通过学号(`sno`)关联,成绩(`sc`)与课程(`course`)通过课程号(`cno`)关联[^3]。 - **B/C/D**的条件逻辑错误,无法正确关联三。 --- #### **题目3:排序与限制结果** 以下哪个语句查询`table1`中`field1`降序排列的前5条记录? A. `SELECT * FROM table1 ORDER BY field1 DESC LIMIT 5` B. `SELECT TOP 5 * FROM table1 ORDER BY field1 DESC` C. `SELECT * FROM table1 WHERE ROWNUM <=5 ORDER BY field1 DESC` D. 以上全对 **答案与解析** 正确答案:**A** - **A**是MySQL语法,`LIMIT 5`限制返回5条。 - **B`TOP`是SQL Server语法,非通用。 - **C`ROWNUM`是Oracle语法,且`WHERE`子句在排序前执行,逻辑错误[^2]。 --- #### **题目4:聚合函数与分组** 统计每个部门的最高工资,正确的语句是: A. `SELECT deptno, MAX(sal) FROM emp GROUP BY deptno` B. `SELECT deptno, MAX(sal) FROM emp WHERE MAX(sal) > 5000` C. `SELECT deptno, sal FROM emp GROUP BY deptno` D. `SELECT deptno, MAX(sal) FROM emp HAVING MAX(sal)` **答案与解析** 正确答案:**A** - **A`GROUP BY deptno`按部门分组,`MAX(sal)`计算每组最大值。 - **B`WHERE`子句不能使用聚合函数,应改为`HAVING`。 - **C`sal`未聚合且未在`GROUP BY`中,语法错误。 - **D`HAVING`缺少条件。 --- #### **题目5:子查询应用** 查询没有选课的学生记录时,应使用: A. `SELECT * FROM student WHERE sno NOT IN (SELECT sno FROM sc)` B. `SELECT * FROM student LEFT JOIN sc ON student.sno = sc.sno WHERE sc.cno IS NULL` C. `SELECT * FROM student WHERE sno NOT EXISTS (SELECT * FROM sc)` D. A和B **答案与解析** 正确答案:**D** - **A**通过`NOT IN`排除已选课学生。 - **B**通过`LEFT JOIN`和`IS NULL`筛选未关联记录。 - **C`NOT EXISTS`子查询逻辑错误(未关联学生与选课)。 --- ### §§相关扩展问题§§ 1. 如何优化多连接查询的性能? 2. `GROUP BY`和`HAVING`的区别与使用场景? 3. 如何用SQL实现分页查询(不同数据库的语法差异)? 4. 什么是SQL注入?如何防范? --- ### 参考引用 : `select ename,sal from emp where sal > (select avg(sal) from emp)` : 排序、聚合函数语法示例 [^3]: 多连接查询示例:`SELECT * from student, course, sc where student.sno=sc.sno and sc.cno=course.cno`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值