1,安装 PostgreSQL

i,Mac OS 上安装 PostgreSQL 

请参考下面链接中的文章:

https://www.runoob.com/postgresql/mac-install-postgresql.html

ii,Windows 上安装 PostgreSQL 

请参考下面链接中的文章:

https://www.runoob.com/postgresql/windows-install-postgresql.html

iii,Linux 上安装 PostgreSQL

请参考下面链接中的文章:

https://www.runoob.com/postgresql/linux-install-postgresql.html

2,PostgreSQL 创建数据库

CREATE DATABASE 创建数据库 

CREATE DATABASE 命令需要在 PostgreSQL 命令窗口来执行,语法格式如下:

CREATE DATABASE dbname;

例如,我们创建一个 runoobdb 的数据库: 

postgres=# CREATE DATABASE runoobdb;

3,PostgreSQL 选择数据库 

数据库的命令窗口

PostgreSQL 命令窗口中,我们可以命令提示符后面输入 SQL 语句:

postgres=#

使用 \l 用于查看已经存在的数据库:

postgres=# \lList of databasesName    |  Owner   | Encoding | Collate | Ctype |   Access privileges   
-----------+----------+----------+---------+-------+-----------------------postgres  | postgres | UTF8     | C       | C     | runoobdb  | postgres | UTF8     | C       | C     | template0 | postgres | UTF8     | C       | C     | =c/postgres          +|          |          |         |       | postgres=CTc/postgrestemplate1 | postgres | UTF8     | C       | C     | =c/postgres          +|          |          |         |       | postgres=CTc/postgres

接下来我们可以使用 \c + 数据库名 来进入数据库 :

postgres=# \c runoobdb 
You are now connected to database "runoobdb" as user "postgres".
runoobdb=# 

4,PostgreSQL 删除数据库

DROP DATABASE 删除数据库

DROP DATABASE 会删除数据库的系统目录项并且删除包含数据的文件目录。

DROP DATABASE 只能由超级管理员或数据库拥有者执行。

DROP DATABASE 命令需要在 PostgreSQL 命令窗口来执行,语法格式如下:

DROP DATABASE [ IF EXISTS ] name

参数说明:

  • IF EXISTS:如果数据库不存在则发出提示信息,而不是错误信息。
  • name:要删除的数据库的名称。

例如,我们删除一个 runoobdb 的数据库: 

postgres=# DROP DATABASE runoobdb;

此时,可能会有个错误报出来,如下所示: 

ERROR:  database "runoobdb" is being accessed by other users
DETAIL:  There is 1 other session using the database.

这是因为当前数据库也在被别的用户使用,这里要删除也要慎重,确保数据库是可以被删除的再继续操作。
解决方式:
断开连接到这个数据库上的所有链接,再删除数据库。怎么断开呢?在PostgreSQL 9.2 及以上版本,执行下面的语句:

SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE datname='mydb' AND pid<>pg_backend_pid();

再执行

postgres=# DROP DATABASE runoobdb;

删除成功

语句说明:

  • pg_terminate_backend:用来终止与数据库的连接的进程id的函数。
  • pg_stat_activity:是一个系统表,用于存储服务进程的属性和状态。
  • pg_backend_pid():是一个系统函数,获取附加到当前会话的服务器进程的ID。

5,PostgreSQL 创建表格 

PostgreSQL 使用 CREATE TABLE 语句来创建数据库表格。 

语法

CREATE TABLE 语法格式如下:

CREATE TABLE table_name(column1 datatype,column2 datatype,column3 datatype,.....columnN datatype,PRIMARY KEY( 一个或多个列 )
);

CREATE TABLE 是一个关键词,用于告诉数据库系统将创建一个数据表。

表名字必需在同一模式中的其它表、 序列、索引、视图或外部表名字中唯一。

CREATE TABLE 在当前数据库创建一个新的空白表,该表将由发出此命令的用户所拥有。

表格中的每个字段都会定义数据类型,如下:

实例

以下创建了一个表,表名为 COMPANY 表格,主键为 IDNOT NULL 表示字段不允许包含 NULL 值:

CREATE TABLE COMPANY(ID INT PRIMARY KEY     NOT NULL,NAME           TEXT    NOT NULL,AGE            INT     NOT NULL,ADDRESS        CHAR(50),SALARY         REAL
);

接下来我们再创建一个表格,在后面章节会用到:

CREATE TABLE DEPARTMENT(ID INT PRIMARY KEY      NOT NULL,DEPT           CHAR(50) NOT NULL,EMP_ID         INT      NOT NULL
);

\d tablename 查看表格信息:

runoobdb=# \d companyTable "public.company"Column  |     Type      | Collation | Nullable | Default 
---------+---------------+-----------+----------+---------id      | integer       |           | not null | name    | text          |           | not null | age     | integer       |           | not null | address | character(50) |           |          | salary  | real          |           |          | 
Indexes:"company_pkey" PRIMARY KEY, btree (id)
runoobdb=# \d departmentTable "public.department"Column |     Type      | Collation | Nullable | Default 
--------+---------------+-----------+----------+---------id     | integer       |           | not null | dept   | character(50) |           | not null | emp_id | integer       |           | not null | 
Indexes:"department_pkey" PRIMARY KEY, btree (id)

6,PostgreSQL 删除表格 

 PostgreSQL 使用 DROP TABLE 语句来删除表格,包含表格数据、规则、触发器等,所以删除表格要慎重,删除后所有信息就消失了。

语法

DROP TABLE 语法格式如下:

DROP TABLE table_name;

 删除上节中已创建的两个表格 : 

runoobdb=# drop table department, company;
DROP TABLE

再使用 \d 命令来查看就找不到表格了:

runoobdb=# \d
Did not find any relations.

 7,PostgreSQL 模式(SCHEMA)

 PostgreSQL 模式(SCHEMA)可以看着是一个表的集合。

一个模式可以包含视图、索引、据类型、函数和操作符等。

相同的对象名称可以被用于不同的模式中而不会出现冲突,例如 schema1 和 myschema 都可以包含名为 mytable 的表。

使用模式的优势:

  • 允许多个用户使用一个数据库并且不会互相干扰。

  • 将数据库对象组织成逻辑组以便更容易管理。

  • 第三方应用的对象可以放在独立的模式中,这样它们就不会与其他对象的名称发生冲突。

模式类似于操作系统层的目录,但是模式不能嵌套。

语法

我们可以使用 CREATE SCHEMA 语句来创建模式,语法格式如下: 

CREATE TABLE myschema.mytable (
...
);

实例

接下来我们连接到 runoobdb 来创建模式 myschema:

runoobdb=# create schema myschema;
CREATE SCHEMA

输出结果 "CREATE SCHEMA" 就代表模式创建成功。

接下来我们再创建一个表格:

runoobdb=# create table myschema.company(ID   INT              NOT NULL,NAME VARCHAR (20)     NOT NULL,AGE  INT              NOT NULL,ADDRESS  CHAR (25),SALARY   DECIMAL (18, 2),PRIMARY KEY (ID)
);

以上命令创建了一个空的表格,我们使用以下 SQL 来查看表格是否创建:

runoobdb=# select * from myschema.company;id | name | age | address | salary 
----+------+-----+---------+--------
(0 rows)

删除模式

删除一个为空的模式(其中的所有对象已经被删除):

DROP SCHEMA myschema;

删除一个模式以及其中包含的所有对象:

DROP SCHEMA myschema CASCADE;

 再验证一下该命令是否执行成功了。

