2、PostgreSQL之基本的SQL语言

PostgreSQL之基本的SQL语言

在上一篇文章中,我们已经安装好了PostgreSQL,并且能够通过psql访问数据库,以及远程访问数据库。下面就来介绍一些PostgreSQL的基本操作。

1、创建一个新表

在psql中输入以下命令:

CREATE TABLE weather (city            varchar(80),temp_lo         int,           -- 最低温度temp_hi         int,           -- 最高温度prcp            real,          -- 湿度date            date
);

小tips:

  • SQL语句要以分号“;”结尾。

  • 两个划线(“--”)引入注释

2、删除一个表

DROP TABLE tablename;

3、在表中增加行

INSERT语句用于向表中添加行:

INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');

注意:那些不是简单数字值的常量通常必需用单引号(')包围

当然你也可以指定出列,然后插入数据

INSERT INTO weather (city, temp_lo, temp_hi, prcp, date)VALUES ('San Francisco', 43, 57, 0.0, '1994-11-29');

我觉得这种写出具体列的写法比较规范。

你还可以使用COPY从文本文件中装载大量数据,举个例子:

COPY weather FROM '/home/user/weather.txt';

当然,这个方法只能在后端进程的机器上使用,也就是在PostgreSQL所安装的机器上。

4、查询一个表

要从一个表中检索数据就是查询这个表。SQL的SELECT语句就是做这个用途的。

语法

该语句分为选择列表(列出要返回的列)、表列表(列出从中检索数据的表)以及可选的条件(指定任意的限制)。

最简单的查询语句就是:

SELECT * FROM weather;

输出结果:

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------San Francisco |      46 |      50 | 0.25 | 1994-11-27San Francisco |      43 |      57 |    0 | 1994-11-29Hayward       |      37 |      54 |      | 1994-11-29
(3 rows)

你可以在选择列表中写任意表达式,而不仅仅是表中的列。

举个例子:

SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;

输出:

    city      | temp_avg |    date
---------------+----------+------------San Francisco |       48 | 1994-11-27San Francisco |       50 | 1994-11-29Hayward       |       45 | 1994-11-29
(3 rows)

有SQL基础的应该知道:AS子句是如何给输出列重新命名的(AS子句是可选的)。

WHERE的使用

查询可以使用**WHERE**子句“修饰”,它指定需要哪些行。WHERE子句包含一个布尔(真值)表达式,只有那些使布尔表达式为真的行才会被返回。

举个例子:

SELECT * FROM weatherWHERE city = 'San Francisco' AND prcp > 0.0;

输出:

    city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------San Francisco |      46 |      50 | 0.25 | 1994-11-27
(1 row)

ORDER BY的使用

使用ORDER BY你可以要求返回的查询结果是排好序的。

举个例子:

SELECT * FROM weatherORDER BY city, temp_lo;

输出:

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------Hayward       |      37 |      54 |      | 1994-11-29San Francisco |      43 |      57 |    0 | 1994-11-29San Francisco |      46 |      50 | 0.25 | 1994-11-27

DISTINCT的使用

使用DISTINCT可以去除重复行。

举个例子:

SELECT DISTINCT cityFROM weather;

输出:

     city
---------------HaywardSan Francisco
(2 rows)

5、在表之间连接

到目前为止,我们的查询一次只访问一个表。查询可以一次访问多个表,或者用这种方式访问一个表而同时处理该表的多个行。 一个同时访问同一个或者不同表的多个行的查询叫连接查询。(多表查询)

举个例子:

比如你想列出所有天气记录以及相关的城市位置。要实现这个目标,我们需要拿 weather表每行的city列和cities表所有行的name列进行比较, 并选取那些在该值上相匹配的行对。(注意:weather所包含的列有:city、temp_lo、temp_hi、prcp、date。city表中包含列:城市名、城市位置)

那么你可以这么写:

SELECT *FROM weather, citiesWHERE city = name;

输出:

     city      | temp_lo | temp_hi | prcp |    date    |     name      | location
---------------+---------+---------+------+------------+---------------+-----------San Francisco |      46 |      50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)San Francisco |      43 |      57 |    0 | 1994-11-29 | San Francisco | (-194,53)
(2 rows)

