学生表 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;