学生表 课程表 成绩表 教师表 50个常用sql语句
建表
Student(S#,Sname,Sage,Ssex) 学生表
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表
---- If database exists the same name datatable deletes it.
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Student') DROP TABLE Student;
---- Create TABLE
create table Student(S# varchar(20),Sname varchar(10),Sage int,Ssex varchar(2))
关于表的50问
-
查询”001”课程比”002”课程成绩高的所有同学的学号:
SELECT a.S#
FROM (
SELECT s#, score
FROM SC
WHERE C# = '001'
) a, (
SELECT s#, score
FROM SC
WHERE C# = '002'
) b
WHERE a.score > b.score AND a.s# = b.s#; -
查询平均成绩大于60分的同学的学号和平均成绩:
SELECT S#, avg(score)
FROM sc
GROUP BY S#
HAVING avg(score) > 60;通过GROUP BY子句,可以让SUM、COUNT、MAX、AVG等聚合函数对属于一组的是数据起作用.属于同一同学的成绩将只能返回一行值,其中除S#字段,其他字段通过聚合函数返回.
HAVING子句可以让我们筛选成组后的各组数据,WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前.而 HAVING子句在聚合后对组记录进行筛选。
-
查询”李”姓老师的个数:
SELECT count(DISTINCT (Tname))
FROM Teacher
WHERE Tname LIKE '李%';在表中可能包含重复值,关键字distinct用于返回唯一不同的值.distinct语句中select显示的字段只能是distinct指定的字段,其他字段是不可能出现的.
select distinct name, id from A
返回name+id不同的行 -
查询所有同学的学号、姓名、选课数、总成绩:
SELECT stu.S#, stu.Sname, COUNT(scs.C#), SUM(scs.score)
FROM Student stu
LEFT JOIN SC scs
ON stu.S# = scs.S#
GROUP BY stu.S#, stu.Sname- inner join,满足交换律,”A inner join B”和”B inner join A”是相等的
- left outer join,产生左表(Student)的完全集,右表(SC)匹配的则有值,没有匹配的则NULL值
- full outer join,产生左右表的全集,没有匹配的则NULL,满足交换律.
-
查询没选修”李明”老师课程的学生的学号与姓名:
SELECT stu.S#, stu.Sname
FROM Student stu
WHERE stu.S# NOT IN (
SELECT DISTINCT scs.S#
FROM SC scs, Course crs, Teacher tch
WHERE scr.C# = crs.C# AND tch.T# = crs.T# AND tch.Tname = '李明'
); -
查询各科成绩最高分与最低分:课程ID,最高分,最低分
参考资料: