复习
单表查询 简单查询
删除聚簇索引
drop index course.[PK_course_D****]
//会报错
删除方法 右键 设计 表的基本结构会出现 右键 索引键 删除主码的 (PK) 直接删除就OK
创建聚簇索引 clustered 加ed
create clustered index courseno on course
--查询指定列
select sno,sname
from student
select sname 姓名,2021-sage 出生年份
from student;
--查询年龄小于20岁的学生姓名
select sanme --Π
from student --
where sage<20; --限定区域
2021-sage 是表达式 出生年份是别名 仅在查询结果中起作用 不会影响表的结构
先做选择再做投影
where ssex='女'
字符串一定用 单引号!!!!
字符匹配
谓词 [NOT]LIKE ‘<匹配串>’ []
转义字符
SElECT *
FROM Course
WHERE CnameLIKE 'DB\_%i__' ESCAPE'\';
ESCAPE 声明 \作为转义字符出现
三个下划线
第一个 /转义字符
BETWEEN...AND... ---低值到高
###谓词 IS NULL 或IS NOT NULL
IS 不能用“=” 代替
-- 某些学生
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;
-- 某些学生
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
逻辑运算符:AND 和OR来连接多个查询条件
AND优先级高于OR
select sname
from studnet
where sdent ='CS' and sc='';
IN谓词实际上是多个OR运算符的缩写
--查询三个专业的学生
select sname,sex
from
where sdpet IN('CS','MA','IS')
练习二
查询课程名以“数”开头的所有课程的课程名、学分
select cname,ccredit
from course
where cname like '数%';
% 任意长度的字符可以匹配
查询计算机系小于20女姓名
select sno,sname
from student
where sdent='CS' and sage<20 and ssex='女';
查询先修课为5或7的课程信息
select *
from course
where cpno='5' or cpno='7';
select *
from course
where cpno in('5','7')
5和7 数据类型为char所以用单引号;
ORDER BY子句
可以按一个或多个属性列排序
升序:ASC;降序DESC;默认为升序
对于空值,排序时显示的次序由具体系统实现来决定
当多个属性排序时
首先根据第一个属性排序,如果在该属性上有多个相同值时,按第二个属性
--查询3号课程的学生 的学号和成绩按分数降序排序
select sno,grade
from sc
where cno='3'
ORDER BY Grade DESC;
--查询全体学生的情况升序排序
--查询全体学生情况,查询结果按所在系
--的系号升序排列,同一系中的学生按年龄降序排
--列。
select *
from studnet
ORDER BY sdept,sage desc;
聚集函数
统计元组个数 COUNT(*)
统计一列中值的个数 COUNT([DISTINCT|ALL]<列名>)
求和SUM([DISTINCT|ALL]<列名>)
统计元组个数 COUNT(*)
统计一列中值的个数 COUNT([DISTINCT|ALL] <列名>)
计算一列值的总和(此列必须为数值型)SUM([DISTINCT|ALL] <列名>)
计算一列值的平均值(此列必须为数值型)AVG([DISTINCT|ALL] <列名>)
求一列中的最大值和最小值
MAX([DISTINCT|ALL] <列名>)
MIN([DISTINCT|ALL] <列名>)
[例3.41] 查询学生总人数。
SELECT COUNT(*)
FROM Student;
[例3.42] 查询选修了课程的学生人数。
SELECT COUNT(DISTINCT Sno)
FROM SC;
[例3.43] 计算1号课程的学生平均成绩。
SELECT AVG(Grade)
FROM SC
WHERE Cno=' 1 ';
[例3.44] 查询选修1号课程的学生最高分数。
SELECT MAX(Grade)
FROM SC
WHERE Cno='1';
[例3.45 ] 查询学生201215012选修课程的总学分数。
SELECT SUM(Ccredit)
FROM SC,Course
WHERE Sno='201215012' AND SC.Cno=Course.Cno;
聚集函数不能用在where·子句中
只能用于SELECT和 **
SELECT sno,min(grade) 错误的 没有办法显示 不对
from sc
可以分步来做
group by 必须和聚集函数一起使用
如果有聚合函数的select语句,列名部分只能包含分组列和聚合列。
[例3.46] 求各个课程号及相应的选课人数。
SELECT Cno,COUNT(Sno) --不允许再查其他的列 目标列要么时聚集函数要么是分组
FROM SC
GROUP BY Cno;
查询结果可能为:
Cno COUNT(Sno)
1 22
2 34
3 44
4 33
5 48
###HAVING
如分组后还要按一定条件进行筛选 HAVING
[例3.47] 查询选修了3门以上课程的学生学号。
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) >3;
[例3.48 ]查询平均成绩大于等于90分的学生学号和平均成绩
--下面的语句是不对的:
SELECT Sno, AVG(Grade)
FROM SC
WHERE AVG(Grade)>=90
GROUP BY Sno;
因为WHERE子句中是不能用聚集函数作为条件表达式
--正确的查询语句应该是:
SELECT Sno, AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90
HAVING短语与WHERE子句的区别:
作用对象不同
WHERE子句作用于基表或视图,从中选择满足条件的元组,选择条件不能有聚合
函数
HAVING短语作用于组,从中选择满足条件的组。选择条件必须有聚合函数
练习三
查询计算机系(CS)姓刘的学生信息,按照学号大小排序
select *
from studnet
where sdept='cs' and sname like '刘%';
按系并区分男女统计各系学生的人数,并按照人数降序排序
select sdept,ssex,count(sno)
from student
group by sdept,sex
order by count(sno) desc;