数据库⾯试题:常见⾯试SQL语句
常见⾯试SQL语句
1. 创建⼀个表:
创建语法为
CREATE TABLE table_name (column_name column_type);
实例如下:
create TABLE student (
s_id INT NOT NULL,
s_name VARCHAR(20)
);
2. 有⼀张shop表,有三个字段article,author,price,选出每个author的price的最⾼的纪录。(要包含所有字段)思路:使⽤MAX函数,到price的最⼤值,再根据author分类即可
SELECT article,author,MAX(price)
FROM shop
GROUP BY author
我⾃⼰尝试了⼀下,这种⽅法的确是可以直接实现的,我也不知道为什么别⼈的博客⾥⽤了⾮常复杂的连接
3.⼀张company_profit收⼊表,两个字段id,profit。查询平均收⼊⼤于10w的公司id
思路:
先查询所有公司的平均收⼊,作为临时表
再将临时表放在主查询中。
这⾥AVG(age)的⽤法要注意
步骤⼀:查询所有公司的平均收⼊
select id,AVG(profit) avg_profit
from company_profit
where avg_profit >100000
GROUP BY id;
步骤⼆:主查询,只查询id,与临时表进⾏id匹配
SELECT company_profit.id
FROM company_profit,(select id,AVG(profit) avg_profit
from company_profit
where avg_profit >100000
GROUP BY id) temp_table
where company_profit.id= temp_table.id
GROUP BY id;
4. 学⽣成绩表-课程表例题
①如果学号的前两位表⽰年纪,要查98级⼥⽣的姓名,请写出相应SQL语句。
思路:模糊查询 like或者左匹配
解法⼀:
select Sc_name
from score
where Sc_number like'98%'
解法⼆:
select Sc_name
sql查询面试题及答案from score
where left(Sc_number,2)='98';
②要查所有需要补考(⼩于60分)的学⽣姓名和课程的名字和成绩,请写出相应SQL语句。
select s1.Sc_name,c1.Co_name,s1.Sc_score
from score as s1,coures as c1
where s1.Sc_score <useid = c1.Co_id;
③查询每个学⽣需要补考(⼩于60分)的课程的平均分,并以平均分排序。
select s.Sc_name,c.Co_name,AVG(Sc_score)
from score as s, course as c
useid = c.Co_id and s.Sc_score <60
GROUP BY s.Sc_name
ORDER BY AVG(s.Sc_score)
查所有课程都在80以上的学⽣姓名
思路:
到分数在80⼀下的学⽣
在主查询中使⽤not in即可
select stu_name
from score
WHERE score.stu_name not in(select stu_name from score where score.subject_score <80) GROUP BY score.name;
给⼀个成绩表score,求排名(这⾥请忽略最后⼀列)
select a.id,a.name, a.score as Score ,COUNT(DISTINCT b.score)as Rank
from score a, score b
WHERE b.score >= a.score
GROUP BY a.id
ORDER BY a.score desc;
简单解释:
笛卡尔积:
select*
from score a, score b
此时对以上结果进⾏筛选:
select*
from score a, score b
where b.score > a.score
以上结果把"b表"的成绩(score) ⼤于 "a表"的成绩的记录都筛选出来
此时右边成绩字段全部都是⼤于等于左边的成绩字段
然后我们再根据id进⾏⼀个排序
select*
from score a, score b
where b.score > a.score
ORDER BY a.id
此时我们就可以知道针对a表的中的每⼀个学⽣b表中有多少⼤于他的
最后我们根据id分组(GROUP BY), 再把"b表"的成绩去重(DISTINCT)再记总数(COUNT)
select a.id,a.name, a.score as Score ,COUNT(DISTINCT b.score)as Rank
from score a, score b
WHERE b.score >= a.score
GROUP BY a.id
ORDER BY a.score desc;
此sql不太好理解的就是" COUNT( DISTINCT b.score ) AS Rank "这段
结合上⾯的结果 举例⼀个来理解这句sql:
id为1 成绩60的 ⼤于他的有4条记录, 分别是85 80 80 85
我们看到这4条记录去掉重复后剩下 80 85 这2个, 也就说明成绩60有2个⼤于等于他的,那么最⾼只能排名第2
这就是上⾯去重求和的作⽤, 求的和就是他的最⾼排名
但是这⾥我有个不太懂的事情就是COUNT(DISTINCT b.score) 为什么不⽤加1,我测试过了,加1的话就多了。。。。
求某门学科分数最⾼的前3位
使⽤order by降序排列,之后⽤limit限制展⽰数据⾏数
select*
from score
WHERE socre_name ="计算机⽹络"
order by score DESC
LIMIT2
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论