PostgreSQL语句大全

简介: PostgreSQL是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。PostgreSQL开发者把它念作post-gress-Q-L。PostgreSQL的Slogan是"世界上最先进的开源关系型数据库"。基本语法CREATEFUNCTION//声明创建函数ADD(INTEGER,INTEGER)//定义函数名称RETURNSINTEGER//定义函数返回值'//定义函数体'--使用函数。......

 

目录

前言

基本操作

数据库操作

创建表

表操作

往表中插入数据

修改表数据

删除表数据

表查询

单表指定条件查询

单表指定条件复杂查询

多表查询

子查询

数据类型

数值类型

日期与时间类型

编辑

字符串类型

运算符

算术运算符

编辑

比较运算符

逻辑运算符

函数

数值函数

字符串函数

编辑

日期时间函数

自定义函数

数据库索引

数据库视图

主键、外键

主键

外键

约束


前言

PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。PostgreSQL 开发者把它念作 post-gress-Q-L。PostgreSQL 的 Slogan 是 "世界上最先进的开源关系型数据库"。


一、基本操作

数据库操作

-- 创建数据库
CREATE DATABASE db_lbh;
-- 在创建数据库时指定参数信息  WITH OWNER:所有者  ENCODING:编码格式
CREATE DATABASE db_lbh2 WITH OWNER = postgres ENCODING = 'utf-8';
-- 修改数据库名称
ALTER DATABASE db_lbh2 RENAME TO db_lbh3;
-- 修改连接限制数
ALTER DATABASE db_lbh CONNECTION LIMIT 20;
-- 删除数据库
DROP DATABASE db_lbh3;

image.gif

创建表

-- 创建表
CREATE TABLE student(
id INT,
name VARCHAR(30),
birthday DATE,
score NUMERIC(5,2)
);

image.gif

表操作

-- 修改表名
ALTER TABLE student RENAME TO student1;
-- 修改字段名
ALTER TABLE student1 RENAME id TO myid;
-- 修改字段类型
ALTER TABLE student1 ALTER COLUMN name TYPE VARCHAR(40);
-- 删除字段
ALTER TABLE student1 DROP COLUMN birthday;
-- 添加字段
ALTER TABLE student1 ADD COLUMN birthday varchar(20);
-- 删除表
DROP TABLE student1;
-- 删除前进行判断
DROP TABLE IF EXISTS student1;

image.gif

往表中插入数据

-- 插入数据
INSERT INTO student VALUES (1,'阿道夫','2022-10-10',NULL);
-- 指定字段插入数据
INSERT INTO student (id,name) VALUES('2','王老五');
--SELECT批量插入
-- 将表数据插入到新表中
INSERT INTO student1 SELECT * FROM student;
-- 指定字段批量插入
INSERT INTO student1 (id,name) SELECT id, name FROM student;

image.gif

修改表数据

-- 更新数据,将id等于2的用户名改成'张三' ,如果不指定更新条件,会全局更新
UPDATE student SET name = '张三' WHERE id = 2;

image.gif

删除表数据

指定条件删除

--删除id等于2的表数据
DELETE FROM student WHERE id = 2;
--删除id在1到3的表数据
DELETE FROM student WHERE id BETWEEN 1 and 3;

image.gif

清空表数据

--清空数据表
DELETE from student;
TRUNCATE TABLE student;

image.gif

表查询

--  查询所有字段内容
SELECT * FROM student;
--  批量字段查询
SELECT id, name FROM student;
--  多表查询
SELECT student.name, student1.name  FROM student;
--  给表取别名后查询,简化代码
SELECT s.id, s.name  FROM student s;

image.gif

单表指定条件查询

-- in关键字查询 查询id为1,3,5的成员
SELECT id, name FROM student WHERE id IN (1,3,5);
-- between and 关键字查询,在什么之间
SELECT id, name, birthday  FROM student 
WHERE birthday BETWEEN '2020-10-10' AND '2024-10-10';
--模糊查询,查询所有姓张的用户
SELECT id, name FROM student WHERE name LIKE '张%';

