笔记:《SQL 基础教程》第2版(已完结)

第一章 数据库和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

<完结>


备注:该文章为个人读书学习笔记,仅供学习之用,未经允许禁止转载。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容