SQL题

本文精选了多个SQL面试题目,并提供了详细的解答方案。包括查询特定条件的学生信息、删除冗余记录、比赛组合生成等,涵盖了从基础到进阶的SQL技巧。

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)
select name from table group by name having min(fenshu)>80

2. 学生表 如下:
自动编号   学号   姓名 课程编号 课程名称 分数
1        2005001 张三 0001      数学    69
2        2005002 李四 0001      数学    89
3        2005001 张三 0001      数学    69
删除除了自动编号不同, 其他都相同的学生冗余信息

A: delete tablename where 自动编号 not in(select min( 自动编号) from tablename group by 学号, 姓名, 课程编号, 课程名称, 分数)
3. 一个叫 team 的表,里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球对,现在四个球对进行比赛,用一条sql 语句显示所有可能的比赛组合.
你先按你自己的想法做一下,看结果有我的这个简单吗?
答:select a.name, b.name
from team a, team b
where a.name < b.name

5. 面试题:怎么把这样一个表儿
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
*******************************************************************************
6. 说明:复制表( 只复制结构, 源表名:a 新表名:b)

SQL: select * into b from a where 1<>1       (where1=1,拷贝表结构和数据内容)
ORACLE:create table b
As
Select * from a where 1=2
 
[<>(不等于)(SQL Server Compact)
比较两个表达式。 当使用此运算符比较非空表达式时,如果左操作数不等于右操作数,则结果为 TRUE。 否则,结果为 FALSE。]
 

7. 说明:拷贝表( 拷贝数据, 源表名:a 目标表名:b)

SQL: insert into b(a, b, c) select d,e,f from a;


11. 说明:两张关联表,删除主表中已经在副表中没有的信息

SQL:
Delete from info where not exists (select * from infobz where info.infid=infobz.infid )

*******************************************************************************
12. 有两个表A 和B ,均有key 和value 两个字段,如果B 的key 在A 中也有,就把B 的value 换为A 中对应的value
这道题的SQL 语句怎么写?
update b set b.value=(select a.value from a where a.key=b.key) where b.id in(select b.id from b,a where b.key=a.key);
***************************************************************************

13. 高级sql 面试题
原表:
courseid coursename score
-------------------------------------
1 java 70
2 oracle 90
3 xml 40
4 jsp 30
5 servlet 80
-------------------------------------
为了便于阅读, 查询此表后的结果显式如下( 及格分数为60):
courseid coursename score mark
---------------------------------------------------
1 java 70 pass
2 oracle 90 pass
3 xml 40 fail
4 jsp 30 fail
5 servlet 80 pass
---------------------------------------------------
写出此查询语句
   decode主要作用:将查询结果翻译成其他值
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1
测试SQL2000不能用decode函数,可写为case  sign(score-60) when 1 then 'pass'
                                                        when -1 then 'fail' end
select courseid, coursename ,score ,decode (sign(score-60),-1,'fail','pass') as mark from course
完全正确


SQL面试题(1)
create table testtable1
(
id int IDENTITY,
department varchar(12)
)
select * from testtable1
insert into testtable1 values('设计')
insert into testtable1 values('市场')
insert into testtable1 values('售后')
/*
结果
id department
1   设计
2   市场
3   售后
*/
create table testtable2
(
id int IDENTITY,
dptID int,
name varchar(12)
)
insert into testtable2 values(1,'张三')
insert into testtable2 values(1,'李四')
insert into testtable2 values(2,'王五')
insert into testtable2 values(3,'彭六')
insert into testtable2 values(4,'陈七')
/*
用一条SQL语句,怎么显示如下结果
id dptID department name
1   1      设计        张三
2   1      设计        李四
3   2      市场        王五
4   3      售后        彭六
5   4      黑人        陈七
*/
答案:
-- SELECT B.id,B.dptID,A.department,B.name
-- from testtable2 B left join testtable1 A
-- on  B.dptID=A.id
左右连接运用
SELECT testtable2.* , ISNULL(department,'黑人')
FROM testtable1 right join testtable2 on testtable2.dptID = testtable1.ID

### SQL 练习与面试 以下是几个常见的 SQL 练习和面试,涵盖了多种场景和技术点: #### 1. 查询每个班级各科成绩总和 通过 `CASE` 表达式实现多列聚合计算,统计每个班级的语文、数学、英语成绩总分。 ```sql SELECT class_no, SUM(CASE subject_no WHEN 1 THEN score ELSE 0 END) AS 语文, SUM(CASE subject_no WHEN 2 THEN score ELSE 0 END) AS 数学, SUM(CASE subject_no WHEN 3 THEN score ELSE 0 END) AS 英语 FROM ( SELECT class_no, st_no, NAME, subject_no, score FROM 班级信息表 c LEFT JOIN 成绩表 sc ON c.st_no = sc.stu_no ) m GROUP BY class_no; ``` 此查询展示了如何利用子查询和条件聚合来处理复杂的数据结构[^1]。 --- #### 2. 查询下一个月过生日的学生 使用 MySQL 的日期函数提取月份并匹配当前时间加一月的结果。 ```sql SELECT s_id FROM student WHERE MONTH(s_birth) = MONTH(NOW()) + 1; ``` 该查询适用于基于日期字段筛选特定时间段内的记录[^2]。 --- #### 3. 将有序行转换为列 给定一学生分数表,将其按科目拼接成单行显示的形式。 ```sql SELECT student, MAX(CASE WHEN subject = '语文' THEN score END) AS 语文, MAX(CASE WHEN subject = '数学' THEN score END) AS 数学, MAX(CASE WHEN subject = '英语' THEN score END) AS 英语 FROM t17_student_score GROUP BY student; ``` 这种技术称为 **行列转换**,常用于报表生成或数据分析场景[^3]。 --- #### 4. 查找重复数据 假设有一员工表 `employee`,查找姓名相同的重复记录。 ```sql SELECT name, COUNT(*) FROM employee GROUP BY name HAVING COUNT(*) > 1; ``` --- #### 5. 计算排名(窗口函数) 对于学生的成绩表,按照某一科目进行排名。 ```sql SELECT student, subject, score, RANK() OVER (PARTITION BY subject ORDER BY score DESC) AS rank FROM t17_student_score; ``` 这里使用了窗口函数 `RANK()` 来动态分配名次。 --- #### 6. 跨表更新操作 如果需要同步两表中的某些字段值,可以采用如下方式: ```sql UPDATE table_a a JOIN table_b b ON a.id = b.id SET a.column_name = b.column_value; ``` --- #### 7. 时间范围过滤 找出最近一周内新增的用户。 ```sql SELECT * FROM users WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL 7 DAY); ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值