PostgreSQL 数据库查询

42 篇文章 9 订阅
42 篇文章 22 订阅

数据库的查询

一、基本查询

语法:SELECT查询基本格式


①、创建frui表
create table fruit(
f_id character(10) not null,
s_id integer not null,
f_name character(255) not null,
f_price decimal(8,2) not null,
primary key(f_id));


②、插入字段
insert into fruit (f_id,s_id,f_name,f_price)
values('a1',101,'apple',5.2),
('b1',101,'berry',10.2),
('bs1',102,'orange',11.2),
('bs2',105,'melon',8.2),
('t1',102,'banana',7.2),
('t2',102,'grape',16.5),
('o2',103,'cherry',9.6);
③、查询数据库


二、单表查询

单表查询是从一张数据表中查询所需数据。

(一)、查询所有字段
1、使用通配符“*”查询所有字段
select * from  表名;


2、指定所有字段进行查询
select 字段, 字段,··· from fruit;
(二)、查询指定的字段
1、查询单个字段
select 字段 from 表名;

2、查询多个字段
select 字段1,字段2·· from 表名;


(三)、查询指定记录


select f_price from fruit where f_name='banana';



要求在查询的结果中消除重复的行。结果行的顺序可能变化。可以组合使用 DISTINCT 和 ORDER BY 来保证获取一致
的结果:


(四)、IN关键字查询

       IN操作符用来查询满足指定条件范围内的记录,使用IN操作符时,将所有检索条件用括号括起来,检索条件用逗号分隔开,只要满足查询范围内的一个值即为匹配项。

select s_id,f_name,f_price from fruit where s_id in (102,103);


也可以使用NOT来检索不在条件范围内的记录。

select s_id,f_name,f_price from fruit where s_id not in (102,103);


(五)、BETWEEN AND关键字的范围查询

①、它是用来查询某个范围内的值,该操作符需要两个参数,即范围的开始值和结束值,如果记录的字段值满足指定的范围查询条件,则这些记录被返回。

select s_id,f_name,f_price from fruit where f_price between 5.2 and 8.2;


②、BETWEEN AND 操作符前可以加关键字NOT,表示指定范围之外的值,如果字段值不满足指定的范围内的值,则这些记录被返回。

select s_id,f_name,f_price from fruit where f_price not between 5.2 and 8.2;


(六)、带LIKE的字符匹配查询

通配符是一种在SQL的WHERE条件句子中拥有特殊含义的字符,SQL语句支持通配符,可以和LIKE一起使用的通配符是“%”。

①、查询以‘a’开头的水果名称;

select s_id,f_name from fruit where f_name LIKE 'a%';


②、查询水果中含有b的水果

select s_id,f_name from fruit where f_name LIKE '%b%';


(七)、查询空值


1、创建表


②、插入数据


③、查询为空的字段
select id,name ,email from customers where email is null;

与 IS NULL 相反的是NOT IS NULL ,该关键字查找字段不为空。

select id,name ,email from customers where email is not null;


(八)、AND查询

        PostgreSQL在where子句中使用AND操作符,限定只有满足所有查询条件的记录才会被返回。可以使用AND连接两个甚至多个查询条件,多个表达式之间用AND分开。

select s_id ,f_name,f_price from fruit where s_id=101 and f_price >=6.0;


查询s_id =102 、103 ,价格大于等于5,并且是‘banana’的记录

select f_id ,f_name,f_price from fruit where s_id in('102','103') and f_price >=5.0 and f_name ='banana';


(九)、OR查询

        在WHERE中使用OR操作符,表示记录只需要满足其中一个条件即可返回。OR也可以连接两个甚至多个查询条件,多个条件表达式之间用OR分开。

select s_id ,f_name,f_price from fruit where s_id='101' or s_id='102';


(十)、查询结果不重复

消除重复记录



(十一)、对结果进行排序
1、列排序
select  s_id ,f_name,f_price from fruit order by f_name;

2、指定排序方向




(十二)、分组查询


1、创建分组

对水果进行分组,每类水果有几种

select  s_id , count(*) as total  from fruit group by s_id ;