观察结果集的两个方面:

  • 没有城市Hayward的结果行。这是因为在cities表里面没有Hayward的匹配行,所以连接忽略 weather表里的不匹配行。我们稍后将看到如何修补它。
  • 有两个列包含城市名字。这是正确的, 因为weathercities表的列被串接在一起。不过,实际上我们不想要这些, 因此你将可能希望明确列出输出列而不是使用*
SELECT city, temp_lo, temp_hi, prcp, date, locationFROM weather, citiesWHERE city = name;

如果在两个表里有重名的列,你需要限定列名来说明你究竟想要哪一个,如:

SELECT weather.city, weather.temp_lo, weather.temp_hi,weather.prcp, weather.date, cities.locationFROM weather, citiesWHERE cities.name = weather.city;

指定列所在的表是一个必备的习惯,当然你也可以给表器别名,这样的话可以更加简易一些。

JOIN ON的写法

上面提到了查询结果集中没有没有城市Hayward的结果行,想要解决这个问题,就要用到连接查询的另一种写法:JOIN ON

可以写成这样:

SELECT *FROM weather INNER JOIN cities ON (weather.city = cities.name);

我们想让查询干的事是扫描weather表, 并且对每一行都找出匹配的cities表行。如果我们没有找到匹配的行,那么我们需要一些“空值”代替cities表的列。 这种类型的查询叫外连接 (我们在此之前看到的连接都是内连接)。

SELECT *FROM weather LEFT OUTER JOIN cities ON (weather.city = cities.name);city      | temp_lo | temp_hi | prcp |    date    |     name      | location
---------------+---------+---------+------+------------+---------------+-----------Hayward       |      37 |      54 |      | 1994-11-29 |               |San Francisco |      46 |      50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)San Francisco |      43 |      57 |    0 | 1994-11-29 | San Francisco | (-194,53)
(3 rows)

这个查询是一个左外连接, 因为在连接操作符左部的表中的行在输出中至少要出现一次, 而在右部的表的行只有在能找到匹配的左部表行时才被输出。 如果输出的左部表的行没有对应匹配的右部表的行,那么右部表行的列将填充空值(null)。

当然还有右外连接全外连接,这里就不过多介绍了。

我们也可以把一个表和自己连接起来。这叫做自连接。 比如,假设我们想找出那些在其它天气记录的温度范围之外的天气记录。这样我们就需要拿 weather表里每行的temp_lotemp_hi列与weather表里其它行的temp_lotemp_hi列进行比较。我们可以用下面的查询实现这个目标:

SELECT W1.city, W1.temp_lo AS low, W1.temp_hi AS high,W2.city, W2.temp_lo AS low, W2.temp_hi AS highFROM weather W1, weather W2WHERE W1.temp_lo < W2.temp_loAND W1.temp_hi > W2.temp_hi;city      | low | high |     city      | low | high
---------------+-----+------+---------------+-----+------San Francisco |  43 |   57 | San Francisco |  46 |   50Hayward       |  37 |   54 | San Francisco |  46 |   50
(2 rows)

6、聚合函数

一个聚集函数从多个输入行中计算出一个结果。

举个例子:

找出所有记录中最低温度中的最高温度

SELECT max(temp_lo) FROM weather;

输出:

 max
-----46
(1 row)

值得注意的是,聚合函数不能被用于WHERE子句中(这是以为SQL执行顺序的原因)。

GROUP BY的使用

举个例子:

获取每个城市观测到的最低温度的最高值

SELECT city, max(temp_lo)FROM weatherGROUP BY city;

输出:

     city      | max
---------------+-----Hayward       |  37San Francisco |  46
(2 rows)

HAVING 的使用

每个聚集结果都是在匹配该城市的表行上面计算的。我们可以用HAVING 过滤这些被分组的行:

举个例子:

只给出那些所有temp_lo值曾都低于 40的城市

SELECT city, max(temp_lo)FROM weatherGROUP BY cityHAVING max(temp_lo) < 40;
  city   | max
---------+-----Hayward |  37
(1 row)

WHEREHAVING的基本区别

WHERE在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而HAVING在分组和聚集之后选取分组行。因此,WHERE子句不能包含聚集函数; 因为试图用聚集函数判断哪些行应输入给聚集运算是没有意义的。相反,HAVING子句总是包含聚集函数(严格说来,你可以写不使用聚集的HAVING子句, 但这样做很少有用。同样的条件用在WHERE阶段会更有效)。

