随便玩玩之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(第二章)单表数据查询的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL基础操作之单表的增删改查

Django学习第6篇:Django之ORM单表操作(增删改查)

Django学习第6篇:Django之ORM单表操作(增删改查)

Django之Models

iOS CoreData数据库之增删改查

iOS CoreData数据库之增删改查