第一章 数据库和SQL
1、什么是数据库
◼︎ 将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合称为数据库(Database,DB)。
◼︎ 用来管理数据库的计算机系统称为数据库管理系统 (Database Management System,DBMS),可以实现多个用户同时安全简单地操作大量数,这也是我们一定要使用DBMS的原因。
◼︎ DBMS的种类:
层次数据库(Hierarchical Database,HDB):最古老的数据库之一,它把数据通过层次结构(树形结构)的方式表现出来;
关系数据库(Relational Database,RDB):是现在应用最广泛的数据库,和 Excel 工作表一样,它也采用由行和列组成的二维表来管理数据,它还使用专门的 SQL(Structured Query Language,结构化查询语言)对数据进行操作;
面向对象数据库(Object Oriented Database,OODB):把数据以及对数据的操作集合起来以对象为单位进行管理,因此得名;
XML 数据库(XML Database,XMLDB):可以对XML形式的大量数据进行高速处理;
键值存储系统(Key-Value Store,KVS):是一种单纯用来保存查询所使用的主键(Key)和值(Value)的组合的数据库。
2、数据库的结构
◼︎ 使用 RDBMS 时,最常见的系统结构就是客户端 / 服务器类型(C/S 类型)这种结构
◼︎ 表的结构:用来管理数据的二维表在关系数据库中简称为表,根据 SQL 语句的内容返回的数据同样必须是二维表的形式。
◼︎ 表的列(垂直方向)称为字段,表的行(水平方向)称为记录,关系数据库必须以行为单位进行数据读写。
◼︎ 行和列交汇的方格称为单元格,一个单元格中只能输入一个数据。
3、SQL概要
◼︎ SQL语句及其种类:SQL用关键字、表名、列名等组合而成的一条语句(SQL语句)来描述操作的内容。SQL根据功能不同可以分为三类,其中使用最多的是DML。
◼︎ DDL(Data Definition Language,数据定义语言)用来创建或者删除存储数据用的数据库以及数据库中的表等对象。
CREATE:创建数据库和表等对象
DROP: 删除数据库和表等对象
ALTER: 修改数据库和表等对象的结构
◼︎ DML(Data Manipulation Language,数据操纵语言)用来查询或者变更表中的记录。
SELECT:查询表中的数据
INSERT:向表中插入新数据
UPDATE:更新表中的数据
DELETE:删除表中的数据
◼︎ DCL(Data Control Language,数据控制语言)用来确认或者取消对数据库中的数据进行的变更。
COMMIT: 确认对数据库中的数据进行的变更
ROLLBACK :取消对数据库中的数据进行的变更
GRANT: 赋予用户操作权限
REVOKE: 取消用户的操作权限
◼︎ SQL基本书写规范:
SQL语句要以分号(;)结尾;
SQL语句不区分大小写;
字符串和日期常数需要使用单引号(')括起来;
数字常数无需加注单引号(直接书写数字即可);
单词之间需要使用半角空格或者换行符进行分隔。
4、表的创建
◼︎ 数据库的创建:CREATE DATABASE <数据库名称>;
◼︎ 表的创建:每一列的数据类型(后述)是必须要指定的,还要为需要的列设置约束(后述)。约束可以在定义列的时候进行设置,也可以在语句的末尾进行设置。
CREATE TABLE <表名>
(<列名1> <数据类型> <该列所需约束>,
<列名2> <数据类型> <该列所需约束>,
<列名3> <数据类型> <该列所需约束>,
<列名4> <数据类型> <该列所需约束>,
.
<该表的约束1>, <该表的约束2>,…...);
◼︎ 命名规则:
只能使用半角英文字母、数字、下划线(_)作为数据库、表和列的名称;
名称必须以半角英文字母开头;
同一个数据库中不能创建两个相同名称的表,在同一个表中也不能创建两个名称相同的列。
◼︎ 数据类型的指定:数据类型表示数据的种类,包括数字型、字符型和日期型等,所有的列都必须指定数据类型,每一列都不能存储与该列数据类型不符的数据。
INTEGER型:用来指定存储整数的列的数据类型(数字型),不能存储小数;
CHAR型:是CHARACTER(字符)的缩写,是用来指定存储字符串的列的数据类型(字符型)。 可以像 CHAR(10) 或者 CHAR(200) 这样,在括号中指定该列可以存储的字符串的长度(最大长度);
VARCHAR型:也是用来指定存储字符串的列的数据类型(字符串类型),但该类型的列是以可变长字符串的形式来保存字符串的;
DATE型:用来指定存储日期(年月日)的列的数据类型(日期型)。
◼︎ 约束的设置:约束是除了数据类型之外,对列中存储的数据进行限制或者追加条件的功能。
设置NOT NULL约束。NULL是代表空白(无记录)的关键字 A。在 NULL 之前加上了表示否定的 NOT,就是给该列设置了不能输入空白,也就是必须输入数据的约束(如果什么都不输入就会出错)。
设置主键约束。所谓键,就是在指定特定数据时使用的列的组合。键种类多样,主键(primary key)就是可以特定一行数据的列。
5、表的删除和更新
◼︎ 表的删除:DROP TABLE <表名>; (删除了的表是无法恢复的)
◼︎ 表定义的更新:(表定义变更之后无法恢复)
添加列的ALTER TABLE语句:ALTER TABLE <表名> ADD COLUMN <列的定义>;
删除列的ALTER TABLE语句:ALTER TABLE <表名> DROP COLUMN <列名>;
◼︎ 向表中插入数据:INSERT INTO <表名> VALUES (数据);
◼︎ 变更表名:RENAME TABLE <旧表名> TO <新表名>;
第二章 查询基础
1、SELECT语句基础
◼︎ 列的查询:SELECT <列名>,...... FROM <表名>;
◼︎ 查询出表中所有的列:SELECT * FROM <表名>; 【星号(*)代表全部列的意思,如果使用星号的话,就无法设定列的显示顺序了】
◼︎ SQL 语句可以使用 AS 关键字为列设定别名。别名可以使用中文,使用中文时需要用双引号(")括起来。请注意不是单引号(')。
◼︎ 常数的查询:SELECT '商品' AS string, 38 AS number, '2009-02-24' AS date, product_id, product_name FROM Product;
◼︎ 从结果中删除重复行:使用 DISTINCT 来实现,DISTINCT关键字只能用在第一个列名之前
◼︎ WHERE 子句来指定查询数据的条件:SELECT <列名>, ...... FROM <表名> WHERE <条件表达式>;
◼︎ 语句执行顺序:首先通过 WHERE 子句查询出符合指定条件的记录,然后再选取出 SELECT 语句指定的列。
◼︎ WHERE 子句要紧跟在 FROM 子句之后。
◼︎ 注释的书写方法:注释是 SQL 语句中用来标识说明或者注意事项的部分。
1 行注释:书写在“--”之后,只能写在同一行。
多行注释:书写在“/*”和“*/”之间,可以跨多行。
2、算数运算符和比较运算符
◼︎ SQL 语句中使用的四则运算的主要运算符:加法运算+,减法运算-,乘法运算*,除法运算/。
◼︎ 所有包含 NULL 的计算,结果肯定是 NULL。
◼︎ FROM 子句在 SELECT 语句中并不是必不可少的,只使用 SELECT 子句进行计算也是可以的。
◼︎ 比较运算符:=相等,<>不相等,>=大于等于,>大于,<=小于等于,<小于
◼︎ SQL 提供了专门用来判断是否为NULL的IS NULL运算符,希望选取不是NULL的记录时,需要使用IS NOT NULL运算符。
3、逻辑运算符
◼︎ NOT 运算符:用来否定某一条件,但是不能滥用。
◼︎ AND 运算符:在其两侧的查询条件都成立时整个查询条件才成立,其意思相当于“并且”。
◼︎ OR运算符:在其两侧的查询条件有一个成立时整个查询条件都成立,其意思相当于“或者”。
◼︎ AND 运算符的优先级高于 OR 运算符。想要优先执行 OR 运算符时可以使用括号。
◼︎ 逻辑运算符和真值:NOT、AND 和 OR 称为逻辑运算符,真值就是值为真(TRUE)或假(FALSE)其中之一的值。
第三章 聚合与排序
1、聚合查询
◼︎ 聚合函数:SQL 对数据进行某种操作或计算时需要使用函数。
◼︎ 常用聚合函数:count、sum、avg、max、min
◼︎ COUNT 函数的结果根据参数的不同而不同。COUNT(*) 会得到包含 NULL 的数据行数,而 COUNT(< 列名 >) 会得到 NULL 之外的数据行数。
◼︎ 聚合函数会将 NULL 排除在外。但 COUNT(*) 例外,并不会排除 NULL 。
◼︎ MAX/MIN 函数几乎适用于所有数据类型的列。SUM/AVG 函数只适用于数值类型的列。
◼︎ 想要计算值的种类时,可以在 COUNT 函数的参数中使用 DISTINCT。
◼︎ 在聚合函数的参数中使用 DISTINCT,可以删除重复数据。
2、对表进行分组
◼︎ GROUP BY 子句
SELECT <列名1>, <列名2>, <列名3>, ...... FROM <表名>
GROUP BY <列名1>, <列名2>, <列名3>, ......;
◼︎ SQL子句的书写顺序不能改变,也不能互相替换。SELECT → 2.FROM → 3.WHERE → 4.GROUP BY
◼︎ 聚合键中包含 NULL 时,在结果中会以“不确定”行(空行)的形式表现出来。
◼︎ GROUP BY和WHERE并用时SELECT语句的执行顺序FROM → WHERE → GROUP BY → SELECT
◼︎ 使用 GROUP BY 子句时,SELECT 子句中不能出现聚合键之外的列名。
◼︎ 在 GROUP BY 子句中不能使用 SELECT 子句中定义的别名。
◼︎ GROUP BY 子句结果的显示是无序的。
◼︎ 只有SELECT子句和HAVING子句(以及ORDER BY子句)中能够使用聚合函数。
3、为聚合结果制定条件
◼︎ HAVING子句:取出符合指定条件的组【HAVING 子句要写在 GROUP BY 子句之后】
SELECT <列名1>, <列名2>, <列名3>, ......
FROM <表名>
GROUP BY <列名1>, <列名2>, <列名3>, ......
HAVING <分组结果对应的条件>
◼︎ 聚合键所对应的条件不应该书写在 HAVING 子句当中,而应该书写在 WHERE 子句 当中。
◼︎ 通常情况下,为了得到相同的结果,将条件写在 WHERE 子句 中要比写在 HAVING 子句中的处理速度更快,返回结果所需的时间更短。
4、对查询结果进行排序
◼︎ ORDER BY子句
SELECT <列名1>, <列名2>, <列名3>, ...... FROM <表名>
ORDER BY <排序基准列1>, <排序基准列2>, ......
◼︎ 书写顺序 1.SELECT子句→2.FROM子句→3.WHERE子句→4.GROUP BY子句→ 5. HAVING 子句 → 6. ORDER BY 子句
◼︎ ORDER BY 子句通常写在 SELECT 语句的末尾。
◼︎ ASC 和 DESC 是 ascendent(上升的)和 descendent(下降的)这两个单词的缩写。
◼︎ 未指定 ORDER BY 子句中排列顺序时会默认使用升序进行排列。
◼︎ 在 ORDER BY 子句中可以使用 SELECT 子句中定义的别名。不能在GROUP BY子句中使用的别名,为什么可以在ORDER BY 子句中使用呢?这是因为 SQL 语句在 DBMS 内部的执行顺序被掩盖起来 了。SELECT 语句按照子句为单位的执行顺序如下所示。
◼︎ 使用 HAVING 子句时 SELECT 语句的顺序 FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY
◼︎ 在 ORDER BY 子句中可以使用 SELECT 子句中未使用的列和聚合函数。
◼︎ 在 ORDER BY 子句中不要使用列编号。
第四章 数据更新
1、数据的插入
◼︎ INSERT 语句:INSERT INTO <表名> (列1, 列2, 列3, ......) VALUES (值1, 值2, 值3, ......);
◼︎ 原则上,执行一次 INSERT 语句会插入一行数据。
◼︎ 对表进行全列 INSERT 时,可以省略表名后的列清单。
◼︎ 省略列清单INSERT INTO ProductIns VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');
◼︎ INSERT 语句中想给某一列赋予 NULL 值时,可以直接在 VALUES 子句的值清单中写入 NULL。
◼︎ INSERT语句的SELECT语句中,可以使用WHERE子句或者GROUP BY子句等任 何 SQL 语法(但使用 ORDER BY 子句并不会产生任何效果)。
2、数据的删除
◼︎ DROP TABLE 语句可以将表完全删除。
◼︎ DELETE 语句会留下表(容器),而删除表中的全部数据。
◼︎ DELETE 语句的基本语法:DELETE FROM <表名>;
◼︎ 如果语句中忘了写 FROM,而是写成了“DELETE < 表名 >”,或者 写了多余的列名,都会出错,无法正常执行,请大家特别注意。
◼︎ DELETE 语句的删除对象并不是表或者列,而是记录(行)。
◼︎ 指定删除对象的 DELETE 语句(搜索型 DELETE):DELETE FROM <表名> WHERE <条件>;
◼︎ 可以通过 WHERE 子句指定对象条件来删除部分数据。
◼︎ DELETE语句中不能使用GROUP BY、 HAVING和ORDER BY三类子句,而只能使用WHERE子句。
3、数据的更新
◼︎ UPDATE 语句的基本语法:UPDATE <表名> SET <列名> = <表达式>;
◼︎ 指定条件的 UPDATE 语句(搜索型 UPDATE):UPDATE <表名> SET <列名> = <表达式> WHERE <条件>;
◼︎ 使用UPDATE语句可以将值清空为NULL(但只限于未设置NOT NULL约束的列)。
4、事务
◼︎ 在 RDBMS 中,事务是对表中数据进行更新的单位。简单来讲,事务就是需要在同一个处理单元中执行的一系列更新处理的集合。
◼︎ 创建事务:
事务开始语句 ;
DML 语句1 ;
DML 语句2 ;
DML 语句3 ;
事务结束语句(COMMIT 或者 ROLLBACK);
◼︎ 需要特别注意的是事务的开始语句 A。实际上,在标准 SQL 中 并没有定义事务的开始语句,而是由各个 DBMS 自己来定义的。比较有 代表性的语法如下所示。
● SQL Server、PostgreSQL
BEGIN TRANSACTION
● MySQL
START TRANSACTION
● Oracle、DB2
无
◼︎ COMMIT 是提交事务包含的全部更新处理的结束指令,相当于文件处理中的覆盖保存。一旦提交,就无法恢复到事务开始前的状态了。因此,在提交之前一定要确认是否真的需要进行这些更新。
◼︎ ROLLBACK 是取消事务包含的全部更新处理的结束指令,相当于文件处理中的放弃保存。一旦回滚,数据库就会恢复到事务开始之前的状态。通常回滚并不会像提交那样造成大规模的数据损失。
◼︎ DBMS 的事务都遵循四种特性,将这四种特性的首字母结合起来统称为 ACID 特性。这是所有 DBMS 都必须遵守的规则。
◼︎ 原子性:是指在事务结束时,其中所包含的更新处理要么全部执行,要么完全不执行,也就是要么占有一切要么一无所有。
◼︎ 一致性:指的是事务中包含的处理要满足数据库提前设置的约束,如主键约束或者 NOT NULL 约束等。
◼︎ 隔离性:指的是保证不同事务之间互不干扰的特性。
◼︎ 持久性:也可以称为耐久性,指的是在事务(不论是提交还是回滚)结束后,DBMS 能够保证该时间点的数据状态会被保存的特性。
第五章 复杂查询
1、视图
◼︎ 视图究竟是什么呢?如果用一句话概述的话,就是“从 SQL 的角度来看视图就是一张表”。
◼︎ 视图和表到底有什么不同呢?区别只有一个,那就是“是否保存了实际的数据”。
◼︎ 视图的优点大体有两点:第一点是由于视图无需保存数据,因此可以节省存储设备的容量。第二个优点就是可以将频繁使用的 SELECT 语句保存成视图,这样就不用每次都重新书写了。
◼︎ 创建视图的方法:创建视图需要使用CREATE VIEW语句
CREATE VIEW 视图名称(<视图列名1>, <视图列名2>, ......)
AS
<SELECT 语句 >
◼︎ 应该避免在视图的基础上创建视图。
◼︎ 视图的限制:
1、 定义视图时不能使用ORDER BY子句
2、 对视图进行更新,视图和表需要同时进行更新,因此通过汇总得到的视图无法进行更新。
◼︎ 删除视图:删除视图的 DROP VIEW 语句
DROP VIEW 视图名称(<视图列名1>, <视图列名2>, ......)
2、子查询
◼︎ 子查询的特点概括起来就是一张一次性视图。
◼︎ 子查询作为内层查询会首先执行。
◼︎ 随着子查询嵌套层数的增加,SQL 语句会变得越来越难读懂,性能也会越来越差。因此,请大家尽量避免使用多层嵌套的子查询。
◼︎ 原则上子查询必须设定名称,设定名称时需要使用 AS 关键字,该关键字有时也可以省略。
◼︎ 标量子查询就是返回单一值的子查询。必须而且只能返回 1 行 1 列的结果。
◼︎ 在 WHERE 子句中使用标量子查询:
SELECT product_id, product_name, sale_price
FROM Product
WHERE sale_price > (SELECT AVG(sale_price) FROM Product);
◼︎ 标量子查询的书写位置:能够使用常数或者列名的地方,无论是 SELECT 子句、GROUP BY 子句、HAVING 子句,还是ORDER BY子句,几乎所有的地方都可以使用。
◼︎ 标量子查询绝对不能返回多行结果。
3、关联子查询
◼︎ 在细分的组内进行比较时,需要使用关联子查询。例如:按照商品种类与平均销售单价进行比较。
SELECT product_type, product_name, sale_price
FROM Product AS P1 1
WHERE sale_price > (SELECT AVG(sale_price)
FROM Product AS P2
WHERE P1.product_type = P2.product_type
GROUP BY product_type);
◼︎ 这里起到关键作用的就是在子查询中添加的 WHERE 子句的条件。该条件的意思就是,在同一商品种类中对各商品的销售单价和平均单价进行比较。
第六章 函数、谓词、CASE 表达式
1、函数
◼︎ 根据用途,函数可以大致分为算术函数、字符串函数、日期函数、转换函 数和聚合函数。
◼︎ 算术函数(用来进行数值计算的函数)
ABS是计算绝对值的函数:ABS(数值)
MOD 是计算除法余数(求余)的函数:M O D (被除数,除数)
ROUND 函数用来进行四舍五入操作:ROUND(对象数值,保留小数的位数)
◼︎ 字符串函数(用来进行字符串操作的函数)
||函数:字符串 1|| 字符串 2 【|| 函数在 SQL Server 和 MySQL 中无法使用。SQL Server使用“+”运算符(函数)来连接字符串A。MySQL使用CONCAT函数来完成字符串的拼接。】
LENGTH 函数:LENGTH(字符串)【该函数也无法在 SQL Server 中使用。SQL Server使用LEN函数来计算字符串的长度。】
LOWER函数(小写转换):LOWER(字符串)【UPPER 就是 大写转换函数。】
REPLACE字符串替换函数:REPLACE( 对象字符串,替换前的字符串,替换后的字符串 )
SUBSTRING字符串的截取函数:SUBSTRING(对象字符串 FROM 截取的起始位置 FOR 截取的字符数)【(P o s t g r e S Q L / M y S Q L 专 用 语 法 )】
◼︎ 日期函数(用来进行日期操作的函数)
CURRENT_DATE获取当前日期函数:SELECT CURRENT_DATE;【该函数无法在 SQL Server 中执行。Oracle 和 DB2 中的语法略有不同。】
CURRENT_TIME获取当前时间函数:SELECT CURRENT_TIME;【该函数无法在 SQL Server 中执行。Oracle 和 DB2 中的语法略有不同。】
CURRENT_TIMESTAMP获取当前日期和时间函数:SELECT CURRENT_TIMESTAMP;【在 Oracle 和 DB2 中该函数的语法略有不同。】
EXTRACT截取日期元素函数:EXTRACT(日期元素 FROM 日期)【截取出日期数据中的一部分,例如“年” “月”,或者“小时”“秒”等。SQL Server使用如下的DATEPART函数 】
◼︎ 转换函数(用来转换数据类型和值的函数)
CAST类型转换函数:CAST(转换前的值 AS 想要转换的数据类型)
◼︎ 聚合函数(用来进行数据聚合的函数)
COUNT、SUM、AVG、MAX、MIN
2、谓词
◼︎ LIKE谓词——字符串的部分一致查询
前方一致查询:LIKE 'ddd%'
中间一致查询:LIKE '%ddd%'
后方一致查询:LIKE '%ddd'
“abc + 任意 2 个字符”: LIKE 'abc__'
◼︎ BETWEEN谓词——范围查询
例如:SELECT product_name, sale_price
FROM Product
WHERE sale_price BETWEEN 100 AND 1000;
*BETWEEN 的特点就是结果中会包含 100 和 1000 这两个临界值。如果不想让结果中包含临界值,那就必须使用 < 和 >。
◼︎ IS NULL、IS NOT NULL——判断是否为NULL
为了选取出某些值为 NULL 的列的数据,不能使用 =,而只能使用特定的谓词IS NULL。
◼︎ IN谓词——OR的简便用法
例如:SELECT product_name, purchase_price
FROM Product
WHERE purchase_price IN (320, 500, 5000);【否定形式NOT IN】
*IN谓词(NOT IN谓词)具有其他谓词所没有的用法,那就是可以使用子查询作为其参数。
例如:SELECT product_name, sale_price
FROM Product
WHERE product_id IN (SELECT product_id
FROM ShopProduct
WHERE shop_id = '000C');
3、CASE 表达式
◼︎ CASE 表达式的语法分为简单 CASE 表达式和搜索 CASE 表达式两种。
◼︎ 搜索 CASE 表达式:
CASE WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
. . .
ELSE <表达式>
END
◼︎ 虽然 CASE 表达式中的 ELSE 子句可以省略,但还是希望大家不要省略。
◼︎ CASE 表达式中的 END 不能省略。
◼︎ 使用 CASE 表达式进行行列转换
SELECT SUM(CASE WHEN product_type = '衣服' THEN sale_price ELSE 0 END) AS sum_price_clothes,
SUM(CASE WHEN product_type = '厨房用具' THEN sale_price ELSE 0 END) AS sum_price_kitchen,
SUM(CASE WHEN product_type = '办公用品' THEN sale_price ELSE 0 END) AS sum_price_office
FROM Product;
第七章 集合运算
1、表的加减法
◼︎ 表的加法——UNION
SELECT product_id, product_name FROM Product
UNION
SELECT product_id, product_name
FROM Product2;
◼︎ 集合运算符会除去重复的记录。
◼︎ 集合运算的注意事项:
作为运算对象的记录的列数必须相同。
作为运算对象的记录中列的类型必须一致。
可以使用任何SELECT语句,但ORDER BY子句只 能在最后使用一次。
◼︎ 在 UNION 的结果中保留重复行的语法。只需要在UNION后面添加 ALL 关键字就可以了。
◼︎ 选取表中公共部分——INTERSECT
SELECT product_id, product_name FROM Product
INTERSECT
SELECT product_id, product_name
FROM Product2 ORDER BY product_id;
◼︎ 记录的减法——EXCEPT
SELECT product_id, product_name FROM Product
EXCEPT
SELECT product_id, product_name
FROM Product2 ORDER BY product_id;
2、联结
◼︎ 内联结——INNER JOIN
SELECT SP.shop_id,SP.shop_name,SP.product_id,P.product_name,P.sale_price
FROM ShopProduct AS SP INNER JOIN Product AS P
ON SP.product_id=P.product_id;
*进行联结时需要在 FROM 子句中使用多张表。
*进行内联结时必须使用 ON 子句,并且要书写在 FROM 和 WHERE 之间。
*使用联结时 SELECT 子句中的列需要按照“< 表的别名 >.< 列名 >”的格式进行书写。
◼︎ 外联结——OUTER JOIN
外联结中使用 LEFT、RIGHT 来指定主表。使用二者所得到的结果完全相同。
◼︎ 交叉联结——CROSS JOIN
交叉联结没有应用到实际业务之中的原因有两个。一是其结果没有实用价值,二是由于其结果行数太多,需要花费大量的运算时间和高性能设备的支持。
第八章 SQL高级处理
1、窗口函数
◼︎ 窗口函数语法:
< 窗口函数 > OVER ([PARTITION BY < 列清单 >] ORDER BY < 排序用列清单 >)
◼︎ 能够作为窗口函数使用的函数
能够作为窗口函数的聚合函数(SUM、AVG、COUNT、MAX、MIN)
RANK、DENSE_RANK、ROW_NUMBER 等专用窗口函数
◼︎ 语法的基本使用方法——使用 RANK 函数
SELECT product_name, product_type, sale_price,
RANK () OVER (PARTITION BY product_type ORDER BY sale_price) AS ranking
FROM Product;
*窗口函数兼具分组和排序两种功能。
*通过PARTITION BY分组后的记录集合称为窗口。
◼︎ 专用窗口函数的种类
RANK 函数 计算排序时,如果存在相同位次的记录,则会跳过之后的位次。例)有 3 条记录排在第 1 位时:1 位、1 位、1 位、4 位......
DENSE_RANK 函数 同样是计算排序,即使存在相同位次的记录,也不会跳过之后的位次。例)有 3 条记录排在第 1 位时:1 位、1 位、1 位、2 位......
ROW_NUMBER 函数 赋予唯一的连续位次。例)有 3 条记录排在第 1 位时:1 位、2 位、3 位、4 位......
*由于专用窗口函数无需参数,因此通常括号中都是空的。
◼︎ 原则上窗口函数只能在 SELECT 子句中使用。
◼︎ 作为窗口函数使用的聚合函数:
1)计算累加值,例如:
SELECT product_id, product_name, sale_price,
SUM (sale_price) OVER (ORDER BY product_id) AS current_sum
FROM Product;
解释:计算出商品编号“小于自己”的商品 的销售单价的合计值。
2)计算移动平均,例如:
SELECT product_id, product_name, sale_price,
AVG (sale_price)OVER (ORDER BY product_id
ROWS 2 PRECEDING) AS moving_avg
FROM Product;
解释:使用了 ROWS(“行”)和 PRECEDING(“之前”)两个关键字,将框架指定为“截止到之前 ~ 行”,因此“ROWS 2 PRECEDING”就是将框架指定为“截止到之前 2 行”(最靠近的 3 行)。
2、GROUPING 运算符
◼︎ GROUPING 运算符包含以下 3 种:
1)ROLLUP:同时得出合计和小计
SELECT product_type, SUM(sale_price) AS sum_price
FROM Product
GROUP BY ROLLUP(product_type);
2)CUBE:将使用聚合键进行切割的模块堆积成一个立方体
3)GROUPING SETS:用于从 ROLLUP 或者 CUBE 的结果中取出部分记录
第九章 通过应用程序连接数据库
1、数据库世界和应用程序世界的连接
◼︎ 系统=应用+数据库
◼︎ 驱动是应用和数据库之间的桥梁。
◼︎ 现在广泛使用的驱动标准主要有 ODBC(Open DataBase Connectivity) 和 JDBC(Java Data Base Connectivity)两种。
2、java基础知识
略
3、通过 Java 连接 PostgreSQL
略
<完结>
备注:该文章为个人读书学习笔记,仅供学习之用,未经允许禁止转载。