SQL的数据查询(一)

Student表
这里写图片描述
Course表
这里写图片描述
SC表
这里写图片描述

1.选择表中的若干列

(1)查询指定的列
eg:查询全体学生的学号,姓名和所在系的有关信息
select Sno,Sname,Sdept from Student
eg:查询所有学生的所有信息
select * from Student
(2)查询经过计算的值
查询所有学生的姓名及出生年份
select Sname,2017-Sage from Student

这里写图片描述

select Sname,'Year of Birth',2017-Sage from Student

这里写图片描述

select Sname,2017-Sage Birthday from Student

这里写图片描述

eg:查询学生的学号,姓名和所在系,要求用小写字母表示所在的系
select Sno,Sname,lower(Sdept) from Student

2.选择表中的若干元组

(1)消除取值相同的行

select distinct Sno from SC;

这里写图片描述
(2)查询满足条件的元组

比较   =,>,<,>=,<,=,!=,<>,!>,!<,not+上述比较运算符
确定范围 between and,not between and
确定集合 in,not in
字符匹配 like,not like
空值 is null,is not null
逻辑运算 and,or,not

基于比较运算的查询
eg:查询计算机系的所有学生的学号和姓名。

select Sno,Sname from Student where Sdept='CS';

这里写图片描述
eg:查询考试成绩不及格的学生的学号

select Sno from SC where Grade<60;
或者
select Sno from SC where not Grade>=60;

基于范围条件的查询
eg:查询年龄在20-30岁之间的学生的姓名,所在系和性别

select Sname,Sdept,Ssex from Student 
where Sage between 20 and 23
或者
select Sname,Sdept,Ssex from Student
where Sage>=20 and Sage<=23

这里写图片描述
基于确定集合的查询
eg:查询计算机系,数学系,和信息系的学生姓名和年龄。

select Sname,Sage from Student
where Sdept='CS' or Sdept='MA' or Sdept='IS'
或者
select Sname,Sage from Student
where Sdept in ('CS','MA','IS')

这里写图片描述
eg:查询既不是数学系也不是计算机系的学生姓名和性别

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

这里写图片描述
基于字符串匹配的查询
谓词like可以用来查找指定列与给定字符串常量匹配的元组。在字符串常量中可以包含通配符从而实现模糊查询。其语法格式为:

[not] like '<匹配串>' [escape '<换码子符>']

其含义是查询指定的属性列值与<匹配串>相匹配的元组。<匹配串>中可以包含下面两个通配符

  • %(百分号):代表任意长度(长度可以为0)的字符串
    例如:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,afdvb,ab等都满足该匹配串
  • _(下划线):代表任意单个字符
    例如:a_b表示以a为开头,以b为结尾的长度为3的字符串。
    eg:查询信息系所有学生的情况
select * from Student
where Sdept like 'IS'
或者
select * from Student
where Sdept='IS'

这里写图片描述
eg:查询所有姓张的,第3个字为”伟”的学生的姓名,学号和性别。

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

eg:查询DB_Design课程的课程号及学分

select Cno,Ccredit from Course
where Cname like 'DB\_Design' escape '\'
//escape '\'为转换字符,这样匹配串中紧跟在'\'后的字符就不再具有通配符的含义,即将通配符_转义为普通的字符.

基于空值的查询
eg:查询没有考试成绩的学生的学号及相应的课程号。

select Sno,Cno from SC
where Grade is null

基于多个条件的查询
eg:查询计算机系年龄在20岁以下的学生的学号,姓名和性别

select Sno,Sname,Ssex from Student
where Sdept='CS' and Sage<20

这里写图片描述

查询结果排序

eg:查询选修了1号课程的学生的学号及成绩,查询结果按成绩的降序排序

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

这里写图片描述
eg:查询全体学生情况,查询结果按所在系的升序排序,同一系中的学生按年龄降序排序

select * from Student
order by Sdept,Sage desc;

这里写图片描述

聚集函数

(1)AVG,用于计算查询结果的平均值,语法格式为
AVG ([all|distinct] <列名>)
其中,distinct表示只计算不同值的平均值,若有重复值,则该重复值只计算一次,默认为all。
eg:计算选修了2号课程的学生的平均分

select AVG(Grade) as '平均成绩' from SC
where Cno='2';

这里写图片描述
(2)MIN,该函数用于在表中查询列值的最小值。语法格式为:
min([all|distinct] <列名>)
eg:查询成绩表中的最低分

select min(distinct Grade) as '最低分' from SC;

这里写图片描述
(3),max,该函数用于在表中查询列值的最大值
(4).sum,该函数用于计算表中某列值的和。语法格式为
sum([all|distinct] <列名>)
其中,all|distinct的含义与avg函数相同
(5)count,该函数用于统计表中或查询结果中元组的个数,且只统计不为
空的元组。语法格式为count([all|distince] <列名>])
注意,若指定distinct短语,则表示统计是取消指定列中的重复值,默认为all。
eg:统计学生的总人数

select count(*) as '总人数' from Student;

eg:统计选修了课程的学生人数

select count(distinct Sno) from SC;

查询结果分组

(1)group by子句。在SQL中,可以用group by子句将查询的结果按指定的列进行分组,即将指定列值相同的元组分为一组。对查询结果分组的目的是为了细化聚集函数的作用对象。若对查询结果没有分组,聚集函数的作用对象是整个查询结果,分组后聚集函数将作用于每一个分组,即相当于每个分组均有一个函数值。
eg:查询每门课程的课程号及相应的选课人数。

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

这里写图片描述
该查询把结果中的元组按课程号值相同进行分组,那么选修了相同课程的学生被分为一组,然后再对每个分组作用于聚集函数count,即可求的每个分组中的学生人数。
(2)having短语,having短语按一定的条件对分组进行筛选,即把符合指定条件的分组进行输出。但having与where子句不同,他们的区别有如下几点。
- where子句中条件的作用对象是基本表或视图,而having子句中条件的作用对象是每个分组。
- 执行查询时,再按照group by子句分组之前先去除不满足where子句中条件的元组,而having子句中的条件在分组之后被应用。
- having子句可以在条件中包含聚集函数,但where子句中不能包含。

select Sno from SC
where Grade>=90
group by Sno having count(*)>3;

该例查询中,先用group by子句将90分以上的成绩按照Sno进行分组,在用聚集函数count对每一组进行统计,having子句给出了选择组的条件,只有满足元组个数大于3的组才能被输出,即有3门以上成绩大于90分的组予以输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值