image.gif

单表指定条件复杂查询

--  查询所有字段内容
SELECT * FROM student;
-- 只显示前3条数据
SELECT * FROM student LIMIT 3;
-- 查询三条数据,从第二条开始
SELECT * FROM student LIMIT 3 OFFSET 2;
-- 查询姓名非空内容
SELECT id,name FROM student where name is NOT null;
-- 1 or 3 :1与3 ;ORDER BY id ASC 按id升序 ORDER BY id DESC 按id降序
SELECT id,name FROM student where id=1 OR id=3 ORDER BY id ;

image.gif

多表查询

--创建一个班级表,id为主键
CREATE TABLE class(
id int PRIMARY KEY,
name VARCHAR(10)
);
--插入班级与对应id
INSERT INTO class VALUES(1,'一班'),(2,'二班');
--创建学生表,id为主键,classid为外键,关联表class的id
CREATE TABLE student(
id INT PRIMARY KEY,
name VARCHAR(30),
birthday DATE,
score NUMERIC(5,2),
classid int,
CONSTRAINT pk_student_id FOREIGN KEY(classid) REFERENCES class(id)
);
INSERT INTO student VALUES
(1,'阿道夫','2022-10-10',NULL,1),
(2,'沙和尚','2022-10-10',NULL,2),
(3,'孙悟空','2022-10-10',NULL,2);
-- 隐式内连接,关联classid显示student成员所在班级
SELECT student.id, class.id,student.name, class.name FROM student, class WHERE  student.classid = class.id;
-- 显示内连接,INNER JOIN不返回空值;LEFT JOIN 左连接,RIGHT JOIN 右连接,不能匹配的数据也返回
SELECT student.id, class.id,student.name, class.name 
FROM student INNER JOIN class ON student.classid = class.id ;

image.gif

image.gif

子查询

子查询或称为内部查询、嵌套查询,指的是在 PostgreSQL 查询中的 WHERE 子句中嵌入查询语句。

一个 SELECT 语句的查询结果能够作为另一个语句的输入值

-- EXISTS关键字子查询
SELECT * FROM student WHERE EXISTS
(SELECT class.id FROM class WHERE class.name = '二班' AND student.classid = class.id);
-- IN 关键字子查询
SELECT * FROM student WHERE student.classid IN
(SELECT class.id FROM class WHERE class.name = '二班' );

image.gif

查询结果合并操作

UNION                 可去重复         执行速度慢

UNION ALL         不可去重复         执行速度快

二、数据类型

数值类型

--整数类型
SMALLINT          //小整数:-32768 ~ 32767
INT(INTEGER)        //普通整数:-2147483648 ~ 2147483647
--任意精度浮点数类型
REAL            //6位十进制数字精度
NUMERIC(m,n)        //任意精度(m总位数,n小数位)

image.gif

举例

--创建学生表,设置id数值类型
CREATE TABLE student(
id1 SMALLINT,
id2 INT,
id3 REAL,
id4 numeric(5,2)
);

image.gif

日期与时间类型

image.gif

举例:

--创建表
CREATE TABLE student(
t TIME,
d DATE,
tm TIMESTAMP
);
--插入数据
INSERT INTO student VALUES('10:10:10','2020-10-10','2020-10-10 10:10:10');

image.gif

image.gif

字符串类型

image.gif举例:

-- 创建表
CREATE TABLE student(
ch CHAR(10),
vch VARCHAR(30),
t TEXT
);
-- 插入数据
INSERT INTO student VALUES ('哈哈哈','哈哈哈','哈哈哈')
SELECT concat('(',ch,')'),
       concat('(',vch,')'),
       concat('(',t,')')
FROM student;

image.gif

可以看见CHAR类型字符长度不够会空白补充

image.gif

运算符

算术运算符

image.gif

比较运算符

image.gif

