SELECT SName,SBir FROM Student WHERE SSex='男'AND SBir BETWEEN'1984-01-01'AND'1985-12-31'
查询0004部门、0005部门和0006部门的职工的信息。
1 2
SELECT * FROM Teacher WHERE DNo IN('0004','0005','0006')
查询学号为03004的同学正在学习的课程。
1 2 3
SELECT CNo FROM SC WHERE SNo='0304'
查询姓“要”的同学的信息。
1 2 3
SELECT * FROM Student_X01814031 WHERE SName LIKE'要%'
ORDER BY关键字
查询所有职工的工号,年龄,并按照年龄从小到大的顺序进行排列
1 2 3
SELECT TNo,TAge FROM TEACHER ORDERBY AGE
查询学生某门课(如00005)的成绩,并按成绩由高到低的顺序输出
1 2 3 4
SELECT Score FROM SC WHERE CName='00005' ORDERBY Score DESC
查询职工的年薪,并按年薪的升序排列
1 2 3
SELECT TName,sal*12 FROM TEACHER OREDER BY2
查询所有职工信息,被部门号的降序排列,再部门相同的情况下,按照年龄的升序排列
1 2 3
SELECT * FROM TEACHER ORDERBY DNo DESC,Age
查询中聚合函数应用
统计职工的工资总额
1 2
SELECTSUM(sal) FROM TEACHER
统计职工的工资总额,并显示每个职工的工资情况。
1 2 3 4 5 6
显示每个职工的工资情况。 SELECT TNo,sal FROM TEACHER ORDERBY TNo 统计职工的工资总额 COMPUTESUM(sal)
统计职工的工资总额,并显示每个职工的工资情况及各部门的工资总额。
1 2 3 4
SELECT TNo,sal FROM TEACHER ORDERBY DNo,TNo COMPUTESUM(sal) BY DNo
求职工的最高工资,最低工资和平均工资
1 2
SELECTMAX(sal),MIN(sal),AVG(sal) FROM TEACHER
求男学生的学生总数
1 2 3
SELECT COUNT(*) FROM STUDENT WHERE Ssex='男'
查询有多少学生的数学课成绩小于99
1 2 3
SELECTCOUNT(SNo) FROM SC,COURSE WHERE COURSE.SNo=STUDENT.SNo AND COURSE.CName='数学'AND COURSE.Score<09
查询中分组统计GROUP BY
求每个班学生的人数
CLno:班级
1 2 3
SELECT CLno,COUNT(*)'COUNT(*)' FROM STUDENT GROUPBY CLno
查询每个学生已获得的学分
CCredits:学分
1 2 3 4
SELECT SNo,SUM(CCredits) FROM SC,COURSE WHERE SCORE>60AND SC.CNo=COURSE.CNo GROUPBY SNO
HAVING字句
使用HAVING字句查询学分大于8的学生,并输出学生的学号和学分
1 2 3 4 5
SELECT SNo,SUM(CCredit) FROM SC,COURSE WHERE SC.SCORE>60AND SC.CNo=COURSE.CNo GROUPBY SNO HAVINGSUM(CCredits)>8 //大于8的留下
基本连接操作
查询选修了语文课程的学生
原来的方法:
1 2 3
SELECT SNO FROM SC,COURSE WHERE SC.CNo=COURSE.CNO AND COURSE.CName='语文'
也可以用连接操作:
1 2 3
SELECT A.SNo FROM SC AS A,COURSE AS B WHRER A.CNo=B.CNo AND CName='语文'
查询电路基础成绩不及格的学生名单(输出学生的学号、姓名及成绩)
1 2 3
SELECT STUDENT.SNo,STUDENT.SName,SC.Score FROM SC,STUDENT WHERE STUDENT.CNo=SC.Cno AND SC.SCore<60AND SC.SName='基础电路'
内连接操作
查询每个学生及其选修课程的情况,并且输出其学号、姓名、所选课程号及分数
1 2 3
SELECT A.SNo,A.SName,B.CNo,B.Score FROM STUDENT A INNERJOIN SC B ON A.SNo=B.SNo
查询每个学生及其选修课程的情况,输出其学号、姓名、所选课程号及分数,并且按“学号”的降序排列
1 2 3 4
SELECT A.SNo,A.SName,B.CNo,B.Score FROM STUDENT A INNERJOIN SC B ON A.SNo=B.SNo ORDERBY A.SNo DESC
查询在数字逻辑课之后,还有哪些课被选修(按课程编号排序)
1 2 3
SELECT B.CNo FROM COURSE A INNERJOIN SC B ON B.CNo>A.CNo AND A.CName='数字逻辑'
外连接操作
显示目前还没学生报道的班级
1 2 3 4
SELECT CLname FROM STUDENT A RIGHTOUTERJOINCLASS B ON A.CLno=B.CLno WHERE SNo ISNULL
查询每个学生及选修课程的情况,并比较如下两条命令的执行结果
1 2 3
SELECT A.*,B.* FROM STUDENT A LEFTOUTERJOIN SC B ON A.SNo=B.SNo
1 2 3
SELECT Student.*,SC.* FROM Student,SC WHERE Student.SNo=SC.SNo
联合查询
1 2
SELECT SNo FROM SC,COURSE WHERE CName='英语'
联合查询UNION
两种不同的用法是UNION和UNION ALL,区别在于UNION从结果集中删除重复的行。如果使用UNION ALL 将包含所有行并且将不删除重复的行。
UNION和UNION ALL的区别:
union 检查重复
union all 不做检查
比如select ‘a’ union select ‘a’ 输出就是一行 a
比如select ‘a’ union all select ‘a’ 输出就是两行 a
查询当前至少上着数学和英语其中一门课的学生
1 2 3 4 5 6 7 8 9 10 11
( SELECT SNo FROM SC,COURSE WHERE CName='英语'AND SC.CNo=COURSE.CNo ) UNION ( SELECT SNo FROM SC,COURSE WHERE CName='数学'AND SC.CNo=COURSE.CNo )
集合操作(交,叉,并)
1 2 3 4 5 6 7
1.并操作UNION (SELECT * FROMTABLE A) UNION (SELECT * FROMTABLE B) 2.交操作INTERSECT (SELECT * FROMTABLE A) INTERSECT(SELECT * FROMTABLE B) 3.差操作EXCEPT(MINUS) (SELECT * FROMTABLE A) EXCEPT (SELECT * FROMTABLE B)
交叉连接
交叉连接就是两个表的乘积。
查询每个学生选修课程的情况,并输出其学号,姓名,所选课程号及分数。
1 2 3
SELECT Student.SNo,SName,SC.CNo,Score FROM Student CROSSJOIN SC WHERE Student.SNo=SC.SNo
自连接
在表Teacher中查询职工的上级领导信息
1 2 3
SELECT B.TNo,B.TName FROM TEACHER A INNERJOIN TEACHER B ON A.Manager=B.TNo
查询混双选手名单。每行输出一对选手,男在前,女在后
1 2 3 4
SELECT A.Name,B.Name FROM ATHLETE A AND ATHLETE B ON A.GROUP=B.GROUP WHERE A.Sex='男'
IN关键字
查询语文班的学生名单
1 2 3
SELECTName FROM STUDENT,CLASS WHERE STUDENT.CLno=CLASS.CLno AND CLASS.CLName='语文'
或者
1 2 3 4 5
SELECT SName FROM Student WHERE CLno IN (SELECT CLno FROM Class_X01814031 WHERE CLname='语文')
数学高于90分的男生
1 2 3 4 5 6 7
SELECT SName FROM Student WHERE Sex='男'AND SNo IN(SELECT SNo FROM SC WHERE Score>90AND SC.CNo IN (SELECT CNo FROMClass WHERE Class.CLname='数学'))
SELECT SName FROM STUDENT WHERE EXIST (SELECT * FROM SC WHERE SNo=STUDENT.SNo AND CNo='1')
NOT EXIEST关键字
和EXIST同理,长和谓词推到结合使用。
谓词推导+利用EXIST查询
查询至少选修了学生200215122选修的全部课程的学生号码。
我们首先转换一下语句:不存在任何课程该学生没选修
即:
1 2 3 4 5 6 7 8 9
SELECT Sname FROM Student WHERENOTEXISTS(SELECT * FROM Course WHERENOTEXISTS(SELECT * FROM SC WHERE Sno= Student.Sno AND Cno= Course.Cno ) )
查询至少选修了学生200215122选修的全部课程的学生号码。
1 2 3 4 5 6 7 8 9 10
SELECTDISTINCT Sno FROM SC SCX WHERENOTEXISTS(SELECT * FROM SC SCY WHERE SCY.Sno = ' 200215122 ' AND NOTEXISTS(SELECT * FROM SC SCZ WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno) );
查询中的比较运算符
查询其他班中比1班所有学生年龄都小的学生,并按照年龄降序输出
1 2 3 4 5 6
SELECT SName,SAge FROM STUDENT WHERE SAge<ALL(SELECT SAge FROM STUDENT WHERE CLno='1' ) AND CLno<>'1' ORDERBY SAge DESC
CREATEVIEW W1_Student AS SELECT SNo,SName FROM Student_X01814031 WHERE SName LIKE'要%'WITHCHECKOPTION
创建1班选修了语文课程的学生的视图
1 2 3 4 5 6 7 8
CREATEVIEW C1(SCno,SName,Score) AS SELECT STUDENT.SNo, SName, Class FROM STUDENT,SC,CLASS WHERE STUDENT.CLname='1' AND STUDENT.SNo=SC.SNo AND SC.SName='语文' AND STUDENT.CLno=CLASS.CLno
创建一个反应学生出生年份的视图:
1 2 3 4
CREATEVIEW STUDENT_Birthyear(SNo,SName,SBirth) AS SELECT SNo,SName,2020-SAge FROM STUDENT
将学生的学号和平均成绩创建一个视图
1 2 3 4 5
CREATEVIEW SNO_AVG_VIEW(SNo,GRADE_avg) AS SELECT SNo,AVG(Score) FROM SC GROUPBY SNo
更新视图定义
将S_G1表中的年龄限定改为20
1 2 3 4 5
ALTERVIEW S_G1(SNo,S age) AS SELECT SNo,Sage FROM STUDENT WHERE SAge>20