导图社区 SQL学习总结
详细SQL基础知识点,介绍详细,描述全面,希望对感兴趣的小伙伴有所帮助!
编辑于2023-12-08 18:22:06SQL概念基础
关系数据库
数据库(DB):计算机加工而成的数据集合。由行(记录)和列(字段)组成的二维表管理数据。一个单元格只能输入一个数据。数据库中有多个表组成,以行为单位进行数据读写操作。 数据库管理系统:(DBMS):管理数据库的计算机系统。
关系型数据库:用二维表的形式表示数据关系的数据库。
关系数据库的规范化
第一范式:消除重复字段,各字段为最小逻辑单元
第二范式:要求实体属性完全依赖主关键字
第三范式:要求不存在非关键字列对任意候选关键子列传递函数依赖
SQL
用于操作数据库的语言
DDL:用于定义数据库对象(数据库、表、字段等)。 常见指令:create、drop、alter、
DML:用来查询或变更表记录。 常见指令:select、insert、update、delete
DCL:确认数据变更、也就是事务控制。 常见指令:grant、revoke
DQL:根据需要对数据进行相应的查询。 常见指令:select
DTL:确认或取消对数据的变更,也就是事务提交和回滚 常见指令:commit、rollback
常见数据类型
char:定长字符串
vchar:变长字符串
int:整型
date型:指定数据为日期型
约束
对数据进行限制或者追加条件
非空约束:not null
主键约束:primary key
唯一约束:unique
默认值约束:default
检查约束:check
外键约束:foreign key
运算符
算数运算符: +、-、*、/
比较运算符
=:等于
>=
<=
>
<
<>:不等于
逻辑运算符: not、and、or
and的优先级比or高,有需要的情况可通过括号()强化处理
和null进行算数运算的值都为null, 不能用null进行比较运算, 逻辑运算符和null会产生三值逻辑
函数
算数函数
加(+)减(-)乘(*)除(/)四则运算
abs(数值): 计算绝对值的函数
mod(被除数,除数): 求余函数,SQL Server不支持
round函数(对象数值,保留小数的位数) 四舍五入函数

字符串函数
字符串1||字符串2: 字符串拼接函数进行字符串拼接时,如果其中包含 NULL,那么得到的结果也是 NULL。这是因为“||”也是变了形的函数。 ||在SQL Server和MySQL中无法使用

length(字符串): 计算字符串字符数量,计算字符串长度 SQL Server无法使用length,SQL Server使用len()

lower(字符串): 只能针对英文式字符串,将字符串全部转为小写
upper(字符串): 只能针对英文式字符串,将字符串全部转为大写
replace(对象字符串,替换前字符串,替换后字符串): 将一个字符串的一部分替换为其他字符串。

substring(对象字符串 from 截取起始位置 for 截取字符数): 字符串的截取。 只有PostgreSQL、MySQL支持,其他数据库见注释

日期函数
current_date: 返回SQL执行的日期,如: slect current_date PostgreSQL、MySQL支持
current_time: 返回SQL执行的时间。 PostgreSQL、MySQL支持
current_timestamp: 获取当前的日期和时间 SQL Server、PostgreSQL、MySQL支持,其他见注释:

extract(日期元素 from 日期): 截取日期元素,如:”年“、”小时“等。 返回的是数值类型 PostgreSQL、MySQL支持
转换函数
数据类型转换
cast(转换前的值 as 想要转换的数据类型):
值的转换
coalesce(数据1,数据2,...)
聚合函数
谓词
like
betwwen
is null
is not null
in: 无法选取出 NULL 数据。
not in: 无法选取出 NULL 数据。
exist
子主题
SQL查询
基础select
基础查询: select 列1,列2,...from 表
为列设置别名: select 列1 as 别名 from 表
从结果中删除重复行/记录(distinct): select distinct 列 from 表
聚合查询
select 聚合函数(列)from 表
聚合函数
count:计算行数(记录数) count(*)会记录所有行,包括null所在行 count(列)会排除null
sum:计算数据合计值
avg:计算数据平均值
max:计算最大值
min:计算最小值
使用聚合函数删除重复值
select 聚合函数(distinct 列)from 表
分组查询
select 列1,列2,...from 表 group by 需要分组的列(可一列可多列);
书写顺序: select->from->where->group by 执行顺序: from->where->group by->select
常见错误:
把聚合键之外的列名书写在 SELECT 子 句之中

在GROUP BY子句中写了列的别名

GROUP BY子句的结果不能排序
通常 SELECT 语句的执行结果的显示顺序都是随机的,因此想要按 照某种特定顺序进行排序的话,需要在 SELECT 语句中进行指定。
在WHERE子句中使用聚合函数

having子句:为聚合结果指定条件
select 列1,列2,...from 表 group by 需要分组的列(可一列可多列) having 条件
order by子句:为查询结果排序
执行顺序: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY 所以order by子句可以使用别名
asc关键字:升序
desc关键字:降序
当指定多个排序键时,规则是优先使用左侧的键(默认升序) order by通常写在select语句末尾
数据更新
数据插入
insert into 表 (列1,列2,...)values(值1,值2,...);
数据删除
drop table语句:可以将表完全删除
delete:会留下表(容器),而删除表的全部数据 语法:delete from 表 where 条件;
delete的对象是行(记录)而不是列,因此指定列名是错误的 delete * from 表;也是错误的
数据更新
update 表 set 列1 = 表达式, set 列2 = 表达式 where 条件;
使用null进行更新(null清空),只需将赋值表达式右边的值写为null即可
事务: 需要在同一个处理单元中执行的一系列更 新处理的集合。

commit:提交处理
rollback:取消处理
ACID特性: 原子性、持久性、一致性(完整性)、隔离性
区分各个事务: 1 每条SQL语句就是一个事务(自动提交模式) 2 直到用户执行commit或者rollback算一个事务
复杂查询
视图
优点: 1、由于视图无需保存数据,因此可以节省存储设备的容量。视图本身会保存在储存介质(硬盘)中。 2、可以将频繁使用的 SELECT 语句保存成视图,这样就不用每次都重新书写了。
语法: create view 视图名称(试图列1,视图列2,...) as select语句

删除视图: drop view 视图名

视图就是保存好的select语句,定义视图时,可以使用任何select语句 多重视图(通过视图创建视图)会降低SQL性能 定义视图不能排序(使用order by子句),因为视图和表一样,数据行没有顺序 无法直接对视图进行更新

子查询
另一种用来定义视图的select语句,直接写在from子句中

在前面注释中的子查询代码中,其中结尾的 productSum 就是子查询的名字 但由于该名称是一次性的,因此不会像视图那样保存在存储介质(硬盘)之中, 而是在 SELECT 语句执行之后就消失了。
标量子查询
必须返回一个值(单一值)的子查询。
使用场景: 在where子句需要使用聚合函数可以采用

能够使用常数或者列名的地方,无论是 SELECT 子句、GROUP BY 子句、HAVING 子句,还是ORDER BY 子句,几乎所有的地方都可以使用。 不能返回多行结果

关联子查询
适用于标量子查询不能返回多个结果的应用场景
在标量子查询子句中加入 where 别名1.列=别名2.列
 这里起到关键作用的就是在子查询中添加的 WHERE 子句的条件。该条 件的意思就是,在同一商品种类中对各商品的销售单价和平均单价进行比较。
关联子查询也可以对集合切分
关联名称(别名)
作用域
子查询内部设定的关联名称,只能在该子查询内部使用 where 别名1.列=别名2.列一定要写在子查询中
其它知识点
集合运算
SQL高级处理