文章目录
- 一、单表查询基本结构
-
二、单表查询结构语法
- select
- 聚合函数
- where
- 模糊查询
- order by
- group by
- having
- 三、多表查询基本结构
-
四、多表查询结构语法
- 内连接
- 自连接
- 外连接
- 五、总结
前言
学习了数据库,在以后公司等地方,你可能不会用到创建数据库或者表格,但是你一定会使用查询,公司的账单、学校的成绩单等等。所以学习数据库最重要的就是会查询,本章的查询只是一个很简单的操作,后面会写更深的高级查询!
查询了解清楚最重要的东西:顺序
一、单表查询的基本结构
查询语句是数据库操作中最基本也是最重要的语句之一,其功能是从数据库中检索满足条件的数据。查询的数据源可以来自一张表,也可以来自多张表甚至可以来自视图。查询的结果是由0行或多行数据组成的一个数据集合,且允许选择一个或多个字段作为输出字段。
查询语句的基本结构可简单描述如下:
select 字段、聚合函数、top… from 表
where –条件过滤
group by –表格分组
having –分组后进行过滤
order by –表格排序
二、单表查询结构语法
1、select
查询学生表student的全部内容
select *from student
查询学生表student的学生学号id、姓名name、性别gender
select id 学号,name 姓名,gender 性别 from student
top用法
查询学生表student前3行数据
select top 3 *from student
查询学生表student前百分之50的数据
select top 50 percent *from student
2、聚合函数
较为常用的聚合函数有:sum()、avg()、max()、min()、count()。
下面演示其用法
求student表中的学生人数
select count(id) from student
求学生的平均成绩,最高成绩和总分
select avg(grade) 平均成绩,max(grade) 最高分,
sum(grade) 总分 from student
3、where
where的主要功能是对我们查询的数据进行过滤,得到我们想要的一些数据!!!
之后的语法会越来越多,想要弄懂整个流程,顺序很重要!
数据库执行的顺序是:先from找到学生表,然后对表格where过滤,最后用 * 来显示全部信息!!!
显示成绩大于80分的学生的基本信息
select *from student
where grade>80
显示全部女生的信息
select *from student
where gender = '女'
显示成绩在80~90之间的学生信息
select *from student
where grade between 80 and 90
4、模糊查询
模糊查询的语法:在where后面加like 或 not like 表示 像这样 或 不像这样
‘_’ 代表一个符号,用来记述一个事物
列出所有姓刘的所有学生
select *from student
where name like '刘%'
列出所有不姓王的所有学生
select *from student
where name not like '王%'
列出姓“张”且全名为2个汉字的学生
select *from student
where name like '张_'
查询出年龄含有“1”字串的所有学生基本信息
select *from student
where age like '%1%'
5、order by
order by 可以用来排列表格的数据。可以分为desc降序排列和asc升序排列,表格默认是升序排列!!
如果:
order by a b,表示先以a升序排列,再以b升序排列!!!
order by desc a b,表示先按a降序排列,然后再以b升序排列!!!
列出学生表中全部信息,按年龄的降序排列
select *from student
order by age desc
先按照年龄升序排列,然后按成绩降序排列学生表
select *from student
order by age ,grade desc
6、group by
gourp by 是将表格进行分组。在有些表例如课程表中,有些学生选多个课程因此会多次出现同一个学号,这时我们可以把学号进行分组,去统计每个学生的选课数目或者总成绩。
注意:在group by 中的select 语句中,只能出现分组依据列和聚合函数。
因为分组之后每个只会显示一行数,聚合函数也只会出现一个数从而不产生矛盾!!
关键词:每个、每门、不同等等
首先查询院系表
在院系表中,统计每个学生的选课门数和总成绩
select sno,count(Cno) 门数,sum(Grade) 总成绩 from sc
group by Sno
7、having
having语句是对分组之后的数据进行过滤,而且只能使用分组列和聚合函数
而where语句是对原始表格进行过滤,只能使用字段不能使用聚合函数
where 必须在having的前面!!
排列顺序为:where -> group by -> having -> order by
统计选课门数超过2门的学生学号、门数和总成绩,并且以选课门数降序排列
select sno,count(Cno) 门数,sum(Grade) 总成绩 from sc
group by sno
having count(Cno)>2
order by count(Cno) desc
三、多表查询的基本结构
多表查询首要目的是将多个表连接起来,在再去进行查询。连接的基本结构为:
select *from A join B
on A.字段 = B.字段 //这样就将A表与B表连接起来了
join C
on C.字段 = A.字段 //看C表与哪个表字段相同则去连接,
这样就形成了三表相连,以此类推
连接查询又分为:内连接、自连接、外连接、全外连接。我们默认连接属于内连接!!!
这种连接在整体上看是一种横向连接,即左右相连,后面会将纵向连接union联合!!
连接后的表是一个整体表,也是一个临时表。依然可以进行单表的所有操作,where、having等依然可以使用!!!
四、多表查询的结构语法
1、内连接
内连接是最常用的一种连接类型。关键词为:inner,使用内连接时,如果两个表的相关字段满足连接条件,则可以把这两个表中提取数据并组合成一个新的临时表!!!
表中连接默认为内连接,其关键词inner 可以省略不写!!
查询课程表,将学生表与课程表用内连接方式连接起来
课程表如下:
select *from student inner join course
on course.sno = student.sno
查询学生张三所选的选课名称
select sname from student inner join course
on course.sno = student.sno
where name = '张三'
2、 自连接
自连接是一种特殊的内连接,它是指的表既可以看成是一张表,也可以看成是两张表。
由于要把一张表当成两种表,以此,在使用自连接时一定要为表取别名!!!
查询和张三爱好相同的学生的学生姓名和爱好
select s2.name,s2.love from student s1 join student s2
on s1.love = s2.love
where s1.name = '张三' and s2.name!='张三'
3、外连接
外连接是只限制一张表中的数据必须满足连接条件,而另一张表中的数据可以不满足连接条件。
例如正常连接条件为选课号相同,只连有选课号的所有学生,但外连接可以显示没有选课号的学生,选课号会自动显示为null。
外连接分为左外连接和右外连接,其关键词分别为:left outer 和 right outer ,其中outer可以省掉不写!!!
查询全体学生的选课情况,包括选修了课程的学生和没有选修课程的学生
select * from student left outer join course
on student.sno = course.sno
使用内连接第8行数据是不会显示的!!!
五、总结
查询的基础语言其实很简单,只需要这些语法的顺序和语句就能很快上手,从上到下首先是找出这张表from 表,然后想要这张表的某些内容 select sno…,或者总分、个数等聚合函数、前几名top语句;
接下来需要对表格进行过滤,用到where语句,注意where只能用普通字段不能使用聚合函数,完了还想把表格分成一些组,则用到group by 语句,分组后想进一步则需要having语句来过滤,但是having只能用聚合函数和分组条件,不能用其他的=字段。
以上只是对一张表格进行操作,要想使用多张表则需要把表连接起来形成一张大的临时表,临时表也是一张表,依然可以用到where等所有语句。其中连接又分为内连接、自连接和外连接,默认为内连接,这三种连接区别很大,容易弄清楚。
学完基础查询后,后面还会学到高级查询,包括子查询和联合,在查询语句里面嵌套查询,之后我会写一篇去解释,如果这篇文章对你有帮助,请一键三连谢谢!!!