-- 判断2是否在1~3之间  T 
SELECT 2 BETWEEN 1 AND 3;
-- 判断2是否在234集合中 T
SELECT 2 in (2,3,4);
--  like运算符模糊匹配 %代表多个字符  _代表一个字符
SELECT 'abc' LIKE 'a%',       --T
       'abc' LIKE '_a_',    --F
       'abc' LIKE '_b_',    --T
       'abc' NOT LIKE '_b_';  --F
SELECT LEAST(1,2,3),      --返回最小值:1
       GREATEST(1,2,3); --返回最大值:3

image.gif

逻辑运算符

    • NOT (逻辑非)
    • AND (逻辑与)
    • OR (逻辑或)

    image.gif

    函数

    数值函数

    image.gif

    SELECT 函数(字段名) from 表名;  

    字符串函数

    image.gif

    SELECT 函数(字段名) from 表名;

    日期时间函数

    image.gif

    image.gif

    EXTRACT使用

    image.gif

    自定义函数

    基本语法

    CREATE FUNCTION               //声明创建函数
      ADD(INTEGER,INTEGER)          //定义函数名称
    RETURNS INTEGER               //定义函数返回值
      AS'SELECT $1 + $2;'           //定义函数体
    LANGUAGE SQL                //用以实现函数的语言名字
    RETURNS NULL ON NULL INPUT;           //定义参数为NULL时处理情况

    image.gif

    举例:

    CREATE FUNCTION                   
      add2(INTEGER,INTEGER)           
    RETURNS INTEGER                   
      AS'SELECT $1 + $2 + $1;'              
    LANGUAGE SQL                      
    RETURNS NULL ON NULL INPUT;  
    --使用函数
    SELECT add2(1,2);
    -- 结果: 4

    image.gif

    删除函数

    DROP FUNCTION concat_student(INT,VARCHAR,DATE);

    数据库索引

    使用索引的优缺点

    优点:

      1. 通过创建唯一的索引,可以保证数据库表中每一行数据的唯一性。
      2. 可以大大提高查询速度
      3. 加速表与表之间的连接
      4. 减少查询中分组和排序的时间

      缺点:

        1. 创建和维护索引耗费时间,数据量越多耗费的时间越多
        2. 索引需要占用物理空间
        3. 对表的数据进行增加、删除、修改的时候,索引也需要动态维护,降低了数据的维护速度。

        image.gif

        -- 创建索引 此处默认使用B-tree
        CREATE INDEX student_name_index ON student(name);
        -- 删除索引
        DROP INDEX student_name_index;

        image.gif

        数据库视图

        使用视图具有 简单化、安全性、逻辑数据独立性

        --创建视图top3,展示id,name,birthday 条件是id<=3  并且按id降序
        CREATE VIEW top3 AS SELECT id,name,birthday FROM student where id <= 3 ORDER BY id desc;
        --查看视图
        SELECT * FROM top3;
        --删除视图
        DROP VIEW top3;

        image.gif

        image.gif

        主键、外键

        主键

        比如我们前面创建的学生表student里,id是唯一的,就可以使用PRIMARY KEY语句设置为主键

        --方式1,列级约束,使用PRIMARY KEY语句,不能指定主键名称
        CREATE TABLE student(
        id INT PRIMARY KEY,
        name VARCHAR(30),
        birthday DATE,
        score NUMERIC(5,2)
        );
        --方式2,表级约束,可以指定主键名称
        CREATE TABLE student(
        id INT,
        name VARCHAR(30),
        birthday DATE,
        score NUMERIC(5,2),
        CONSTRAINT pk_student_id PRIMARY KEY(id)
        );

        image.gif

        外键

        --创建一个班级表,id为主键
        CREATE TABLE class(
        id int PRIMARY KEY,
        name VARCHAR(10)
        );
        --插入班级与对应id
        INSERT INTO class VALUES(1,'一班'),(2,'二班');
        --创建学生表,id为主键,classid为外键,关联表class的id
        CREATE TABLE student(
        id INT PRIMARY KEY,
        name VARCHAR(30),
        birthday DATE,
        score NUMERIC(5,2),
        classid int,
        CONSTRAINT pk_student_id FOREIGN KEY(classid) REFERENCES class(id)
        );

        image.gif

        约束

        主键与约束的区别,主键的值是非空唯一,且一个表只能有一个主键,可以有多个约束

        CREATE TABLE student(
        id INT UNIQUE,               // UNIQUE    唯一约束
        name VARCHAR(30) NOT NULL,       // NOT NULL  非空约束
        birthday DATE,
        score NUMERIC(5,2) DEFAULT 0.0     // DEFAULT   默认值约束
        );

        image.gif

        相关实践学习
        使用PolarDB和ECS搭建门户网站
        本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
        阿里云数据库产品家族及特性
        阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
        目录
        相关文章
        |
        Go 数据库
        gorm模型创建以及关键标签
        gorm模型创建以及关键标签
        294 0
        |
        9月前
        |
        JSON 数据挖掘 API
        Lazada商品 API接口,开发者详解与使用指南
        Lazada商品API为开发者提供商品信息获取功能,适用于电商应用开发与数据分析。支持获取标题、价格、库存等详细信息,具备实时更新、高并发支持等特点,适用于竞品分析、价格趋势研究、导购应用及客服系统集成。需获取凭证后调用接口,示例代码使用Python实现。
        |
        12月前
        |
        JavaScript 前端开发 API
        |
        存储 安全 物联网
        操作系统的心脏:深入理解现代操作系统架构与核心技术
        本文旨在为读者提供一个关于现代操作系统(OS)架构和核心技术的全面概述。通过分析OS的主要组件、功能以及它们如何协同工作,本文揭示了操作系统在计算机系统中的核心地位及其复杂性。我们将探讨进程管理、内存管理、文件系统和输入/输出(I/O)等关键技术,并讨论它们对系统性能的影响。此外,本文还将涵盖一些最新的操作系统趋势和技术,如云计算、虚拟化和物联网(IoT)。通过阅读本文,读者将获得对操作系统内部运作方式的深刻理解,这对于软件开发人员、IT专业人士以及对计算机科学感兴趣的任何人来说都是宝贵的知识。
        |
        关系型数据库 Linux 分布式数据库
        rpm安装polarDB-PG的实践
        安装PolarDB for PostgreSQL的实践,需要帮助到有同样需要的小伙伴
        957 3
        |
        存储 NoSQL Java
        Tablestore集成MCP协议: 标量与向量混合检索的新范式
        基于表格存储(Tablestore)实现的MCP(Model Context Protocol)服务,支持文档存储与混合检索工具两大功能。通过Cherry-Studio界面和通义千问qwen-max模型进行演示,展示了文本数据上传、向量嵌入及查询过程。此外,详细说明了Python和Java版本的本地运行步骤、环境配置及二次开发方法,并提供了集成三方工具如Cherry Studio的应用示例。Tablestore凭借混合查询、Serverless低成本、弹性扩展等优势,为MCP场景提供高效解决方案。
        1074 3
        |
        传感器 人工智能 文字识别
        智能化车辆信息管理:AI视频监控在大型商场的技术方案介绍
        通过高效停车管理系统实现精准采集车牌号码和停车时长、关联消费数据、优化停车引导。解决方案包括智能车牌识别、实时车位引导及个性化服务,利用OCR、AI图像增强、传感器等技术,确保准确识别、减少寻找车位时间,并提供定制化优惠,提升购物体验。
        349 0
        |
        SQL 存储 索引
        如何在 SQL Server 中使用 `CHARINDEX`
        【8月更文挑战第10天】
        1505 3
        如何在 SQL Server 中使用 `CHARINDEX`
        |
        SQL Oracle 关系型数据库
        关系型数据库Oracle并行查询
        【7月更文挑战第12天】
        515 15
        |
        Go
        Golang的time.NewTicker周期性定时器使用案例
        这篇文章介绍了Golang中time包的NewTicker函数如何创建周期性定时器,并通过两个示例展示了如何使用定时器以及如何停止定时器。
        366 1