欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

数据库sql语句常见面试题

程序员文章站 2022-06-21 22:20:05
转载:本文转载自:https://blog.csdn.net/woshinidedege/article/details/78659202 一.有以下几张表及表结构Student(Sid,Sname,Sage,Ssex) 学生表Course(Cid,Cname,Tid) 课程表SC(Sid,Cid, ......

转载:本文转载自:https://blog.csdn.net/woshinidedege/article/details/78659202

一.有以下几张表及表结构
student(sid,sname,sage,ssex) 学生表
course(cid,cname,tid) 课程表
sc(sid,cid,score) 成绩表
teacher(tid,tname) 教师表
题目:
1.查询“某1”课程比“某2”课程成绩高的所有学生的学号;
select a.sid from(select sid,score from sc where cid=1) a,  (select sid,score from sc where cid=3) b where a.score>b.score and a.sid = b.sid;
2.查询平均成绩大于60分的同学的学号和平均成绩;
select  sid ,avg(score)from sc group by sid having avg(score)>60;
3.查询所有同学的学号、姓名、选课数、总成绩
select student.sid,student.sname,count(sc.cid) ,sum(score)from student left outer join sc on student.sid=sc.cid group by student.sid,sname;
4.查询姓“李”的老师的个数;
select count(teacher.tid)from teacher where teacher.tname like "李";
5.查询没学过“叶平”老师课的同学的学号、姓名;
select student.sid,student.sname from student where sid not in(select  distinct(sc.sid) from sc,course,teacher where sc.cid = course.cid and teacher.tid=course.tid and teacher.tname = '和平' );
distinct:去重复
6.查询学过“```”并且也学过编号“```”课程的同学的学号、姓名;
select a.sid,a.sname from(select student.sname,student.sid from student,course,sc where cname='数学'and sc.sia=student.sid and sc.cid = course.cid) a ,
                                       (select student.sname,student.sid from student,course,sc where cname='毛概' and sc.sid = student.sid and sc.cid=course.cid) b where a.sid=b.sid;
7.查询学过“叶平”老师所教的所有课的同学的学号、姓名;
//select a.sid,a.sname from(select student.sid,student.sname from student,teacher,course,sc where teacher.tname='叶平'and teacher.tid=course.tid and course.cid=sc.cid andstudent.sid=sc.sid)a;
                                  
select  sid,sname from student where sid in (select sid from sc,course,teacher where sc.cid=course.cid and teacher.tid=course.tid and teacher.tname = '叶平' grop by sid having
count (sc.cid)=(select count(cid) from course,teacher where teacher.tid = course.tid and tname=‘叶平))                                     
8.查询课程编号“”的成绩比课程编号“”课程低的所有同学的学号、姓名;
select sid,sname from(select student.sid,student.sname,score,
(select score from sc sc_2 where sc_2.sid=student.sid and sc_2.cid=1) score2 from student,sc
where student.sid=sc.sid and cid=1 )s_2 where score2<score;
9.查询所有课程成绩小于60分的同学的学号、姓名;
select sid,sname from student where sid not in (select student.sid from student,sc where student.sid=sc.sid and score>60);
10.查询没有学全所有课的同学的学号、姓名;
select student.sid,student.sname  from student,sc  
where student.sid=sc.sid group by  student.sid,student.sname having count(cid) <(select count(cid) from course);
11.查询至少有一门课与学号为“”的同学所学相同的同学的学号和姓名;

12.查询至少学过学号为“”同学所有一门课的其他同学学号和姓名;

