sql练习题

学生表 Student

create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10));
insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
insert into Student values('02' , '钱电' , '1990-12-21' , '男');
insert into Student values('03' , '孙风' , '1990-12-20' , '男');
insert into Student values('04' , '李云' , '1990-12-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吴兰' , '1992-01-01' , '女');
insert into Student values('07' , '郑竹' , '1989-01-01' , '女');
insert into Student values('09' , '张三' , '2017-12-20' , '女');
insert into Student values('10' , '李四' , '2017-12-25' , '女');
insert into Student values('11' , '李四' , '2012-06-06' , '女');
insert into Student values('12' , '赵六' , '2013-06-13' , '女');
insert into Student values('13' , '孙七' , '2014-06-01' , '女');

科目表 Course

create table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10));
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');

教师表 Teacher

create table Teacher(TId varchar(10),Tname varchar(10));
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');

成绩表 SC

create table SC(SId varchar(10),CId varchar(10),score decimal(18,1));
insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' , 50);
insert into SC values('04' , '02' , 30);
insert into SC values('04' , '03' , 20);
insert into SC values('05' , '01' , 76);
insert into SC values('05' , '02' , 87);
insert into SC values('06' , '01' , 31);
insert into SC values('06' , '03' , 34);
insert into SC values('07' , '02' , 89);
insert into SC values('07' , '03' , 98);

查询" 01 “课程比” 02 "课程成绩高的学生的信息及课程分数

select * from Student RIGHT JOIN (
    select t1.SId, class1, class2 from
          (select SId, score as class1 from sc where sc.CId = '01')as t1, 
          (select SId, score as class2 from sc where sc.CId = '02')as t2
    where t1.SId = t2.SId AND t1.class1 > t2.class2
)r 
on Student.SId = r.SId;

–查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩

SELECT * FROM student right JOIN
(
SELECT AVG(score) ,sid FROM sc GROUP BY SId
  HAVING AVG(score)>=60
)r
ON r.sid=student.SId;

查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )

select student.SId,student.Sname,r.cids,r.scores from student ,
(
SELECT sid,sum(cid) as cids,sum(score) as scores FROM sc GROUP BY sid  
)r
WHERE r.sid=student.SId;
select * from student RIGHT JOIN 
(
SELECT sid,sum(cid) ,sum(score)  FROM sc GROUP BY sid  
)r
on r.sid=student.SId;

查有成绩的学生信息
–去重函数 DISTINCT

select * from student WHERE EXISTS
(
 select distinct 'x' from sc where score is not NULL 
);

exists(xxxxx)后面的子查询被称做相关子查询, 他是不返回列表的值的.
只是返回一个ture或false的结果(这也是为什么子查询里是select 'x’的原因 当然也可以select任何东西) 也就是它只在乎括号里的数据能不能查找出来,是否存在这样的记录。

select * from student where sid in (
 select distinct sid from sc where score is not NULL 
);

当in和exists在查询效率上比较时,in查询的效率快于exists的查询效率,尽量使用in用作查出语句

查询「李」姓老师的数量

select count(*) from teacher  WHERE tname like '李%';

查询学过「张三」老师授课的同学的信息

SELECT * FROM student WHERE student.SId IN
(
SELECT SId FROM sc WHERE CId IN (
SELECT course.CId FROM course  WHERE TId in(
select teacher.tid from teacher  WHERE tname like '张三'
)));
SELECT student.*  from student ,course,teacher,sc,
(
select * from teacher  WHERE tname like '张三'
)r
WHERE r.TId=course.TId and course.cid=sc.cid and student.sId=sc.sid and course.tid = teacher.tid 
select student.* from student,teacher,course,sc
where 
    student.sid = sc.sid 
    and course.cid=sc.cid 
    and course.tid = teacher.tid 
    and tname = '张三';

查询没有学全所有课程的同学的信息

SELECT * FROM student WHERE
student.sid IN
(
SELECT  DISTINCT sid   from sc
WHERE
   sid not IN(
SELECT sid FROM sc GROUP BY sid
HAVING COUNT(cid)=3
)
)

查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息

SELECT * FROM student WHERE student.sid in(
select sc.SId from sc WHERE sc.CId in(
SELECT DISTINCT cid FROM sc
WHERE sc.SId='01'
)
);

查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息

SELECT * FROM student WHERE SId in
(
select sid from sc where sid<>'01' group by sid -- 取出不是01学生的cid 并排序 和 取出01学生的cid并排序 进行比较
having group_concat(cid ORDER BY cid) = (select group_concat(cid ORDER BY cid) from SC where sid = '01')
)

查询没学过"张三"老师讲授的任一门课程的学生姓名

SELECT student.Sname FROM student WHERE student.SId not IN
(
SELECT student.SId FROM teacher,course,sc,student
WHERE 
teacher.Tname='张三'
AND course.TId=teacher.TId
and sc.CId=course.CId
and sc.SId=student.SId
)

查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

 select sid from sc 
              where score<60 
              GROUP BY sid 
              HAVING count(score)>1
select student.SId, student.Sname,b.avg
from student RIGHT JOIN
(select sid, AVG(score) as avg from sc
    where sid in (
              select sid from sc 
              where score<60 
              GROUP BY sid 
              HAVING count(score)>1)
    GROUP BY sid) b on student.sid=b.sid;

检索" 01 "课程分数小于 60,按分数降序排列的学生信息

order by <列名> [ASC|DESC] ASC 升序 DESC 降序 
SELECT sid,score FROM sc
  where score<60
 AND cid='01'
  ORDER BY (score) desc

按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

select *  from sc 
left join (
    select sid,avg(score) as avscore from sc 
    group by sid
    )r 
on sc.sid = r.sid
order by avscore desc;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值