2、HAVING过滤分组

GROUP BY 可以和HAVING一起限定显示所需满足的条件,只有满足条件的分组才会被显示。

分组,并显示水果种类大于1;


3、GROUP BY 和ORDER BY一起用
select  s_id , count(f_name) from fruit group by s_id having count(f_name)>1 order by count(f_name);


(十三)、限制查询结果的数量

SELECT将返回所有匹配的行,可能是表中所有的行,如仅仅需要返回第一行或是前几行,使用LIMIT关键字:

                                         


查询前两行的数据:

如果指定返回记录的开始位置,则返回结果为从“位置偏移量”参数开始的指定行数,“行数”参数指定返回的记录条数。

三、集合函数查询

(一)、COUNT()函数

COUNT()函数统计数据表中包含的记录行的总数,或者根据查询结果返回列中包含的数据行数。

两种使用方法: COUNT(*) 计算表中总的行数,不管某列是否有数值或者为空值。

                        COUNT(字段名)计算指定列下总的行数,计算时将忽略字段值为空值的行。

①、查询customers一共有几列


指定列的值为空的行被COUNT()函数与GROUP BY 关键字一起使用


②、水果s_id分组,以及查询每组水果的数量


(二)、SUM()函数

SUM()是一个求总和的函数,返回指定列表的总和。

①、查询id=101 的水果价格总和


②SUM()也可以和group by、order by一起使用,计算每个分组的总和

价格分组,并查询每组价格总和,并按照价格升序排列

SUM()在进行操作时,会忽略值为NULL 的行

(三)、AVG()函数

AVG()函数通过计算返回的行数和每一行数据的和,求得指定列数据的平均值。

①、求id=101的价格平均


②、平均、分组、排序


AVG()函数在使用的时候,其参数为要计算的列名称,如果要得到多个列的多个平均值,则需要在每一列上使用AVG()函数。

(四)、MAX()函数

MAX()返回指定列中的最大值。

①、查询价格最高的


②、查询每组价格最高的,并且排序


MAX()函数不仅适用于查询数值类型,也适用于查询字符类型。



(五)、MIN()函数

MIN()函数返回查询列中最小值。



MIN()和MAX()函数一样,不仅适用于查询数值类型,也适用于查询字符类型。

四、连接查询

(一)、内连接

(二)、外连接

请参考我之前写过的博客:https://blog.csdn.net/qq_28289405/article/details/80254001

五、子查询

        子查询是指一个查询语句嵌套在另一个查询语句内部的查询。在SELECT子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或是多个表。子查询中常用的操作符有ANY(SOME) 、ALL、IN 、EXISIT。子查询可以添加到SELECT 、UPDATE 、DELETE语句中,而且可以进行多层嵌套。子查询中也可以使用比较运算符,如“<”、“>”、“>=”、“!=”、“<=”等。

(一)、ANY 、SOME关键字的子查询


1、创建表并插入数据



ANY关键字接在一个比较操作符的后面,表示与子查询返回的任何值比较为TRUE,则返回TRUE。



(二)、ALL关键字的子查询

使用ALL需要同时满足所有内层查询的条件。ALL接在一个比较操作符后,表示与子查询返回的所有值比较为TRUE时,则返回TRUE;

select num1 from tb11 where num1 > all(select num2 from tb12);

(三)、带EXISTS关键字的子查询

        EXISTS关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么EXISTS的结果为TRUE,此时外层查询语句将进行查询;如果子查询没有返回任何行,那么EXISTS的结果为FLASE,此时外层语句将不进行查询。

查询customers表中id=102的顾客,存在在fruit表中的纪录:

select * from fruit where exists(select f_name from customers where s_id=102);


EXISTS --- 关键字可以和条件表达式一起用。




EXISTS 和NOT EXISTS的结果只取决于是否会返回行,而不取决于这些行的内容,所以这个子查询输入列表通常是无关紧要的。

(四)、带IN关键字的子查询

IN关键字进行子查询的时候,内层查询语句仅仅返回一个数据列,这个数据列里的值将提供给外层查询语句进行比较操作。



  • 2
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值