图解SQL基础知识,小白也能看懂的SQL文章!

文章图片
CSDN|来源https://blog.csdn.net/horses/article/details/104553075【图解SQL基础知识,小白也能看懂的SQL文章!】本文介绍关系数据库的设计思想:在SQL中 , 一切皆关系 。
在计算机龄域有许多伟大的设计理念和思想 , 例如:
在Unix中 , 一切皆文件 。
在面向对象的编程语言中 , 一切皆对象 。
关系数据库同样也有自己的设计思想:在SQL中 , 一切皆关系 。
1
关系模型
关系模型(Relationalmodel)由E.F.Codd博士于1970年提出 , 以集合论中的关系概念为基础;无论是现实世界中的实体对象还是它们之间的联系都使用关系表示 。 我们在数据库系统中看到的关系就是二维表(Table) , 由行(Row)和列(Column)组成 。 因此 , 也可以说关系表是由数据行构成的集合 。

文章图片
关系模型由数据结构、关系操作、完整性约束三部分组成 。
关系模型中的数据结构就是关系表 , 包括基础表、派生表(查询结果)和虚拟表(视图) 。
常用的关系操作包括增加、删除、修改和查询(CRUD) , 使用的就是SQL语言 。 其中查询操作最为复杂 , 包括选择(Selection)、投影(Projection)、并集(Union)、交集(Intersection)、差集(Exception)以及笛卡儿积(Cartesianproduct)等 。
完整性约束用于维护数据的完整性或者满足业务约束的需求 , 包括实体完整性(主键约束)、参照完整性(外键约束)以及用户定义的完整性(非空约束、唯一约束、检查约束和默认值) 。
我们今天的主题是关系操作语言 , 也就是SQL 。
2
面向集合
SQL(结构化查询语言)是操作关系数据库的标准语言 。 SQL非常接近英语 , 使用起来非常简单 。 它在设计之初就考虑了非技术人员的使用需求 , 我们通常只需说明想要的结果(What) , 而将数据处理的过程(How)交给数据库管理系统 。 所以说 , SQL才是真正给人用的编程语言!接下来我们具体分析一下关系的各种操作语句;目的是为了让大家能够了解SQL是一种面向集合的编程语言 , 它的操作对象是集合 , 操作的结果也是集合 。
在关系数据库中 , 关系、表、集合三者通常表示相同的概念 。3
SELECT
下面是一个简单的查询语句:
SELECTemployee_id,first_name,last_name,hire_dateFROMemployees;它的作用就是从employees表中查询员工信息 。
显然 , 我们都知道FROM之后是一个表(关系、集合) 。 不仅如此 , 整个查询语句的结果也是一个表 。 所以 , 我们可以将上面的查询作为表使用:
SELECT*FROM(SELECTemployee_id,first_name,last_name,hire_dateFROMemployees)t;括号内的查询语句被称为派生表 , 我们给它指定了一个别名叫做t 。 同样 , 整个查询结果也是一个表;这就意味着我们可以继续嵌套 , 虽然这么做很无聊 。
我们再看一个PostgreSQL中的示例:
--PostgreSQLSELECT*FROMupper('sql');|upper||-------||SQL|upper是一个大写转换的函数 。 它出现再FROM子句中 , 意味着它的结果也是一个表 , 只不过是1行1列的特殊表 。
SELECT子句用于指定需要查询的字段 , 可以包含表达式、函数值等 。 SELECT在关系操作中被称为投影(Projection) , 看下面的示意图应该就比较好理解了 。

文章图片
除了SELECT之外 , 还有一些常用的SQL子句 。
WHERE用于指定数据过滤的条件 , 在关系运算中被称为选择(Selection) , 示意图如下:

文章图片
ORDERBY用于对查询的结果进行排序 , 示意图如下:

文章图片
总之 , SQL可以完成各种数据操作 , 例如过滤、分组、排序、限定数量等;所有这些操作的对象都是关系表 , 结果也是关系表 。

文章图片
在这些关系操作中 , 有一个比较特殊 , 就是分组 。
4
GROUPBY
分组(GROUPBY)操作和其他的关系操作不同 , 因为它改变了关系的结构 。 来看下面的示例:
SELECTdepartment_id,count(*),first_nameFROMemployeesGROUPBYdepartment_id;该语句的目的是按照部门统计员工的数量 , 但是存在一个语法错误 , 就是first_name不能出现在查询列表中 。 原因在于按照部门进行分组的话 , 每个部门包含多个员工;无法确定需要显示哪个员工的姓名 , 这是一个逻辑上的错误 。
所以说 , GROUPBY改变了集合元素(数据行)的结构 , 创建了一个全新的关系 。 分组操作的示意图如下:

文章图片
尽管如此 , GROUPBY的结果仍然是一个集合 。
5
UNION
SQL面向集合特性最明显的体现就是UNION(并集运算)、INTERSECT(交集运算)和EXCEPT/MINUS(差集运算) 。 这些集合运算符的作用都是将两个集合并成一个集合 , 因此需要满足以下条件:
两边的集合中字段的数量和顺序必须相同;
两边的集合中对应字段的类型必须匹配或兼容 。
具体来说 , UNION和UNIONALL用于计算两个集合的并集 , 返回出现在第一个查询结果或者第二个查询结果中的数据 。
它们的区别在于UNION排除了结果中的重复数据 , UNIONALL保留了重复数据 。 下面是UNION操作的示意图:

文章图片
INTERSECT操作符用于返回两个集合中的共同部分 , 即同时出现在第一个查询结果和第二个查询结果中的数据 , 并且排除了结果中的重复数据 。 INTERSECT运算的示意图如下:

文章图片
EXCEPT或者MINUS操作符用于返回两个集合的差集 , 即出现在第一个查询结果中 , 但不在第二个查询结果中的记录 , 并且排除了结果中的重复数据 。 EXCEPT运算符的示意图如下:

文章图片
除此之外 , DISTINCT运算符用于消除重复数据 , 也就是排除集合中的重复元素 。
SQL中的关系概念来自数学中的集合理论 , 因此UNION、INTERSECT和EXCEPT分别来自集合论中的并集(∪cup∪)、交集(∩cap∩)和差集(?setminus?)运算 。
需要注意的是 , 集合理论中的集合不允许存在重复的数据 , 但是SQL允许 。 因此 , SQL中的集合也被称为多重集合(multiset);多重集合与集合理论中的集合都是无序的 , 但是SQL可以通过ORDERBY子句对查询结果进行排序 。
6
JOIN
在SQL中 , 不仅实体对象存储在关系表中 , 对象之间的联系也存储在关系表中 。 因此 , 当我们想要获取这些相关的数据时 , 需要使用到另一个操作:连接查询(JOIN) 。
常见的SQL连接查类型包括内连接、外连接、交叉连接等 。 其中 , 外连接又可以分为左外连接、右外连接以及全外连接 。
内连接(InnerJoin)返回两个表中满足连接条件的数据 , 内连接的原理如下图所示:

文章图片
左外连接(LeftOuterJoin)返回左表中所有的数据;对于右表 , 返回满足连接条件的数据;如果没有就返回空值 。 左外连接的原理如下图所示:

文章图片
右外连接(RightOuterJoin)返回右表中所有的数据;对于左表 , 返回满足连接条件的数据 , 如果没有就返回空值 。 右外连接与左外连接可以互换 , 以下两者等价:
t1RIGHTJOINt2t2LEFTJOINt1全外连接(FullOuterJoin)等价于左外连接加上右外连接 , 同时返回左表和右表中所有的数据;对于两个表中不满足连接条件的数据返回空值 。 全外连接的原理如下图所示:

文章图片
交叉连接也称为笛卡尔积(CartesianProduct) 。 两个表的交叉连接相当于一个表的所有行和另一个表的所有行两两组合 , 结果的数量为两个表的行数相乘 。 交叉连接的原理如下图所示:

文章图片
其他类型的连接还有半连接(SEMIJOIN)、反连接(ANTIJOIN) 。集合操作将两个集合合并成一个更大或更小的集合;连接查询将两个集合转换成一个更大或更小的集合 , 同时获得了一个更大的元素(更多的列) 。 很多时候集合操作都可以通过连接查询来实现 , 例如:
SELECTdepartment_idFROMdepartmentsUNIONSELECTdepartment_idFROMemployees;等价于:
SELECTCOALESCE(d.department_id,e.department_id)FROMdepartmentsdFULLJOINemployeeseON(e.department_id=d.department_id);我们已经介绍了许多查询的示例 , 接下来看看其他的数据操作 。
7
DML表示数据操作语言 , 也就是插入、更新和删除 。 以下是一个插入语句示例:
CREATETABLEtest(idint);--MySQL、SQLServer等INSERTINTOtest(id)VALUES(1),(2),(3);--OracleINSERTINTOtest(id)(SELECT1ASidFROMDUALUNIONALLSELECT2FROMDUALUNIONALLSELECT3FROMDUAL);我们通过一个INSERT语句插入了3条记录 , 或者说是插入了一个包含3条记录的关系表 。 因为 , UNIONALL返回的是一个关系表 。 VALUES同样是指定了一个关系表 , 在SQLServer和PostgreSQL中支持以下语句:
SELECT*FROM(VALUES(1),(2),(3))test(id);前面我们已经说过 , FROM之后是一个关系表 , 所以这里的VALUES也是一样 。 由于我们经常插入单条记录 , 并没有意识到实际上是以表为单位进行操作 。
同样 , UPDATE和DELETE语句也都是以关系表为单位的操作;只不过我们习惯了说更新一行数据或者删除几条记录 。
推荐阅读
- 胆囊结石|【图解】胆结石的危害:位置和大小的影响
- 哲学|从2020到2021,由哲学说起
- 爱卡汽车|外观更时尚 新款现代 Kona EV 官图解析
- TDSQL|腾讯云携手神州信息推联合方案 加速银行核心实现自主安全可控
- 大国经彩|图解:中国外贸为何能够打出“翻身仗”?
- 中国|图解:中国外贸为何能够打出“翻身仗”?
- 拼多多财报图解:单季GMV约4383亿 同比增长76%
- 昔日王者今回归 HUMMER EV新车图解
- 原神|原神:渊月螺旋9-12地脉异常和怪物配置,附基础知识和对策
- 时尚又漂亮!日本编织杂志女士秋冬季花样,全部高清图解
