【SQL重温】面试之数据库基础练习
简介
最近在练习SQL基础,首先感叹一下,在机器上写和在纸上写还是有区别的。
本文的练习题目请点击此链接进行查看:http://www.cnblogs.com/edisonchou/p/3878135.html
提要:本文只列举个人认为有点难度,且有必须要重温知识点的题目,详细还请查看上面所给的链接进行练习。
练习题
(1)查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
- 思路1:使用++intersect++(intersect的使用)
- 思路1:使用++EXISTS++(EXISTS的用法)
--解法一:求交集
select s.S#,s.Sname
from Student s,SC sc
where s.S#=sc.S# and sc.C#='001'
intersect
select s.S#,s.Sname
from Student s,SC sc
where s.S#=sc.S# and sc.C#='002'
--解法二:使用exists
select s.S#,s.Sname
from Student s,SC sc
where s.S#=sc.S# and sc.C#='001' and exists
(
select * from SC sc2 where sc.S#=sc2.S# and sc2.C#='002'
)
小知识:EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用:
IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
(7)查询学过“叶平”老师所教的所有课的同学的学号、姓名
分析:这题要注意一个老师可能教多门课
- 先在成绩单上查询到教师为“叶平”老师的信息,通过学生ID进行分组并获取考试门数
- 然后统计课程表上的“叶平”老师的课程数
3.第一个条件的学生考试门数跟第二个条件的“叶平”老师所教课程数进行对比,相等即时答案
select s.S#,s.Sname
from Student s
where s.S# in
(
select sc.S#
from SC sc,Course c,Teacher t
where c.C#=sc.C# and c.T#=t.T# and t.Tname='叶平'
group by sc.S#
having COUNT(sc.C#)=
(
select COUNT(c1.C#)
from Course c1,Teacher t1
where c1.T#=t1.T# and t1.Tname='叶平'
)
)
(14)查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名
注意:查询的是跟“002”完全相同,且是其他,记得得排除“002”
- 首先确定学生课程范围在“002”学生所选的课程范围内;
- 然后就是对比他们间的课程数。
完成上面两个条件即可确定他们所选的所有课程是否都相等了
select s.S#,s.Sname
from Student s
where s.S#!='002' and s.S# in
(
select distinct(S#) from SC
where C# in (select C# from SC where S#='002')
group by S#
having COUNT(distinct C#)=
(
select COUNT(distinct C#) from SC
where S#='002'
)
)
(16)向SC表中插入一些记录,这些记录要求符合以下条件:①没有上过编号“002”课程的同学学号;②插入“002”号课程的平均成绩
- 先查询第一个条件的学员,因为插入的学号需要用到;
- 然后获取课程“002”的平均分,这里是获取分数用于插入;
最后答案就顺理成章了:
INSERT INTO dbo.Sc
SELECT s.S#,'002',(SELECT AVG(score) FROM dbo.Sc WHERE C#='002')
from dbo.Student s
WHERE s.S# NOT IN(SELECT DISTINCT(sc.S#) FROM dbo.Sc sc WHERE sc.C#='002')
(17)按平均成绩从低到高显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分
这里涉及到行转列的知识,在查询语数英这三列的时候用到了子查询和主查询的关联保证了与其他列数据的关联性
- 请各位要注意对分组(Group by)的概念较为清晰,重点就在学生的ID:S#
- 行转列知识:http://www.cnblogs.com/kerrycode/archive/2010/07/28/1786547.html
select t.S# as '学生ID',
(select Score from SC where S#=t.S# and C#='002') as '语文',
(select Score from SC where S#=t.S# and C#='003') as '数学',
(select Score from SC where S#=t.S# and C#='004') as '英语',
COUNT(t.C#) as '有效课程数',
AVG(t.Score) as '有效平均分'
from SC t
group by t.S#
order by AVG(t.Score)
(19)按各科平均成绩从低到高和及格率的百分数从高到低顺序
- CASE WHEN *** THEN *** ELSE *** END 的使用
- 及格率SUM(PassedCounts)/COUNT(AllCounts)的计算
- 另外,这里[Percent(%)]可以使用100 * SUM(CASE WHEN ISNULL(sc.Score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*)替代。
SELECT sc.C#,c.Cname,AVG(sc.score) AS avgScore,100*SUM(CASE WHEN ISNULL(score,0)>=60 THEN 1 ELSE 0 END )/COUNT(*)
FROM dbo.Sc sc,dbo.Course c
WHERE sc.C#=c.C#
GROUP BY sc.C#,c.Cname
order BY AVG(sc.score)
(20)查询如下课程平均成绩和及格率的百分数(备注:需要在1行内显示): 企业管理(002),OO&UML (003),数据库(004)
这里也是涉及行转列的问题,由于列的数据都是相对独立的,也就没有关联子查询的的问题了
select
SUM(CASE WHEN C#='002' THEN Score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) as '企业管理平均分',
100 * SUM(CASE WHEN C#='002' and Score>=60 THEN 1 ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) as '企业管理及格百分比',
SUM(CASE WHEN C#='003' THEN Score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) as 'OO&UML平均分',
100 * SUM(CASE WHEN C#='003' and Score>=60 THEN 1 ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) as 'OO&UML及格百分比',
SUM(CASE WHEN C#='004' THEN Score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) as '数据库平均分',
100 * SUM(CASE WHEN C#='004' and Score>=60 THEN 1 ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) as '数据库及格百分比'
from SC
(24)查询学生平均成绩及其名次;
看似简单,名次这里其实不好弄。
- 首先使用group by获取需要的字段(学生ID,平均分)
- 然后这段sql需要再拿来新建并进行对比
select s.S#,s.Sname,T2.AvgScore,
(select COUNT(AvgScore) from
(select S#,AVG(Score) as 'AvgScore' from SC group by S#) as T1
where T2.AvgScore<T1.AvgScore)+1 as 'Rank'
from
(select S#,AVG(Score) as 'AvgScore' from SC
group by S#) as T2,
Student s
where s.S#=T2.S#
order by AvgScore desc
(25)查询各科成绩前三名的记录:(不考虑成绩并列情况)
- 建立子查询获取每科前三名,这里需要跟主查询进行关联,而关联的字段就是科目字段C#
- 主查询难度不大,查询条件包括分数区域在子查询的分数区域内并且主和子查询的科目进行关联
select sc.C#,c.Cname,sc.S#,s.Sname,sc.Score
from Student s,SC sc,Course c
where sc.C#=c.C# and sc.S#=s.S# and sc.Score in
(
select top 3 Score from SC sc2
where sc.C#=sc2.C#
Order by Score desc
)
order by sc.C#,sc.Score desc
以上就是我用纸张手写的时候遇到有难度的题目,希望能给各位一些参考。
【SQL重温】面试之数据库基础练习的更多相关文章
- SQL学习笔记之 数据库基础(一)
数据库基础 数据库系统的组成:由数据库,数据库管理软件,数据库管理员DBA,支持数据库系统的硬件和软件组成,其中数据库管理员是对数据库进行规划.设计.维护.和监视的专业管理人员,在数据库系统中起着非常 ...
- PHP面试 MySQL数据库基础
MySQL数据库基础 MySQL数据类型 整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT 属性:UNSIGNED 长度:可以为整数类型指定宽度,列 ...
- 走向面试之数据库基础:一、你必知必会的SQL语句练习-Part 1
本文是在Cat Qi的参考原帖的基础之上经本人一题一题练习后编辑而成,非原创,仅润色而已.另外,本文所列题目的解法并非只有一种,本文只是给出比较普通的一种而已,也希望各位园友能够自由发挥. 一.三点一 ...
- 走向面试之数据库基础:二、SQL进阶之case、子查询、分页、join与视图
一.CASE的两种用法 1.1 等值判断->相当于switch case (1)具体用法模板: CASE expression WHEN value1 THEN returnvalue1 WHE ...
- 走向面试之数据库基础:三、SQL进阶之变量、事务、存储过程与触发器
一.变量那点事儿 1.1 局部变量 (1)声明局部变量 DECLARE @变量名 数据类型 ) DECLARE @id int (2)为变量赋值 SET @变量名 =值 --set用于普通的赋值 SE ...
- 数据库基础SQL知识面试题一
数据库基础SQL知识面试题一 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如标题所示,本篇博客主要介绍基础知识的面试题.大家可以用来测试面试者的技术水平,由于个人水平所限,难免 ...
- SQL 必知必会-- 第1课:数据库基础和什么是SQL
第1课 了解SQL 1 1.1 数据库基础 11.2 什么是SQL 61.3 动手实践 71.4 小结 8 第一课主要是一些概念,具体笔记如下: 1,数据库(database):保存有组织的数据的容器 ...
- SQL 数据库基础语句
一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建备份 ...
- Sql Server数据库基础
--------------------------------------第一章 Sql Server数据库基础------------------------------------------ ...
随机推荐
- Bellman-Ford(BF)和Floyd算法
以下只是本人的笔记,想法我自己都怀疑,内容不作为参考, Floyd算法就比较暴力了,算法思想是三重循环,直接枚举所有的顶点,再两次for循环枚举所有点,验证以第一个点为中转点的两个点是否路径更短,具体 ...
- String字符串排序1.8 lamda表达式以及1.7自定义排序
// 1.8 public class text { public static void main(String[] args) { String s1 = "哈哈哈11,呵呵呵22,嘿嘿 ...
- selenium自动化测试用例需要关注的几点(二)
注:原文地址 UI映射 一个UI映射是一种机制,它存储所有的定位器的测试套件在一个地方,方便修改UI元素的路径标识符或改变在AUT.测试脚本,然后使用UI地图定位以被测试的元件.基本上,UI地图是一个 ...
- PaymentServlet代码
package ${enclosing_package}; import java.io.IOException; import java.util.ResourceBundle; import ja ...
- poj 3750 小孩报数问题
小孩报数问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11527 Accepted: 5293 Descripti ...
- Eclipse 常见问题总结
添加包 1.build path 直接添加 2.在windows-->preferences -> Java -> build path -> classpath variab ...
- PHP学习8——图像处理
主要内容: 加载GD库 创建图像 绘制点,线,矩形,多边形,椭圆,弧线 绘制文字 通过GD库生成验证码 其实吧,学习图像方法的最大作用,好像就是为了制作验证码. 所以此专题,不如叫做制作验证码. 1. ...
- nginx+nodejs+mysql+memcached服务器后台架设centos6.5
需要的下面四个工具最好都采用yum安装,不要采用编译安装的方法,因为编译安装会导致某些依赖关系丢失. nginx 作为HTTP和反向代理,处理静态页面,动态服务交由nodejs服务. nodejs作为 ...
- Nexus-NuGet私有仓库服务搭建(一)
搭建私有Nuget服务器的方式有很多,大多数人文章介绍在vs 中新建默认web项目,然后再Nuget 中安装 Nuget.Server,再部署到IIS 中即可.虽然能用,但是这种方式太过简陋,操作界面 ...
- Java 重写(Override)与重载(Overload)区别
2019-04-1217:31:19 (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading). (2)方法重写是在子 ...