导图社区 SQL基础教程入门
思维导图,顺时针顺序,知识点完整有图有分析。
编辑于2020-04-05 15:18:26SQL基础教程
集合运算
集合在数学领域表示“(各种各样的)事物的总和”,在数据库领域表示记录的集合
表、视图和查询的执行结果都是记录的集合
表的加减法
注意事项
集合运算符会除去重复的记录
作为运算对象的记录的列数必须相同
作为运算对象的记录中列的类型必须一致
可以使用任何SELECT语句,但ORDER BY子句只能在最后使用一次
在集合运算符中使用ALL选项,可以保留重复行
UNION(并集)
INTERSECT(交集)
联结
将其他表中的列添加过来,进行“添加列”的运算
进行联结时需要在FROM子句中使用多张表,一般需要使用别名
进行内联结时必须使用ON子句,并且要书写在FROM和WHERE之间
使用联结时SELECT子句中的列需要按照“<表的别名>.<列名>”的格式进行书写
分类
内联结INNER JOIN
外联结OUTER JOIN
LEFT OUTER JOIN
RIGHT OUTER JOIN
交叉联洁CROSS JOIN(笛卡尔积)
三张表以上的联结
数据库与SQL
数据库是什么?
数据库(Database,DB):将大量数据保存,通过计算机加工并可以高效访问的数据集
数据库管理系统(Database Management System,DBMS):即数据库软件,用来管理数据库的计算机系统
数据库的结构
RDBMS的常见系统结构:客户端 / 服务器类型(C/S类型)
表的结构
需求
关系数据库由行和列组成的二维表来管理数据
根据 SQL 语句的内容返回的数据同样必须是二维表的形式
构成
表的列(垂直方向)称为字段,描述某一特征,它代表了保存在表中的数据项目
表的行(水平方向)称为记录,它相当于一条数据
注意:关系数据库必须以行为单位进行数据读写!
SQL概要
SQL是为操作数据库而开发的语言
SQL 用关键字、表名、列名等组合而成的一条语句(SQL 语句)来描述操作的内容
种类
DDL(Data Definition Language,数据定义语言)
CREATE: 创建数据库和表等对象
命名规则
我们只能使用半角英文字母、数字、下划线(_)作为数据库、表和列的名称
名称必须以半角英文字母开头
同一个数据库中不能创建两个相同名称的表
数据类型
INTEGER型
用来指定存储整数的列的数据类型(数字型),不能存储小数
CHAR型
定长字符串, CHARACTER(字符)的缩写,用来指定存储字符串的列的数据类型(字符型)
VARCHAR型
可变长字符串,VARCHAR 型也是用来指定存储字符串的列的数据类型(字符串类型)
DATE型
用来指定存储日期(年月日)的列的数据类型(日期型)
约束的设置
约束是除了数据类型之外,对列中存储的数据进行限制或者追加条件的功能
类型
NOT NULL 约束
给该列设置了不能输入空白
PRIMARY KEY约束
主键(primary key)就是可以特定一行(唯一确定一行)数据的列
DEFAULT约束
用于设定默认值
DROP: 删除数据库和表等对象
删除了的表是无法恢复的,在执行DROP TABLE语句之前务必仔细确认
ALTER: 修改数据库和表等对象的结构
变更表名,各个RDBMS不太相同
DML(Data Manipulation Language,数据操纵语言)
SELECT:查询表中的数据
INSERT:向表中插入新数据
UPDATE:更新表中的数据
DELETE:删除表中的数据
DCL(Data Control Language,数据控制语言)
COMMIT:确认对数据库中的数据进行的变更
ROLLBACK: 取消对数据库中的数据进行的变更
GRANT:赋予用户操作权限
REVOKE:取消用户的操作权限
SQL基本书写规则
QL语句要以分号(;)结尾
SQL语句 不区分关键字的大小写,但表中数据区分
常数的书写方式是固定的
像'abc' 这样,使用单引号(')将字符串括起来,用来标识这是一个字符串
含有日期的时候,同样需要使用单引号将其括起来,如'2010-01-26', ' 年 - 月 - 日 '
书写数字不需要任何符号标识,直接写
查询基础
SELECT语句基础
列的查询
查询表中所有的列
星号(*)代表全部列的意思
为列设定别名
SQL 语句可以使用 AS 关键字为列设定别名
别名可以使用中文,使用中文时需要用双引号(")括起来
常数的查询
SELECT 子句中不仅可以书写列名,还可以书写常数
DISTINCT可以从结果中删除重复行
DISTINCT 关键字只能用在第一个列名之前
WHERE子句
WHERE子句先执行,即选取行之后,再输出列
WHERE子句要紧跟在FROM子句之后
注释的书写方法
书写在“--”之后,只能写在同一行
书写在“/*”和“*/”之间,可以跨多行
算数运算符
四则运算所使用的运算符(+、-、*、/)
SELECT子句中可以使用常数或者表达式
注意NULL,所有包含 NULL 的计算,结果肯定是 NULL
比较运算符
字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小顺序混淆
不能对NULL使用比较运算符
希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符。
逻辑运算符
NOT运算符
AND运算符和OR运算符
AND运算符的优先级高于OR运算符。想要优先执行OR运算符时可以使用括号
聚合与排序
聚合函数(聚集函数)
常见种类
COUNT: 计算表中的记录数(行数)
SELECT COUNT(*)可以计算全部列
COUNT函数的结果根据参数的不同而不同
COUNT(*)会得到包含NULL的数据行数,而COUNT(<列名>)会得到NULL之外的数据行数
MAX:求出表中任意列中数据的最大值
MIN:求出表中任意列中数据的最小值
SUM:计算表中数值列中数据的合计值
AVG:计算表中数值列中数据的平均值
注意事项
聚合函数会将NULL排除在外。但COUNT(*)例外,并不会排除NULL
MAX/MIN函数几乎适用于所有数据类型的列。SUM/AVG函数只适用于数值类型的列
DISTINCT可以用在聚合函数中以去除重复值,例如COUNT(DISTINCT<列名>)
GROUP BY 子句
用于数据分组,通常和聚合函数配合使用
在 GROUP BY 子句中指定的列称为聚合键或者分组列
子句的书写顺序(暂定):1. SELECT → 2. FROM → 3. WHERE → 4. GROUP BY
SELECT 语句的执行顺序(暂定):FROM → WHERE → GROUP BY → SELECT
聚合键中包含NULL时,在结果中会以“不确定”行(空行)的形式表现出来
容易忽略的点
使用聚合函数时,SELECT子句限制使用以下元素
常数(数字或字符串)
聚合函数
GROUP BY子句中指定的列名,即聚合键
在GROUP BY子句中不能使用SELECT子句中定义的别名
GROUP BY子句结果的显示是无序的
只有SELECT子句和HAVING子句(以及ORDER BY子句)中能够使用聚合函数
HAVING子句
用于取出符合条件的组
子句书写顺序(暂定):SELECT → FROM → WHERE → GROUP BY → HAVING
HAVING限制使用以下元素
常数(数字或字符串)
聚合函数
GROUP BY子句中指定的列名,即聚合键
聚合键所所对应的条件更适合在WHERE子句中使用
ORDER BY子句
用以明确指定排列顺序
ORDER BY子句中书写的列名称为排序键
子句的书写顺序:1. SELECT 子句 → 2. FROM 子句 → 3. WHERE 子句 → 4. GROUP BY 子句 →5. HAVING 子句 → 6. ORDER BY 子句
在ORDER BY子句中可以使用SELECT子句中定义的别名,原因在于其执行顺序
ORDER BY子句可以使用的别名和聚合函数并没有什么限制
数据更新
INSERT语句
用来装入数据的SQL
将列名和值用逗号隔开,分别括在()内,这种形式称为清单
基本语法
对表进行全列 INSERT 时,可以省略表名后的列清单
INSERT 语句中想给某一列赋予 NULL 值时,可以直接在 VALUES子句的值清单中写入 NULL
省略INSERT语句中的列名,就会自动设定为该列的默认值(没有默认值时会设定位NULL)
INSERT … SELECT 语句:先建立一张表,再复制数据
INSERT语句的SELECT语句中,可以使用WHERE子句或者GROUP BY子句等任何SQL语法 (但使用ORDER BY子句并不会产生任何效果)
DELETE语句
DROP TABLE 语句可将表完全删除,DELETE 语句会留下表(容器),而删除表中的全部数据
DELETE语句的删除对象并不是表或者列,而是记录(行)
搜索型DELETE
即使用WHERE子句制定删除条件
DELETE语句不能使用GROUP BY,HAVING,和ORDER BY三类子句,原因在于这三类子句都是用来改变抽取数据形式的
UPDATE语句
用以改变表中的数据
使用UPDATE语句可以将值清空为NULL(但只限于未设置NOT NULL约束的列)
搜索型UPDATE
指定更新对象的 UPDATE 语句
事务
事务是需要在同一个处理单元中执行的一系列更新处理的集合
COMMIT
ROLLBACK
事务的ACID特性
原子性(Atomicity)
原子性是指在事务结束时,其中所包含的更新处理要么全部执行,要么完全不执行
一致性(Consistency)
一致性指的是事务中包含的处理要满足数据库提前设置的约束
隔离性(Isolation)
事务结束(COMMIT)之前,对其他事务而言是不可见的
持久性(Durability)
持久性也可以称为耐久性,指的是在事务(不论是提交还是回滚)结束后,DBMS 能够保证该时间点的数据状态会被保存的特性
函数、谓词、CASE表达式
函数
所谓函数,就是输入某一值得到相应输出结果的功能,输入值称为参数,输出值称为返回值
分类
算数函数
字符串函数
日期函数
转换函数
聚合函数
谓词
即返回值为真值的函数
LIKE谓词——字符串的部分一致查询
BETWEEN谓词——范围查询
IS NULL、IS NOT NULL——判断是否为NULL
IN谓词——OR的简便用法
“IN( 值,……)”可用来替换多个OR连用
IN 和 NOT IN 无法选取出 NULL 数据
SQL中最危险的陷阱,NOT IN包含NULL结果通常为空
使用子查询作为IN谓词的参数是区别于其他谓词的唯一特性
因为子查询就是SQL内部生成的表,所以视图也可以作为参数
EXIST谓词
理解起来比较困难
记住两点
只有一个参数,通常指定关联子查询作为EXIST的参数
作为EXIST参数的子查询中经常会使用SELECT *
CASE表达式
无论多么庞大的 CASE 表达式,最后也只会返回类似“1”或者“' 渡边先生 '”这样简单的值
虽然CASE表达式中的ELSE子句可以省略,但还是希望大家不要省略
CASE表达式中的END不能省略
分类
简单CASE表达式
搜索CASE表达式
复杂查询
视图
表中存储的是实际数据,而视图中保存的是从表中取出数据所使用的SELECT语句
从SQL来看视图就是一张表
优点
视图无需保存数据,因此可以节省存储设备的容量
可以将频繁使用的 SELECT 语句保存成视图,减少书写工作量
创建视图
应该避免在视图的基础上创建视图,因为多重视图会降低性能
限制
数据行都是没有顺序的,定义视图时不要使用ORDER BY子句
对视图的更新归根结底是对视图所对应的表进行更新
删除视图
子查询
一言以蔽之,子查询就是一次性视图(SELECT语句)
子查询作为内层查询会首先执行
原则上子查询需要设定名称
类别
标量子查询
标量子查询就是返回单一值的子查询
可以用在 = 或者 <> 上
应用
标量子查询的书写位置并不仅仅局限于 WHERE 子句中,通常任何可以使用单一值的位置都可以使用
注意事项
标量子查询绝对不能返回多行结果
关联子查询
在细分的组内进行比较时,需要使用关联子查询
和GROUP BY一样,关联子查询也是用来对集合进行切分的
需要注意的是,结合条件一定要写在子查询当中