【SQL】以mysql为例系统学习DQL理论知识

1、思维导图-知识体系

一、sql是什么?一种计算机语言,一种操作数据库的结构化查询语言
SQL 是关系型数据库的标准语言,所有的关系型数据库管理系统(RDBMS),比如 MySQL、Oracle、SQL Server
二、数据库是什么?大量数据的集合,按照数据结构来组织、存储和管理数据的仓库
数据库的分类:1、关系型数据库、2、非关系型数据库
1、关系型数据库,存储的格式可以直观地反映实体间的关系。关系型数据库和常见的表格比较相似, 数据以行和列的方式进行存储
2、非关系型数据库(NoSQL):对于非结构化海量的数据的处理更合适,大量的NoSql数据库如MongoDB、Redis;通常以数据集的方式,大量的数据集中存储在一起,类似于键值对、图结构或者文档。

在这里插入图片描述
在这里插入图片描述

2、数据库相关操作-查询

2.1、单一select简单查询

在这里插入图片描述

2.2、复杂数据库查询(重点)

在这里插入图片描述


重点:join操作(mysql的sql为例)
https://blog.csdn.net/qq_45911678/article/details/123682784

2.3、单一select的SQL语句执行过程理解

一个简单sql语句一般包含的关键字以及执行顺序如下图所示:【参考了很多网上说法,大致流程如下】

	(8)SELECT (9)DISTINCT
	
	(1)FROM [left_table]
	(3)<join_type> JOIN <right_table>
	(2)ON <join_condition>
	(4)WHERE <where_condition>
	(5)GROUP BY <group_by_list>
	(6)WITH <CUBE | RollUP>
	(7)HAVING <having_condition>
	
	(10)ORDER BY <order_by_list>
	(11)LIMIT <limit_number>
(1)from我需要知道我从哪个表里获取数据,如果from中包含多个表,则所有表执行笛卡尔积(交叉链接)如下图1所示。形成一个虚拟表1
(2)on这一步需要对虚拟表1 进行筛选,一般就是两个表的连接条件具有一个列,然后列值对应,然后只有那些使<join_condition>为真的行记录才被插入虚拟表2
(3)join要看<join_type>形成保留表:(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)
把保留表中未找到匹配的行将作为外部行添加到 虚拟表2  形成虚拟表3

注:如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,
直到处理完所有的表数据。  

(4)where用一些条件筛选虚拟表3 ,只有使<where_condition>为true的行才被插入 虚拟表4
(5)GROUP BY:按GROUP BY子句中的某一或者多个列的类型对虚拟表4中的行分组,对于同一类型列的其他列需要进行执行count聚合、max函数聚合等  形成虚拟表5

分组:如果是多个列类型进行分组操作,这里把某一列和另一列看成一个整体,例如:把名字和成绩看成一个整体,只要是name相同,grade不同,就不同的类型,也就是两条记录
(6)高级分组/超组:看参考资料
(7)HAVING:对虚拟表5应用HAVING筛选器。HAVING是过滤聚合值,WHERE 关键字无法与聚合函数一起使用;只有使<having_condition>为 true 的组的记录才会被插入虚拟表7


(8)SELECT:处理SELECT列表,就是需要展示虚拟表6的哪几列 形成虚拟表7
并且,group by 操作的字段列必须包含在select后面;
同时,从这一步开始,后面的语句中都可以使用SELECT中的别名。
(9)DISTINCT:(用distinct来返回不重复单字段或者多字段组合的条数)将重复的行从虚拟表7中移除




(10)Order by把查询出来的结果进行一个默认升序asc,降序排列desc,即order by;
如果根据一个列排序,那么按照字母顺序或者数字顺序;如果按照多个列排序,按照顺序,先一列,在此列中在按某中顺序排其他列,保持第一列顺序不变;如图实例2所示

注:order by 生成的不是虚拟表了,而是游标:
这一步是第一步也是唯一 一步可以使用SELECT列表中的列别名的步骤。
这一步不同于其它步骤的 是,它不返回有效的表,而是返回一个游标。
SQL是基于集合理论的。
集合不会预先对它的行排序,它只是成员的逻辑集合,成员的顺序无关紧要。
对表进行排序 的查询可以返回一个对象,包含按特定物理顺序组织的行。
ANSI把这种对象称为游标。

(11)limit做一个限制就行,也就是limit

sql表执行笛卡尔积
在这里插入图片描述

参考资料:

http://ty2y.com/study/sqlyjzhbzxj.html
分组操作理解:
https://www.cnblogs.com/YH-shjd-senvn/p/15890258.html
高级分组(超组(Suppergroups)):
https://www.cnblogs.com/marxist/p/12149863.html
去重distinct
https://blog.csdn.net/shenziheng1/article/details/102536146

重点:join操作(mysql的sql为例)
https://blog.csdn.net/qq_45911678/article/details/123682784

3、扩展:Mysql结构

在这里插入图片描述
在这里插入图片描述

https://blog.csdn.net/weixin_30409927/article/details/109143380
https://blog.csdn.net/ximenjianxue/article/details/120256035
https://blog.csdn.net/weixin_45797834/article/details/125522587

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风吹海洋浪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值