13.把“sc”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;
update sc set score=(select avg(score) from sc,course,teacher where course.cid=sc.cid and course.tid=teacher.tid and teacher.tname='杨巍巍')
14.查询和“”号的同学学习的课程完全相同的其他同学学号和姓名;
select sid from sc where cid in (select cid from sc where sid=6) group by sid having count(*)=(select count(*) from sc where sid=6);
15.删除学习“叶平”老师课的sc表记录;?
delete from sc s where s.cid in (select c.cid from teacher t,course c where t.tid = c.tid and tname='叶平')
16.向sc表中插入一些记录,这些记录要求符合以下条件:没有上过编号“”课程的同学学号、课程的平均成绩;
insert into sc select sid,2,(select avg(score) from sc where cid=2) from student where sid not in (select sid from sc where cid=2);
17.按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示:学生id,,数据库,企业管理,英语,有效课程数,有效平均分;
18.查询各科成绩最高和最低的分:以如下形式显示:课程id,最高分,最低分;
19.按各科平均成绩从低到高和及格率的百分数从高到低顺序
20.查询每门课程被选修的学生数
select sc.cid,count(sc.sid) from sc,course where sc.cid=course.cid group by sc.cid
21.查询出只选修了一门课程的全部学生的学号和姓名
select sc.sid,student.sname,count(cid) as 选课数 from sc ,student  
where sc.sid=student.sid group by sc.sid ,student.sname having count(cid)=1;
22.查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
select cid,avg(score) from sc group by cid order by avg(score),cid desc ;
23.查询不及格的课程,并按课程号从大到小排列?
select cid,sid from sc where score <60 order by cid
24.查询课程编号为且课程成绩在60分以上的学生的学号和姓名;
select student.sid,student.sname from sc,student where sc.cid=1 and sc.score>60 and sc.sid=student.sid
25.查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩
select student.sname,sc.score from sc,student,teacher,course c where teacher.tname='李子'
and teacher.tid=c.tid and c.cid=sc.cid and sc.sid=student.sid and sc.score=(select max(score)from sc where sc.cid=c.cid)
26.查询各个课程及相应的选修人数
select sc.cid ,count(sc.sid)from sc,student where sc.sid=student.sid group by sc.cid
27.查询每门功成绩最好的前两名
28.统计每门课程的学生选修人数(超过人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列
select sc.cid,count(sc.cid)from sc,course where sc.cid=course.cid group by sc.cid  order by sc.cid desc
29.检索至少选修两门课程的学生学号
select sid from  sc group  by  sid having  count(*)  >  =  2  
30.查询没学过“叶平”老师讲授的任一门课程的学生姓名
select distinct sid from sc where sid not in(select sc.sid from sc,course,teacher where sc.cid=course.cid and course.tid=teacher.tid and
teacher.tname='杨巍巍')
31.查询两门以上不及格课程的同学的学号及其平均成绩
32.检索“”课程分数小于90,按分数降序排列的同学学号
select sc.sid from sc,course where sc.cid=course.cid and course.cname='java' and sc.score<90
33.删除“”同学的“”课程的成绩
delete from sc where sid=1 and cid=1
二.下面的题目和上面的表没有任何关系
34、列出全部学生的信息。
35、列出软件专业全部学生的学号及姓名。
36、列出所有必修课的课号。
37、求1号课成绩大于80分的学生的学号及成绩,并按成绩由高到低列出。
38、列出非软件专业学生的名单。
39、查询成绩在70~80分之间的学生选课得分情况
不在此范围内的查询:(注意写出和以下语句等价的语句)
40、列出选修1号课或3号课的全体学生的学号和成绩。  
简答题
(一).什么是事务?事务的提交和回滚什么意思?
答:
a>事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。
事务具有四个特征:原子性( atomicity )、一致性( consistency )、隔离性(isolation )和持续性( durability )。
事务是为了保证对同一数据表操作的一致性。
即多条语句放在事务中执行的时候,要么一起成功,要么全不成功。我的理解:数据库中的事务就是需要捆绑在一起执行的操作集合,他们应不能被部分的完成。
b>事务提交是提交事务的所有操作:具体来说就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中,事务正常结束;
c>事务回滚是数据库返回到事务开始的状态:事务在运行过程中发生某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的更新操作全部撤销,使数据库回滚到事务开始时的状态。
(二)、sql语句应该考虑哪些安全性?()https://www.cnblogs.com/usa007lhy/p/5976673.html
(1)少使用root账户,应该为不同的动作分配不同的账户;
(2)sql执行出错后,不能把数据库中显示的出错信息,直接展示给用户。防止泄露服务器和数据库相关信息;
(3)防止sql注入,对特殊字符进行转义、过滤或者使用预编译的sql语句绑定变量。
(三)、简单描述mysql中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响。
--索引是一种特殊的文件(innodb数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
--普通索引(由关键字key或index定义的索引)的唯一任务是加快对数据的访问速度。
--普通索引:允许被索引的数据列包含重复的值,如果能确定某个数据列只包含彼此各不相同的值,在为这个数据索引创建索引的时候就应该用关键字uniqe把它定义为一个唯一所以,唯一索引可以保证数据记录的唯一性。
--主键:一种特殊的唯一索引,在一张表中只能定义一个主键索引,逐渐用于唯一标识一条记录,是用关键字primary key来创建。
--索引可以覆盖多个数据列,如像index索引,这就是联合索引。
--索引可以极大的提高数据的查询速度,但是会降低插入删除更新表的速度,因为在执行这些写操作时,还要操作索引文件。    
(四)、一张表,里面有id自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把mysql重启,再insert一条记录,这条记录的id是18还是15 ?
如果表的类型是myisam,那么是18。
因为myisam表会把自增主键的最大id记录到数据文件里,重启mysql自增主键的最大id也不会丢失。
如果表的类型是innodb,那么是15。
innodb表只是把自增主键的最大id记录到内存中,所以重启数据库或者是对表进行optimize操作,都会导致最大id丢失。
(五)、请简述项目中优化sql语句执行效率的方法,从哪些方面。sql语句性能如何分析?(https://www.cnblogs.com/coderchuanyu/p/4065434.html)
(1).尽量选择较小的列
(2).将where中用的比较频繁的字段建立索引
(3).select子句中避免使用‘*’
(4).避免在索引列上使用计算,not,in和<>等操作
(5).当只需要一行数据的时候使用limit 1
(6).保证表单数据不超过200w,适时分割表
  针对查询较慢的语句,可以使用explain来分析该语句具体的执行情况
(六)、myisam和innodb各有哪些特性?分别适用在怎样的场景下?(https://blog.csdn.net/aaa123524457/article/details/54375341)
 主要区别:
    1).myisam是非事务安全型的,而innodb是事务安全型的。
    2).myisam锁的粒度是表级,而innodb支持行级锁定。
    3).myisam支持全文类型索引,而innodb不支持全文索引。
    4).myisam相对简单,所以在效率上要优于innodb,小型应用可以考虑使用myisam。
    5).myisam表是保存成文件的形式,在跨平台的数据转移中使用myisam存储会省去不少的麻烦。
    6).innodb表比myisam表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename type=innodb)。
