http://www.cnblogs.com/linhaifeng/articles/7895711.html   (egon@5565487)

1 查询所有的课程的名称以及对应的任课老师的姓名

use db01;
select course.cname,teacher.tname from course
inner join  一旦两张表建立了链接,第一个select 就可以用第二张表的字段了
teacher
on
course.cid=teacher.tid  两张表建立链接的条件

 2 查询学生表中男女各有多少人

use db01;
select gender,count(1) count_gender from student group by gender;

 3 查询物理成绩等于100的学生的姓名

select sname from student
where 
student.sid in ( select student_id from score inner join course on score.course_id=course.cid where course.cname="物理" and score.num=100 )

 4 查询所有学生的学号,姓名,选课数,总成绩(注意,对于那些没有选修任何课程的学生也算在内)

select sid,sname,t1.course_num,t1.total_num from student
left join
(select student_id,count(course_id) course_num,sum(num) total_num from score
group by student_id) as t1
on
student.sid=t1.student_id

 5 查询平均成绩大于80分的同学的姓名和平均成绩

select sname,t1.avg_num from student
inner join
(
select student_id,avg(num) avg_num from score group by student_id
having avg(num)>80
) as t1
on 
student.sid=t1.student_id

 6 查询姓李的老师的个数

select count(tid) from teacher 
where
 tname like "李%"

7 查询没有报李平老师课的学生姓名(找出报名李平老师课程的学生,然后取反就可以了)

select sname from student
where 
student.sid not in
(
select distinct student_id from score
where
score.course_id in
(
select cid from course
inner join
teacher
on 
course.teacher_id=teacher.tid
where
teacher.tname="李平老师"
)
)

 8 查询物理课程比生物课程高的学生的学号(分别得到物理成绩表与生物成绩表,然后连表即可)

select t1.student_id from
(
select student_id,num from score
inner join
 course
 on
 score.course_id=course.cid
 where course.cname="物理"
 ) as t1
 inner join
 (
select student_id,num from score
inner join
 course
 on
 score.course_id=course.cid
 where course.cname="生物"
 ) as t2
 on
 t1.student_id=t2.student_id
 where
 t1.num>t2.num

 9 查询没有同时选修物理课程和体育课程的学生姓名

(没有同时选修指的是选修了一门的,思路是得到物理+体育课程的学生信息表,然后基于学生分组,统计count(课程)=1)

select sname from student
where student.sid in
(
select student_id from score
where
score.course_id in
(
select student_id from course
where
cname="物理" or
cname="体育"
)
group by student_id
having
count(course_id)=1
)

 10 查询挂科超过两门,包括两门的学生姓名和班级

(思路:求出<60表,然后对学生进行分组,统计课程数目>=2)

select sname,class.caption from student
inner join
(
select student_id from score
where num<60
group by student_id
having
count(course_id)>=2
) as t1
inner join
class
on
student.sid=t1.student_id
and 
student.class_id=class.cid

 11 查出选修了所有课程的学生姓名

(思路:先从course表统计课程的总数,然后基于score表按照student_id分组,统计课程数据等于课程总数即可)

select sname from student
where
student.sid in
( 
select student_id from score
group by student_id
having
count(course_id)=(select  count(cid) from course)
)

 12 查询李平老师 的课程的所有成绩记录

select * from score
where course_id in
(select cid from course
inner join
teacher
on course.teacher_id=teacher.tid
where teacher.tname="李平老师")

 13 查询全部学生都选修了的课程号和课程名

(思路:取所有学生数,然后基于score表的课程分组,找出count(studnet_id)等于学生数即可)

SELECT
    cid,
    cname
FROM
    course
WHERE
    cid IN (
        SELECT
            course_id
        FROM
            score
        GROUP BY
            course_id
        HAVING
            COUNT(student_id) = (
                SELECT
                    COUNT(sid)
                FROM
                    student
            )
    );

 14 查询只选修了一门课程的学生姓名和学号

select sid,sname from student
where student.sid
in
(
select student_id from  score
group by student_id
having
count(course_id)=1
)

 15 查询每门课程被选修的次数

select count(student_id),course_id from score
group by course_id

 16 查询所有学生考出的成绩并按照从高到低排序(成绩去重)

select distinct num from score
order by num desc

 17 查询平均成绩大于85的学生姓名和平均成绩

select sname,avg_num from student
inner join
(
select student_id,avg(num) avg_num from score
group by student_id
having avg(num)>85
) as t1
on student.sid=t1.student_id