数据库查询(一)
-- 这是数据库中最重要的一个部分;
-- 使用select语句来进行查询,可以在一个或者是多个上表上进行查询,
-- 他的结果也是一个关系,这是毋庸置疑的;
先看看SELECT的一般格式:
select [all|distinct] <选择序列>
from <表引用>, ...,<表引用>
[where <查询条件>]
[group by <分组列> ,..., <分组列> [HAVING <分组选择条件>] ]
[order by <排序列> [asc|desc],..., <排序列> [asc|desc] ]
select包括5个子句:1.select 2.from 3.where 4.group by 5.order by
其中,select 和 from 是必须的,其他子句可以选择
-- 他有一个最基本的结构,就是 select-from-where 这个结构是很多复杂结构的基础,需要用命去进行学习
-- 先认识最简单的查询(不带where 字句的查询)
-- 这里的*表示将Student中的所有属性都投影出来并且顺序和表的相同,select相当于是关系验算中的投影
-- 这个语句是最简单的查询了,就是将Student中的所有列的值打印
select * from Student;
-- 表示只是打印Student中的Sno这一列
select Sno from Student;
-- 这里加了一个关键字 as 他表示,将Sno 这个名字,在打印的时候用H替换,这一般使用在
-- 较长的列名的简写,当然 表明也可以用这个关键字 来使用一个临时命名来进行各种操作
-- as 可以省略
select Sno as H from Student as S;
-- 这里有多了一个小东西:就是S.Sno 其实这是一个列名的另一种表示,
-- 我们在操作很多表的时候,可能会有重名的情况,这个时候,就需要使用这种形式来
-- 进行区分这个属性(列)是哪一个表的,这样就不会有歧义了,如果是操作的表没有相同的属性
-- 这个时候,就可以直接使用列明即可
select S.Sno from Student S;
-- 这里有多了一个小东西:就是ALL,其实,他在默认情况下了省略的,他就相当于select Sno from Student;
-- 也就是,将所有的行,不管你是重复的元组还是不重复的都打印出来,也就是有表有几行就打印出几行
-- 这就相应的有了一个打印不同的元组,也就是满足集合的特性(元素的唯一性distinct)
select all Sno from Student;
select distinct Sex from Student;
-- 在<选择序列> 这一栏,不仅可以是列名,还可以是一个表达式,但是需要给这个表达式起一个名字,就需要用as这个关键字
select distinct T.Salary-100 Sa from Teacher T;
数据库查询(二)
/*
Departments(Dno, Dname,Dheadno)
院系(院系号,院系名,院主任)
Teachers (Tno,Tname,Sex,Birthday,Title,Dno)
老师(教工号,教师名,性别,生日,职称,所在院系号)
Students(Sno,Sname,Sex,Birthday,Speciality,Dno)
学生(学号,名字,性别,生日,专业名,院系号)
Course(Cno, Cname,Credit)
课表(课程号,课程名,任课教师)
Teaches(Tno,Cno,TCscore)
实体教(教工号,课程号,评估得分)
SC(Sno,Cno,Grade)
选课(学生学号,课程号,学生成绩)
这几个关系,例子中涉及到的表
*/
-- 接下来就是总结一下带有where字句的查询
-- 我们使用最简单的就是只有select 和from这两个字句,这只能投影表,其他做不了什么,显然不满足我们的需求
/*
select [all|distinct] <选择序列>
from <表引用>, ...,<表引用>
[where <查询条件>]
[group by <分组列> ,..., <分组列> [having <分组选择条件>] ]
[order by <排序列> [asc|desc],..., <排序列> [asc|desc] ]
[where <查询条件>]:
关于查询条件一般是布尔表达式:
表达式在SQL中,可以是:
TRUE , 比较表达式, between 表达式,in表达式, like 表达式,null表达式,
量化比较表达式,存在表达式,唯一表达式,或匹配表达式
关于where的语句有复杂又简单,所以,先从简单的几个开始,慢慢进行深入;
这些中基本都会介绍,下面慢慢开始:
先学习这几种:
1.比较表达式:
2.between 表达式
3.in表达式
4.like表达式
5.null表达式
*/
-- 从这一篇开始,将SQL的语句和实际意义上的语句结合:
-- 现在假设所有的表都已经创建好了,就只是查询
--1.比较表达式:通过进行值的比较,有一个结果就是TRUE或者是FALASE,来判断真假
-- 他的格式可以详细写为:<值表达式> 比较运算符 <值表达式>
--查询职称(Title)为讲师的全部教师的姓名和性别
select Tname,Sex
from Teachers
where Title = '讲师';
--查询考试成绩不及格的学生的学号
select Sno
from SC
where Grade <60;
--2.between 表达式:这是判断一个给定的值是否在给定的闭区间里
-- 格式:<值表达式>[NOT] between <下界> AND <上界>,有NOT为FALSE 没有为TRUE
-- 查询出生年份在1987—~1990年的学生的姓名和专业
select Sname, Speciality
from Students
where (year)Birthday between 1980 and 1990;--(year)Birthday 这里就是为了得到年份的函数
--查询出生年份不在1987—~1990年的学生的姓名和专业
select Sname, Speciality
from Students
where (year)Birthday NOT between 1980 and 1990;
-- 其实这种方式也是可以用上面的比较表达式来表达:
select Sname, Speciality
from Students
where (year)Birthday >= 1980 and (year)Birthday <= 1990;
select Sname, Speciality
from Students
where (year)Birthday < 1980 OR (year)Birthday > 1990;
-- 3.in表达式:判断一个给定的元素是否在给定的集合中
-- 格式:第一种:<值表达式> [NOT] in (<值表达式列表>)
-- 第二种:<元组>|[NOT] in <子查询> 这种,下一篇介绍
-- 注意,一般值表达式列表是字面值,也就是常量;看下面例子,一看就懂
-- 查询计算机科学与技术和软件工程专业的学生的学号和姓名
select Sname,Sno
from Students
where Speciality in ('计算机科学与技术','软件工程专业');
-- 查询既不是计算机科学与技术也不是软件工程专业的学生的学号和姓名
select Sname,Sno
from Students
where Speciality NOT in ('计算机科学与技术','软件工程专业');
-- 4.like 表达式:这是一种迷糊查询,根据字典的模糊查询
-- 格式:<匹配值> [NOT] like <模式> [ESCAPE '<换码字符>']
-- 需要了解一下的几个常用的字符:'%':表示或者字符的通配符 '_':一个字符的通配符
-- [ESCAPE '<换码字符>'] 这和,一般不需要自己写,默认的就是转义字符,'\'
-- 查询所有以”数据“开头的课程名
select Cname
from Course
where Cname like '数据%';
-- 查询姓李并且姓名只有两个汉字的学生的学号和姓名
select Sname,Sno
from Students
where Sname like '李__';--但是这种不是非常的准确了,因为现在,汉字不一定是一个字符组成的,所以,还是根据情况而定;
-- 查询以C_ 打头的课程的详细信息
-- 这个时候就需要用转义字符了,因为用到了特殊的这些字符,并且,在查询的是时候,还要查询,就用转义字符,
-- 如果是学过编程语言的应该知道这个规定,特别是C语言
select *
from Course
where Cname like 'C\_%';
-- 5.null表达式:SQL允许在某些属性上为空值,代表未知的值,不能喝其他的值作比较,但是可以判断表达式是否为空
-- 格式:<值表达式> | <子查询> is [NOT] null 其中的子查询,会单独说,这一篇不做介绍
-- 查询成绩为空的学生的学号和课程号
select Sno,Cno
from SC
where Grade is null
数据库查询(三)
-- 下面介绍查询中,一个有趣的知识点:就是排序,聚集函数和分组,
-- 1.排序
-- 和excel这个软件一样,我们很有可能将根据某一列来进行对表的排序,这样,能很直观的看到高低,
-- 在SQL中就有这些语句来解决这个问题:就是order by
-- 格式:order by <排序列> [asc|desc] {, <排序列> [asc|desc]}
-- <排序列> :一般是属性名或者是其别名,必须出现在selete字句中
-- order by后面可以有多个<排序列> ,用逗号隔开,每一个都可以是asc(默认升序)或者是desc(降序)
-- 如果是指定多个<排序列> ,则查询结果按照指定的次序进行,排第一个,相等就按照第二个排
-- 查询每一位学生CS202课程的成绩,并将查询结果按成绩降序排序
select *
from SC
where Cn = 'CS202'
order by Greade desc;
-- 查询每位学生的没门课程的成绩,并将查询结果按课程号升序,成绩降序排序
select *
from SC
order by Cno ,Greade desc;
-- 2。聚集函数:也就是SQL提供的一些使用的函数;
-- 这些常见函数是:count max min avg sum
-- 聚集函数可以单独使用,也可以和组合字句 一起使用,
-- 格式:<聚集函数> ([all|distinct] <值表达式>)
-- 下面这是不和组一起的使用:(当和组一起使用的时候,是必须是投影的属性是组中必须有的,否则不能进行投影)
-- 集聚函数一般有两种用法:
-- 1.比较简单,count(*)或者是count(all *)返回的是表中元组的个数,其中ALL可以省略
-- 而count(distinct *)返回的是每一个不同元组的个数
-- 2.加入属性A,计算这个属性的最大值,就是max(A) 直接是使用一个属性进行
-- 查询选修了CS301课程的学生人数
select count(*)
from SC
where Cno = 'CS301';
-- 查询CS101课程最低分和最高分和平均分
select min(Greade),max(Greade),avg(Greade)
from SC
where Cno = 'CS101';
-- 3.分组
-- 分组就是将一个大表分为一个一个有意义的虚拟的表
-- 格式:group by <分组列> {, <分组列>} [having <分组选择条件>]
-- <分组列>:属性
-- [HAVING <分组选择条件>]:过滤掉不满足分组选择条件的元组,默认为having true
-- 注意:带有group by的select ,需要将结果列打印出来
-- 查询每个学生的平均成绩,输出学生的学号和平均成绩
select Sno ,avg(Greade) as A
from SC
group by Sno;
-- 这个语句可以这么理解:第一步:先将一个表分组(按照学号分),第二步:是把每个学号的所有学的课程分数求平均分;
-- 查询200705001学生的平均成绩,输出平均成绩
select avg(Greade) A
from SC
group by Sno having Sno = '200705001';--having 这个关键词就将满足后面条件查询的分出来;
-- 相当于是这个语句
select avg(Greade) A
from SC
where Sno = '200705001';
-- 求每一个科目的平均成绩,输出每个科目的学号和平均成绩
select Cno,avg(Greade) A
from SC
group by Cno;
-- 查询每个学生的平均成绩,并输出平均成绩大于85的学生学号和平均成绩。
select Sno,avg(Greade)
from SC
group by Sno having avg(Greade)>85;
本文详细介绍SQL查询的基础知识,包括SELECT语句的使用方法、WHERE子句的多种表达方式如比较表达式、BETWEEN表达式、IN表达式、LIKE表达式、NULL表达式等。此外还介绍了ORDER BY进行排序、GROUP BY进行分组以及使用聚合函数进行数据汇总的方法。

被折叠的 条评论
为什么被折叠?



