数据库常用访问技术
- ODBC:open datebase connectivity(开放数据库连接)
- JDBC:Java database connectivity(Java数据库连接)
- ADO.NET:.NET框架用于和数据库交互的类库
- PDO:PHP Data Object(PHP语言访问数据库技术)
发现问题:
1、在第一步安装postgresql时,出现无法写入内部临时环境变量路径错误
经过检查,原因是我本机上安装的nodepad++中对.vbs的后缀类型进行了接管,从而导致postgresql在创建临时变量写入计算机时出现错误,因此我把nodepad++中的.vbs后缀接管给去掉后就可以了。
直接修改注册表的方式如下:https://blog.youkuaiyun.com/weixin_40689822/article/details/105498071
2、在安装完成时,出现问题:Problem running post-install step . Installation may not complete correctlyThe database cluster initialisation failed;这个问题原因在于选择运行环境时选择了中文字符集,这会导致查询结果和排序效果不正确,所以,我们应该选择C,即不使用区域
然后Next…
完成安装。
CREATE DATABASE 创建数据库
CREATE DATABASE 命令需要在 PostgreSQL 命令窗口来执行,语法格式如下:
CREATE DATABASE dbname;
createdb 命令创建数据库
createdb 是一个 SQL 命令 CREATE DATABASE 的封装。
createdb 命令语法格式如下:
createdb [option...] [dbname [description]]
参数说明:
dbname:要创建的数据库名。
description:关于新创建的数据库相关的说明。
options:参数可选项,可以是以下值:
序号 | 选项 & 描述 |
---|---|
1 | -D tablespace指定数据库默认表空间。 |
2 | -e将 createdb 生成的命令发送到服务端。 |
3 | -E encoding指定数据库的编码。 |
4 | -l locale指定数据库的语言环境。 |
5 | -T template指定创建此数据库的模板。 |
6 | –help显示 createdb 命令的帮助信息。 |
7 | -h host指定服务器的主机名。 |
8 | -p port指定服务器监听的端口,或者 socket 文件。 |
9 | -U username连接数据库的用户名。 |
10 | -w忽略输入密码。 |
11 | -W连接时强制要求输入密码。 |
选择数据库
使用 \l 用于查看已经存在的数据库:
postgres=# \l
接下来我们可以使用 \c + 数据库名 来进入数据库:
postgres=# \c runoobdb
You are now connected to database "runoobdb" as user "postgres".
DROP DATABASE 删除数据库
DROP DATABASE 会删除数据库的系统目录项并且删除包含数据的文件目录。
DROP DATABASE 只能由超级管理员或数据库拥有者执行。
DROP DATABASE 命令需要在 PostgreSQL 命令窗口来执行,语法格式如下:
DROP DATABASE [ IF EXISTS ] name
参数说明:
- IF EXISTS:如果数据库不存在则发出提示信息,而不是错误信息。
- name:要删除的数据库的名称。
例如,我们删除一个 runoobdb 的数据库:
postgres=# DROP DATABASE runoobdb;
dropdb 命令删除数据库
dropdb 是 DROP DATABASE 的包装器。
dropdb 用于删除 PostgreSQL 数据库。
dropdb 命令只能由超级管理员或数据库拥有者执行。
dropdb 命令语法格式如下:
dropdb [connection-option...] [option...] dbname
参数说明:
dbname:要删除的数据库名。
options:参数可选项,可以是以下值:
序号 | 选项 & 描述 |
---|---|
1 | -e显示 dropdb 生成的命令并发送到数据库服务器。 |
2 | -i在做删除的工作之前发出一个验证提示。 |
3 | -V打印 dropdb 版本并退出。 |
4 | –if-exists如果数据库不存在则发出提示信息,而不是错误信息。 |
5 | –help显示有关 dropdb 命令的帮助信息。 |
6 | -h host指定运行服务器的主机名。 |
7 | -p port指定服务器监听的端口,或者 socket 文件。 |
8 | -U username连接数据库的用户名。 |
9 | -w连接数据库的用户名。 |
10 | -W连接时强制要求输入密码。 |
11 | –maintenance-db=dbname删除数据库时指定连接的数据库,默认为 postgres,如果它不存在则使用 template1。 |
创建表结构
CREATE TABLE 语法格式如下:
CREATE TABLE table_name(
column1 datatype,
column2 datatype,
column3 datatype,
.....
columnN datatype,
PRIMARY KEY( 一个或多个列 )
);
CREATE TABLE 是一个关键词,用于告诉数据库系统将创建一个数据表。
表名字必需在同一模式中的其它表、 序列、索引、视图或外部表名字中唯一。
CREATE TABLE 在当前数据库创建一个新的空白表,该表将由发出此命令的用户所拥有。
表格中的每个字段都会定义数据类型,如下:
实例
以下创建了一个表,表名为 COMPANY 表格,主键为 ID,NOT 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 命令来查看表格是否创建成功:
runoobdb=# \d
List of relations
Schema | Name | Type | Owner
--------+------------+-------+----------
public | company | table | postgres
public | department | table | postgres
(2 rows)
\d tablename 查看表格信息:
runoobdb=# \d company
Table "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)
删除表结构
DROP TABLE 语法格式如下:
DROP TABLE table_name;
实例
上一章节中我们创建了 COMPANY 和 DEPARTMENT 两个表格,我们可以先使用 \d 命令来查看表格是否创建成功:
runoobdb=# \d
List of relations
Schema | Name | Type | Owner
--------+------------+-------+----------
public | company | table | postgres
public | department | table | postgres
(2 rows)
从以上结果可以看出,我们表格已经创建成功,接下来我们删除这两个表格:
runoobdb=# drop table department, company;
DROP TABLE
再使用 \d 命令来查看就找不到表格了:
testdb=# \d
Did not find any relations.
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
);
在 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
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 | Paul
2 | Allen
3 | Teddy
4 | Mark
5 | David
(5 rows)
运算符
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。
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 |
表达式
表达式是由一个或多个的值、运算符、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 表(下载 COMPANY SQL 文件 ),数据内容如下:
runoobdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
以下使用了布尔表达式(SALARY=10000)来查询数据:
runoobdb=# SELECT * FROM COMPANY WHERE SALARY = 10000;
id | name | age | address | salary
----+-------+-----+----------+--------
7 | James | 24 | Houston | 10000
(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
-------------------------------
2019-06-13 10:49:06.419243+08
(1 row)
WHERE 子句
在 PostgreSQL 中,当我们需要根据指定条件从单张表或者多张表中查询数据时,就可以在 SELECT 语句中添加 WHERE 子句,从而过滤掉我们不需要数据。
WHERE 子句不仅可以用于 SELECT 语句中,同时也可以用于 UPDATE,DELETE 等等语句中。
语法
以下是 SELECT 语句中使用 WHERE 子句从数据库中读取数据的通用语法:
SELECT column1, column2, columnN
FROM table_name
WHERE [condition1]
我们可以在 WHERE 子句中使用比较运算符或逻辑运算符,例如 >, <, =, LIKE, NOT 等等。
创建 COMPANY 表(下载 COMPANY SQL 文件 ),数据内容如下:
runoobdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
以下几个实例我们使用逻辑运算符来读取表中的数据。
AND
找出 AGE(年龄) 字段大于等于 25,并且 SALARY(薪资) 字段大于等于 65000 的数据:
runoobdb=# SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000;
id | name | age | address | salary
----+-------+-----+------------+--------
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
(2 rows)
OR
找出 AGE(年龄) 字段大于等于 25,或者 SALARY(薪资) 字段大于等于 65000 的数据:
runoobdb=# SELECT * FROM COMPANY WHERE AGE >= 25 OR SALARY >= 65000;
id | name | age | address | salary
----+-------+-----+-------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
(4 rows)
NOT NULL
在公司表中找出 AGE(年龄) 字段不为空的记录:
runoobdb=# SELECT * FROM COMPANY WHERE AGE IS NOT NULL;
id | name | age | address | salary
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
(7 rows)
LIKE
在 COMPANY 表中找出 NAME(名字) 字段中以 Pa 开头的的数据:
runoobdb=# SELECT * FROM COMPANY WHERE NAME LIKE 'Pa%';
id | name | age |address | salary
----+------+-----+-----------+--------
1 | Paul | 32 | California| 20000
IN
以下 SELECT 语句列出了 AGE(年龄) 字段为 25 或 27 的数据:
runoobdb=# SELECT * FROM COMPANY WHERE AGE IN ( 25, 27 );
id | name | age | address | salary
----+-------+-----+------------+--------
2 | Allen | 25 | Texas | 15000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
(3 rows)
NOT IN
以下 SELECT 语句列出了 AGE(年龄) 字段不为 25 或 27 的数据:
runoobdb=# SELECT * FROM COMPANY WHERE AGE NOT IN ( 25, 27 );
id | name | age | address | salary
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
3 | Teddy | 23 | Norway | 20000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
(4 rows)
BETWEEN
以下 SELECT 语句列出了 AGE(年龄) 字段在 25 到 27 的数据:
runoobdb=# SELECT * FROM COMPANY WHERE AGE BETWEEN 25 AND 27;
id | name | age | address | salary
----+-------+-----+------------+--------
2 | Allen | 25 | Texas | 15000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
(3 rows)
子查询
以下的 SELECT 语句使用了 SQL 的子查询,子查询语句中读取 SALARY(薪资) 字段大于 65000 的数据,然后通过 EXISTS 运算符判断它是否返回行,如果有返回行则读取所有的 AGE(年龄) 字段。
runoobdb=# SELECT AGE FROM COMPANY
WHERE EXISTS (SELECT AGE FROM COMPANY WHERE SALARY > 65000);
age
-----
32
25
23
25
27
22
24
(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
----+------+-----+------------+--------
1 | Paul | 32 | California | 20000
AND & OR 运算符
在 PostgreSQL 中,AND 和 OR 也叫连接运算符,在查询数据时用于缩小查询范围,我们可以用 AND 或者 OR 指定一个或多个查询条件。
AND
AND 运算符表示一个或者多个条件必须同时成立。
在 WHERE 子句中,AND 的使用语法如下:
SELECT column1, column2, columnN
FROM table_name
WHERE [condition1] AND [condition2]...AND [conditionN];
实例
创建 COMPANY 表(下载 COMPANY SQL 文件 ),数据内容如下:
runoobdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
以下实例读取 AGE 字段大于 25 且 SALARY 字段大于等于 65000 的所有记录:
runoobdb=# SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000;
id | name | age | address | salary
----+-------+-----+------------+--------
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
(2 rows)
OR
OR 运算符表示多个条件中只需满足其中任意一个即可。
在 WHERE 子句中,OR 的使用语法如下:
SELECT column1, column2, columnN
FROM table_name
WHERE [condition1] OR [condition2]...OR [conditionN]
创建 COMPANY 表(下载 COMPANY SQL 文件 ),数据内容如下:
runoobdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
以下实例读取 AGE 字段大于等于 25 或 SALARY 字段大于等于 65000 的所有记录:
runoobdb=# SELECT * FROM COMPANY WHERE AGE >= 25 OR SALARY >= 65000;
id | name | age | address | salary
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
(4 rows)
UPDATE 语句
如果我们要更新在 PostgreSQL 数据库中的数据,我们可以用 UPDATE 来操作。
语法
以下是 UPDATE 语句修改数据的通用 SQL 语法:
UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];
- 我们可以同时更新一个或者多个字段。
- 我们可以在 WHERE 子句中指定任何条件。
实例
创建 COMPANY 表(下载 COMPANY SQL 文件 ),数据内容如下:
runoobdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
以下实例将更新 COMPANY 表中 id 为 3 的 salary 字段值:
runoobdb=# UPDATE COMPANY SET SALARY = 15000 WHERE ID = 3;
得到结果如下:
id | name | age | address | salary
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
3 | Teddy | 23 | Norway | 15000
从结果上看,COMPANY 表中的 id 为 3 的 salary 字段值已被修改。
以下实例将同时更新 salary 字段和 address 字段的值:
runoobdb=# UPDATE COMPANY SET ADDRESS = 'Texas', SALARY=20000;
得到结果如下:
id | name | age | address | salary
----+-------+-----+---------+--------
1 | Paul | 32 | Texas | 20000
2 | Allen | 25 | Texas | 20000
4 | Mark | 25 | Texas | 20000
5 | David | 27 | Texas | 20000
6 | Kim | 22 | Texas | 20000
7 | James | 24 | Texas | 20000
3 | Teddy | 23 | Texas | 20000
(7 rows)
DELETE 语句
你可以使用 DELETE 语句来删除 PostgreSQL 表中的数据。
语法
以下是 DELETE 语句删除数据的通用语法:
DELETE FROM table_name WHERE [condition];
如果没有指定 WHERE 子句,PostgreSQL 表中的所有记录将被删除。
一般我们需要在 WHERE 子句中指定条件来删除对应的记录,条件语句可以使用 AND 或 OR 运算符来指定一个或多个。
实例
创建 COMPANY 表(下载 COMPANY SQL 文件 ),数据内容如下:
runoobdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
以下 SQL 语句将删除 ID 为 2 的数据:
runoobdb=# DELETE FROM COMPANY WHERE ID = 2;
得到结果如下:
id | name | age | address | salary
----+-------+-----+-------------+--------
1 | Paul | 32 | California | 20000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
(6 rows)
从上面结果可以看出,id 为 2 的数据已被删除。
以下语句将删除整张 COMPANY 表:
DELETE FROM COMPANY;
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 表(下载 COMPANY SQL 文件 ),数据内容如下:
runoobdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
下面实例将找出 AGE 以 2 开头的数据:
runoobdb=# SELECT * FROM COMPANY WHERE AGE::text LIKE '2%';
得到以下结果:
id | name | age | address | salary
----+-------+-----+-------------+--------
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
8 | Paul | 24 | Houston | 20000
(7 rows)
下面实例将找出 address 字段中含有 - 字符的数据:
runoobdb=# SELECT * FROM COMPANY WHERE ADDRESS LIKE '%-%';
得到结果如下:
id | name | age | address | salary
----+------+-----+-------------------------------------------+--------
4 | Mark | 25 | Rich-Mond | 65000
6 | Kim | 22 | South-Hall | 45000
(2 rows)
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 表(下载 COMPANY SQL 文件 ),数据内容如下:
runoobdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
下面实例将找出限定的数量的数据,即读取 4 条数据:
runoobdb=# SELECT * FROM COMPANY LIMIT 4;
得到以下结果:
id | name | age | address | salary
----+-------+-----+-------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
(4 rows)
但是,在某些情况下,可能需要从一个特定的偏移开始提取记录。
下面是一个实例,从第三位开始提取 3 个记录:
runoobdb=# SELECT * FROM COMPANY LIMIT 3 OFFSET 2;
得到以下结果:
id | name | age | address | salary
----+-------+-----+-----------+--------
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
(3 rows)
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 表(下载 COMPANY SQL 文件 ),数据内容如下:
runoobdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
下面实例将对结果根据 AGE 字段值进行升序排列:
runoobdb=# SELECT * FROM COMPANY ORDER BY AGE ASC;
得到以下结果:
id | name | age | address | salary
----+-------+-----+----------------------------------------------------+--------
6 | Kim | 22 | South-Hall | 45000
3 | Teddy | 23 | Norway | 20000
7 | James | 24 | Houston | 10000
4 | Mark | 25 | Rich-Mond | 65000
2 | Allen | 25 | Texas | 15000
5 | David | 27 | Texas | 85000
1 | Paul | 32 | California | 20000
(7 rows)
下面实例将对结果根据 NAME 字段值和 SALARY 字段值进行升序排序:
runoobdb=# SELECT * FROM COMPANY ORDER BY NAME, SALARY ASC;
得到以下结果:
id | name | age | address | salary
----+-------+-----+----------------------------------------------------+--------
2 | Allen | 25 | Texas | 15000
5 | David | 27 | Texas | 85000
7 | James | 24 | Houston | 10000
6 | Kim | 22 | South-Hall | 45000
4 | Mark | 25 | Rich-Mond | 65000
1 | Paul | 32 | California | 20000
3 | Teddy | 23 | Norway | 20000
(7 rows)
下面实例将对结果根据NAME字段值进行降序排列:
runoobdb=# SELECT * FROM COMPANY ORDER BY NAME DESC;
得到以下结果:
id | name | age | address | salary
----+-------+-----+----------------------------------------------------+--------
3 | Teddy | 23 | Norway | 20000
1 | Paul | 32 | California | 20000
4 | Mark | 25 | Rich-Mond | 65000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
5 | David | 27 | Texas | 85000
2 | Allen | 25 | Texas | 15000
(7 rows)
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 表(下载 COMPANY SQL 文件 ),数据内容如下:
runoobdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
下面实例将根据 NAME 字段值进行分组,找出每个人的工资总额:
runoobdb=# SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME;
得到以下结果:
name | sum
-------+-------
Teddy | 20000
Paul | 20000
Mark | 65000
David | 85000
Allen | 15000
Kim | 45000
James | 10000
(7 rows)
现在我们添加使用下面语句在 CAMPANY 表中添加三条记录:
INSERT INTO COMPANY VALUES (8, 'Paul', 24, 'Houston', 20000.00);
INSERT INTO COMPANY VALUES (9, 'James', 44, 'Norway', 5000.00);
INSERT INTO COMPANY VALUES (10, 'James', 45, 'Texas', 5000.00);
现在 COMPANY 表中存在重复的名称,数据如下:
id | name | age | address | salary
----+-------+-----+--------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
8 | Paul | 24 | Houston | 20000
9 | James | 44 | Norway | 5000
10 | James | 45 | Texas | 5000
(10 rows)
现在再根据 NAME 字段值进行分组,找出每个客户的工资总额:
runoobdb=# SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME ORDER BY NAME;
这时的得到的结果如下:
name | sum
-------+-------
Allen | 15000
David | 85000
James | 20000
Kim | 45000
Mark | 65000
Paul | 40000
Teddy | 20000
(7 rows)
下面实例将 ORDER BY 子句与 GROUP BY 子句一起使用:
runoobdb=# SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME ORDER BY NAME DESC;
得到以下结果:
name | sum
-------+-------
Teddy | 20000
Paul | 40000
Mark | 65000
Kim | 45000
James | 20000
David | 85000
Allen | 15000
(7 rows)
WITH 子句
在 PostgreSQL 中,WITH 子句提供了一种编写辅助语句的方法,以便在更大的查询中使用。
WITH 子句有助于将复杂的大型查询分解为更简单的表单,便于阅读。这些语句通常称为通用表表达式(Common Table Express, CTE),也可以当做一个为查询而存在的临时表。
WITH 子句是在多次执行子查询时特别有用,允许我们在查询中通过它的名称(可能是多次)引用它。
WITH 子句在使用前必须先定义。
语法
WITH 查询的基础语法如下:
WITH
name_for_summary_data AS (
SELECT Statement)
SELECT columns
FROM name_for_summary_data
WHERE conditions <=> (
SELECT column
FROM 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 表(下载 COMPANY SQL 文件 ),数据内容如下:
runoobdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
下面将使用 WITH 子句在上表中查询数据:
With CTE AS
(Select
ID
, NAME
, AGE
, ADDRESS
, SALARY
FROM COMPANY )
Select * From CTE;
得到结果如下:
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
接下来让我们使用 RECURSIVE 关键字和 WITH 子句编写一个查询,查找 SALARY(工资) 字段小于 20000 的数据并计算它们的和:
WITH RECURSIVE t(n) AS (
VALUES (0)
UNION ALL
SELECT SALARY FROM COMPANY WHERE SALARY < 20000
)
SELECT sum(n) FROM t;
得到结果如下:
sum
-------
25000
(1 row)
下面我们建立一张和 COMPANY 表相似的 COMPANY1 表,使用 DELETE 语句和 WITH 子句删除 COMPANY 表中 SALARY(工资) 字段大于等于 30000 的数据,并将删除的数据插入 COMPANY1 表,实现将 COMPANY 表数据转移到 COMPANY1 表中:
CREATE TABLE COMPANY1(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
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
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
7 | James | 24 | Houston | 10000
(4 rows)
runoobdb=# SELECT * FROM COMPANY1;
id | name | age | address | salary
----+-------+-----+-------------+--------
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
(3 rows)
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 表(下载 COMPANY SQL 文件 ),数据内容如下:
runoobdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
下面实例将找出根据 NAME 字段值进行分组,并且 name(名称) 字段的计数少于 2 数据:
SELECT NAME FROM COMPANY GROUP BY name HAVING count(name) < 2;
得到以下结果:
name
-------
Teddy
Paul
Mark
David
Allen
Kim
James
(7 rows)
我们往表里添加几条数据:
INSERT INTO COMPANY VALUES (8, 'Paul', 24, 'Houston', 20000.00);
INSERT INTO COMPANY VALUES (9, 'James', 44, 'Norway', 5000.00);
INSERT INTO COMPANY VALUES (10, 'James', 45, 'Texas', 5000.00);
此时,COMPANY 表的记录如下:
id | name | age | address | salary
----+-------+-----+--------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
8 | Paul | 24 | Houston | 20000
9 | James | 44 | Norway | 5000
10 | James | 45 | Texas | 5000
(10 rows)
下面实例将找出根据 name 字段值进行分组,并且名称的计数大于 1 数据:
runoobdb-# SELECT NAME FROM COMPANY GROUP BY name HAVING count(name) > 1;
得到结果如下:
name
-------
Paul
James
(2 rows)
DISTINCT 关键字
在 PostgreSQL 中,DISTINCT 关键字与 SELECT 语句一起使用,用于去除重复记录,只获取唯一的记录。
我们平时在操作数据时,有可能出现一种情况,在一个表中有多个重复的记录,当提取这样的记录时,DISTINCT 关键字就显得特别有意义,它只获取唯一一次记录,而不是获取重复记录。
语法
用于去除重复记录的 DISTINCT 关键字的基本语法如下:
SELECT DISTINCT column1, column2,.....columnN
FROM table_name
WHERE [condition]
实例
创建 COMPANY 表(下载 COMPANY SQL 文件 ),数据内容如下:
runoobdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
让我们插入两条数据:
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (8, 'Paul', 32, 'California', 20000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (9, 'Allen', 25, 'Texas', 15000.00 );
现在数据如下:
id | name | age | address | salary
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
8 | Paul | 32 | California | 20000
9 | Allen | 25 | Texas | 15000
(9 rows)
接下来我们找出 COMPANY 表中的所有 NAME:
runoobdb=# SELECT name FROM COMPANY;
得到结果如下:
name
-------
Paul
Allen
Teddy
Mark
David
Kim
James
Paul
Allen
(9 rows)
现在我们在 SELECT 语句中使用 DISTINCT 子句:
runoobdb=# SELECT DISTINCT name FROM COMPANY;
得到结果如下:
name
-------
Teddy
Paul
Mark
David
Allen
Kim
James
(7 rows)
SELECT DISTINCT column1, column2,…columnN
FROM table_name
WHERE [condition]
### 实例
创建 COMPANY 表([下载 COMPANY SQL 文件](https://static.runoob.com/download/company.sql) ),数据内容如下:
runoobdb# select * from COMPANY;
id | name | age | address | salary
----±------±----±----------±-------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
让我们插入两条数据:
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (8, ‘Paul’, 32, ‘California’, 20000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (9, ‘Allen’, 25, ‘Texas’, 15000.00 );
现在数据如下:
id | name | age | address | salary
----±------±----±-----------±-------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
8 | Paul | 32 | California | 20000
9 | Allen | 25 | Texas | 15000
(9 rows)
接下来我们找出 COMPANY 表中的所有 NAME:
runoobdb=# SELECT name FROM COMPANY;
得到结果如下:
name
Paul
Allen
Teddy
Mark
David
Kim
James
Paul
Allen
(9 rows)
现在我们在 SELECT 语句中使用 DISTINCT 子句:
runoobdb=# SELECT DISTINCT name FROM COMPANY;
得到结果如下:
name
Teddy
Paul
Mark
David
Allen
Kim
James
(7 rows)