runoobdb=# DROP SCHEMA myschema;
ERROR:  cannot drop schema myschema because other objects depend on it
DETAIL:  table myschema.company depends on schema myschema
HINT:  Use DROP ... CASCADE to drop the dependent objects too.
runoobdb=# DROP SCHEMA myschema CASCADE;
NOTICE:  drop cascades to table myschema.company
DROP SCHEMA
runoobdb=# select * from myschema.company;
ERROR:  relation "myschema.company" does not exist
LINE 1: select * from myschema.company;^
runoobdb=# 

 8,PostgreSQL INSERT INTO 语句

PostgreSQL INSERT INTO 语句用于向表中插入新记录。

我们可以插入一行也可以同时插入多行。

语法

INSERT INTO 语句语法格式如下:

INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)
VALUES (value1, value2, value3,...valueN);
  • column1, column2,...columnN 为表中字段名。

  • value1, value2, value3,...valueN 为字段对应的值。

在使用 INSERT INTO 语句时,字段列必须和数据值数量相同,且顺序也要对应。

如果我们向表中的所有字段插入值,则可以不需要指定字段,只需要指定插入的值即可:

INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);

下表列出执行插入后返回结果的说明:

序号输出信息 & 描述
1

INSERT oid 1

只插入一行并且目标表具有 OID的返回信息, 那么 oid 是分配给被插入行的 OID。

2

INSERT 0 #

插入多行返回的信息, # 为插入的行数。

实例

在 runoobdb 数据库中创建 COMPANY 表:

runoobdb=# CREATE TABLE COMPANY(ID INT PRIMARY KEY     NOT NULL,NAME           TEXT    NOT NULL,AGE            INT     NOT NULL,ADDRESS        CHAR(50),SALARY         REAL,JOIN_DATE      DATE
);

 输入\d确认表是否新建成功。

runoobdb=# \dList of relationsSchema |  Name   | Type  |  Owner   
--------+---------+-------+----------public | company | table | postgres
(1 row)

在 COMPANY 表中插入以下数据:

runoobdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY,JOIN_DATE) VALUES (1, 'Paul', 32, 'California', 20000.00,'2001-07-13');
INSERT 0 1

以下插入语句忽略 SALARY 字段:

runoobdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,JOIN_DATE) VALUES (2, 'Allen', 25, 'Texas', '2007-12-13');
INSERT 0 1

以下插入语句 JOIN_DATE 字段使用 DEFAULT 子句来设置默认值,而不是指定值:

runoobdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY,JOIN_DATE) VALUES (3, 'Teddy', 23, 'Norway', 20000.00, DEFAULT );
INSERT 0 1

以下实例插入多行:

runoobdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY,JOIN_DATE) VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00, '2007-12-13' ), (5, 'David', 27, 'Texas', 85000.00, '2007-12-13');
INSERT 0 2

使用 SELECT 语句查询表格数据:

runoobdb=# SELECT * FROM company;ID        NAME        AGE        ADDRESS     SALARY   JOIN_DATE
----      ----------  -----      ----------  -------      --------
1         Paul        32         California  20000.0      2001-07-13
2         Allen       25         Texas                    2007-12-13
3         Teddy       23         Norway      20000.0
4         Mark        25         Rich-Mond   65000.0      2007-12-13
5         David       27         Texas       85000.0      2007-12-13

9,PostgreSQL SELECT 语句

PostgreSQL SELECT 语句用于从数据库中选取数据。

结果被存储在一个结果表中,称为结果集。

语法

SELECT 语句语法格式如下:

SELECT column1, column2,...columnN FROM table_name;
  • column1, column2,...columnN 为表中字段名。

  • table_name 为表名。

如果我们想读取表中的所有数据可以使用以下 SQL 语句:

SELECT * FROM table_name;

在上一节 INSERT INTO 语句 中,已经向表 company 插入了一些数据,使用 * 号可以读取该表的所有数据: 

runoobdb=# SELECT * FROM company;ID        NAME        AGE        ADDRESS     SALARY   JOIN_DATE
----      ----------  -----      ----------  -------      --------
1         Paul        32         California  20000.0      2001-07-13
2         Allen       25         Texas                    2007-12-13
3         Teddy       23         Norway      20000.0
4         Mark        25         Rich-Mond   65000.0      2007-12-13
5         David       27         Texas       85000.0      2007-12-13

 也可以读取指定字段 ID 和 NAME:

runoobdb=# SELECT ID,NAME FROM company;id | name  
----+-------1 | Paul2 | Allen3 | Teddy4 | Mark5 | David
(5 rows)

10,PostgreSQL 运算符 

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。

PostgreSQL 运算符是一个保留关键字或字符,一般用在 WHERE 语句中,作为过滤条件。

常见的运算符有:

  • 算术运算符
  • 比较运算符
  • 逻辑运算符
  • 按位运算符

算术运算符

假设变量 a 为 2,变量 b 为 3,则:

运算符描述实例
+a + b 结果为 5
-a - b 结果为 -1
*a * b 结果为 6
/b / a 结果为 1
%模(取余)b % a 结果为 1
^指数a ^ b 结果为 8
|/平方根|/ 25.0 结果为 5
||/立方根||/ 27.0 结果为 3
!阶乘5 ! 结果为 120
!!阶乘(前缀操作符)!! 5 结果为 120

实例

runoobdb=# select 2+3;?column? 
----------5
(1 row)runoobdb=# select 2*3;?column? 
----------6
(1 row)runoobdb=# select 10/5;?column? 
----------2
(1 row)runoobdb=# select 10%5;?column? 
----------0
(1 row)runoobdb=# select 2^3;?column? 
----------8
(1 row)runoobdb=# select |/ 25.0;?column? 
----------5
(1 row)runoobdb=# select ||/ 27.0;?column? 
----------3
(1 row)runoobdb=# select 5 !;?column? 
----------120
(1 row)runoobdb=# select !! 5;?column? 
----------120
(1 row)

比较运算符

假设变量 a 为 10,变量 b 为 20,则:

运算符描述实例
=等于(a = b) 为 false。
!=不等于(a != b) 为 true。
<>不等于(a <> b) 为 true。
>大于(a > b) 为 false。
<小于(a < b) 为 true。
>=大于等于(a >= b) 为 false。
<=小于等于(a <= b) 为 true。

实例

创建 COMPANY 表,数据内容如下:

runoobdb=# select * from company;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2001-07-132 | Allen |  25 | Texas                                              |  15000 | 2007-12-133 | Teddy |  23 | Norway                                             |  20000 | 2019-06-264 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-016 | Kim   |  22 | South-Hall                                         |  45000 | 2016-01-017 | James |  24 | Houston                                            |  10000 | 2015-05-01

读取 SALARY 字段大于 50000 的数据:

runoobdb=# select * from company where salary > 50000;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------4 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-01
(2 rows)

读取 SALARY 字段等于 20000 的数据:

runoobdb=# select * from company where salary = 20000;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2001-07-133 | Teddy |  23 | Norway                                             |  20000 | 2019-06-26
(2 rows)

读取 SALARY 字段不等于 20000 的数据:

runoobdb=# select * from company where salary != 20000;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------2 | Allen |  25 | Texas                                              |  15000 | 2007-12-134 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-016 | Kim   |  22 | South-Hall                                         |  45000 | 2016-01-017 | James |  24 | Houston                                            |  10000 | 2015-05-01
(5 rows)runoobdb=# select * from company where salary <> 20000;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------2 | Allen |  25 | Texas                                              |  15000 | 2007-12-134 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-016 | Kim   |  22 | South-Hall                                         |  45000 | 2016-01-017 | James |  24 | Houston                                            |  10000 | 2015-05-01
(5 rows)