7、更新

UPDATE命令更新现有的行。

假设你发现所有 11 月 28 日以后的温度读数都低了两度,那么你就可以用下面的方式改正数据:

UPDATE weatherSET temp_hi = temp_hi - 2,  temp_lo = temp_lo - 2WHERE date > '1994-11-28';

8、删除

数据行可以用DELETE命令从表中删除。

假设你对Hayward的天气不再感兴趣,那么你可以用下面的方法把那些行从表中删除:

DELETE FROM weather WHERE city = 'Hayward';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/47706.shtml

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

相关文章

[003-02-10].第10节:Docker环境下搭建Redis主从复制架构

我的博客大纲 我的后端学习大纲 我的Redis学习大纲 1.cluster&#xff08;集群&#xff09;模式-docker版 哈希槽分区进行亿级数据存储 1.1.面试题&#xff1a;1~2亿条数据需要缓存&#xff0c;请问如何设计这个存储案例 1.回答&#xff1a;单机单台100%不可能&#xff0c;肯…

细说MCU用定时器控制ADC采样频率的实现方法并通过Simulink查看串口输出波形

目录 一、硬件工程 二、建立Simulink模型 1.安装MATLAB和Simulink 2.建立Simulink模型 三、代码修改 1.修改回调函数 2.产看结果 3.完整的main.c 本文作者的文章 细说MCU用定时器控制ADC采样频率的实现方法-CSDN博客 https://wenchm.blog.csdn.net/article/details/…

Zabbix的安装部署及使用流程

Zabbix的安装部署及使用流程可以分为以下几个主要步骤&#xff1a; 一、准备工作 确定监控目标&#xff1a; 确定需要监控的设备或应用程序&#xff0c;如服务器、网络设备、应用程序等。 准备环境&#xff1a; 准备至少两台机器&#xff0c;一台作为Zabbix服务器&#xff08…

270-VC709E 基于FMC接口的Virtex7 XC7VX690T PCIeX8 接口卡

一、板卡概述 本板卡基于Xilinx公司的FPGA XC7VX690T-FFG1761 芯片&#xff0c;支持PCIeX8、两组 64bit DDR3容量8GByte&#xff0c;HPC的FMC连接器&#xff0c;板卡支持各种FMC子卡扩展。软件支持windows&#xff0c;Linux操作系统。 二、功能和技术指标&#xff1a; 板卡功…

Getx学习笔记之中间件鉴权

目录 前言 一、实现步骤 1.添加依赖 2.创建鉴权中间件 3.定义路由 4.设置初始路由 5.模拟登陆状态 二、Getx鉴权步骤总结 三、本文demo示例 四、参考文章 前言 在 Flutter 中&#xff0c;使用 GetX 可以很方便地实现中间件鉴权&#xff08;Authentication&#xff09…

MySQL生产环境迁移至YashanDB数据库深度体验

前言 首届YashanDB「迁移体验官」开放后&#xff0c;陆续收到「体验官」们的投稿&#xff0c;小崖在此把优秀的投稿文章分享给大家~今天分享的用户文章是《MySQL生产环境迁移至YashanDB数据库深度体验》&#xff08;作者&#xff1a;呆呆的私房菜&#xff09;&#xff0c;满满…

Python简化命令行界面库之fire使用详解

概要 在开发命令行工具时,开发者通常需要编写大量代码来解析命令行参数,这既耗时又容易出错。Python Fire 是 Google 开源的一个库,旨在简化命令行界面的开发。它可以将任何 Python 对象自动生成一个命令行界面,从而大大减少了开发时间和代码复杂度。本文将详细介绍 Pytho…

mysql-造数据/列转行

-- MySQL 列转行 set global group_concat_max_len102400; set group_concat_max_len102400; SELECT global.group_concat_max_len; SELECT group_concat_max_len; select table_name,concat(group_concat(COLUMN_NAME order by ORDINAL_POSITION separator ,)) as all_columns…

网络安全-网络安全及其防护措施10

46.软件定义网络&#xff08;SDN&#xff09; 软件定义网络&#xff08;SDN&#xff09;的概念和特点 软件定义网络&#xff08;SDN&#xff09;是一种新兴的网络架构&#xff0c;通过将网络的控制平面&#xff08;Control Plane&#xff09;和数据转发平面&#xff08;Data …

