Sql Server 04

目录

单表查询

1.查询满足条件的元组

 (1)比较大小

   (2)确定范围

 (3)确定集合

   (4)字符匹配

   (5)涉及空值的查询

 (6)多重条件查询

           2.ORDER BY子句

           3.聚集函数

           4. GROUP BY子句

补充

 

附表



单表查询

 

1.查询满足条件的元组

(1)比较大小

[例3.22] 查询计算机科学系全体学生的名单。

select Sname
from Student
where Sdept='CS';

 

[例3.23]查询所有年龄在20岁以下的学生姓名及其年龄。

select Sname,Sage
from Student
where Sage <20;

[例3.24]查询考试成绩有不及格的学生的学号。

select distinct Sno
from SC
where Grade<60;

 

(2)确定范围

❖谓词:

BETWEEN … AND …

NOT BETWEEN … AND

[例3.25] 查询年龄在10~20岁(包括20岁和23岁)之间的学生 的姓名、系别和年龄

select Sname,Sdept,Sage
from Student
where Sage Between 10 and 20;

 

使用< ,>符号也是一样的

select Sname,Sdept,Sage
from Student
where Sage >=10 and Sage <= 20;

 

[例3.26] 查询年龄不在10~19岁之间的学生姓名、系别和年龄

select Sname,Sdept,Sage
from Student
where Sage not between 10 and 19;

 

(3)确定集合

[例3.27]查询计算机科学系(CS)、数学系(MA)和信息 系(IS)学生的姓名和性别。

select Sname,Ssex
from Student
where Sdept in('CS','MA','IS');

 

[例3.28]查询既不是计算机科学系、数学系,也不是信息系 的学生的姓名和性别。

select Sname,Ssex
from Student
where Sdept not in('CS','MA','IS');

 

(4)字符匹配

 

(4.1)匹配串为固定字符串

[例3.29] 查询学号为201215121的学生的详细情况。

select *
from Student
where Sno like '201215121'; 
--等价于
select * 
from Student
where Sno='201215121';	

 

       (4.2)匹配串为含通配符的字符串

[例3.30] 查询所有姓张学生的姓名、学号和性别。

select Sname,Sno,Ssex
from Student
where Sname  like '张%';

[例3.31] 查询姓"欧阳"且全名为三个汉字的学生的姓名。

【注】数据库字符集为ASCII时,一个汉字需要两个_ 数据库字符集为 GBK 时,一个汉字需要一个_

select Sname
from Student
where Sname  like '欧阳_';

 

[例3.32] 查询名字中第2个字为"阳"字的学生的姓名和学号。

同样,不同的字符集_个数不一样

 

[例3.33] 查询所有不姓刘的学生姓名、学号和性别。

select Sname,Sno,Ssex
from Student
where Sname  not like '刘%';

 

  (4.3)使用换码字符将通配符转义为普通字符

[例3.34] 查询DB_Design课程的课程号和学分。

select Cno,Ccredit
from Course 
where Cname like  'DB\_Design' escape '\' ;

 

[例3.35] 查询以"DB_"开头,且倒数第3个字符为 i的课程的 详细情况。

select *
from Course 
where Cname like  'DB\_%i__' escape '\' ;

 

(5)涉及空值的查询

❖谓词: IS NULL 或 IS NOT NULL

\S“IS” 不能用 “=” 代替

[例3.36] 某些学生选修课程后没有参加考试,所以有选课 记录,但没 有考试成绩。查询缺少成绩的学生的学号和相 应的课程号。

select Sno,Cno
from SC 
where Grade is NULL ;

如果用‘=’

 

[例3.37] 查所有有成绩的学生学号和课程号。

select Sno,Cno
from SC 
where Grade is not NULL ;

 

(6)多重条件查询

❖逻辑运算符:AND和 OR来连接多个查询条件

◼ AND的优先级高于OR

◼ 可以用括号改变优先级

[例3.38] 查询计算机系年龄在20岁以下的学生姓名。

select Sname
from Student
where Sdept= 'CS' and Sage<20 ;

 

改写[例3.27] [例3.27] 查询计算机科学系(CS)、数学系(MA)和信息系 (IS)学生的姓名和性别。 

 

select Sname,Ssex
from Student
where Sdept in('CS','MA','IS');
--改写为
select Sname,Ssex
from Student
where Sdept ='CS'or Sdept= 'MA'or Sdept='IS';

 

 

2.ORDER BY子句

❖ORDER BY子句(排序)

◼ 可以按一个或多个属性列排序

◼ 升序:ASC;降序:DESC;缺省值为ASC

❖对于空值,排序时显示的次序由具体系统实现来 决定

 

[例3.39]查询选修了3号课程的学生的学号及其成绩,查询结 果按分数降序排列。

select Sno,Grade
from SC
where Cno='3'
order by Grade desc;

 

[例3.40]查询全体学生情况,查询结果按所在系的系号升序 排列,同一系中的学生按年龄降序排列。

select *
from Student
order by Sdept,Sage desc;

如果不写desc 默认asc

 

 

3.聚集函数

❖聚集函数:

◼ 统计元组个数 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';S

 

[例3.45 ] 查询学生201215012选修课程的总学分数。

select sum(Ccredit)
from SC,Course
where Sno='201215012' and SC.Cno=Course.Cno;

 

4. GROUP BY子句

细化聚集函数的作用对象

◼ 如果未对查询结果分组,聚集函数将作用于整个查询结果

◼ 对查询结果分组后,聚集函数将分别作用于每个组

◼ 按指定的一列或多列值分组,值相等的为一组

 

[例3.46] 求各个课程号及相应的选课人数。

select Cno,count(Sno)
from SC
group by Cno;

[例3.47] 查询选修了3门以上课程的学生学号。

select Sno
from SC
group by Sno
having count(*)>3;

[例3.48 ]查询平均成绩大于等于90分的学生学号和平均成绩

select Sno,avg(Grade)
from SC
group by Sno
having avg (Grade)>=90;

要利用having对进行分组之后的元组进行操作 

而where 子句作用于基本表或视图 故下面的语句是不对的 

select Sno,avg(Grade)
from SC
where avg(Grade)>=90
group by Sno;

聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。
 

补充

lower()函数

     --将大写字符数据转换为小写字符数据

  语法:lower(character_expression)

      --character_expression是指定要进行转换的字符串

其他相关函数

 

附表

Student1

Student2

SC

Course

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值