你必知必会的sql练习

    废话不多说;玩sql之前还是画一张关系图吧,便于更好的进行理解哈!

Part 1 练习题和参考解

(1)查询“001”课程比“002”课程成绩低的所有学生的学号、001学科成绩、002学科成绩

SELECT 
s1.StudentNo,
s1.score AS '001',
s2.score AS '002'
FROM
   score s1,
	 score s2
WHERE
  s1.CourseNo = 1
	AND
	s2.CourseNo = 2
	AND
	s1.score < s2.score
  order  BY s1.StudentNo	

(2)查询平均成绩大于60分的同学的学号和平均成绩

SELECT 
 s1.StudentNo,
 AVG(s1.score)
FROM 
  score s1
GROUP BY s1.StudentNo
HAVING 
  AVG(s1.score) > 60

3.查询所有同学的学号、姓名、选课数、总成绩

SELECT 
  s1.StudentNo,
	pe.`name`,
	COUNt(s1.CourseNo),
	SUM(s1.score)
FROM
 score s1 
LEFT JOIN student pe  on s1.StudentNo = pe.studentNo
GROUP BY s1.StudentNo

4.查询姓“李”的老师的个数


SELECT 
    COUNT(*)
FROM 
    teacher
where 
    `name` like '李%'

5.查询没学过“叶平”老师课的同学的学号、姓名

select 
  s1.`name`,
	s1.studentNo
from 
  student s1
where 
  s1.studentNo
not in 
(
  select 
	  sc.StudentNo
  from
      score sc,
	  course co,
	  teacher te
  where 
	  sc.courseNo = co.courseNo
  and 
      co.teacherNo = te.teacherNo
  and 
      te.name = '叶平'	 
)

6.查询学过“001”并且也学过编号“002”课程的同学的学号、姓名

select 
  s1.studentNo,
	s1.`name`
from 
  student s1,
	score sc
where 
   s1.studentNo = sc.StudentNo
	 and 
	sc.CourseNo in (1,2)
group by s1.studentNo
having count(*) = 2

或者:

SELECT
  s1.StudentNo,
  stu1.name
FROM
  score s1,
  student stu1
WHERE
  s1.StudentNo = stu1.StudentNo
  AND
  s1.CourseNo = 1
  AND
  s1.StudentNo IN
  (
  SELECT
    s2.StudentNo
  FROM
    score s2
  WHERE
    s2.CourseNo = 2
  )

7.查询学过“叶平”老师所教的所有课的同学的学号、姓名

#这个地方就是 根据课程主键值的不同,那摩他们的和也一定不相同,
#思路:查出叶平老师的课程的所有主键值和 如果和 学生所学的叶萍老师的逐渐和相等的话,就说明学了该老师的所偶课程
select 
  st.studentNo,
	st.name
from 
  score sc,
  student st,
  course  co,
	teacher te
where 
  sc.StudentNo = st.studentNo
	and 
	co.courseNo = sc.CourseNo
	and 
	te.teacherNo = co.teacherNo
	and 
	te.`name` = '叶平'
	GROUP BY
	sc.StudentNo
	
	having sum(sc.CourseNo) = 
	(
	  select 
	    sum(c2.courseNo)
		from
		 course c2,
		 teacher t2
		where 
	   c2.teacherNo = t2.teacherNo
		and 
	   t2.name = '叶平' 
	)
	
# 这个思路跟上面的一个类似,只不过是查询出叶平老师所教的数量之和 与 学生的所学课程之和 相同就代表学了该来时的所有课程
select 
  st.studentNo,
	st.name
from 
  score sc,
  student st,
  course  co,
	teacher te
where 
  sc.StudentNo = st.studentNo
	and 
	co.courseNo = sc.CourseNo
	and 
	te.teacherNo = co.teacherNo
	and 
	te.`name` = '叶平'
	GROUP BY
	sc.StudentNo
	having count(*) = 
	(
	  select 
	   count(*)
		from
		 course c2,
		 teacher t2
		where 
	   c2.teacherNo = t2.teacherNo
		and 
	   t2.name = '叶平' 
	)
	

今天先写这么多,后面再补上!!!!

参考: 非常感谢Dulk's Blog大佬的帮助 https://www.cnblogs.com/deng-cc/p/6515166.html

发布了74 篇原创文章 · 获赞 3 · 访问量 1945

猜你喜欢

转载自blog.csdn.net/qq_32565267/article/details/104920975