写在前面:最近又看了下数据库,先是看了之前看的《MySQL必知必会》,还是感觉书的逻辑混乱,看的有点混沌,所以又拿起了之前的《SQL基础教程》,以前是为了使用先看了前三章,现在又补了四到七章,所以前三章的总结更为全面一些,后面四章可能就水一点啦哈哈,在此分两拨把这本书的思维导图和总结发布出来吧
第一章 数据库和SQL
1.数据库(DB)
通过计算机加工而成的可以进行高效访问的数据集合称为数据库(Database,DB)
-
1.1 数据库管理系统(DBMS)
用来管理数据库的计算机称为数据库管理系统(Database Management System,DBMS)
-
1.1.1 层次数据库(HDB)
最古老的,通过将数据以层级结构(树形结构)的方式表示出来(Hierarchical Database)
-
1.1.2 关系数据库(RDB)
应用最广的,使用由行和列组成的二维表来管理数据(Relational Database)。
使用专门的SQL(Structured Query Language,结构化查询语言)对数据进行操作。- (1)Oracle Database:甲骨文公司
- (2)SQL Server:微软公司
- (3)DB2 : IBM:IBM公司
- (4)PostgreSQL:开源
- (5)MySQL:开源
-
1.1.3 面向对象数据库(OODB)、SML数据库(XMLDB)、键值存储系统(KVS)
-
2.数据库的结构
-
2.1 RDBMS的常见系统结构—客户端 / 服务器类型(C/S类型)
-
2.1.1 服务器
接收其他程序发出的请求,并对该请求进行相应处理的程序(软件)。类似于委托方
-
2.1.2 客户端
向服务器发出请求的程序(软件)(SQL语句),或者是安装了该程序的设备(计算机)称之为客户端。类似于受托方。
-
-
2.2 表的结构
-
2.2.1 列(字段)
列的约束相当严格,定义为输入什么只能输入对应的
-
2.2.2 行(记录)
-
2.2.3 单元格
一个单元格中只能输入一个数据
-
3. SQL概要
-
3.1 标准SQL
国际标准化组织所制订的SQL标准
-
3.2 SQL语句及其种类
使用关键字、表名和列名等组成一条语句
-
(1)数据定义语言DDL
Data Definiton Language,用来创建或删除储存数据用的数据库以及数据库中的表等对象。
- CREATE:创建数据库和表等对象
- DROP:删除数据库和表等对象
- ALTER:修改数据库和表等对象的结构
-
(2)数据操作语言DML
Data Manipulation Language,用来查询或者变更表中的记录。
- SELECT:查询表中的数据
- INSERT:向表中插入新数据
- UPDATA:更新表中的数据
- DELETE:删除表中的数据
-
(3)数据控制语言DCL
Data Control Language,用来确认或者取消数据控库中对数据进行的变更。以及修改RDBMS用户的权限。
- COMMIT:确认在数据库中的数据进行的变更
- ROLLBACK:取消在数据库中的数据进行的变更
- GRANT:赋予用户操作权限
- REVOKE:取消用户的操作权限
-
-
3.3 SQL的基本书写规则
-
3.3.1 SQL的基本书写规则
- (1)法则1-5 SQL语句要以分号(;)结尾
- (2)SQL语句不区分关键字大小写
- (3)常数(字符串、日期或者数字)的书写方式固定
- (4)法则1-8 单词需要用半角空格或者换行符来分隔
-
4.表的创建
-
4.1 数据库的创建
- CREATE DATABASE <数据库名称>
-
4.2 表的创建
- CREAT TABEL <表名>
(<列名> <数据类型> <该列所需约束>,
<该表所需的约束1>,<该表所需的约束2>);
- CREAT TABEL <表名>
-
4.3 命名规则
- 只能使用半角英文字母、数字、下划线(_)作为数据库、表和列的名称
-
4.4 数据类型的指定
-
所有的列都必须指定数据类型,具体分为数字型、字符型和日期型
-
INTEGER型
- 指定存储整数的列的数据类型(数字型),不能存小数
-
CHAR型
- 指定存储字符串的列的数据类型(字符型)
其中为定长字符串,即设置长度后会自动填充
- 指定存储字符串的列的数据类型(字符型)
-
VARCHAR型
- 存储字符串的列的数据类型(字符串类型)
其中为可变长字符串,不会自动填充
- 存储字符串的列的数据类型(字符串类型)
-
DATE型
- 存储日期(年月日)的列的数据类型(日期型)
-
-
-
4.5 约束的设置
- 对列中存储的数据进行限制或者追加条件的功能,
例如:NOT NULL 表示必须输入,不输入会出错:
product_id CHAR(4) NOT NULL - 主键约束:PRIMARY KEY (product_id)
其中键为在指定特定数据时使用的列的组合;
主键即为可以特定一行数据的列。
- 对列中存储的数据进行限制或者追加条件的功能,
5.表的删除和更新
-
5.1 表的删除
- 语法:DROP TABLE <表名>
-
5.2 表(列)定义的更新(ALTER TABLE语句)
- 语法:添加列的ALTER TABLE语句
ALTER TABLE <表名> ADD COLUMN <列的定义>; - 语法:删除列的ALTER TABLE语句
ALTER TABEL <表名> DROP COLUMN <列名>;
- 语法:添加列的ALTER TABLE语句
-
5.3 表(行)定义的更新
-
BEGIN TRANSACTION;
INSERT INTO <表名> VALUES (数据);
COMMIT;- 其中的BEGIN TRANSACTION为插入行的指令语句,COMMIT为确认执行插入行的语句。
在MySQL中,开始为START TRANSACTION,而Oracle和DB2中无需这指令语句
- 其中的BEGIN TRANSACTION为插入行的指令语句,COMMIT为确认执行插入行的语句。
-
第二章 查询基础
1. SELECT语句基础
匹配查询或查询
-
1.1 列的查询
- 1.1.1 语法:SELECT <列名>,…
FROM <表名>; - 1.1.2 子句:组成SQL语句的组成要素,如上两个子句
- 1.1.3 顺序:查询结果中列的顺序和SELECT子句中的顺序相同
- 1.1.1 语法:SELECT <列名>,…
-
1.2 查询出表中所有的列
- SELECT *
FROM <表名> - 使用星号后,就无法设定列的显示顺序了
- SELECT *
-
1.3 为列设定别名
- 1.3.1 语法:SELECT product_id AS id,
product name AS name
FROM Product; - 1.3.2 特殊格式:可以在双引号中使用各种语言
- 1.3.1 语法:SELECT product_id AS id,
-
1.4 常数的查询
- 1.4.1 常数分类:字符串常数(‘商品’);数字常数(38);日期常数(‘2009-02-24’)
- 1.4.2 使用AS关键字设置常数
SELECT ‘商品’ AS string, 38 AS number, ‘2009-02-24’ AS date, product_id, product_name
FROM Product
-
1.5 从结果中删除重复行
- 1.5.1 常规的重复行搜索
SELECT DISTINCT product_type
FROM Product; //删除type里的重复数据 - 1.5.2 对NULL的特殊情况
SELECT DISTINCT <列名>
FROM <表名>;
//存在NULL的数据会被执行成为一行 - 1.5.3 对多行/列运算合并同行/列的数据
SELECT DISTINCT <列名1>, <列名2>
FROM <表名>; - 1.5.4 规则:DISTINCT关键字只能用在第一个列名之前
- 1.5.1 常规的重复行搜索
-
1.6 根据WHERE语句来选择记录
- 1.1.1 WHERE:指定查询数据的条件
SELECT <列名>,…
FROM <表名>,…
WHERE <条件表达式>; - 1.1.2 规则:
可以不选取作为查询条件的列;
SQL中子句的书写顺序是固定的,不能随意更改。
- 1.1.1 WHERE:指定查询数据的条件
-
1.7 注释
- 1.7.1 单行注释:–
- 1.7.2 多行注释:/* */
2. 算术运算符和比较运算符
-
2.1 算术运算符
- 2.1.1 语法
SELECT product_name, sale_price,
sale_price * 2 AS “sale_price * 2”
FROM Product; - 2.1.2 规则:
运算是以进行运算的对象为行/列来对应执行;
SQL语句中可以使用四则运算和括号
- 2.1.1 语法
-
2.2 注意NULL
- 所有包含NULL的计算,结果肯定都是NULL
-
2.3 比较运算符
- 其使用方式就是标准的比较运算符,除了不等于 为特殊符号’<>’(可以类比于正常运算符!=)
-
2.4 字符串比较
-
2.5 NULL字符的比较
3.逻辑运算符
-
3.1 NOT运算符
- 用来表示非的意思,如!和~,但是最好不要用于比较语句
-
3.2 AND和OR运算符
- 3.2.1 AND即|,表示或者
- 3.2.2 OR即&,表示并且
- 3.2.3 文氏图:将集合(事物的聚集)的关系通过更加容易理解的图形进行可视化展示
-
3.3 通过括号强化处理
- 用法与传统语言类似
-
3.4 逻辑运算符和真值
- AND运算符的逻辑计算为逻辑积,OR的为逻辑和
-
3.5 含有NULL时的真值
- SQL中的逻辑为三值逻辑,即含有NULL时逻辑将变成不确定型(UNKNOWKM)
第三章 聚合和排序
3.1 对表进行聚合查询
-
3.1.1 聚合函数
- 用于汇总的函数被称为聚合函数或者聚集函数 COUNT,SUM,AVG,MAX,MIN
- 所谓的聚合,就是将多行汇总为一行。不能被用于WHERE语句中
-
3.1.2 计算表中数据的行数
- SELECT COUNT(*)
FROM Product; - 此处的输入(*)为参数/parameter,输出值为返回值
- SELECT COUNT(*)
-
3.1.3 计算NULL之外的数据的行数
- 对于COUNT函数来说,参数列不同计算的结果也会不同,如:
SELECT COUNT(purchase_price),COUNT(*)
FROM Product;
这里计算的所有行数和进货价格的行数不同
- 对于COUNT函数来说,参数列不同计算的结果也会不同,如:
-
3.1.4 计算合计值
- SELECT SUM(purchase_price)
FROM Product;
- SELECT SUM(purchase_price)
-
3.1.5 计算平均值
- SELECT AVG(purchase_price)
FROM Product;
- SELECT AVG(purchase_price)
-
3.1.6 计算最大值和最小值
- SELECT MAX(purchase_price),MIN(sale_price),MAX(regist_data),MIN(regist_data)
FROM Product;
- SELECT MAX(purchase_price),MIN(sale_price),MAX(regist_data),MIN(regist_data)
-
3.1.7 使用聚合函数删除重复值(DINSTINCT)
- SELECT COUNT(DISTINCT product_type)
FROM Product; - SELECT SUM(DISTINCT sale_price), SUM(sale_price)
FROM Product; //结果不同,因为售价中重复数据
- SELECT COUNT(DISTINCT product_type)
3.2 对表进行分组
-
3.2.1 GROUP BY子句
- SELECT <列名1>,<列名2>,<列名3>,…
FROM <表名>
GROUP BT <列名1>,<列名2>,<列名3>,…; - SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type; - GROUP BY子句中指定的列为聚合键或者分组列
- 子句的书写顺序(暂定):
1.SELECT→2.FROM→3.WHERE→4.GROUP BY
- SELECT <列名1>,<列名2>,<列名3>,…
-
3.2.2 聚合键中包含NULL时的情况
- SELECT purchase_price, COUNT(*)
FROM Product
GROUP BY purchase_price;
//会将NULL行也单独算进来的
- SELECT purchase_price, COUNT(*)
-
3.2.3 使用WHERE子句时GROUP BY的执行结果
- SELECT <列名1>,<列名2>,<列名3>,…
FROM <表名>
WHERE
GROUP BY <列名1>,<列名2>,<列名3>,…; - GROUP BY和WHERE并用时SELECT语句的执行顺序如下:(与书写顺序不同)
FROM(表名)→WHERE(限制条件)→GROUP BY(分组)→SELECT(查询)
- SELECT <列名1>,<列名2>,<列名3>,…
-
3.2.4 与聚合函数和GROUP BY子句有关的常见错误
- (1)在SELECT子句中书写了多余的列:
把聚合键之外的列名书写在SELECT子句之中了 - (2)在GROUP BY子句中写了列的别名:
对于PGSQL和MYSQL都没有问题 - (3)GROUP BY子句的结果排序:
完全随机,全是偶然情况 - (4)在WHERE子句中使用聚合函数:
WHERE表示对表的限制条件,而不是对于组的
- (1)在SELECT子句中书写了多余的列:
3.3 为聚合结果指定条件
-
聚合函数可以在SELECT子句、HAVING子句和ORDER BY子句中使用
-
3.3.1 HAVING子句
- SELECT <列名1>,<列名1>,<列名1>,…
FROM <列名1>
GROUP BY <列名1>,<列名1>,<列名1>,…
HAVING <分组结果对应的条件> - 使用HAVING子句时要写在GROUP BY子句之后,执行顺序如下:
SELECT→FROM→WHERE→GROUP BY→HAVING
- SELECT <列名1>,<列名1>,<列名1>,…
-
3.3.2 HAVING子句的构成要素
- 常数,聚合函数,GROUP BY子句中指定的列名(即聚合键)
- HAVING可以理解为GROUP BY分组之后,对于组的SELECT语句
-
3.3.3 HAVING与WHERE子句
- WHERE子句即指定行所对应的条件;
HAVING子句即指定组所对应的条件
- WHERE子句即指定行所对应的条件;
3.4 对查询结果进行排序
-
3.4.1 ORDER BY子句
- SELECT <列名1>,<列名2>,<列名3>,…
FROM <表名>
ORDER BY <排序基准列>,<排序基准列>,… - ORDER BY子句中书写的列的名称为排序键,子句的书写顺序如下:
1.SELECT子句→2.FROM子句→3.WHERE子句→4.GROUP BY子句→
5.HAVING子句→6.ORDER BY子句
- SELECT <列名1>,<列名2>,<列名3>,…
-
3.4.2 指定升序或降序
- ORDER BY <排序基准列>,<排序基准列> ASC/DESC
其中ASC为上升的,DESC为下降的,表示升序和降序 - ASC和DESC是以列为单位指定的,所以可以指定有的列升序,有的列降序
- ORDER BY <排序基准列>,<排序基准列> ASC/DESC
-
3.4.3 指定多个排序键
- 有多个排序基准列时,规则是优先使用左侧的键,如果该列存在相同值的话,再接着参考右侧的值
-
3.4.4 NULL的顺序
- NULL的排序根据DBMS的不同,会汇集在开头或者末尾。PGSQL的规则为NULL为最小数
-
3.4.5 在排序键中使用别名
- 排序键中使用别名是可行的,原因在于执行顺序:
FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY
- 排序键中使用别名是可行的,原因在于执行顺序:
-
3.4.6 ORDER BY子句中可以使用的列
-
3.4.7 不要使用列编号