复习

单表查询 简单查询

删除聚簇索引

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;