PostgreSQL学习笔记(二)—— 概览
数据库
创建数据库:
createdb dbname
指定用户名创建数据库:
createdb -U username dbname
删除数据库:
dropdb dbname
访问数据库:
psql [-U username] dbname
交互式环境下数据库内执行
select version();
会进入到一个新页面,要返回按q
退出数据库:
\q
、exit
、quit
表
创建表:
CREATE TABLE weather (city varchar(80), temp_low int, temp_high int, date date);
查看表结构:
\d tablename;
创建表时
--
表示注释,--
到行尾的东西都会被忽略删除表:
drop table tablename;
表中增加行:
insert into weather values('San Francisco', 46, 50, 0.25, '1994-11-27');
COPY
命令可以一次性向表中装填大量数据:COPY weather FROM '/home/user/weather.txt';
查询表:
select city, (temp_lo+temp_hi)/2, date from weather;
查询结果消除重复行:
SELECT DISTINCT city FROM weather;
指定表的列查询:
select weather.city, cities.location from weather, cities where cities.name = weather.city;
设置别名:
select * from weather w, cities c where w.city = c.name;
聚集函数:
最大值:
select max(temp_lo) from weather;
子查询:
select city from weather where temp_lo = (select max(temp_lo) from weather);
组合:
select city, max(temp_lo) from weather group by city;
Having:
select city, max(temp_lo) from weather group by city having max(temp_lo) < 40;
like:
select city, max(temp_lo) from weather where city like 's%' group by city having max(temp_lo) < 40;
where 和 having:
WHERE在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而HAVING在分组和聚集之后选取分组行。因此,WHERE子句不能包含聚集函数;因为试图用聚集函数判断哪些行应输入给聚集运算是没有意义的。相反,HAVING子句总是包含聚集函数(严格说来,你可以写不使用聚集的HAVING子句, 但这样做很少有用。同样的条件用在WHERE阶段会更有效)
更新行:
update weather set temp_hi = temp_hi - 2 where date > '1994-11-28';
删除行:
delete from weather where city = 'Hayward';
- 注:
delete from tablename;
会直接删除表中所有行而删除之前系统不会请求确认
- 注:
增加主键:
alter table weather add primary key (city);
增加外键:
alter table weather add constraint foreignkeyName foreign key (city) references cities(name);
高级特性
视图:
create view myview as select city, temo_lo, date, location from weather, cities where city = name;
select * from myview;
事务
开启一个事务需要将SQL命令用
BEGIN
和COMMIT
命令包围起来,如下:在事务中如果并不想提交,可以发出
ROLLBACK
命令而不是COMMIT
,这样所有目前的更新将被取消
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
-- etc etc
COMMIT;
- 保存点
在使用
SAVEPOINT
定义一个保存点后,我们可以在必要时利用ROLLBACK TO
回滚到该保存点。该事务中位于保存点和回滚点之间的数据库修改都会被放弃,但是早于该保存点的修改则会被保存在回滚到保存点之后,它的定义依然存在,因此我们可以多次回滚到它。如果确定不再需要回滚到特定的保存点,它可以被释放以便系统释放一些资源。记住不管是释放保存点还是回滚到保存点都会释放定义在该保存点之后的所有其他保存点
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
SAVEPOINT my_savepoint;
UPDATE accounts SET balance = balance + 100.00
WHERE name = 'Bob';
-- oops ... forget that and use Wally's account
ROLLBACK TO my_savepoint;
UPDATE accounts SET balance = balance + 100.00
WHERE name = 'Wally';
COMMIT;
窗口函数
- 一个窗口函数调用总是包含一个直接跟在窗口函数名及其参数之后的
OVER
子句。这使得它从句法上和一个普通函数或非窗口函数区分开来。OVER
子句决定究竟查询中的哪些行被分离出来由窗口函数处理。 OVER
子句中的PARTITION BY
子句指定了将具有相同PARTITION BY
表达式值的行分到组或者分区- eg:
SELECT depname, empno, salary, rank() OVER (PARTITION BY depname ORDER BY salary DESC) FROM empsalary;
- 窗口函数只允许出现在查询的
SELECT
列表和ORDER BY
子句中。它们不允许出现在其他地方,例如GROUP BY
、HAVING
和WHERE
子句中。这是因为窗口函数的执行逻辑是在处理完这些子句之后
- 一个窗口函数调用总是包含一个直接跟在窗口函数名及其参数之后的
-- 展示如何将每一个员工的薪水与他/她所在部门的平均薪水进行比较
SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;
/* depname | empno | salary | avg
-----------+-------+--------+-----------------------
develop | 11 | 5200 | 5020.0000000000000000
develop | 7 | 4200 | 5020.0000000000000000
develop | 9 | 4500 | 5020.0000000000000000
develop | 8 | 6000 | 5020.0000000000000000
develop | 10 | 5200 | 5020.0000000000000000
personnel | 5 | 3500 | 3700.0000000000000000
personnel | 2 | 3900 | 3700.0000000000000000
sales | 3 | 4800 | 4866.6666666666666667
sales | 1 | 5000 | 4866.6666666666666667
sales | 4 | 4800 | 4866.6666666666666667
*/
--最开始的三个输出列直接来自于表empsalary,并且表中每一行都有一个输出行。第四列表示对与当前行具有相同depname值的所有表行取得平均值(这实际和非窗口avg聚集函数是相同的函数,但是OVER子句使得它被当做一个窗口函数处理并在一个合适的窗口帧上计算。)
- 继承
--创建两个表:cities、capitals。自然地,首都也是城市,所以我们需要有某种方式能够在列举所有城市的时候也隐式地包含首都。
CREATE TABLE cities (
name text,
population real,
altitude int -- (in ft)
);
CREATE TABLE capitals (
state char(2)
) INHERITS (cities);
--在这种情况下,一个capitals的行从它的父亲cities继承了所有列(name、population和altitude)
-- 查找所有海拔高于500尺且不是州首府的城市
SELECT name, altitude
FROM ONLY cities
WHERE altitude > 500;
-- ONLY用于指示查询只在cities表上进行而不会涉及到继承层次中位于cities之下的其他表。很多我们已经讨论过的命令 — SELECT、UPDATE 和DELETE — 都支持这个ONLY记号
-- 尽管继承很有用,但是它还未与唯一约束或外键集成,这也限制了它的可用性
PostgreSQL学习笔记(二)—— 概览的更多相关文章
- PostgreSQL学习笔记(二)-安装pgAdmin
继上篇安装PostgreSQL后,我们需要安装一个PostgreSQL的图形化管理工具. pgadmin管理工具 创建Python的虚拟环境 cd /root/venv python -m venv ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- Java IO学习笔记二
Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...
- 《SQL必知必会》学习笔记二)
<SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...
- NumPy学习笔记 二
NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(二) indigo tools
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
随机推荐
- cf1189解题报告
cf1189div2解题报告 codeforces A 答案要不是一串要不就是去掉最后一个字母的两串 #include <bits/stdc++.h> #define ll long lo ...
- x64汇编第四讲,c / C++中调用x64汇编
目录 x64汇编第四讲,c / C++中调用x64汇编 一丶简介 1.说明 二丶C/C++调用 asm64.asm函数. 1.配置asm参与生成 2.给Asm文件添加函数代码 3.C/C++调用asm ...
- SpringBoot:使用Jenkins自动部署SpringBoot项目(二)具体配置
1.启动Jenkins 在浏览器输入ip:port后,进入Jenkins初始化界面,需要查看文件,得到密码. 输入密码进入初始化界面,选择推荐插件安装. 安装完成创建账号,进入Jenkins主界面. ...
- 【BigData】Java基础_数组
什么是数组?数据是可以装一组数据的变量 1.定义数组 float[] arr1 = new float[10]; // 可以装10个float数据 int[] arr2 = new int[10]; ...
- eclipse Target runtime com.genuitec.runtime.generic.jee50 is not defined
1.情景展示 报错信息如下: 2.原因分析 使用eclipse导入myeclipse时,唯独这个报错信息改不了. 需要通过修改这个项目的配置文件才行. 3.解决方案 第一步:切换到导航视图: 第二 ...
- 阿里P8架构师深度概述分布式架构
简介 作为一名架构师,我们要专业,要能看懂代码,及时光着臂膀去机房,也能独挡一面!及时同事搞不定问题,或者撂挑子,你也能给老大一个坚定的眼神:不怕,有我在!还能在会议室上滔滔不绝,如若无人,让不懂技术 ...
- C#反射方式调用泛型方法
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- C# .net 高清压缩图片 合并图片方法
/// <summary> /// 合并宽度一样的图片 /// </summary> /// <param name="imgUrls">多张图 ...
- WebGL学习笔记(十四):一些零碎的记录
HUD和Billboard 这两个名词都指向同一种东西,即始终面向摄像机的面片,该技术在游戏中大量使用,比如UI的绘制.模型头顶的名称和血条等等都需要使用到. 交换缓冲区 在PC上使用的OpenGL开 ...
- ETF计算公司:现金差额
T日现金差额=T日最小申赎单位的基金净值-(申购.赎回清单中必须现金替代的替代金额+申购.赎回清单中可以现金替代成份证券的数量与T日收盘价之和+申购.赎回清单中禁止现金替代成份证券的数量与T日收盘价之 ...