单表查询详解,以及数据库小结

今天是刘小爱自学Java的第62天。

感谢你的观看,谢谢你。

话不多说,继续数据库的学习:

在这里插入图片描述

使用了数据库可视化工具Navicat,感觉真香。

比在Dos窗口中操作方便多了,那个黑乎乎的窗口真心不习惯,并且也有提示。

今天详细地学习下数据记录的查询,同时最后对这几天的知识点做一个总结。

一、基本查询

select,选择选取的意思,在数据库之中可以理解成查询。

在这里插入图片描述
①查询所有数据

select * from student;

*即代表了所有数据,格式为:

select * from+表名

②查询指定列的信息

select name,gender from student;

查询表中name,gender这两列的所有数据,格式为;

select+列名,列名,列名+from+表名

列名之间用逗号隔开。

③条件查询

select * from student where name=“比企谷八幡”;

查询表中name为“比企谷八幡”的所有数据,其中也可以选择部分列的数据,格式不再赘述。

总之where后面填写判断条件。

其中还有运算符相关的查询操作:

在这里插入图片描述

①查询成绩不及格的同学

select * from student where score<60;

即score<60的所有数据。

②查询成绩不等于90的同学

不等于在SQL中有三种表示方式:

  • not score=90;
  • score!=90;
  • score<>90;

③查询成绩在80和90之间的数据

也就是80<=score<=90,在SQL中有两种方式:

  • between 80 and 90;
  • score>=80 and score<=90;

and,即并且的意思。

④查询成绩为88,95,100的同学

在SQL中有两种方式:

  • score in(88,95,100);
  • score=88 or score=95 or score=100;

or,即或者的意思。

上述均为条件查询,也就是用where来说明判断条件,只不过条件中设计到了运算

二、模糊查询、滤重和别名

除了上述的基本查询之外,还有模糊查询:

在这里插入图片描述
①模糊查询

like,像的意思,可以用来模糊查询:

  • name like ‘刘%’;其中%表示1个或多个;
  • name like ‘刘_’;其中_表示1个。

其中第一个只要以刘开头即可以,第二个以刘开头的两个字。

②查询成绩不为null的学生

score is not null;

这很好理解,从字面意思就能看出来。

③查询成绩为null的学生

score is null;

在这里插入图片描述

①过滤掉重复的数据

distinct,清楚的、不同的意思,在这里可以理解成过滤,格式如下:

select distinct+列名+from+表名

其中列名可以有多个。

②给列名起别名

可以给列名起一个别名,格式如下:

select 列名 as 别名+from+表名

就算取别名了,数据库里的列名是没有改变的。

它就是一个渲染效果,所以as后面接什么都可以,字符串也不用加引号。

其中as也可以省略,但最好不省略。

③列运算

这个也好理解,直接在查询列名上+10即可。

其中有一行数据score=null,在SQL中:null与任何数相加都为null。(有点类似于Java中的字符串)

④关于null的处理

ifnull(列名,默认值) ,如果列名为空,给它一个默认值,图中默认值为0,这样就能参与运算了。

三、排序查询及聚合函数

1排序查询

order,订单、排序的意思,在数据库中order就是排序的意思,和前面我们学的sort是一样的。

在这里插入图片描述
①根据score排序查询

select * from+表名+order by+列名+desc

  • desc,在这里是降序的意思。
  • asc,即为升序。

②根据指定条件排序

现在只对男生排序,故加一个where条件判断。

注意:where是紧接着from+表名后面的,这是语法。

其中因为是升序,所以可以省略不写

②根据年龄、分数组合排序

多重排序,先根据前面的条件排序,再根据后面的条件排序。

2聚合函数

SQL语言中定义了部分的函数,可以对查询结果进行操作,也就是聚合函数。

在这里插入图片描述
①统计数量

count,数数的意思,即统计表示数据数量。

  • count(*):*代表所有,即查询所有数据,结果为5。
  • count(score):score这一列因为有一行数据为null,所以不计算在内,

②统计班上的总分

sum,求和的意思。

  • sum(score):分数这一列所有的数据求和。
  • sum(score+age):(分数+年龄这两列)所有的数据求和。

③统计班上的平均分

avg,求平均数的意思,很好理解。

  • avg(score):分数这一列求平均值。
  • avg(score+age):分数+年龄这两列求平均值。
  • sum(score)/count(*):总分除以总人数求平均值。

这两种的区别在于第一种如果数据为null,不加入运算,第二种将nul的数据也加入运算了。

④保留小数点数

round(avg(score),2);2,即表示保留小数点数为2位,可自行设点想要保留的小数点数。

此外,还有两个聚合函数:

  • max(score):求分数这列的最大值。
  • min(score):求分数这列的最小值。

用法和上述一样,就不再赘述了。

再次强调

  • null是不参与运算的。
  • 可以使用ifnull(列名,默认值)给null设定一个默认值。

四、分组查询及查询语句执行顺序

1分组查询

group,分组的意思,关键单词为group by。

在这里插入图片描述

①分男女组查询平均分

根据性别gender分组查询。

格式为:select+列名+from+表名+group by+列名

②根据特定条件分组查询平均分

前面的学习也知道了,where后面专门是接查询条件的,但是在分组查询中一般用having代替,其放在group by后面。

2查询语句执行顺序

用一个例子来说明执行顺序,如下图:
在这里插入图片描述

①from+表名

这是第1步,表中的所有数据。

②where+指定条件

这是第2步,查询出指定条件的数据。

其中起别名:as+别名

这是第2.5步,介于第1步和第2步之间。

所以where后面不能接别名,因为别名都还没有执行。

③group by+列名

这是第3步,按照指定列名分组。

其中聚合函数:avg(列名)

这是第3.5步,聚合函数是介于第3步和第4步之间。

所以分组不能接聚合函数。

④having+条件

这是第4步,所以having后的查询条件,既可以有别名,也可以有聚合函数。

而where就不行,因为where执行的太早了。

⑤select+查询语句

这是第5步,查询出对应的数据,也就是结果集。

⑥order by+列名+desc|asc

查询语句是最后执行的,所以也可以接别名。

面试题:where 和 having 的区别

  • having 通常与group by(分组查询)结合使用。
  • where 是在分组之前进行过滤的,having 是在分组之后进行过滤的。
  • having 可以接聚合函数和别名,where都不可以。也就是说having的查询条件比where更广。

查询时,如非必要,用where的效率更高。

为什么?

where先执行,先将数据筛选之后会减少计算量。

后续再进行其他条件判断,这样可以提高查询效率。

最后

对这几天知识点做一个总结:
在这里插入图片描述

谢谢你的观看。

如果可以的话,麻烦帮忙点个赞,谢谢你。

猜你喜欢

转载自blog.csdn.net/qq_41228864/article/details/106792004