首先要鸣谢 gdicebird 为我讲解左外连接、右外连接、内连接诸多连接和Group BY的意思,虽说一时半会并不能茅塞顿开, 但我自己会加把劲把他捅开.
Question 1. 假如说有四个表,分别是学生表、成绩表、课程表、教师表, 具体结构如下:Copy语言代码 ...
首先要鸣谢 gdicebird 为我讲解左外连接、右外连接、内连接诸多连接和Group BY的意思,虽说一时半会并不能茅塞顿开, 但我自己会加把劲把他捅开.
什么是左外连接呢?
Question 1. 假如说有四个表,分别是学生表、成绩表、课程表、教师表, 具体结构如下:
Copy
语言代码:
Student(S#,Sname,Sage,Ssex) 学生表
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表
现在要求出 学生学号 姓名 选课数 总成绩
Copy
语言代码:
SELECT a.S#,a.Sname,COUNT(b.C#) AS Courses,SUM(b.score) AS Scores
FROM Student AS a
LEFT OUTER JOIN SC AS b
ON Student.S# = SC.S#
GROUP BY a.S#,Sname
分析一下这条
语句Copy
语言代码:
select a.S#,a.Sname,count(b.C#) as Courses, sum(b.score) as Scores
这句话的意思就是要得出一个学生学号 姓名 选课数 总成绩的结果集. as在这里可以用 "="来代替,也就是把count(b.c#)赋给Course, sum(b.score)赋给Scores
重头戏来了
LEFT OUTER JOIN 左外连接(意思就是把左边表与右边的行相同值都显示,另外左边表的值都会显示)
不管是否与 SC表的 S# 列相匹配,LEFT OUTER JOIN 都会在结果中包括 Student 表的所有行。请注意,对于结果中没有匹配的产品审核 ID 的产品,行的 SC.S# 列中则包含一个空值。
Question 2.
查询姓“李”的老师的个数
Copy
语言代码:
Student(S#,Sname,Sage,Ssex) 学生表
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表
Select Count(DISTINCT(Tname)) FROM Teacher Where Tname LIKE "李%";
其实这里我一直都不明白DISTINCT为什么要用在这里
DISTINCT
对指定的集求值,
删除该集中的重复元组,然后返回结果集。
其实我觉得这里不应该删除重复的值,一个大学校应该会有重名的老师
Question 3 查询“001”课程比“002”课程成绩高的所有学生的学号
Student(S#,Sname,Sage,Ssex) 学生表
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表
这个问题我之前也是想了很久,我在想应该怎么查,后来看了别人写的,这里用得是子查询. 我才知道
应该先一步步查,然后再联合. 不过这只是对我像这样的Newbie来说.
下面就用我的想法来写
First 查询出001课程成绩的学生和成绩 SELECT S#,score FROM SC WHERE C# = '001'
Second 查询出002课程成绩的学生和成绩 SELECT S#,score FROM SC WHERE C# = '002'
Next 根据1和的查询来比较查询001高于002成绩的学生学号
Copy
语言代码:
SELECT a.S# FROM (SELECT S#,score FROM SC WHERE C# ='001') AS a, (SELECT S#,score FROM SC WHERE C# = '002') AS b
WHERE a. score>b.score and a.S# = b.S#
Question 4 查询没学过“叶平”老师课的同学的学号、姓名;
Copy
语言代码:
SELECT S#,Sname
FROM Student WHERE S# not in (SELECT DISTINCT(SC.S#) FROM SC,Course,Teacher
WHERE SC.C# = Course.C# and Teacher.T# = Course.T# and Teacher Tname = '叶平');
-- 分析一下
Copy
语言代码:
SELECT DISTINCT (SC.S#) FROM SC,Course,Teacher WHERE SC.C# = Course.C#and Teacher.T# = Course.T# and Teacher Tname = '叶平'; //这个语句用到了where连接查询.主要是得出学过叶平老师课程学生的学号.
SELECT S#,Sname FROM Student //查询Student表中的学生学号与姓名
not in 关键字则表示不在某个集中
Question 5 查询平均成绩大于60分的同学的学号和平均成绩;
Copy
语言代码:
SELECT S#,AVG(score) as 'AverageCore'
FROM SC
GROUP BY S# HAVING AVG(SCORE) > 60
今天就整了这几条语句.感觉不怎么样。