浅学SQL Sever之数据库操纵(4)数据的操作第二部分

这部分的内容主要讲解SQL Sever数据库的数据的操作的第二部分,主要是在第一部分的基础上进行拓展延伸。首先我们需要建立以下三张数据表,代码如下:

create table student(
	no char(8) primary key,
	name char(8) not null,
	sex char(2) check(sex = '男'or sex = '女'),
	birthday smalldatetime check(birthday >= '1995-1-1' and birthday< = '2003-1-1'),
	speciality varchar(50) default '软件工程',
	avgrade numeric(4,1) check(avgrade >= 0 and avgrade <= 100),
	dept varchar(50) default '工学院' 
);
insert student values('19503001','王军','男','1999-3-25','网络工程','89','工学院');
insert student values('19503002','王大海','男','1999-3-25','电子信息工程','78','工学院');
insert student values('19503003','张三','男','1999-3-25','网络工程','90','工学院');
insert student values('19503004','李大牛','男','1999-4-25','网络工程','80','工学院');
insert student values('19503005','蒙恬','男','2000-3-15','软件工程','85','工学院');
insert student values('19503006','蒙毅','男','1999-4-25','计算机与科学','76','工学院');
insert student values('19503007','郭靖','男','1999-5-21','网络工程','70','工学院');
insert student values('19503008','黄蓉','女','2000-1-22','计算机与科学','61','工学院');
insert student values('19503009','杨过','男','1999-12-16','电子信息工程','59','工学院');
insert student values('19503010','郭芙','女','1996-4-21','软件工程','66','工学院');
insert student values('19503011','毛遂','男','1999-3-26','计算机与科学','89','工学院');
insert student values('19503012','田亚光','男','1999-8-23','电子信息工程','84','工学院');
insert student values('19503013','张飞','男','1999-9-21','软件工程','75','工学院');
insert student values('19503014','孙尚香','女','1995-3-22','电子信息工程','87','工学院');
insert student values('19503015','李翠花','女','1997-3-21','计算机与科学','72','工学院');
insert student values('19503016','毛雅','女','1999-10-21','电子信息工程','63','工学院');
insert student values('19503017','毛军','男','1996-4-25','软件工程','54','工学院');
insert student values('19503018','黄浩','男','1997-3-25','网络工程','63','工学院');

一、带DISTINCT的查询
在使用SELECT查询时,SELECT后面可以加上以下字段的关键字,用来满足不同的查询要求:
1、ALL。ALL是全部的意思,即表示要返回所有满足条件的元组,在之前的所有查询都是使用这种查询方式的。ALL它又作为默认的关键字,当不加任何关键字的时候,表示默认使用ALL作为关键字。
2、TOP。TOP是顶端,居什么之首的意思,但在SQL当中它表示的是返回前面的n个元组。其用法有两种格式,第一种:TOP n;这种表示的是返回前面n个元组。第二种:TOP n PERCENT;这种表示返回前面n%个元组,如果n%不是整数则向上取整
3、DISTINCT。DISTINCT意思独特的有区别的,即在SQL当中如果查询的结果有多条一样的记录,只会返回这些重复的记录中的一条。使用IDSTINCT关键字保证了查询结果当中不会包含重复的元组,但与DISTINCTROW不一样的是它不会删除所有重复的元组,所以在查询过程当中要分清DISTINCT与DISTINCTROW的区别,以免造成数据的错误。同时要记住在使用DISTINCT的过程当中,如果查询的是多个字段,那么DISTINCT一定要放在第一个字段的前面,不然会出现错误的。
下面我们就以代码来表示这三种不同关键字的相关情况
(1)使用ALL来查询表student当中的专业

select all speciality from student

结果如下:
在这里插入图片描述

(2)使用TOP n来查询表student当中的前4条记录

select TOP  4 * from student

结果如下:
在这里插入图片描述

(3)使用TOP n PERCENT来查询表student当中的前30%条记录

select TOP  30  PERCENT * from student

结果如下:
在这里插入图片描述
原本这个表中有18条记录前30%就会显示前6条记录
(4)使用DISTINCT来查询表student当中的专业

select DISTINCT speciality from student

结果如下:
在这里插入图片描述