应用场景:
    1).myisam管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的select查询,那么myisam是更好的选择。
    2).innodb用于事务处理应用程序,具有众多特性,包括acid事务支持。如果应用中需要执行大量的insert或update操作,则应该使用innodb,这样可以提高多用户并发操作的性能。
(七)、在创建和使用索引时,有哪些要注意的地方,有什么规则?
 
a.:使用索引的注意事项
使用索引时,有以下一些技巧和注意事项:
1.索引不会包含有null值的列
只要列中包含有null值都将不会被包含在索引中,复合索引中只要有一列含有null值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为null。
2.使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和i/o操作。
3.索引列排序
mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
4.like语句操作
一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
5.不要在列上进行运算
select * from users where year(adddate)<2007;
将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:
select * from users where adddate<‘2007-01-01';
6.不使用not in和<>操作。
b.:sql优化原则
常见的简化规则如下:
1).不要有超过5个以上的表连接(join)
2).考虑使用临时表或表变量存放中间结果。
3).少用子查询
4).视图嵌套不要过深,一般视图嵌套不要超过2个为宜。
5).连接的表越多,其编译的时间和连接的开销也越大,性能越不好控制。
6).最好是把连接拆开成较小的几个部分逐个顺序执行。
7).优先执行那些能够大量减少结果的连接。
8).拆分的好处不仅仅是减少sql server优化的时间,更使得sql语句能够以你可以预测的方式和顺序执行。

(八),请简洁地描述下mysql中innodb支持的四种事务隔离级别名称,以及逐级之间的区别?
1.innodb支持事物,而myisam不支持事物
2.innodb支持行级锁,而myisam支持表级锁
3.innodb支持mvcc, 而myisam不支持
4.innodb支持外键,而myisam不支持
5.innodb不支持全文索引,而myisam支持。
6.innodb不能通过直接拷贝表文件的方法拷贝表到另外一台机器, myisam 支持
7.innodb表支持多种行格式, myisam 不支持
8.innodb是索引组织表, myisam 是堆表