随便玩玩之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中的分类汇总更合理,使用方法也非常灵活。

至此,第二章结束,简单介绍了单表查询,语句都很简单,但是很神奇。

时间: 2024-08-26 17:20:47

随便玩玩之PostgreSQL(第二章)单表数据查询的相关文章

第二章 单表查询 T-SQL语言基础(3)

单表查询(3) 2.6 处理字符数据 字符数据的查询处理,内容包括:类型,排序规则,运算符和函数,以及模式匹配. 2.6.1 数据类型 SQL Server支持两种字符数据类型----普通字符和Unicode字符.普通字符数据类型包括CHAR和VARCHAR,Unicode字符数据类型包括NCHAR和NVARCHAR. 普通字符和Unicode字符的区别:普通字符使用一个字节来保存每个字符,而Unicode字符则需要两个字节. 注:当表示一个普通的字符常量时,只需要简单地使用单引号:'This

第二章 单表查询 T-SQL语言基础(2)

单表查询(2) 2.2 谓词和运算符 T-SQL有几种不同的语言元素可以指定逻辑表达式,例如,查询过滤器(WHERE和HAVING),CHECK约束,等等. 在逻辑表达式中可以使用各种谓词(取值为TRUE,FALSE,或UNKNOWN的表达式)和运算符. T-SQL支持的谓词包括IN,BETWEEN,以及LIKE等. -- Predicates: IN, BETWEEN, LIKE SELECT orderid, empid, orderdate FROM Sales.Orders WHERE

随便玩玩之PostgreSQL(第三章)表连接查询

随便玩玩之PostgreSQL(第三章)表连接查询 随便玩玩之PostgreSQL 未经授权不得转载

机器学习 Machine Learning(by Andrew Ng)----第二章 单变量线性回归(Linear Regression with One Variable)

第二章 单变量线性回归(Linear Regression with One Variable) <模型表示(Model Representation)>                                                             <代价函数(Cost Function)>                                                          <梯度下降(Gradient Descent)

ORM 单表操作查询 多表操作查询及增删改查

------------------------------------------只有对前途乐观的人,才能不怕黑暗,才能有力量去创造光明.乐观不是目的,而是人生旅途中的一种态度. 多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系(one-to-one) 出版商模型:出版商有名称,所在城市以及email. 书籍模型: 书籍有书名和出版日期

CentOS6.4 配置mysql服务器启动多个端口,同步单表数据

============================================================ ====多端口启动==== ============================================================ 创建数据目录 mkdir /usr/local/mysql/var1/ mkdir /usr/local/mysql/var2/ =================================================

django获取单表数据的三种方式

django获取单表数据的三种方式 v1 = models.Business.objects.all() # QuerySet ,内部元素都是对象 v2 = models.Business.objects.all().values('id','caption') # QuerySet ,内部元素都是字典 v3 = models.Business.objects.all().values_list('id','caption') # QuerySet ,内部元素都是元组 def business(

SQLServer导出导出单表数据

1.SQLServer导出单表数据为TXT文件 数据库--任务--导出数据 这样,导出会带列名称.. 导入数据:

MySQL学习总结(五) --- 表数据查询

查询数据记录,是指从数据库对象表中获取所要查询的数据记录,该操作可以说是数据最基本的操作之一,也是使用频率最高.最重要的数据操作. 1.单表数据记录查询 1.1.简单数据查询 SELECT field1,field2,…,fieldn FROM table_name,filed可以是表中所有的字段,也可以是部分字段. SELECT * FROM table_name ,从表中查询所有的数据.*符号可以代替所有的字段,但是这种方式不够灵活,只能按照表中字段的顺序固定进行显示,不能够随便改变字段的显