二、带WHERE子句的条件查询
在实际的应用当中,很多时候的查询都是按照一定的条件来进行查询的,即查询满足的条件的记录。WHERE的语法格式如下:
SELECT 字段名
FROM 所要查询的表名
WHERE 查询的条件
查询的条件其实就是一种逻辑表达式,在逻辑表达式当中比较常用的连接词有NOT、OR、AND等,在逻辑上表示的是非、或、与。在SQL的逻辑表达式当中的不等于用<>来表示而不是**!=**,这个需要我们在写逻辑表达式当中多加注意。
例如:查询表student中平均成绩在[80,90)之间的学生学号、姓名、专业、平均成绩,

select no 学号,name 姓名,speciality 专业,avgrade 成绩
from student
where avgrade>=80 and avgrade<90;

结果如下:
在这里插入图片描述

查询表student中平均成绩不等于85的学生学号、姓名、专业、平均成绩,

select no 学号,name 姓名,speciality 专业,avgrade 成绩
from student
where avgrade<>85;

结果如下:
在这里插入图片描述

WHERE语句的语法格式比较简单,但在查询当中却使用得最多。
三、带BETWEEN的范围查询
在实际应用当中查询某一范围的记录也可以用BETWEEN语句来进行查询,其语法格式如下:
SELECT 字段名
FROM 所要查询的表
WHERE 所要查询范围的字段 [NOT] BETWEEN 值1 AND 值2
例如:查询成绩在80-90之间的学生学号、姓名、专业、成绩

select no 学号,name 姓名,speciality 专业,avgrade 成绩
from student
where avgrade between 80 and 90;

结果如下:
在这里插入图片描述

查询成绩不在80-90之间的学生学号、姓名、专业、成绩

select no 学号,name 姓名,speciality 专业,avgrade 成绩
from student
where avgrade not between 80 and 90;

结果如下:
在这里插入图片描述

通过上诉的两个例子我们可以很好的理解BETWEEN的用法。
四、带IN的范围查询
IN与BETWEEN具有类似的功能,都是查询满足字段值在一定范围内的记录。但是IN与BETWEEN不同的是,IN后面必须跟枚举的字段值,即把所有的字段值都列举出来,而不能写成“值1 and 值2”之类的表达式。其语法格式如下:
SELECT 所要查询的字段名
FROM 所要查询的表名
WHERE 范围的字段名 [NOT] IN (值1,值2…)
例如查询表student中专业是软件工程和网络工程的学生学号、姓名、专业、成绩

select no 学号,name 姓名,speciality 专业,avgrade 成绩
from student
where speciality in('软件工程','网络工程')

结果如下
在这里插入图片描述

说白了IN的作用与OR类似,例如上个例子当中的代码也可写成以下这种形式:

select no 学号,name 姓名,speciality 专业,avgrade 成绩
from student
where speciality='软件工程' or  speciality='网络工程';

其结果也是一样的。
五、带GROUP的分组查询
带GROUP的查询就是通常所说的分组查询,它将查询结果按照某一字段或者某一字段值进行分组,这样就可以对每一组进行相应的操作,而一般的查询都只能针对某一条记录进行操作。分组查询经常与库函数count()结合使用,用于统计每一组的记录的个数。其语法格式如下:
SELECT 字段名 [,count(*或者分组中要统计的字段名)]
FROM 查询的表名
GROUP BY 要分组的字段名
[HAVING count(*或者分组中要统计的字段名)]
HAVING是可选的,它用于对形成的分组进行筛选,留下满足条件的组。
例如查询表student当中每个专业的人数

select speciality 专业,count(*) 人数
from student
group by speciality;

结果如下:
在这里插入图片描述

查询专业人数大于4的专业人数

select speciality 专业,count(*) 人数
from student
group by speciality
having count(*)>4;

结果如下:
在这里插入图片描述

查询每个专业成绩大于70的人数

select speciality 专业,count(*) 人数
from student
where avgrade>70
group by speciality

结果如下:
在这里插入图片描述

