sql面试题详解1
2014-01-22 17:08
344 查看
sql语句面试或者笔试中经常出现,有时明明就只是一个简单的sql语句但是抓破脑袋还是写不出来,有时我觉得写sql语句还是需要一定的逻辑思维能力和分析问题的能力的。接下来看看这个题目
学生表student(学号,姓名,年龄,性别)
课程表course(课程编号,课程名称,授课教师编号)
成绩表score(学号,课程编号,成绩)
教师表teacher(教师编号,教师名称)
学生表结构如下:
课程表结构如下:
成绩表结构如下:
教师表结构如下:
下面开始第一个题目
1.查询"001"课程比“002”课程成绩高的所有学生的学号
这个题目乍一看还是比较难的,从这个题目提取到的关键字是成绩、学号,这2个字段都能从成绩表里取得,接下来就是拆分sql了,首先查询出001课程的所有学生成绩
Select studentnum,score From t_score Where coursenum='c001'
接下来查询出002课程的所有学生的成绩
Select studentnum,score From t_score Where coursenum='c002'
接下来就是条件了,首先需满足001课程的成绩比002课程成绩高,要达到这样的前提那么学号还要相同。到这里写出sql就不难了
2.查询平均成绩高于60分的同学的学号和平均成绩
这个题稍微简单些要用到的就是聚合函数、分组以及having的使用,首先求出每个学生的平均成绩
Select studentnum,avg(score) From t_score Group By studentnum
之后从这些记录中取出,平均成绩大于60的学生
Select studentnum,avg(score) From t_score Group By studentnum Having avg(score)>60
3.查询所有同学的学号、姓名、选课数、总成绩
这种主要是多表连接查询以及聚合函数、group by的使用,这里可以使用内连接查询或者左外连接查询
答案1:
答案2:
4.查询姓“李”的老师的个数
主要考察模糊查询和聚合函数的使用,这个题相对前面几个简单的不是一点点
Select Count(tname) From t_teacher Where tname Like '李%'
5.查询没学过“叶平”老师课的同学的学号、姓名
考察not in以及连接查询的使用,首先根据问题得知学生只有选课后才能知道选修了那些课程即成绩表、而要知道是否学过叶平老师的课程则还需要一个课程表,但此时只能得到教师编号所以还要关联教师表,最后把查询结果和学生表关联起来即可,sql如下所示
Select sname,studentnum From t_student Where studentnum Not In (Select distinct(A.studentnum) From t_score A,t_course B,t_teacher C Where A.coursenum=B.coursenum And B.teachernum=c.teachernum and C.tname='叶平')
接下来补充一点连接查询的知识
两个表的连接,是通过将一个表中的一列或者多列同另一个表中的列链接而建立起来的。用来连接两张表的表达式组成了连接条件。当连接成功后,第二张表中的数据就同第一张表连接起来了,并形成了复合结果集--包括两张表中数据行的计划。简单地说,就是两张表有了子集,虽然只是暂时的
有两者基本类型的的连接,inner和outer连接。两种类型的主要区别在于,即使是在连接条件不满足的情况下,外部连接也会在结果集内返回行,而内部连接不会在结果集类返回行
当外部连接不满足连接条件时,通常返回一个表中的列,但是第二个表中没有返回值--为null
(一)内连接
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的
列值。内连接分三种:
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结
果中列出被连接表中的所有列,包括其中的重复列。
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的
列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选
择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
(二) 外连接
外连接,返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左
外连接或左连接))、右表(右外连接或右连接)或两个边接表(全外连接)中的所有数据行。
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录;
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录;
例如1:SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
ON a.username=b.username
例如2:SELECT a.*,b.*
FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username
(三) 交叉连接
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到
结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查
询条件的数据行数。例,titles表中有6类图书,而publishers表中有8家出版社,则下
列交叉连接检索到的记录数将等于6*8=48行。
例如:SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY type
学生表student(学号,姓名,年龄,性别)
课程表course(课程编号,课程名称,授课教师编号)
成绩表score(学号,课程编号,成绩)
教师表teacher(教师编号,教师名称)
学生表结构如下:
课程表结构如下:
成绩表结构如下:
教师表结构如下:
下面开始第一个题目
1.查询"001"课程比“002”课程成绩高的所有学生的学号
这个题目乍一看还是比较难的,从这个题目提取到的关键字是成绩、学号,这2个字段都能从成绩表里取得,接下来就是拆分sql了,首先查询出001课程的所有学生成绩
Select studentnum,score From t_score Where coursenum='c001'
接下来查询出002课程的所有学生的成绩
Select studentnum,score From t_score Where coursenum='c002'
接下来就是条件了,首先需满足001课程的成绩比002课程成绩高,要达到这样的前提那么学号还要相同。到这里写出sql就不难了
Select A.studentnum From (Select studentnum,score From t_score Where coursenum='c001') A,(Select studentnum,score From t_score Where coursenum='c002') B Where A.studentnum=B.studentnum And A.score>B.score
2.查询平均成绩高于60分的同学的学号和平均成绩
这个题稍微简单些要用到的就是聚合函数、分组以及having的使用,首先求出每个学生的平均成绩
Select studentnum,avg(score) From t_score Group By studentnum
之后从这些记录中取出,平均成绩大于60的学生
Select studentnum,avg(score) From t_score Group By studentnum Having avg(score)>60
3.查询所有同学的学号、姓名、选课数、总成绩
这种主要是多表连接查询以及聚合函数、group by的使用,这里可以使用内连接查询或者左外连接查询
答案1:
Select B.studentnum,B.sname,count(A.coursenum),sum(A.score) From t_student B Left Outer Join t_score A On A.studentnum=B.studentnum Group By B.studentnum,B.sname
答案2:
Select B.studentnum,B.sname,count(A.coursenum),sum(A.score) From t_score A,t_student B Where A.studentnum=B.studentnum Group By B.studentnum,B.sname
4.查询姓“李”的老师的个数
主要考察模糊查询和聚合函数的使用,这个题相对前面几个简单的不是一点点
Select Count(tname) From t_teacher Where tname Like '李%'
5.查询没学过“叶平”老师课的同学的学号、姓名
考察not in以及连接查询的使用,首先根据问题得知学生只有选课后才能知道选修了那些课程即成绩表、而要知道是否学过叶平老师的课程则还需要一个课程表,但此时只能得到教师编号所以还要关联教师表,最后把查询结果和学生表关联起来即可,sql如下所示
Select sname,studentnum From t_student Where studentnum Not In (Select distinct(A.studentnum) From t_score A,t_course B,t_teacher C Where A.coursenum=B.coursenum And B.teachernum=c.teachernum and C.tname='叶平')
接下来补充一点连接查询的知识
两个表的连接,是通过将一个表中的一列或者多列同另一个表中的列链接而建立起来的。用来连接两张表的表达式组成了连接条件。当连接成功后,第二张表中的数据就同第一张表连接起来了,并形成了复合结果集--包括两张表中数据行的计划。简单地说,就是两张表有了子集,虽然只是暂时的
有两者基本类型的的连接,inner和outer连接。两种类型的主要区别在于,即使是在连接条件不满足的情况下,外部连接也会在结果集内返回行,而内部连接不会在结果集类返回行
当外部连接不满足连接条件时,通常返回一个表中的列,但是第二个表中没有返回值--为null
(一)内连接
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的
列值。内连接分三种:
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结
果中列出被连接表中的所有列,包括其中的重复列。
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的
列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选
择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
(二) 外连接
外连接,返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左
外连接或左连接))、右表(右外连接或右连接)或两个边接表(全外连接)中的所有数据行。
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录;
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录;
例如1:SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
ON a.username=b.username
例如2:SELECT a.*,b.*
FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username
(三) 交叉连接
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到
结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查
询条件的数据行数。例,titles表中有6类图书,而publishers表中有8家出版社,则下
列交叉连接检索到的记录数将等于6*8=48行。
例如:SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY type
相关文章推荐
- sql面试题详解
- sql面试题详解4
- sql面试题详解
- sql面试题详解2
- 关于mysql数据库中常用的面试题以及sql语句和关键字的详解!
- sql面试题详解3
- sql 面试题
- java面试题:string,stringbuffer详解(通过代码说明)
- 【状态保持】Cache 基于SQL 数据库 的缓存依赖 轮询机制详解
- PowerDesigner15在win7-64位系统下对MySQL 进行反向工程以及建立物理模型产生SQL语句步骤图文傻瓜式详解
- sql中的连接 join 实例详解
- SQL经典面试题及答案1
- SQL各种连接查询详解(左连接、右连接..)
- MS SQL Server:排名函数详解
- Spark源码系列(九)Spark SQL初体验之解析过程详解
- 关于几道SQL经典题详解
- sql类似面试题
- MyBatis的动态SQL详解
- 部分常见ORACLE面试题以及SQL注意事项
- mybatis 详解(五)------动态SQL