经过前面三章的学习,我们对于数据库基本的查询操作已经可以熟练掌握了,那么接下来我们需要学习的就是一些我们日常中会用到的查询语句
相信大家目前已经熟练掌握了where语句的用法了,我们现在回顾一下,我们如果要在learn这个表中查询等级为5的玩家,就可以输入一下语句:
select * from player where level = 5;
那么同样,我们也可以在这其中找寻,玩家等级大于,小于,大于等于,小于等于5的,只需要把level 后面的“=”分别改为“>”,“<”,“>=”,“<=”即可
那如果我们需要多条件检索的话,我们可以用and,between....and....来连接,如果我们现在需要查询等级大于等于1 小于等于5的玩家就可以输入:
select * from player where level >= 1 and level <= 5 ;
运行后我们就可以得出等级在1-5之间的玩家了
当然我们同样可以输入:
select * from player where level between 1 and 5 ;
运行后我们也可以得到相同的结果
不过在这里我们要注意的是,between 后面跟的使我们的最小值,and后面跟的是我们的最大值,如果将1和5反过来再运行,那我们会检索不到任何内容,大家感兴趣的话可以自己尝试下
当然我们也可以用括号来进行检索优先级的限制,比如我们检索等级在1-5或者经验在1-5的玩家,我们就可以输入一下代码:
select * from player
where level > 1 and level < 5
or exp > 1 and exp < 5;
那这时我们如果需要在其中加一个括号,例如:
select * from player
where level > 1
and
(level < 5 or exp > 1)
and exp < 5;
那这样的话,我们就得到了一个全新的结果,这是由于括号里的条件被优先执行,后来再执行的两边的and语句所导致的。
如果我们想快速查询多条数据,我们可以将我们的查询的条件改为in,例如我们如果想要查询等级在(1,3,5)的玩家就可以输入以下代码来快速查询:
select * from player where level in (1,3,5);
当然可以定向查询值在一定范围,也可以查询不在某一范围的值,这个只需要我们在他们的检索前面加上not即可,例如:
select * from player where level not between 1 and 5 ;
或者是
select * from player where level not in (1,3,5);
那么我们在学习的过程中,也需要去进行一些模糊查询,例如我们需要查找姓为“王”的玩家,或是名字中带有“王”的玩家,那么这时候我们就需要进行模糊查询,那我们就可以用like来查询,那么这里我们也需要介绍两个通配符
“%” 代表查询任意个字符
“_” 代表查询任意一个字符
下面我们举例来让大家学习下,首先我们如果需要查找姓王的同学,并且名字为两个字,那我们就可以输入如下语句:
select * from player where name like '王_';
运行后,我们就得到了姓为王,且名字总共两个字的玩家,那如果我们要查找名称中包含王的玩家,那么只需要我们输入:
select * from player where name like '王_';
那如果我们如果想要查看姓名中带王的玩家的,那么我们只需要输入以下代码:
select * from player where name like '%王%';
这样就可以搜索到我们想要的数据了
到这里我们就会发现我们目前的搜索有了些新的字符可以用来表达,那我们也可以在搜索的过程中使用REGEXP来开启我们正则表达式,来使用这些通配符进行搜索,那我们的常用通配符有以下几类:
. | 任意一个字符 |
^ | 开头 |
$ | 结尾 |
[abc] | abc其中任意一个字符 |
[a-z] | 范围内任意一个字符 |
A|B | A或者B |
那么了解到这些之后如果还是刚刚的例子,我们需要查找姓王并且名字只有两个字的玩家,我们就可以输入:
select * from player where name regexp '^王.$';
运行后我们就可以得到一样的结果了,那如果我们需要找到含有王的玩家,只去要在‘’中只留下王就可以了,例如
select * from player where name regexp '王';
运行后我们得到了相同的结果,那么剩下的大家也可以逐一尝试下排序
在某些时候我们需要对我们查找到的结果进行排序操作,这时候我们就需要新引入一个语句order by,这个语句可以帮助我们对于查找到的结果进行排序操作,例如我们需要对player表中的玩家按照等级进行升序操作,那么我们需要输入的内容就是:
select * from player order by level desc;
输入后我们就可以得到以下的结果,那如果我们需要按照等级排序后,等级相同的我们按照经验升序排序,就可以输入:
select * from player order by level desc , exp asc;
这样执行后,我们的结果就会按照等级降序,等级相同经验升序进行排序了
当然,order by 也可以根据表中列数来进行排序,例如还是刚刚的需求,我们也可以输入
select * from player order by 5 desc;也会得到相同的结果,大家有兴趣的话可以试一下
那么除了排序呢,我么也会在实际操作中需要对于我们查找到的数据进行一个简单的处理,那这里就用到了我们的聚合函数,聚合函数常用的有以下几个
avg() | 返回集合的平均值 |
count() | 返回集合中的项数 |
MAX() | 返回最大值 |
MIN() | 返回最小值 |
sum() | 求和 |
而他们的语法会有一些改变,我们这里如果要计算player 这张表中的玩家数量,那么我们就需要输入
select count(*) from player;
查询后就可以看到我们目前的玩家数量了,那么我们如果那我们如果需要查询评价等级,就需要我们输入:
select avg(level) from player;
这样我们就可以取得整张表中的评价等级,其他的我们也可以在自我练习一下。
那如果我们想将我们查询结果进行分组,那我们就可以通过group by来进行查找,例如我们现在想查看player这个表中的男女人数,那我们需要输入
select sex,count(*) from player group by sex;
这里我们select后面并没有跟 * 二十换成了sex,count(*),这里*代表的查找的是我们的表中的所有的数据,sex,count(*)则代表的是只反馈sex和count两个值
同样我们如果想要找到我们的每个等级的玩家的数量,我们只需要将我们的sex换成level就可以了,例如:
select level,count(*) from player group by level;
当然我们有时候也需要对于我们查找的数据进行筛选,那我们需要加上having来对数据进行筛选,
例如我们现在需要查询同一等级中数量大于四个的玩家,那我们需要输入:
select level,count(*) from player group by level having count(level) > 4;
这样我们就可以筛选出来我们的数据了,同样,我们也可以用之前的方法对于我们筛选出来的数据进行排序,例如
select level,count(*)
from player
group by level
having count(level) > 4
order by count(level) desc;
这样就可以将我们的数据进行排列了
那如果在生活中我们需要查找某个姓氏的数量我们需要怎么做呢,这里我们需要引入一个新的表达式叫substr,我们先来编译代码,如果我们需要查询整张表中所有玩家姓氏的数量,并将结果降序排序,并且只需要姓氏数量大于等于5的姓氏,那我们的代码如下:
select substr(name,1,1),count(substr(name,1,1)) from player
group by substr(name,1,1)
having count(substr(name,1,1)) >= 5
order by COUNT(substr(name,1,1)) desc;
运行后即可得到我们想要的数据,那么到这里大家应该就已经可以了解到substr的用法了,他是为了结局到我们数据的一部分,第一个参数是指定字段,第二个参数是截取数据,第三个参数是截取长度,那么大家有兴趣也可以试试其他的内容
接下来我们看看限制函数limit,这里我们一般会对于数据进行限制,取前几位,我们就可以通过limit来进行操作,例如在刚刚如果我们只需要返回前三名的数据,我们只需要在后面加上limit 3 就可以了
当然limit也可以返回一个偏移量,例如我们如果想返回4-6名的数据,我们就可以写成
limit 3,3
这里第一个3代表开始数量,第二个3代表限制数量
这个也就是我们的分页原理,数据分页也就是运用这个函数来操作的
去重这里我们有一个函数叫distinct,可以直接让我们去除重复记录,
例如我们想要查看player表中的重复记录,就可以利用distinct来操作,例如我们想要查询表中所有玩家的性别,我们就可以输入一下代码得到去重之后的结果,当然distinct还会用作于去除笛卡尔积中,这个我们后面遇到了在进行讲解
select distinct sex from player;
合并查询结果我们这里使用union这个结果,例如我们如果想查询等级1-3以及经验1-3的玩家,我们就可以执行
select * from player where level between 1 and 3
union
select * from player where exp between 1 and 3;
即可,但是我们需要注意的是,union操作会直接去掉重复项,我们如果查找的数据中有重复项的话,是不会显示在其中的,可以看到我们吕秀才玩家两个条件都是满足的,那如何让我们把所有的信息都保存了呢,我们就可以使用union all来保存,
select * from player where level between 1 and 3
union all
select * from player where exp between 1 and 3;
这样我们的所有数据就会都被保存下来了
当然我们可以查询两个结果的并集,当然也可以查询两个结果的交际,只需要我们把union 换成intersect就可以了,例如输入以下内容,我们运行后即可看到,
select * from player where level between 1 and 3
intersect
select * from player where exp between 1 and 3;
内容中仅有一个满足的玩家
except则是筛选其中的差集,我们接下来继续将我们的intersect换成except后运行一下看看
select * from player where level between 1 and 3
except
select * from player where exp between 1 and 3;
这个查找就是我们查找等级在1-3,但是经验不在1-3的玩家了