注意WHERE语句要在GROUP和HAVING语句之前出现。WHERE语句和HAVING语句他们都是用于指定查询条件,但是实际上WHERE语句是对表的每一条记录进行设定条件查询的,而HAVING语句是对组进行设定条件,而不是具体的某一条记录进行设定条件的,或者可以理解为HAVING语句是在GROUP语句的基础上形成的。
六、带LIKE的匹配查询和带IS的查询。
1、模糊查询主要是通过谓词LIKE来实现的。其语法格式如下:
SELECT 字段1,字段2
FROM 所要查询的表名
WHERE 要模糊查询的字段名 [NOT] LIKE 字符串常数。
注意在模糊查询的字段名一定要是字符串类型
字符串常数可以是一个字符串常量,也可以是包含通配符的字符串。
通配符有**“”(下划线)“%”**这两种
(下划线)”:它可以与任意的单字符相匹配。
“%”:它可以与任意长度的字符串(包括空值)相匹配。
例如:查询所有姓王的学生学号、姓名、专业、成绩

select no 学号,name 姓名,speciality 专业,avgrade 成绩
from student
where name like '王%';

结果如下:
在这里插入图片描述
查询专业当中第二个字是件的学生学号、姓名、专业、成绩

select no 学号,name 姓名,speciality 专业,avgrade 成绩
from student
where speciality like '_件%';

结果为:
在这里插入图片描述
2、空值null查询
在查询指定字段为空值的记录不能用=null来表示而是要用is null 来表示
比如我们先插入以下字段

insert student(no,name,sex,birthday) values('19503021','张三','男','1999-4-1');
insert student (no,name,sex) values('19503022','李三','男');

那么我们现在查询成绩为空的学生学号、姓名、专业、成绩

select no 学号,name 姓名,speciality 专业,avgrade 成绩
from student
where avgrade is null;

结果如下:
在这里插入图片描述
但是如果将代码写成这样:

select no 学号,name 姓名,speciality 专业,avgrade 成绩
from student
where avgrade = null;

那么他的结果会显示成这样:
在这里插入图片描述
七、使用ORDER排序查询结果
在现实应用当中,我们在查询的时候希望其能够按照一定的顺序进行排列,那么我们就可以利用ORDEY BY语句来进行排序。其语法格式如下:
SELECT 字段名1,字段名2
FROM 所要查询的表
ORDER BY 要进行排序的字段名 [ASC|DESC]
其中ASC是默认排序即升序;DESC是降序排序
例如对student表中的男同学按成绩降序排列

select * from student
where sex = '男'
order by avgrade desc;

结果如下:
在这里插入图片描述
如果是升序排列,代码如下:

select * from student
where sex = '男'
order by avgrade asc;

结果如下:
在这里插入图片描述
不过升序的代码也可以这样写:

select * from student
where sex = '男'
order by avgrade ;

即将ASC去掉不写,那么结果也是升序排列。
本部分是对第一部分的延伸,如果有错误欢迎大家提出来,让我们共同进步,谢谢大家!!!

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
一、建立以下五个表: 教师表:Teacher,学生表:Student, 课程表:Course,选课表:SC,授课表:TC 二、完成以下查询: 1.查询成绩在80-90之间的记录。 2.查询至少4个同学选修的课程名。 3.查询其他系中比“信息系”所有学生年龄都大的学生名单及年龄,并按年龄降序输出: 4.查询与学生张建国同岁的所有学生的学号姓名和系别。 5.查询选修了2门以上课程的学生名单。 6.查询至少有一门与“张建国”选课相同的学生的姓名,课程号,系别 7.查询成绩比该课程平均成绩高的学生的成绩表。 8.查询选课号为01001课程且成绩高于课程01002学生的姓名,此两门课的课程名和成绩。 9.查询所有没选修01001号课程的学生名单 10、查询每个同学各门课程的平均成绩和最高成绩,按降序输出姓名平均成绩、最高成绩; 11、查询所有学生都选修了的课程号和课程名; 12、查询选修了991102号学生选修了的课程的学生学号姓名。 三、使用SQL创建视图,修改记录 1.创建成绩视图SCORE_VIEW,包含学号sno,姓名sn,课程名cn,成绩score; 2.创建一个计算机系学生名单视图S_VIEW,包含学号sno,姓名sn,性别sex; 3.通过上面的视图,修改学号为991102,课程号01001的成绩记录; 4,创建一个视图,计算机系学生的成绩单score_view_CDEPT,包含学号sno,姓名sn,课程名cn,成绩score

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华丽转场

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值