笔记:《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 基础教程》第2版(已完结)_第1张图片

◼︎ 表的结构:用来管理数据的二维表在关系数据库中简称为表,根据 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