读取 SALARY 字段大于等于 65000 的数据:

runoobdb=# select * from company where salary >= 65000;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------4 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-01
(2 rows)

逻辑运算符

PostgreSQL 逻辑运算符有以下几种:

序号运算符 & 描述
1

AND

逻辑与运算符。如果两个操作数都非零,则条件为真。

PostgresSQL 中的 WHERE 语句可以用 AND 包含多个过滤条件。

2

NOT

逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。

PostgresSQL 有 NOT EXISTS, NOT BETWEEN, NOT IN 等运算符。

 

3

OR

逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。

PostgresSQL 中的 WHERE 语句可以用 OR 包含多个过滤条件。

SQL 使用三值的逻辑系统,包括 true、false 和 null,null 表示"未知"。

aba AND ba OR b
TRUETRUETRUETRUE
TRUEFALSEFALSETRUE
TRUENULLNULLTRUE
FALSEFALSEFALSEFALSE
FALSENULLFALSENULL
NULLNULLNULLNULL
aNOT a
TRUEFALSE
FALSETRUE
NULLNULL

创建 COMPANY 表,数据内容如下:

runoobdb=# select * from company;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2001-07-132 | Allen |  25 | Texas                                              |  15000 | 2007-12-133 | Teddy |  23 | Norway                                             |  20000 | 2019-06-264 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-016 | Kim   |  22 | South-Hall                                         |  45000 | 2016-01-017 | James |  24 | Houston                                            |  10000 | 2015-05-01
(7 rows)

读取 AGE 字段大于等于 25 且 SALARY 字段大于 6500 的数据:

runoobdb=# select * from company where age >= 25 and salary > 6500;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2001-07-132 | Allen |  25 | Texas                                              |  15000 | 2007-12-134 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-01
(4 rows)

读取 AGE 字段大于等于 25 或 SALARY 字段大于 6500 的数据:

runoobdb=# select * from company where age >= 25 or salary > 6500;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2001-07-132 | Allen |  25 | Texas                                              |  15000 | 2007-12-133 | Teddy |  23 | Norway                                             |  20000 | 2019-06-264 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-016 | Kim   |  22 | South-Hall                                         |  45000 | 2016-01-017 | James |  24 | Houston                                            |  10000 | 2015-05-01
(7 rows)

读取 SALARY 字段不为 NULL 的数据:

runoobdb=# select * from company where salary is not null;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2001-07-132 | Allen |  25 | Texas                                              |  15000 | 2007-12-133 | Teddy |  23 | Norway                                             |  20000 | 2019-06-264 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-016 | Kim   |  22 | South-Hall                                         |  45000 | 2016-01-017 | James |  24 | Houston                                            |  10000 | 2015-05-01
(7 rows)

位运算符

位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:

pqp & qp | q
0000
0101
1111
1001

假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

~A  = 1100 0011

下表显示了 PostgreSQL 支持的位运算符。假设变量 A 的值为 60,变量 B 的值为 13,则:

运算符描述实例
&

按位与操作,按二进制位进行"与"运算。运算规则:

0&0=0;   
0&1=0;    
1&0=0;     
1&1=1;
(A & B) 将得到 12,即为 0000 1100
|

按位或运算符,按二进制位进行"或"运算。运算规则:

0|0=0;   
0|1=1;   
1|0=1;    
1|1=1;
(A | B) 将得到 61,即为 0011 1101
#

异或运算符,按二进制位进行"异或"运算。运算规则:

0#0=0;   
0#1=1;   
1#0=1;  
1#1=0;
(A # B) 将得到 49,即为 0011 0001
~

取反运算符,按二进制位进行"取反"运算。运算规则:

~1=0;   
~0=1;
(~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。
<<二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。A << 2 将得到 240,即为 1111 0000
>>二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。A >> 2 将得到 15,即为 0000 1111

 实例

runoobdb=# select 60 | 13;?column?
----------61
(1 row)runoobdb=# select 60 & 13;?column?
----------12
(1 row)runoobdb=#  select  (~60);?column?
-----------61
(1 row)runoobdb=# select  (60 << 2);?column?
----------240
(1 row)runoobdb=# select  (60 >> 2);?column?
----------15
(1 row)runoobdb=#  select 60 # 13;?column?
----------49
(1 row)

11,PostgreSQL 表达式 

表达式是由一个或多个的值、运算符、PostgresSQL 函数组成的。

PostgreSQL 表达式类似一个公式,我们可以将其应用在查询语句中,用来查找数据库中指定条件的结果集。

语法

SELECT 语句的语法格式如下:

SELECT column1, column2, columnN
FROM table_name
WHERE [CONDITION | EXPRESSION];

 

PostgreSQL 的表达式可以有不同类型,我们接下来会讲到。

布尔表达式

布尔表达式是根据一个指定条件来读取数据:

SELECT column1, column2, columnN
FROM table_name
WHERE SINGLE VALUE MATCHTING EXPRESSION;

创建 COMPANY 表,数据内容如下:

runoobdb=# select * from company;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2001-07-132 | Allen |  25 | Texas                                              |  15000 | 2007-12-133 | Teddy |  23 | Norway                                             |  20000 | 2019-06-264 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-016 | Kim   |  22 | South-Hall                                         |  45000 | 2016-01-017 | James |  24 | Houston                                            |  10000 | 2015-05-01
(7 rows)

以下使用了布尔表达式(SALARY=10000)来查询数据:

runoobdb=# select * from company where salary = 10000;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------7 | James |  24 | Houston                                            |  10000 | 2015-05-01
(1 row)

 

数字表达式

数字表达式常用于查询语句中的数学运算:

SELECT numerical_expression as  OPERATION_NAME
[FROM table_name WHERE CONDITION] ;

numerical_expression 是一个数学运算表达式,实例如下:

runoobdb=# select (17 + 6) as ADDITION;addition 
----------23
(1 row)

此外 PostgreSQL 还内置了一些数学函数,如:

  • avg() : 返回一个表达式的平均值
  • sum() : 返回指定字段的总和
  • count() : 返回查询的记录总数

以下实例查询 COMPANY 表的记录总数:

runoobdb=# select count(*) as "RECORDS" from company;                   RECORDS 
---------7
(1 row)

日期表达式

日期表达式返回当前系统的日期和时间,可用于各种数据操作,以下实例查询当前时间:

runoobdb=# select current_timestamp;current_timestamp       
-------------------------------2020-04-25 09:06:52.101221+08
(1 row)

12,PostgreSQL WHERE 子句

在 PostgreSQL 中,当我们需要根据指定条件从单张表或者多张表中查询数据时,就可以在 SELECT 语句中添加 WHERE 子句,从而过滤掉我们不需要数据。

WHERE 子句不仅可以用于 SELECT 语句中,同时也可以用于 UPDATE,DELETE 等等语句中。

语法

以下是 SELECT 语句中使用 WHERE 子句从数据库中读取数据的通用语法:

SELECT column1, column2, columnN
FROM table_name
WHERE [condition1]

我们可以在 WHERE 子句中使用比较运算符或逻辑运算符,例如 >, <, =, LIKE, NOT 等等。

创建 COMPANY 表,数据内容如下:

runoobdb=# select * from company;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2001-07-132 | Allen |  25 | Texas                                              |  15000 | 2007-12-133 | Teddy |  23 | Norway                                             |  20000 | 2019-06-264 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-016 | Kim   |  22 | South-Hall                                         |  45000 | 2016-01-017 | James |  24 | Houston                                            |  10000 | 2015-05-01
(7 rows)

 以下几个实例我们使用逻辑运算符来读取表中的数据。

AND

找出 AGE(年龄) 字段大于等于 25,并且 SALARY(薪资) 字段大于等于 65000 的数据:

runoobdb=# select * from company where age >= 25 and salary >= 65000;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------4 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-01
(2 rows)

OR

找出 AGE(年龄) 字段大于等于 25,或者 SALARY(薪资) 字段大于等于 65000 的数据:

runoobdb=# select * from company where age >= 25 or salary >= 65000;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2001-07-132 | Allen |  25 | Texas                                              |  15000 | 2007-12-134 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-01
(4 rows)

NOT NULL

在公司表中找出 AGE(年龄) 字段不为空的记录:

runoobdb=# select * from company where age is not null;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2001-07-132 | Allen |  25 | Texas                                              |  15000 | 2007-12-133 | Teddy |  23 | Norway                                             |  20000 | 2019-06-264 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-016 | Kim   |  22 | South-Hall                                         |  45000 | 2016-01-017 | James |  24 | Houston                                            |  10000 | 2015-05-01
(7 rows)

LIKE

在 COMPANY 表中找出 NAME(名字) 字段中以 Pa 开头的的数据:

runoobdb=# select * from company where name like 'Pa%';id | name | age |                      address                       | salary | join_date  
----+------+-----+----------------------------------------------------+--------+------------1 | Paul |  32 | California                                         |  20000 | 2001-07-13
(1 row)

IN

以下 SELECT 语句列出了 AGE(年龄) 字段为 25 或 27 的数据:

runoobdb=# select * from company where age in (25, 27);id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------2 | Allen |  25 | Texas                                              |  15000 | 2007-12-134 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-01
(3 rows)

NOT IN

以下 SELECT 语句列出了 AGE(年龄) 字段不为 25 或 27 的数据:

runoobdb=# select * from company where age not in (25, 27);id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2001-07-133 | Teddy |  23 | Norway                                             |  20000 | 2019-06-266 | Kim   |  22 | South-Hall                                         |  45000 | 2016-01-017 | James |  24 | Houston                                            |  10000 | 2015-05-01
(4 rows)

BETWEEN

以下 SELECT 语句列出了 AGE(年龄) 字段在 25 到 27 的数据:

runoobdb=# select * from company where age between 25 and 27;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------2 | Allen |  25 | Texas                                              |  15000 | 2007-12-134 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-01
(3 rows)

子查询

以下的 SELECT 语句使用了 SQL 的子查询,子查询语句中读取 SALARY(薪资) 字段大于 65000 的数据,然后通过 EXISTS 运算符判断它是否返回行,如果有返回行则读取所有的 AGE(年龄) 字段。

runoobdb=# select age from company where exists (select age from company where salary > 65000);age 
-----32252325272224
(7 rows)

以下的 SELECT 语句同样使用了 SQL 的子查询,子查询语句中读取 SALARY(薪资) 字段大于 65000 的 AGE(年龄) 字段数据,然后用 > 运算符查询大于该 AGE(年龄) 字段数据:

runoobdb=# select * from company where age > (select age from company where salary > 65000);id | name | age |                      address                       | salary | join_date  
----+------+-----+----------------------------------------------------+--------+------------1 | Paul |  32 | California                                         |  20000 | 2001-07-13
(1 row)

13,PostgreSQL UPDATE 语句

如果我们要更新在 PostgreSQL 数据库中的数据,我们可以用 UPDATE 来操作。

语法

以下是 UPDATE 语句修改数据的通用 SQL 语法:

UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];
  • 我们可以同时更新一个或者多个字段。
  • 我们可以在 WHERE 子句中指定任何条件。

实例

创建 COMPANY 表,数据内容如下:

runoobdb=# select * from company;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2001-07-132 | Allen |  25 | Texas                                              |  15000 | 2007-12-133 | Teddy |  23 | Norway                                             |  20000 | 2019-06-264 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-016 | Kim   |  22 | South-Hall                                         |  45000 | 2016-01-017 | James |  24 | Houston                                            |  10000 | 2015-05-01
(7 rows)

以下实例将更新 COMPANY 表中 id 为 3 的 salary 字段值,并得到结果如下:

runoobdb=# update company set salary = 18000 where id = 3;
UPDATE 1
runoobdb=# select * from company;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2001-07-132 | Allen |  25 | Texas                                              |  15000 | 2007-12-134 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-016 | Kim   |  22 | South-Hall                                         |  45000 | 2016-01-017 | James |  24 | Houston                                            |  10000 | 2015-05-013 | Teddy |  23 | Norway                                             |  18000 | 2019-06-26
(7 rows)

从结果上看,COMPANY 表中的 id 为 3 的 salary 字段值已被修改。

以下实例将同时更新 salary 字段和 address 字段的值:

runoobdb=# UPDATE COMPANY SET ADDRESS = 'Texas', SALARY=20000;

得到结果如下:

id | name  | age | address | salary
----+-------+-----+---------+--------1 | Paul  |  32 | Texas   |  200002 | Allen |  25 | Texas   |  200004 | Mark  |  25 | Texas   |  200005 | David |  27 | Texas   |  200006 | Kim   |  22 | Texas   |  200007 | James |  24 | Texas   |  200003 | Teddy |  23 | Texas   |  20000
(7 rows)

14,PostgreSQL DELETE 语句

你可以使用 DELETE 语句来删除 PostgreSQL 表中的数据。

语法

以下是 DELETE 语句删除数据的通用语法:

DELETE FROM table_name WHERE [condition];

如果没有指定 WHERE 子句,PostgreSQL 表中的所有记录将被删除。

一般我们需要在 WHERE 子句中指定条件来删除对应的记录,条件语句可以使用 AND 或 OR 运算符来指定一个或多个。

实例

创建 COMPANY 表,数据内容如下:

runoobdb=# select * from company;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2001-07-132 | Allen |  25 | Texas                                              |  15000 | 2007-12-134 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-016 | Kim   |  22 | South-Hall                                         |  45000 | 2016-01-017 | James |  24 | Houston                                            |  10000 | 2015-05-013 | Teddy |  23 | Norway                                             |  18000 | 2019-06-26
(7 rows)

以下 SQL 语句将删除 ID 为 2 的数据:

runoobdb=# delete from company where id = 2;
DELETE 1

得到结果如下:

runoobdb=# select * from company;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2001-07-134 | Mark  |  25 | Rich-Mond                                          |  65000 | 2018-09-295 | David |  27 | Texas                                              |  85000 | 2017-10-016 | Kim   |  22 | South-Hall                                         |  45000 | 2016-01-017 | James |  24 | Houston                                            |  10000 | 2015-05-013 | Teddy |  23 | Norway                                             |  18000 | 2019-06-26
(6 rows)

从上面结果可以看出,id 为 2 的数据已被删除。

以下语句将删除整张 COMPANY 表:

DELETE FROM COMPANY;

15,PostgreSQL LIKE 子句

在 PostgreSQL 数据库中,我们如果要获取包含某些字符的数据,可以使用 LIKE 子句。

在 LIKE 子句中,通常与通配符结合使用,通配符表示任意字符,在 PostgreSQL 中,主要有以下两种通配符:

  • 百分号 %
  • 下划线 _

如果没有使用以上两种通配符,LIKE 子句和等号 = 得到的结果是一样的。

语法

以下是使用 LIKE 子句搭配百分号 % 和下划线 _ 从数据库中获取数据的通用语法:

SELECT FROM table_name WHERE column LIKE 'XXXX%';
或者
SELECT FROM table_name WHERE column LIKE '%XXXX%';
或者
SELECT FROM table_name WHERE column LIKE 'XXXX_';
或者
SELECT FROM table_name WHERE column LIKE '_XXXX';
或者
SELECT FROM table_name WHERE column LIKE '_XXXX_';

你可以在 WHERE 子句中指定任何条件。

你可以使用 AND 或者 OR 指定一个或多个条件。

XXXX 可以是任何数字或者字符。

实例

下面是 LIKE 语句中演示了 % 和 _ 的一些差别:

实例描述
WHERE SALARY::text LIKE '200%'找出 SALARY 字段中以 200 开头的数据。
WHERE SALARY::text LIKE '%200%'找出 SALARY 字段中含有 200 字符的数据。
WHERE SALARY::text LIKE '_00%'找出 SALARY 字段中在第二和第三个位置上有 00 的数据。
WHERE SALARY::text LIKE '2 %'找出 SALARY 字段中以 2 开头的字符长度大于 3 的数据。
WHERE SALARY::text LIKE '%2'找出 SALARY 字段中以 2 结尾的数据
WHERE SALARY::text LIKE '_2%3'找出 SALARY 字段中 2 在第二个位置上并且以 3 结尾的数据
WHERE SALARY::text LIKE '2___3'找出 SALARY 字段中以 2 开头,3 结尾并且是 5 位数的数据

在 PostgreSQL 中,LIKE 子句是只能用于对字符进行比较,因此在上面列子中,我们要将整型数据类型转化为字符串数据类型。

创建 COMPANY 表,数据内容如下:

runoobdb=# select * from company;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2014-01-012 | Allen |  25 | Texas                                              |  27500 | 2015-02-183 | Teddy |  23 | Norway                                             |  18000 | 2016-03-284 | Mark  |  25 | Rich-Mond                                          |  65000 | 2017-04-265 | David |  27 | Texas                                              |  85000 | 2018-04-066 | Kim   |  22 | South-Hall                                         |  45000 | 2019-09-127 | James |  24 | Houston                                            |  10000 | 2020-02-12

下面实例将找出 AGE 以 2 开头的数据:

runoobdb=# select * from company where age::text like '2%';id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------2 | Allen |  25 | Texas                                              |  27500 | 2015-02-183 | Teddy |  23 | Norway                                             |  18000 | 2016-03-284 | Mark  |  25 | Rich-Mond                                          |  65000 | 2017-04-265 | David |  27 | Texas                                              |  85000 | 2018-04-066 | Kim   |  22 | South-Hall                                         |  45000 | 2019-09-127 | James |  24 | Houston                                            |  10000 | 2020-02-12
(6 rows)

 下面实例将找出 address 字段中含有 - 字符的数据:

runoobdb=# select * from company where address like '%-%';                                                                                                                                        id | name | age |                      address                       | salary | join_date  
----+------+-----+----------------------------------------------------+--------+------------4 | Mark |  25 | Rich-Mond                                          |  65000 | 2017-04-266 | Kim  |  22 | South-Hall                                         |  45000 | 2019-09-12
(2 rows)

16,PostgreSQL LIMIT 子句

PostgreSQL 中的 limit 子句用于限制 SELECT 语句中查询的数据的数量。

语法

带有 LIMIT 子句的 SELECT 语句的基本语法如下:

SELECT column1, column2, columnN
FROM table_name
LIMIT [no of rows]

下面是 LIMIT 子句与 OFFSET 子句一起使用时的语法:

SELECT column1, column2, columnN 
FROM table_name
LIMIT [no of rows] OFFSET [row num]

 

实例

创建 COMPANY 表,数据内容如下:

runoobdb=# select * from company;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2014-01-012 | Allen |  25 | Texas                                              |  27500 | 2015-02-183 | Teddy |  23 | Norway                                             |  18000 | 2016-03-284 | Mark  |  25 | Rich-Mond                                          |  65000 | 2017-04-265 | David |  27 | Texas                                              |  85000 | 2018-04-066 | Kim   |  22 | South-Hall                                         |  45000 | 2019-09-127 | James |  24 | Houston                                            |  10000 | 2020-02-12
(7 rows)

下面实例将找出限定的数量的数据,即读取 4 条数据:

runoobdb=# select * from company limit 4;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2014-01-012 | Allen |  25 | Texas                                              |  27500 | 2015-02-183 | Teddy |  23 | Norway                                             |  18000 | 2016-03-284 | Mark  |  25 | Rich-Mond                                          |  65000 | 2017-04-26
(4 rows)

但是,在某些情况下,可能需要从一个特定的偏移开始提取记录。

下面是一个实例,从第三位开始提取 3 个记录:

runoobdb=# select * from company limit 4 offset 2;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------3 | Teddy |  23 | Norway                                             |  18000 | 2016-03-284 | Mark  |  25 | Rich-Mond                                          |  65000 | 2017-04-265 | David |  27 | Texas                                              |  85000 | 2018-04-066 | Kim   |  22 | South-Hall                                         |  45000 | 2019-09-12
(4 rows)

17,PostgreSQL ORDER BY 语句

在 PostgreSQL 中,ORDER BY 用于对一列或者多列数据进行升序(ASC)或者降序(DESC)排列。

语法

ORDER BY 子句的基础语法如下:

SELECT column-list
FROM table_name
[WHERE condition]
[ORDER BY column1, column2, .. columnN] [ASC | DESC];

 

您可以在 ORDER BY 中使用一列或者多列,但是必须保证要排序的列必须存在。

ASC 表示升序,DESC 表示降序。

实例

创建 COMPANY 表,数据内容如下:

runoobdb=# select * from company;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2014-01-012 | Allen |  25 | Texas                                              |  27500 | 2015-02-183 | Teddy |  23 | Norway                                             |  18000 | 2016-03-284 | Mark  |  25 | Rich-Mond                                          |  65000 | 2017-04-265 | David |  27 | Texas                                              |  85000 | 2018-04-066 | Kim   |  22 | South-Hall                                         |  45000 | 2019-09-127 | James |  24 | Houston                                            |  10000 | 2020-02-12
(7 rows)

下面实例将对结果根据 AGE 字段值进行升序排列:

runoobdb=# select * from company order by age asc;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------6 | Kim   |  22 | South-Hall                                         |  45000 | 2019-09-123 | Teddy |  23 | Norway                                             |  18000 | 2016-03-287 | James |  24 | Houston                                            |  10000 | 2020-02-124 | Mark  |  25 | Rich-Mond                                          |  65000 | 2017-04-262 | Allen |  25 | Texas                                              |  27500 | 2015-02-185 | David |  27 | Texas                                              |  85000 | 2018-04-061 | Paul  |  32 | California                                         |  20000 | 2014-01-01
(7 rows)

下面实例将对结果根据 NAME 字段值和 SALARY 字段值进行升序排序:

runoobdb=# select * from company order by name, salary asc;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------2 | Allen |  25 | Texas                                              |  27500 | 2015-02-185 | David |  27 | Texas                                              |  85000 | 2018-04-067 | James |  24 | Houston                                            |  10000 | 2020-02-126 | Kim   |  22 | South-Hall                                         |  45000 | 2019-09-124 | Mark  |  25 | Rich-Mond                                          |  65000 | 2017-04-261 | Paul  |  32 | California                                         |  20000 | 2014-01-013 | Teddy |  23 | Norway                                             |  18000 | 2016-03-28
(7 rows)

下面实例将对结果根据NAME字段值进行降序排列:

runoobdb=# select * from company order by name desc;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------3 | Teddy |  23 | Norway                                             |  18000 | 2016-03-281 | Paul  |  32 | California                                         |  20000 | 2014-01-014 | Mark  |  25 | Rich-Mond                                          |  65000 | 2017-04-266 | Kim   |  22 | South-Hall                                         |  45000 | 2019-09-127 | James |  24 | Houston                                            |  10000 | 2020-02-125 | David |  27 | Texas                                              |  85000 | 2018-04-062 | Allen |  25 | Texas                                              |  27500 | 2015-02-18
(7 rows)

18,PostgreSQL GROUP BY 语句

在 PostgreSQL 中,GROUP BY 语句和 SELECT 语句一起使用,用来对相同的数据进行分组。

GROUP BY 在一个 SELECT 语句中,放在 WHRER 子句的后面,ORDER BY 子句的前面。

语法

下面给出了 GROUP BY 子句的基本语法:

SELECT column-list
FROM table_name
WHERE [ conditions ]
GROUP BY column1, column2....columnN
ORDER BY column1, column2....columnN

 GROUP BY 子句必须放在 WHERE 子句中的条件之后,必须放在 ORDER BY 子句之前。

在 GROUP BY 子句中,你可以对一列或者多列进行分组,但是被分组的列必须存在于列清单中。

实例

创建 COMPANY 表,数据内容如下:

runoobdb=# select * from company;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2014-01-012 | Allen |  25 | Texas                                              |  27500 | 2015-02-183 | Teddy |  23 | Norway                                             |  18000 | 2016-03-284 | Mark  |  25 | Rich-Mond                                          |  65000 | 2017-04-265 | David |  27 | Texas                                              |  85000 | 2018-04-066 | Kim   |  22 | South-Hall                                         |  45000 | 2019-09-127 | James |  24 | Houston                                            |  10000 | 2020-02-12
(7 rows)

面实例将根据 NAME 字段值进行分组,找出每个人的工资总额:

runoobdb=# select name, sum(salary) from company group by name;name  |  sum  
-------+-------Teddy | 18000David | 85000Paul  | 20000Kim   | 45000Mark  | 65000Allen | 27500James | 10000
(7 rows)

现在我们添加使用下面语句在 CAMPANY 表中添加三条记录:

INSERT INTO COMPANY VALUES (8, 'Paul', 24, 'Houston', 20000.00, '2017-5-4');
INSERT INTO COMPANY VALUES (9, 'James', 44, 'Norway', 5000.00, '2018-6-18');
INSERT INTO COMPANY VALUES (10, 'James', 45, 'Texas', 5000.00, '2019-11-11');

现在 COMPANY 表中存在重复的名称,数据如下:

runoobdb=# select * from company;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2014-01-012 | Allen |  25 | Texas                                              |  27500 | 2015-02-183 | Teddy |  23 | Norway                                             |  18000 | 2016-03-284 | Mark  |  25 | Rich-Mond                                          |  65000 | 2017-04-265 | David |  27 | Texas                                              |  85000 | 2018-04-066 | Kim   |  22 | South-Hall                                         |  45000 | 2019-09-127 | James |  24 | Houston                                            |  10000 | 2020-02-128 | Paul  |  24 | Houston                                            |  20000 | 2017-05-049 | James |  44 | Norway                                             |   5000 | 2018-06-1810 | James |  45 | Texas                                              |   5000 | 2019-11-11
(10 rows)

现在再根据 NAME 字段值进行分组,找出每个客户的工资总额:

runoobdb=# select name, sum(salary) from company group by name order by name; name  |  sum  
-------+-------Allen | 27500David | 85000James | 20000Kim   | 45000Mark  | 65000Paul  | 40000Teddy | 18000
(7 rows)

下面实例将 ORDER BY 子句与 GROUP BY 子句一起使用:

runoobdb=# select name, sum(salary) from company group by name order by name desc;name  |  sum  
-------+-------Teddy | 18000Paul  | 40000Mark  | 65000Kim   | 45000James | 20000David | 85000Allen | 27500
(7 rows)

19,PostgreSQL WITH 子句

在 PostgreSQL 中,WITH 子句提供了一种编写辅助语句的方法,以便在更大的查询中使用。

WITH 子句有助于将复杂的大型查询分解为更简单的表单,便于阅读。这些语句通常称为通用表表达式(Common Table Express, CTE),也可以当做一个为查询而存在的临时表。

WITH 子句是在多次执行子查询时特别有用,允许我们在查询中通过它的名称(可能是多次)引用它。

WITH 子句在使用前必须先定义。

语法

WITH 查询的基础语法如下:

WITHname_for_summary_data AS (SELECT Statement)SELECT columnsFROM name_for_summary_dataWHERE conditions <=> (SELECT columnFROM name_for_summary_data)[ORDER BY columns]

name_for_summary_data 是 WITH 子句的名称,name_for_summary_data 可以与现有的表名相同,并且具有优先级。

可以在 WITH 中使用数据 INSERT, UPDATE 或 DELETE 语句,允许您在同一个查询中执行多个不同的操作。

WITH 递归

在 WITH 子句中可以使用自身输出的数据。

公用表表达式 (CTE) 具有一个重要的优点,那就是能够引用其自身,从而创建递归 CTE。递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达式。

实例

创建 COMPANY 表,数据内容如下:

runoobdb=# select * from company;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2014-01-012 | Allen |  25 | Texas                                              |  27500 | 2015-02-183 | Teddy |  23 | Norway                                             |  18000 | 2016-03-284 | Mark  |  25 | Rich-Mond                                          |  65000 | 2017-04-265 | David |  27 | Texas                                              |  85000 | 2018-04-066 | Kim   |  22 | South-Hall                                         |  45000 | 2019-09-127 | James |  24 | Houston                                            |  10000 | 2020-02-128 | Paul  |  24 | Houston                                            |  20000 | 2017-05-049 | James |  44 | Norway                                             |   5000 | 2018-06-1810 | James |  45 | Texas                                              |   5000 | 2019-11-11
(10 rows)

 下面将使用 WITH 子句在上表中查询数据:

runoobdb=# with cte as (select id, name, age, address, salary, join_date from company) select * from cte;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2014-01-012 | Allen |  25 | Texas                                              |  27500 | 2015-02-183 | Teddy |  23 | Norway                                             |  18000 | 2016-03-284 | Mark  |  25 | Rich-Mond                                          |  65000 | 2017-04-265 | David |  27 | Texas                                              |  85000 | 2018-04-066 | Kim   |  22 | South-Hall                                         |  45000 | 2019-09-127 | James |  24 | Houston                                            |  10000 | 2020-02-128 | Paul  |  24 | Houston                                            |  20000 | 2017-05-049 | James |  44 | Norway                                             |   5000 | 2018-06-1810 | James |  45 | Texas                                              |   5000 | 2019-11-11
(10 rows)

接下来让我们使用 RECURSIVE 关键字和 WITH 子句编写一个查询,查找 SALARY(工资) 字段小于 20000 的数据并计算它们的和:

runoobdb=# with recursive t(n) as ( values(0) union all select salary from company where salary < 20000) select sum(n) from t;sum  
-------38000
(1 row)

下面我们建立一张和 COMPANY 表相似的 COMPANY1 表,使用 DELETE 语句和 WITH 子句删除 COMPANY 表中 SALARY(工资) 字段大于等于 30000 的数据,并将删除的数据插入 COMPANY1 表,实现将 COMPANY 表数据转移到 COMPANY1 表中:

runoobdb=# create table company1(id int primary key not null, name text not null, age int not null, address char(50), salary real,join_date date);   runoobdb=# select * from company1;                                               
id | name | age | address | salary | join_date 
----+------+-----+---------+--------+-----------
(0 rows)runoobdb=# with moved_rows as ( delete from company where salary >= 30000 returning *) insert into company1 (select * from moved_rows);
INSERT 0 3

此时,CAMPANY 表和 CAMPANY1 表的数据如下:

runoobdb=# select * from company;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2014-01-012 | Allen |  25 | Texas                                              |  27500 | 2015-02-183 | Teddy |  23 | Norway                                             |  18000 | 2016-03-287 | James |  24 | Houston                                            |  10000 | 2020-02-128 | Paul  |  24 | Houston                                            |  20000 | 2017-05-049 | James |  44 | Norway                                             |   5000 | 2018-06-1810 | James |  45 | Texas                                              |   5000 | 2019-11-11
(7 rows)runoobdb=# select * from company1;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------4 | Mark  |  25 | Rich-Mond                                          |  65000 | 2017-04-265 | David |  27 | Texas                                              |  85000 | 2018-04-066 | Kim   |  22 | South-Hall                                         |  45000 | 2019-09-12
(3 rows)

20,PostgreSQL HAVING 子句

HAVING 子句可以让我们筛选分组后的各组数据。

WHERE 子句在所选列上设置条件,而 HAVING 子句则在由 GROUP BY 子句创建的分组上设置条件。

语法

下面是 HAVING 子句在 SELECT 查询中的位置:

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

 HAVING 子句必须放置于 GROUP BY 子句后面,ORDER BY 子句前面,下面是 HAVING 子句在 SELECT 语句中基础语法:

SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2

实例

创建 COMPANY 表,数据内容如下:

runoobdb=# select * from company;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2014-01-012 | Allen |  25 | Texas                                              |  27500 | 2015-02-183 | Teddy |  23 | Norway                                             |  18000 | 2016-03-284 | Mark  |  25 | Rich-Mond                                          |   6500 | 2018-05-205 | David |  27 | Texas                                              |  80500 | 2018-07-206 | Kim   |  22 | South-Hall                                         |  40500 | 2019-07-107 | James |  24 | Houston                                            |  10000 | 2017-03-028 | Paul  |  24 | Houston                                            |  20000 | 2018-09-029 | James |  44 | Norway                                             |   5000 | 2017-09-2010 | James |  45 | Texas                                              |   5000 | 2015-10-02
(10 rows)

 下面实例将找出根据 NAME 字段值进行分组,并且 name(名称) 字段的计数少于 2 数据:

runoobdb=# select name from company group by name having count(name) < 2;name  
-------TeddyDavidKimMarkAllen
(5 rows)

下面实例将找出根据 name 字段值进行分组,并且名称的计数大于 1 数据:

runoobdb=# select name from company group by name having count(name) > 1;name  
-------PaulJames
(2 rows)

21,PostgreSQL DISTINCT 关键字

在 PostgreSQL 中,DISTINCT 关键字与 SELECT 语句一起使用,用于去除重复记录,只获取唯一的记录。

我们平时在操作数据时,有可能出现一种情况,在一个表中有多个重复的记录,当提取这样的记录时,DISTINCT 关键字就显得特别有意义,它只获取唯一一次记录,而不是获取重复记录。

语法

用于去除重复记录的 DISTINCT 关键字的基本语法如下:

SELECT DISTINCT column1, column2,.....columnN
FROM table_name
WHERE [condition]

创建 COMPANY 表,数据内容如下:

runoobdb=# select * from company;id | name  | age |                      address                       | salary | join_date  
----+-------+-----+----------------------------------------------------+--------+------------1 | Paul  |  32 | California                                         |  20000 | 2014-01-012 | Allen |  25 | Texas                                              |  27500 | 2015-02-183 | Teddy |  23 | Norway                                             |  18000 | 2016-03-284 | Mark  |  25 | Rich-Mond                                          |   6500 | 2018-05-205 | David |  27 | Texas                                              |  80500 | 2018-07-206 | Kim   |  22 | South-Hall                                         |  40500 | 2019-07-107 | James |  24 | Houston                                            |  10000 | 2017-03-028 | Paul  |  24 | Houston                                            |  20000 | 2018-09-029 | James |  44 | Norway                                             |   5000 | 2017-09-2010 | James |  45 | Texas                                              |   5000 | 2015-10-02
(10 rows)

接下来我们找出 COMPANY 表中的所有 NAME:

runoobdb=# select name from company;name  
-------PaulAllenTeddyMarkDavidKimJamesPaulJamesJames
(10 rows)

现在我们在 SELECT 语句中使用 DISTINCT 子句:

runoobdb=# select distinct name from company;name  
-------TeddyDavidPaulKimMarkAllenJames
(7 rows)

从结果可以看到,重复数据已经被删除。

 

参考资料:

https://www.runoob.com/postgresql/postgresql-tutorial.html

 

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 1.1.10 从二分查找BinarySearch开启算法学习之路---《java算法第四版》

    文章目录0.前言1.功能2.示例有两个名单tinyW.txt和tinyT.txt,将tinyT.txt名单中不在tinyW.txt的数据打印出来① 实现原理② 实现代码③ 性能分析0.前言最近才开始学算法,学习的材料是《算法 第四版》java语言描述,我会在接下来的学习中运用以下步骤学习记录,望广大读者朋友…...

    2024/4/23 14:40:39
  2. python爬虫编程实战-Task04

    目标:爬取腾讯新闻中的热点精选网址:https://news.qq.com/ 思路 1)用selenium模拟操作浏览器下拉页面; 2)提取新闻标题和链接 操作 Step1:初始化 import time from selenium import webdriverdriver = webdriver.Chrome(r"C:\Users\ThinkPad\AppData\Local\Google\C…...

    2024/4/23 14:40:38
  3. 2020.4.27 xilinx PYNQ HLS开发 --以sobel为例

    pynq的介绍:https://blog.csdn.net/xiaoqu001/article/details/79479208 pynq官方文档:http://pynq.readthedocs.io/en/latest/python_environment.html pynq github开源项目:https://github.com/xilinx/pynq pynq sobel github 代码:https://github.com/clancylea/pynq-so…...

    2024/4/23 14:40:30
  4. 模电学习笔记_双极型晶体管及其放大电路(5)

    前置:模电学习笔记_双极型晶体管及其放大电路(4) 一.基本知识点 2.7 差分放大电路 1.基本介绍:差分(差动)放大电路,简称差放,基本特点是放大差模信号、抑制共模信号(抑制零点漂移或温度漂移)。 2.零点漂移现象(也称温度漂移现象):△Vi=0,△Vo≠0 3.零点漂移现象产…...

    2024/4/23 14:40:29
  5. SpringBoot 多文件上传

    一、application.yml # 开发环境配置 server: # 服务器的HTTP端口,默认为80port: 89# 文件上传相关设置servlet:max-file-size: 200MB #单个文件上传大小max-request-size: 600MB #连续上传文件大小#文件上传路径 file:root:path: D:/ruoyi/testUploadPath二、FileUploadContr…...

    2024/4/23 14:40:30
  6. C++自学笔记

    C++自学笔记(03 运算符)03 运算符算术运算符赋值运算符逻辑运算符 03 运算符 本次记录运算符,还请各位大佬批评指正! 算术运算符 +++ 、−-− 、∗*∗(乘) 、/// (除,整数/小数相除结果为整数/小数) 、%(取余,俩小数不可以)int a = 3;int b = 4;cout << a % b …...

    2024/5/5 5:18:03
  7. count() enumerate() zip()函数用法

    count() 方法用于统计字符串里某个字符出现的次数enumerate函数用于遍历序列中的元素以及它们的下标。enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。zip() 函数用于将可迭代的对象作…...

    2024/4/17 6:31:52
  8. 188. 买卖股票的最佳时机 IV

    188. 买卖股票的最佳时机 IV给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。 注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 示例 1: 输入: [2,4,1], k = 2 输出…...

    2024/4/18 2:14:44
  9. ERROR com.alibaba.druid.pool.DruidDataSource - create connection SQLException, url: jdbc:mysql://***

    ERROR com.alibaba.druid.pool.DruidDataSource - create connection SQLException, url: jdbc:mysql://132.232.19.60:3306/zhiping?characterEncoding=utf8&useSSL=false, errorCode 1045, state 28000主要是数据库驱动配置原因:检查数据库地址,密码账户是否正确。莫非…...

    2024/5/5 6:16:47
  10. 大前端:前端全栈加强版!前端全栈+全周期+多端

    学习资源 链接: https://pan.baidu.com/s/1FEvue9TlEE7aUvlE_i_S0A 提取码: sywz 课程介绍: 比前端全栈更上一层,专为实际开发经验1年以上的前端工程师设计,高效全能架构前端。 〖课程目录〗: 第一阶段:开启大前端之门(1-4周) 第1周 认识大前端,开启无限可能 万丈高楼平…...

    2024/4/23 14:40:30
  11. h5 前端面试 一

    css盒子模型 box sizing display 哪些属性 有什么作用 position 哪些属性 有什么作用 link import 区别 flex 布局属性用法 js 基本数据类型,引用类型 ,undefined,null 区别 js 浅拷贝深拷贝 js 同源策略 js list 处理方法 ,for map filter 箭头函数与普通函数区别 vue 生命周期…...

    2024/4/23 14:40:31
  12. c++头文件,的区别

    <cstring> 在一个命名空间std中包含了“string.h”。其实就相当于 c中的头文件<string.h>,包含处理char*字符串的库函数,如strln()等。 <string>当定义了string类型时候必须包含此头文件。string str; char *s; s = str.c_str(); //错误。不能将 char->…...

    2024/5/5 6:57:10
  13. LeetCode 1200. 最小绝对差

    1. 题目 给你个整数数组 arr,其中每个元素都 不相同。 请你找到所有具有最小绝对差的元素对,并且按升序的顺序返回。 示例 1: 输入:arr = [4,2,1,3] 输出:[[1,2],[2,3],[3,4]]示例 2: 输入:arr = [1,3,6,10,15] 输出:[[1,3]]示例 3: 输入:arr = [3,8,-10,23,19,-4,-1…...

    2024/4/23 14:40:25
  14. 23_类的静态成员

    1、进程成员的概述成员:成员变量 成员函数static 修饰成员变量 修饰成员函数static声明为静态的,称为静态成员。 不管这个类创建了多少个对象,静态成员只有一个拷贝,这个拷贝被所有属于这个类的对象共享。静态成员 属于类 而不是对象2、static 修饰成员变量静态变量,是在编…...

    2024/4/23 14:40:30
  15. 虚拟机桥接+NAT+主机网络的简单认识

    一、桥接模式作用及效果:用来设置虚拟机与主机具有同等的网络地位(虚拟机可以和宿主机连通,可以与外网连通)。相当于主机网卡和虚拟网卡连在一个虚拟网桥的不同接口上。IP一般会自动获取,如果没有IP地址分配,则需要修改桥接网卡为指定网卡。注意如果是静态分配IP地址的网…...

    2024/4/23 14:40:23
  16. 【人工智能】信息物理系统(Cyber physical systems)

    【人工智能】信息物理系统信息物理系统基本概念什么是CPS?参考 信息物理系统 信息物理系统(Cyber physical systems,CPS)是一种机制。这种机制是基于计算机算法的控制或监控,整个系统与Internet整合在一起,所以名称中有“Cyber”。在CPS中,物理和软件组件在不同的空间和时…...

    2024/4/29 12:50:57
  17. StringBuilder、String、StringBuffer之间的联系与区别?

    一、不同点:可变性 String不可变 StringBuffer,StringBuilder可变 线程安全 String不可变可称为线程安全 StringBuffer线程安全 StringBuilder非线程安全 性能 在大量字符串拼接操作中String最差 在非线程安全环境中StringBuilder性能要比StringBuffer好 二、相似…...

    2024/4/29 2:57:21
  18. 爬虫第二天

    Beautiful Soup 1、beautifulsoup解析HTML页面: Beautiful Soup 是一个HTML/XML 的解析器,主要用于解析和提取 HTML/XML 数据。 它基于HTML DOM 的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多,所以性能要低于lxml。 BeautifulSoup 用来解析 HTML 比较简单…...

    2024/4/19 15:23:21
  19. SSM Day1

    Spring——Spring简介、入门、配置 , IoC和DI思想 1、 为什么说Spring是一个一站式的轻量级开源框架呢? 跳转到目录 首先轻量级:不是指Spring框架的模块少,数量很轻,而是指Spring框架的非侵入性,即对象可以不必依赖Spring的API类 其次,JavaEE开发可分成三层架构,针对Jav…...

    2024/4/20 10:12:05
  20. pyCharm安装库时出现timeout的问题

    看了其他博客的一些做法,自己学起来稍有难度,于是让自己电脑连了自己手机热点,成功安装!...

    2024/4/23 22:16:10

最新文章

  1. Android 13.0 系统限制上网系列之iptables用IOemNetd实现app上网白名单的功能实现

    1.前言 在13.0的系统rom定制化开发中,对于系统限制网络的使用,在system中netd网络这块的产品需要中,会要求设置app上网白名单的功能, liunx中iptables命令也是比较重要的,接下来就来在IOemNetd这块实现app上网白名单的的相关功能,就是在系统中只能允许某个app上网,就是…...

    2024/5/5 7:08:27
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. STM32重要参考资料

    stm32f103c8t6 一、引脚定义图 二、时钟树 三、系统结构图 四、启动配置 &#xff08;有时候不小心短接VCC和GND&#xff0c;芯片会锁住&#xff0c;可以BOOT0拉高试试&#xff08;用跳线帽接&#xff09;&#xff09; 五、最小系统原理图 可用于PCB设计 六、常见折腾人bug…...

    2024/5/1 13:25:10
  4. [Flutter]导入singular_flutter_sdk后运行到Android报错

    问题&#xff1a; 接入归因之前&#xff0c;flutter项目一起正常。接入归因之后&#xff0c;iOS正常Android有问题。 dependencies: # Singular归因singular_flutter_sdk: ^1.3.3 针对 Flutter 的 Singular SDK 集成指南 https://support.singular.net/hc/zh-cn/articles/…...

    2024/4/30 20:13:57
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/4 23:54:56
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/4 23:54:56
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/4 23:55:17
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/4 23:55:16
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/4 18:20:48
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/4 23:55:06
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/4 2:59:34
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/4 23:55:01
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57