SELECT
st.s_id,
st.s_name,count( sc.c_id )"选课总数",sum(CASEWHEN sc.s_score ISNULLTHEN0ELSE sc.s_score END)"总成绩"FROM
student st
LEFTJOIN score sc ON st.s_id = sc.s_id
GROUPBY
st.s_id
查询"墨"姓老师的数量
SELECT
t.t_name,count( t.t_id )FROM
teacher t
GROUPBY
t.t_id
HAVING
t.t_name LIKE"墨%";
查询学过"墨白"老师授课的同学的信息
SELECT
st.*FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
LEFTJOIN course c ON c.c_id = sc.c_id
LEFTJOIN teacher t ON t.t_id = c.t_id
WHERE
t.t_name ="墨白"
查询没学过"柠檬"老师授课的同学的信息
-- 柠檬老师教的课SELECT
c.*FROM
course c
LEFTJOIN teacher t ON t.t_id = c.t_id
WHERE
t.t_name ="柠檬"-- 有柠檬老师课成绩的st.s_idSELECT
sc.s_id
FROM
score sc
WHERE
sc.c_id IN(SELECT c.c_id FROM course c LEFTJOIN teacher t ON t.t_id = c.t_id WHERE t.t_name ="柠檬")-- 不在上面查到的st.s_id的学生信息,即没学过柠檬老师授课的同学信息SELECT
st.*FROM
student st
WHERE
st.s_id NOTIN(SELECT
sc.s_id
FROM
score sc
WHERE
sc.c_id IN(SELECT c.c_id FROM course c LEFTJOIN teacher t ON t.t_id = c.t_id WHERE t.t_name ="柠檬"))
查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
SELECT
st.*FROM
student st
INNERJOIN score sc ON sc.s_id = st.s_id
INNERJOIN course c ON c.c_id = sc.c_id
AND c.c_id ="01"WHERE
st.s_id IN(SELECT
st2.s_id
FROM
student st2
INNERJOIN score sc2 ON sc2.s_id = st2.s_id
INNERJOIN course c2 ON c2.c_id = sc2.c_id
AND c2.c_id ="02")-- 或者第二种SELECT
a.*FROM
student a,
score b,
score c
WHERE
a.s_id = b.s_id
AND a.s_id = c.s_id
AND b.c_id ='01'AND c.c_id ='02';
查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息
SELECT
st.*FROM
student st
INNERJOIN score sc ON sc.s_id = st.s_id
INNERJOIN course c ON c.c_id = sc.c_id
AND c.c_id ="01"WHERE
st.s_id NOTIN(SELECT
st2.s_id
FROM
student st2
INNERJOIN score sc2 ON sc2.s_id = st2.s_id
INNERJOIN course c2 ON c2.c_id = sc2.c_id
AND c2.c_id ="02")
查询没有学全所有课程的同学的信息
SELECT*FROM
student
WHERE
s_id NOTIN(SELECT
st.s_id
FROM
student st
INNERJOIN score sc ON sc.s_id = st.s_id
AND sc.c_id ="01"WHERE
st.s_id IN(SELECT st1.s_id FROM student st1 INNERJOIN score sc2 ON sc2.s_id = st1.s_id AND sc2.c_id ="02")AND st.s_id IN(SELECT st2.s_id FROM student st2 INNERJOIN score sc2 ON sc2.s_id = st2.s_id AND sc2.c_id ="03"))
查询至少有一门课与学号为"01"的同学所学相同的同学的信息
SELECTDISTINCT
st.*FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
WHERE
sc.c_id IN(SELECT
sc2.c_id
FROM
student st2
LEFTJOIN score sc2 ON sc2.s_id = st2.s_id
WHERE
st2.s_id ='01')
查询和"01"号的同学学习的课程完全相同的其他同学的信息
SELECT
st.*FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
GROUPBY
st.s_id
HAVING
group_concat( sc.c_id )=(SELECT
group_concat( sc2.c_id )FROM
student st2
LEFTJOIN score sc2 ON sc2.s_id = st2.s_id
WHERE
st2.s_id ='01')
查询没学过"默狐"老师讲授的任一门课程的学生姓名
SELECT
st.s_name
FROM
student st
WHERE
st.s_id NOTIN(SELECT
sc.s_id
FROM
score sc
INNERJOIN course c ON c.c_id = sc.c_id
INNERJOIN teacher t ON t.t_id = c.t_id
AND t.t_name ="默狐")
查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
SELECT
st.s_id,
st.s_name,avg( sc.s_score )FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
WHERE
sc.s_id IN(SELECT
sc.s_id
FROM
score sc
WHERE
sc.s_score <60OR sc.s_score ISNULLGROUPBY
sc.s_id
HAVINGCOUNT(1)>=2)GROUPBY
st.s_id
检索"01"课程分数小于60,按分数降序排列的学生信息
SELECT
st.*,
sc.s_score
FROM
student st
INNERJOIN score sc ON sc.s_id = st.s_id
AND sc.c_id ="01"AND sc.s_score <60ORDERBY
sc.s_score DESC-- 第二种SQLSELECT
st.*,
sc.s_score
FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
WHERE
sc.c_id ="01"AND sc.s_score <60ORDERBY
sc.s_score DESC
按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
SELECT
st.s_id,
st.s_name,avg( sc4.s_score )"平均分",
sc.s_score "语文",
sc2.s_score "数学",
sc3.s_score "英语"FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
AND sc.c_id ="01"LEFTJOIN score sc2 ON sc2.s_id = st.s_id
AND sc2.c_id ="02"LEFTJOIN score sc3 ON sc3.s_id = st.s_id
AND sc3.c_id ="03"LEFTJOIN score sc4 ON sc4.s_id = st.s_id
GROUPBY
st.s_id
ORDERBYavg( sc4.s_score )DESC-- 第二种SELECT
st.s_id,
st.s_name,(CASEWHENavg( sc4.s_score )ISNULLTHEN0ELSEavg( sc4.s_score )END)"平均分",(CASEWHEN sc.s_score ISNULLTHEN0ELSE sc.s_score END)"语文",(CASEWHEN sc2.s_score ISNULLTHEN0ELSE sc2.s_score END)"数学",(CASEWHEN sc3.s_score ISNULLTHEN0ELSE sc3.s_score END)"英语"FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
AND sc.c_id ="01"LEFTJOIN score sc2 ON sc2.s_id = st.s_id
AND sc2.c_id ="02"LEFTJOIN score sc3 ON sc3.s_id = st.s_id
AND sc3.c_id ="03"LEFTJOIN score sc4 ON sc4.s_id = st.s_id
GROUPBY
st.s_id
ORDERBYavg( sc4.s_score )DESC
SELECT
t.t_id,
t.t_name,
c.c_name,avg( sc.s_score )FROM
teacher t
LEFTJOIN course c ON c.t_id = t.t_id
LEFTJOIN score sc ON sc.c_id = c.c_id
GROUPBY
t.t_id
ORDERBYavg( sc.s_score )DESC
查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
SELECT
a.*FROM(SELECT
st.*,
c.c_id,
c.c_name,
sc.s_score
FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
INNERJOIN course c ON c.c_id = sc.c_id
AND c.c_id ="01"ORDERBY
sc.s_score DESCLIMIT1,2) a UNIONALLSELECT
b.*FROM(SELECT
st.*,
c.c_id,
c.c_name,
sc.s_score
FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
INNERJOIN course c ON c.c_id = sc.c_id
AND c.c_id ="02"ORDERBY
sc.s_score DESCLIMIT1,2) b UNIONALLSELECT
c.*FROM(SELECT
st.*,
c.c_id,
c.c_name,
sc.s_score
FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
INNERJOIN course c ON c.c_id = sc.c_id
AND c.c_id ="03"ORDERBY
sc.s_score DESCLIMIT1,2) c
SELECT
c.c_id,
c.c_name,((SELECTcount(1)FROM
score sc
WHERE
sc.c_id = c.c_id
AND sc.s_score <=100AND sc.s_score >80)/(SELECTcount(1)FROM
score sc
WHERE
sc.c_id = c.c_id
))"100-85",((SELECTcount(1)FROM
score sc
WHERE
sc.c_id = c.c_id
AND sc.s_score <=85AND sc.s_score >70)/(SELECTcount(1)FROM
score sc
WHERE
sc.c_id = c.c_id
))"85-70",((SELECTcount(1)FROM
score sc
WHERE
sc.c_id = c.c_id
AND sc.s_score <=70AND sc.s_score >60)/(SELECTcount(1)FROM
score sc
WHERE
sc.c_id = c.c_id
))"70-60",((SELECTcount(1)FROM
score sc
WHERE
sc.c_id = c.c_id
AND sc.s_score <=60AND sc.s_score >=0)/(SELECTcount(1)FROM
score sc
WHERE
sc.c_id = c.c_id
))"60-0"FROM
course c
ORDERBY
c.c_id
查询学生平均成绩及其名次
SET@i=0;SELECT
a.*,@i :=@i+1FROM(SELECT
st.s_id,
st.s_name,round((CASEWHENavg( sc.s_score )ISNULLTHEN0ELSEavg( sc.s_score )END),2)"平均分"FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
GROUPBY
st.s_id
ORDERBY
sc.s_score DESC) a
查询各科成绩前三名的记录
SELECT
a.*FROM(SELECT
st.s_id,
st.s_name,
c.c_id,
c.c_name,
sc.s_score
FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
INNERJOIN course c ON c.c_id = sc.c_id
AND c.c_id ='01'ORDERBY
sc.s_score DESCLIMIT0,3) a UNIONALLSELECT
b.*FROM(SELECT
st.s_id,
st.s_name,
c.c_id,
c.c_name,
sc.s_score
FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
INNERJOIN course c ON c.c_id = sc.c_id
AND c.c_id ='02'ORDERBY
sc.s_score DESCLIMIT0,3) b UNIONALLSELECT
c.*FROM(SELECT
st.s_id,
st.s_name,
c.c_id,
c.c_name,
sc.s_score
FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
INNERJOIN course c ON c.c_id = sc.c_id
AND c.c_id ='03'ORDERBY
sc.s_score DESCLIMIT0,3) c
查询每门课程被选修的学生数
SELECT
c.c_id,
c.c_name,count(1)FROM
course c
LEFTJOIN score sc ON sc.c_id = c.c_id
INNERJOIN student st ON st.s_id = c.c_id
GROUPBY
st.s_id
查询出只有两门课程的全部学生的学号和姓名
SELECT
st.s_id,
st.s_name
FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
INNERJOIN course c ON c.c_id = sc.c_id
GROUPBY
st.s_id
HAVINGcount(1)=2
查询男生、女生人数
SELECT
st.s_sex,count(1)FROM
student st
GROUPBY
st.s_sex
查询名字中含有"白"字的学生信息
SELECT
st.*FROM
student st
WHERE
st.s_name LIKE"%白%";
查询同名同性学生名单,并统计同名人数
SELECT
st.*,count(1)FROM
student st
GROUPBY
st.s_name,
st.s_sex
HAVINGcount(1)>1
查询1990年出生的学生名单
SELECT
st.*FROM
student st
WHERE
st.s_birth LIKE"1990%";
SELECT
st.s_id,
st.s_name,avg( sc.s_score )FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
GROUPBY
st.s_id
HAVINGavg( sc.s_score )>=85
查询课程名称为"数学",且分数低于60的学生姓名和分数
SELECT
st.s_id,
st.s_name,
sc.s_score
FROM
student st
INNERJOIN score sc ON sc.s_id = st.s_id
AND sc.s_score <60INNERJOIN course c ON c.c_id = sc.c_id
AND c.c_name ="数学"
查询所有学生的课程及分数情况
SELECT
st.s_id,
st.s_name,
c.c_name,
sc.s_score
FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
LEFTJOIN course c ON c.c_id = sc.c_id
ORDERBY
st.s_id,
c.c_name
查询任何一门课程成绩在70分以上的姓名、课程名称和分数
SELECT
st2.s_id,
st2.s_name,
c2.c_name,
sc2.s_score
FROM
student st2
LEFTJOIN score sc2 ON sc2.s_id = st2.s_id
LEFTJOIN course c2 ON c2.c_id = sc2.c_id
WHERE
st2.s_id IN(SELECT
st.s_id
FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
GROUPBY
st.s_id
HAVINGmin( sc.s_score )>=70)ORDERBY
s_id
查询不及格的课程
SELECT
st.s_id,
c.c_name,
st.s_name,
sc.s_score
FROM
student st
INNERJOIN score sc ON sc.s_id = st.s_id
AND sc.s_score <60INNERJOIN course c ON c.c_id = sc.c_id
查询课程编号为01且课程成绩在80分以上的学生的学号和姓名
SELECT
st.s_id,
st.s_name,
sc.s_score
FROM
student st
INNERJOIN score sc ON sc.s_id = st.s_id
AND sc.c_id ="01"AND sc.s_score >=80
求每门课程的学生人数
SELECT
c.c_id,
c.c_name,count(1)FROM
course c
INNERJOIN score sc ON sc.c_id = c.c_id
GROUPBY
c.c_id
查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩
SELECT
st.*,
c.c_name,
sc.s_score,
t.t_name
FROM
student st
INNERJOIN score sc ON sc.s_id = st.s_id
INNERJOIN course c ON c.c_id = sc.c_id
INNERJOIN teacher t ON t.t_id = c.t_id
AND t.t_name ="墨白"ORDERBY
sc.s_score DESCLIMIT0,1
查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
SELECT
st.s_id,
st.s_name,
sc.c_id,
sc.s_score
FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
LEFTJOIN course c ON c.c_id = sc.c_id
WHERE(SELECTcount(1)FROM
student st2
LEFTJOIN score sc2 ON sc2.s_id = st2.s_id
LEFTJOIN course c2 ON c2.c_id = sc2.c_id
WHERE
sc.s_score = sc2.s_score
AND c.c_id != c2.c_id
)>1
查询每门功成绩最好的前两名
SELECT
a.*FROM(SELECT
st.s_id,
st.s_name,
c.c_name,
sc.s_score
FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
INNERJOIN course c ON c.c_id = sc.c_id
AND c.c_id ="01"ORDERBY
sc.s_score DESCLIMIT0,2) a UNIONALLSELECT
b.*FROM(SELECT
st.s_id,
st.s_name,
c.c_name,
sc.s_score
FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
INNERJOIN course c ON c.c_id = sc.c_id
AND c.c_id ="02"ORDERBY
sc.s_score DESCLIMIT0,2) b UNIONALLSELECT
c.*FROM(SELECT
st.s_id,
st.s_name,
c.c_name,
sc.s_score
FROM
student st
LEFTJOIN score sc ON sc.s_id = st.s_id
INNERJOIN course c ON c.c_id = sc.c_id
AND c.c_id ="03"ORDERBY
sc.s_score DESCLIMIT0,2) c
-- 借鉴(更准确,漂亮):SELECT
a.s_id,
a.c_id,
a.s_score
FROM
score a
WHERE(SELECTCOUNT(1)FROM score b WHERE b.c_id = a.c_id AND b.s_score >= a.s_score )<=2ORDERBY
a.c_id