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

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

4.请用SQL 语句实现:从TestDB 数据表中查询出所有月份的发生额都比101 科目相应月份的发生额高的科目。请注意:TestDB 中有很多科目,都有1 -12 月份的发生额。
AccID :科目代码,Occmonth :发生额月份,DebitOccur :发生额。
答: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

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

  1. 说明:复制表
    ( 只复制结构, 源表名:a 新表名:b)
    SQL: select * into b from a where 1<>1(where1=1,拷贝表结构和数据内容)
    Oracle: create table b as select * from a where 1=2

  2. 说明:拷贝表( 拷贝数据, 源表名:a目标表名:b)
    SQL: insert into b(a, b, c) select d,e,f from a;

  3. 说明:两张关联表,删除主表中已经在副表中没有的信息
    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.为了便于阅读, 查询此表后的结果显式如下( 及格分数为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
写出此查询语句
select courseid, coursename ,score ,if(sign(score-60)=-1,‘fail’,‘pass’) as mark from course

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 testtable2.
, IFNULL(department,‘黑人’)
FROM testtable1 right join testtable2 on testtable2.dptID = testtable1.ID

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
### SQL 面试题及答案 以下是几道经典的 SQL 面试题,涵盖从基础到高级的难度,适合不同层次的求职者准备面试时参考。 #### 1. 查询员工中工资最高的前三名员工 假设有一个名为 `employees` 的,包含以下字段:`id`, `name`, `salary`。需要查询出工资最高的前三名员工。 ```sql SELECT id, name, salary FROM employees ORDER BY salary DESC LIMIT 3; ``` 此查询使用了 `ORDER BY` 和 `LIMIT` 来限制结果集的大小[^1]。 #### 2. 查询部门平均工资高于公司整体平均工资的部门 假设有一个名为 `departments` 的,包含字段 `department_id`, `department_name`,以及一个名为 `employees` 的,包含字段 `employee_id`, `department_id`, `salary`。 ```sql SELECT d.department_name, AVG(e.salary) AS avg_salary FROM departments d JOIN employees e ON d.department_id = e.department_id GROUP BY d.department_name HAVING AVG(e.salary) > (SELECT AVG(salary) FROM employees); ``` 这里通过子查询计算公司的整体平均工资,并与每个部门的平均工资进行比较[^2]。 #### 3. 查询每个部门中工资最高的员工 假设同样的结构,要求查询每个部门中工资最高的员工信息。 ```sql SELECT e1.department_id, e1.name, e1.salary FROM employees e1 WHERE e1.salary = ( SELECT MAX(e2.salary) FROM employees e2 WHERE e1.department_id = e2.department_id ); ``` 这段代码利用了子查询和 `MAX()` 函数来获取每个部门的最高工资,并匹配相应的员工记录。 #### 4. 使用窗口函数查询每个部门工资排名前两名的员工 在现代 SQL 中,可以使用窗口函数实现更复杂的排序需求。 ```sql SELECT department_id, name, salary FROM ( SELECT department_id, name, salary, RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) as rank_num FROM employees ) temp WHERE rank_num <= 2; ``` 这里使用了 `RANK()` 窗口函数对每个部门的员工按工资降序排列,并选取排名前两名的员工[^2]。 #### 5. 处理空值问题:查询所有员工及其对应的部门名称 假设有些员工没有分配到部门,即 `department_id` 为 `NULL`,需要显示这些员工的信息。 ```sql SELECT e.name AS employee_name, d.department_name FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id; ``` 通过使用 `LEFT JOIN`,即使某些员工没有对应的部门信息,也可以正确显示他们的记录。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值