数据库的查询:
/选择查询结果输出列/*
1.表示选择一个表或视图中的所有列
SELECT *
FROM STUD
WHERE 专业='计算机'
2.选择一个表中的指定列
SELECT 学号,姓名,总学分
FROM STUD
WHERE 专业='计算机'
3.定义列别名
SELECT 学号 AS number,姓名 AS name
FROM STUD
WHERE 专业='计算机'
或者
SELECT 学号=number,姓名=name
FROM STUD
WHERE 专业='计算机'
当别名中有空格时,使用引号将标题括起来
SELECT 学号 AS ‘Student number’,姓名 AS name
FROM STUD
WHERE 专业='计算机'
不允许在WHERE子句中使用列别名。
4.替换查询结果中的数据
SELECT 学号,姓名,等级=//将总学分的列值改为等级
CASE
WHEN 总学分 IS NULL THEN'尚未选课'
WHEN <50 THEN'不及格'
WHEN >=50 AND <=52 THEN'合格'
ELSE ‘优秀’
END
FROM STUD
WHERE 专业='计算机'
5.计算列值
查询‘c03’号课程成绩加上10分后的学生学号和成绩,要求给出临时标题
SELECT Sno,Grade+10 as'成绩'
FROM Course,SC
WHERE Course.Cno=SC.Cno AND Course.Cno='C03'
6.消除结果集中的重复行
SELECT DISTINCT 专业
FROM STUD
7.限制结果集返回行数//返回结果集的前6行
SELECT TOP 6 姓名 ,专业
FROM STUD
8.聚合函数
1)SUM ,AVG
SELECT SUM(成绩) AS '总和',AVG(成绩) AS '平均分分'
FROM STUD
WHERE 课程号=‘101’
2)MAX,MIN
SELECT MAX(成绩) AS '最高分',MIN(成绩) AS '最低分'
FROM STUD
WHERE 课程号=‘101’
3)COUNT,统计组中满足条件的行数或总行数
SELECT COUNT(总学分) AS '总学分大于50人数'
FROM STUD
WHERE 总学分>50
如果使用COUNT(*)时将返回检索行的总数目,不论其是否包含空值,如果COUNT()括号中为列名的话,则忽略空值。
/选择查询条件 WHERE*/
1.表达式比较
当两个表达式值中有一个为空值或者都为空值时,比较运算符将返回UNKNOWN。
表达式比较符有 <>,!=不等于,!< 不小于,!> 不大于等运算符。
SELECT *
FROM STUD
WHERE 专业=‘通信工程’ AND 学分>=42
2.模式匹配
% 代表0个或多个任意字符
_ 代表单个字符
[]指定属于范围,如属于[0-9][absd]中的任何单个字符
[^]指定不属于范围,如不属于[^0-9][^absd]中的任何单个字符
SELECT *
FROM STUD
WHERE 姓名 LIKE '王_'
当含有转义字符时,LIKE '%5/%%' ESCAPE '/',这里表示任意位置包含5%的字符串。
3.范围比较(BETWEEN IN )
SELECT 出生时间
FROM STUD
WHERE 出生时间 NOT BETWEEN '1995-1-1' AND '1995-12-31'
SELECT *
FROM STDU
WHERE 专业 IN (‘软件工程’,‘通信工程’)
4.空值比较
SELECT *
FROM STUD
WHERE 备注 IS NULL
5.子查询,子查询中不能使用ORDER BY子句
1)IN,判断一个给定值是否在子查询结果集中,先执行子查询。
查询选修了课程名为“信息系统”的学生学号和姓名
SELECT Sno,Sname ③ 最后在Student关系中
FROM Student 取出Sno和Sname
WHERE Sno IN
(SELECT Sno ② 然后在SC关系中找出选
FROM SC 修了3号课程的学生学号
WHERE Cno IN
(SELECT Cno ① 首先在Course关系中找出
FROM Course “信息系统”的课程号,为3号
WHERE Cname= ‘信息系统’
)
);
2)比较子查询(ALL,SUM,ANY)
找出每个学生超过他选修课程平均成绩的课程号。
SELECT Sno, Cno
FROM SC x
WHERE Grade >=
(
SELECT AVG(Grade)
FROM SC y
WHERE y.Sno=x.Sno
);
3)EXISTS子查询
查询没有选修1号课程的学生姓名。
SELECT Sname
FROM Student
WHERE NOT EXISTS(
SELECT *
FROM SC
WHERE Sno = Student.Sno AND Cno='1');
/指定查询对象*FROM/
1.表或视图
2.导出表
SELECT Sname
FROM (
SELECT Sname
FROM STUD
WHERE SCORE>50
)AS Student//表的别名
WHERE 性别=1
/连接多表*/
1.连接谓词
1)自然连接
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno = SC.Sno;
2)多表连接
查询选修2号课程且成绩在90分以上的所有学生
SELECT Student.Sno, Sname
FROM Student, SC
WHERE Student.Sno = SC.Sno
/* 连接谓词*/
AND SC.Cno= ‘2’ AND SC.Grade > 90;
/* 其他限定条件 */
2.以JOIN关键字指定的连接
1)内连接 INNER JOIN
按照ON所指定的连接条件合并两个表,返回满足条件的行
查询每个学生的情况以及选修课的课程情况
SELECT *
FROM Student INNER JOIN SC
ON Student.sno=SC.sno
2)外连接 OUTER JOIN
其中的OUTER关键字均可省略
外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
左外连接(LEFT OUTER JOIN)结果表中除了包括满足连接条件的所有行外,还包括左表的所有行
查询每个学生及其选修课程的情况
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON Student.Sno=SC.Sno;
右外连接(RIGHT OUTER JOIN)结果表中除了包括满足连接条件的所有行外,还包括右表的所有行
查找选修了的课程和所有开设的课程名
SELECT SC.*,课程名
FROM SC RIGHT OUTER JOIN Course
ON Sc.Sno=Course.Sno
完全外连接(FULL OUTER JOIN)结果表中除了包括满足连接条件的所有行外,还包括两个表的所有行
3)交叉连接 CROSS JOIN,实质是对两个表进行笛卡尔积运算
列出所有学生的可能选课情况:
SELECT 学号,姓名,课程号,课程名
FROM COURSE CROSS JOIN SC
/指定查询结果分组方法*GROUP BY/
根据字段对记录分组,对结果集进行分组,常和聚合函数搭配使用。
在SELECT之后的字段名,除了GROUP BY之后的字段名和聚合函数之外,不能有其他字段名。
SELECT 专业,COUNT(*) AS 人数
FROM Student
GROUP BY 专业
/指定查询结果分组后筛选条件*HAVING/
HAVING子句可以使用聚合函数,而WHERE不可以。常和GROUP BY搭配使用,对分组数据进行过滤。
子句的执行顺序: FROM->WHERE->GROUP BY->HAVING
SELECT 学号
FROM Student
WHERE 成绩>=80
GROUP BY 学号
HAVING COUNT(*) > 2
/指定查询结果排序顺序*ORDER BY/
1.对查询结果排序输出
对查询结果排序输出,ASC升序,DESC降序
SELECT *
FROM Student
WHERE 专业=‘通信工程’
ORDER BY 出生时间
2.对结果排序附加汇总
COMPUTE BY子句 常跟在ORDER BY子句之后搭配使用。
/其他参加集合操作的各查询结果的列数必须相同,对应项的数据类型也必须相同 */
1.INTO 将SELECT查询结果保存到新建的表中去 SELECT..INTO..FROM..WHERE
2.UNION(并) 将多个SELECT查询结果集合并成一个结果集
查询计算机科学系的学生及年龄不大于19岁的学生。
SELECT *
FROM Student
WHERE Sdept= 'CS'
UNION
SELECT *
FROM Student
WHERE Sage<=19;
UNION:将多个查询结果合并起来时,系统自动去掉重复元组。
UNION ALL:将多个查询结果合并起来时,保留重复元组
3.EXCEPT(交)
查询计算机科学系的学生与年龄不大于19岁的学生的交集
SELECT *
FROM Student
WHERE Sdept='CS'
INTERSECT
SELECT *
FROM Student
WHERE Sage<=19
实际上就是查询计算机科学系中年龄不大于19岁的学生
4**.INTERSECT(差)**
查询计算机科学系的学生与年龄不大于19岁的学生的差集。
SELECT *
FROM Student
WHERE Sdept='CS'
EXCEPT
SELECT *
FROM Student
WHERE Sage <=19;
实际上是查询计算机科学系中年龄大于19岁的学生
5.CTE 在SELECT语句的最前面可以使用一条WITH子句指定临时结果集。