Elasticsearch基础(五):使用Kibana Discover探索数据

文章目录 使用Kibana Discover探索数据 一、添加样例数据 二、数据筛选 使用Kibana Discover探索数据 一、添加样例数据 登录Kibana。在Kibana主页的通过添加集成开始使用区域&#xff0c;单击试用样例数据。 在更多添加数据的方式页面下方&#xff0c;单击其他样例数据集…

Vscode+Pyside6开发之虚拟环境配置以及错误解决

Pyside开发之虚拟环境配置以及错误解决 开发环境一、项目创建以及虚拟环境设置1.创建项目2. 新建py文件,新建虚拟环境3.激活虚拟环境二、项目位置改变pip命令报错1.删除原来的虚拟环境2. 产生包列表文件requirements.txt3.重新创建虚拟环境4.重新安装包文件5.其他错误开发环境…

Notepad++换安装路径之后,右键打开方式报错:Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。的处理方法

把Notepad添加到右键打开方式&#xff0c;可以参考下面的3篇文章添加&#xff1a; https://blog.csdn.net/xiaoerbuyu1233/article/details/88287747 https://blog.csdn.net/qq_44000337/article/details/120277317 https://www.cnblogs.com/zhrngM/p/12899026.html 这里主要是…

Django实战项目之进销存数据分析报表——第一天:Anaconda 环境搭建

引言 Anaconda是一个流行的Python和R语言的发行版&#xff0c;它包含了大量预安装的数据科学、机器学习库和科学计算工具。使用Anaconda可以轻松地创建隔离的环境&#xff0c;每个环境都可以有自己的一套库和Python版本&#xff0c;非常适合多项目开发。本文将指导你如何安装A…

谷歌浏览器自动填充密码时,el-input样式错乱

使用到谷歌浏览器的记忆功能&#xff0c;选择的内容为浏览器保存的内容时 会导致element-plus的el-input样式改变 只需要增加一个css样式&#xff0c;就可以解决问题 :deep .el-input__inner {box-shadow: 0 0 0 1000px #fff inset; }修改后

上位机图像处理和嵌入式模块部署(香橙派AI Pro开发板试用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 和工控机相比较,linux嵌入式开发板使用上面方便很多、也容易很多。很多的第三方库都可以通过yum、apt-get这样的方法直接下载到,不需要自己通过源代码重新进行编译、安装。因为自…

Java基础知识之 使用 Cleaner 替代 finalize

Object.finalize 方法 在 Java 中&#xff0c;一个对象如果不再使用&#xff0c;那么它就会在 JVM 垃圾回收时&#xff0c;进行析构释放该对象占用的内存空间。但如果这个对象持有了一些其他需要进行额外处理的资源&#xff08;非堆内存资源&#xff09;&#xff0c;那么就得考…

Shell 构建flutter + Navtive 生成IPA

具体实现: #1. 在工程的根目录下,建立文件夹build_iOS文件,在此文件下建立build_iOS.sh的文件,把以下内容copy进sh文件; #2. 进入build_iOS.sh 文件的目录; #3. 在build_iOS 文件夹配置打包的DEVELOPExportOptionsPlist.plist(dev 构建)或AppStoreExportOptionsP…

SSR理解(vite与nuxt比较)

一、SSR的概念与理解(什么是SSR&#xff1f;) 定义:SSR是指在服务器端完成页面的渲染工作&#xff0c;将最终生成的HTML内容发送给浏览器。 简单来说&#xff0c;就是在服务器端将网页内容渲染成HTML&#xff0c;然后将这个渲染好的HTML发送到客户端&#xff0c;也就是我们的…

网络安全-等级保护制度介绍

一、等保发展历程 &#xff08;1&#xff09;1994国务院147号令 第一次提出等级保护概念&#xff0c;要求对信息系统分等级进行保护 &#xff08;2&#xff09;1999年GB17859 国家强制标准发布&#xff0c;信息系统等级保护必须遵循的法规 &#xff08;3&#xff09;2005年公安…

二、BIO、NIO、直接内存与零拷贝

一、网络通信编程基础 1、Socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层&#xff0c;是一组接口&#xff0c;由操作系统提供&#xff1b; Socket将复杂的TCP/IP协议处理和通信缓存管理都隐藏在接口后面&#xff0c;对用户来说就是使用简单的接口进行网络应用编程…