随便玩玩之PostgreSQL(第二章)单表数据查询
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随便玩玩之PostgreSQL(第二章)单表数据查询相关的知识,希望对你有一定的参考价值。
随便玩玩之PostgreSQL(第二章)单表数据查询
未经授权不得转载
第二章 单表数据查询
数据库的基本功能就是数据增查改删,倘若不可以,要她还有什么意义。数据查询功能不仅仅是查询,而且还能筛选,并且格式化显示。
数据查询使用SELECT语句,本章介绍如何使用SELECT查询(列出)数据库中的数据。
2.1查询数据库cj表中全部信息
方法一:使用“*”通配符查询所有数据(所有字段数据)。
SELECT * FROM cj;
结果如图。
方法二:制定所有字段(列名)。每个字段用逗号(,)隔开。
SELECT id,kc,bj,xm,yw,sx,yy FROM cj;
结果如图。
2.2查询数据库中指定字段信息(只显示出想要的列)。
字段不限制数量,只要是表内的字段,不限制个数,重复也可以。
SELECT xm,yw FROM cj;
结果列出所有学生的姓名和语文成绩。
2.4查询指定记录(只显示想要的行)。
数据库的信息本来就包含了各种信息,如cj表中包括一班、二班、三班的每一个学生的考试成绩。倘若查询一班所有人的成绩,可以查出所有人的成绩,然后在EXCEL中删掉二班、三班的。数据量少的时候可以这样,数据量多的时候速度就会下降。不过,我们可以通过限制查询条件进行查询,按条件查询(列出)数据。
SELECT * FROM cj WHERE bj=‘一班‘;
结果如图。
语句中的等号(=)表示只查询bj字段为一班的学生的成绩。等号为判断符,其他判断符为<>(或者!=,表示不等于),<(表示左边数值小于右边数值),<=(表示小于等于右边数值),>(表示大于右边数值),>=(表示大于等于右边数值),BETWEEN AND(表示介于两个数值之间)。
如:
1 --查询语文成绩大于60的学生。 2 SELECT * FROM cj WHERE yw > 60;
3 --查询语文成绩在60到69之间的学生。 4 SELECT id,bj,xm,yw FROM cj WHERE yw BETWEEN 60 AND 69; 5 --或者 6 SELECT id,bj,xm,yw FROM cj WHERE yw>=60 AND yw<69; --结果与第四行语句相同。
7 --查询语文成绩不是60到69的学生。 8 SELECT * FROM cj WHERE yw NOT BETWEEN 60 AND 69;
9 --查询英语成绩等60的学生。 10 SELECT * FROM cj WHERE yy=60;
11 --查询英语成绩等于60且必须等于70的学生(无意义,没结果且不合逻辑)。 12 SELECT * FROM cj WHERE yy=60 AND yy=70;
13 --查询张三的成绩。 14 SELECT * FROM cj WHERE xm=’张三’;
15 --查询张三其中考试的成绩。 16 SELECT * FROM cj WHERE xm=‘张三‘ AND kc=‘期中考试‘;
17 --查询语文成绩大于80和(或)小于65的学生。 18 SELECT * FROM cj WHERE yw > 80 OR yw<65;
2.4多条件查询
多条件查询使用AND或OR操作符,可以指定2个及以上的条件。
AND操作符限定满足所有条件才会有记录返回。
如:查询期中考试三班语文成绩大于80的学生。
SELECT * FROM cj WHERE kc=‘期中考试‘ AND bj=‘三班‘ AND yw>80;
OR操作符只需所有条件中满足一个条件即可。
如:查询语文成绩大于80或一班的学生。
SELECT * FROM cj WHERE yw>80 OR bj=‘一班‘;
用IN操作符实现OR操作符功能。
如:查询英语成绩等于60和(或)70的学生。
--OR操作符 SELECT * FROM cj WHERE yy=60 OR yy=70; --IN操作符 SELECT * FROM cj WHERE yy in (60,70);
2.5 去掉查询结果中的重复记录。
cj表中共有18个学生的信息,每一个信息都有一个班级。想要从表中得到有多少个班级,只有查询出所有班级字段,然后去掉重复的,只保留一个,即可得到班级数量。使用DISTINCT关键字即可去掉重复记录,只保留一个记录值。
SELECT DISTINCT bj FROM cj;
结果如图。
结果把所有的班级只列出一个,只需要数一数有多少行即可得出有三个班级。
也有不想数行的方法,使用count()函数即可实现。
SELECT count(DISTINCT bj) FROM cj;
结果如图。
2.6对查询结果排序
默认查询结果没有排序,有可能每次的查询结果顺序都不一样。使用ORDER BY子句可以对结果进行排序。
如:从低到高列出所有学生的语文成绩。
SELECT xm,yw,bj,kc FROM cj ORDER BY yw;
结果如图。
如:先分期中考试、期末考试,在从低到高列出所有学生语文成绩。
SELECT kc,yw,bj,xm FROM cj ORDER BY kc,yw;
结果如图。
默认排序为1-9,A-Z,逆序排列只需要在字段后加DESC关键字即可,DESC约束其前的字段,如果对所有排序条件逆序,需在所有关键字后加DESC。
如:列出从高到低列出所有学生期中考试语文成绩。
SELECT kc,yw,bj,xm FROM cj WHERE kc=‘期中考试‘ ORDER BY kc,yw DESC;
结果如图。
2.7查询结果分组
分组排序使用GROUP BY子句。
但是分组之后组字段显示的值是什么?做班级成绩汇报时,一般说一班有多少个人,语文平均分是多少,语文最高分是多少,最低分是多少,不会说出每个人的成绩,也不会随便说一个人的成绩。所以分组之后显示的是计算的结果,计算使用聚合函数。常用的聚合函数有:计数量count(),求最大值max(),求最小值min(),计总和sum(),求平均avg()。
如:计算出各班的期中考试平均。
SELECT bj,avg(yw),avg(sx),avg(yy) FROM cj WHERE kc=‘期中考试‘ GROUP BY bj;
结果如图。
小数点太多?可以用round()函数截取。
SELECT bj,round(avg(yw),2),avg(sx),avg(yy) FROM cj WHERE kc=‘期中考试‘ GROUP BY bj;
结果如图。
一行的SQL语句太长?可以分行写SQL语句,只要在最后有一个分号就可以。
SELECT bj, round(avg(yw),2), avg(sx),avg(yy) FROM cj WHERE kc=‘期中考试‘ GROUP BY bj;
结果如图。
语句换行不影响查询结果。
表头都是AVG,不美观?使用AS关键字设置别名即可。
SELECT bj AS "班级", round(avg(yw),2) AS "语文平均分", avg(sx) AS "数学平均分", avg(yy) AS "英语平均分" FROM cj WHERE kc=‘期中考试‘ GROUP BY bj;
结果如图。
AS的功能是给字段或表起一个别名。
数据没有排序,看起来不方便?分组之后再排序。
SELECT bj AS "班级", round(avg(yw),2) AS "语文平均分", avg(sx) AS "数学平均分", avg(yy) AS "英语平均分" FROM cj WHERE kc=‘期中考试‘ GROUP BY bj ORDER BY avg(yw);
结果如图。
注:最后的ORDER BY指定的不是字段本身,而是使用聚合函数计算后的字段。已经给avg(yw)设置了别名,那么ORDER BY 能使用别名作为排序条件吗?当然可以。
SELECT bj AS "班级", round(avg(yw),2) AS "语文平均分", avg(sx) AS "数学平均分", avg(yy) AS "英语平均分" FROM cj WHERE kc=‘期中考试‘ GROUP BY bj ORDER BY "语文平均分";
结果如图。
2.8查询结果分组排序后再筛选
使用WHERE关键字可以筛选过滤数据,但是WHERE的筛选只能是指定选择记录的条件,请记住:WHERE关键字是用在记录上的。对于分组之后的组有该如何筛选?HAVING关键字用来筛选分组之后的数据。
如:筛选出期中考试语文平均分大于70的班级。
SELECT bj AS "班级", round(avg(yw),2) AS "语文平均分", avg(sx) AS "数学平均分", avg(yy) AS "英语平均分" FROM cj WHERE kc=‘期中考试‘ GROUP BY bj HAVING avg(yw)>70;
结果如图。
2.9限制查询结果数量。
SELECT将返回所有匹配的行,可能是表中的所有行,如仅仅需要返回第一行或前几行,使用LIMIT关键字。
如:查询cj前3行的数据。
SELECT * FROM cj LIMIT 3;
结果如图。
也可以查询从第4行开始的3条记录。
SELECT * FROM cj LIMIT 3 OFFSET 4;
结果如图。
数据库本身的记录(行)从0开始计算,第4行应理解为数据库的第5个记录。
2.10 使用聚合函数实现分类汇总
count()函数计算表内行的总数。方法有两种:count(*)计算表内行的总数,包括空值。Count(字段名)计算指定列行的总数,忽略空值。
sum()函数计算一个列的所有记录累计总和。
avg()函数计算一个列的所有记录的平均值。
Max()函数返回一个列的所有记录中的最大值。
Min()函数返回一个列的所有记录中的最小值。
如:实现EXCEL中的分类汇总功能。
1 SELECT 2 bj AS "班级", 3 count(bj) AS "人数", 4 sum(yw) AS "语文总分", 5 round(sum(yw)/count(bj),2) AS "语文(除)", 6 round(avg(yw),2) AS "语文(返回)", 7 round(avg(sx),2) AS "数学平均分", 8 round(avg(yy),2) AS "英语平均分" 9 FROM cj 10 WHERE kc = ‘期中考试‘ 11 GROUP BY bj 12 ORDER BY avg(yw);
结果如图。
得出的结果比EXCEL中的分类汇总更合理,使用方法也非常灵活。
至此,第二章结束,简单介绍了单表查询,语句都很简单,但是很神奇。
以上是关于随便玩玩之PostgreSQL(第二章)单表数据查询的主要内容,如果未能解决你的问题,请参考以下文章
Django学习第6篇:Django之ORM单表操作(增删改查)