type
status
date
slug
summary
tags
category
icon
password
😀
文章前言: 本文主要介绍数据库系统,这是计算机专业课之一,主要的内容包括以下这些: 1. 关系数据模型 2. 基本SQL语句(包括DDL,DML,DQL,DCL以及多表查询的相关内容)。 3. 关系代数 4. 数据库应用程序开发 5. 数据库理论 6. E-R建模 7. 数据管理(索引结构和索引创建,查询处理和优化,事务管理,并发控制)。 并且会有几十道SQL查询语句的题目,以及一个基础实战项目(只包括基本sql语句的使用)以及一个进阶项目(运用了视图,存储过程,存储函数以及触发器)因为是数据库系统的课程,所以对前端的要求没有那么高,所以项目是基于:MySQL+php进行开发的。

🚀关系数据模型

🐦主键(primary key) 超键(super key) 候选键(candidate key)
超键(super key): 在关系中能唯一标识元组的属性集称为关系模式的超键
候选键(candidate key): 不含有多余属性的超键称为候选键。也就是在候选键中,若再删除属性,就不是键了!
主键(primary key): 用户选作元组标识的一个候选键程序主键
🐖举例:
notion image
超键
在关系中能唯一标识元组的属性集称为关系模式的超键。
于是我们从例子中可以发现 学号是标识学生实体的唯一标识。那么该元组的超键就为学号。
除此之外我们还可以把它跟其他属性组合起来,比如:
(学号,性别)
(学号,年龄)
这样也是超键.
候选键
不含多余属性的超键为候选键。
根据例子可知,学号是一个可以唯一标识元组的唯一标识,因此学号是一个候选键,实际上,候选键是超键的子集,比如 (学号,年龄)是超键,但是它不是候选键。因为它还有了额外的属性。
主键
用户选择的候选键作为该元组的唯一标识,那么它就为主键。
简单的说,例子中的元组的候选键为学号,但是我们选定他作为该元组的唯一标识,那么学号就为主键。
 
 
 

🌰基本SQL语句

说明,基本SQL语句包括DDL,DML,DQL,DCL以及多表查询的相关内容,这和MySQL的基础篇中的内容有重合,所以只写一篇内容,在另外一篇中更加强调函数,约束和事务。 另外,一些特别基本的SQL语句可能会直接给出语法并不会举例子,所以需要由那么一丢丢的基础。

☘️SQL的分类

SQL语句,根据其功能,主要分为以下四类:
notion image

🐉DDL

Data Definition Language,数据定义语言,用来定义数据库对象(数据库,表,字段) 。
DDL语句的语法:
🥑数据库的操作:
🍇表的操作:
🍎表操作的数值类型:
notion image
🍉字符串类型:
notion image
说明:
char 与 varchar 都可以描述字符串,char是定长字符串,指定长度多长,就占用多少个字符,和字段值的长度无关 。而varchar是变长字符串,指定的长度为最大占用长度 。相对来说,char的性能会更高些。
例如:char(10)类型的数据为:“hello”,那么在内容中仍然占用10个char类型的内存大小,如果超过是个字符,那么会进行截断。
🍓日期时间类型:
notion image
📔表操作案例:
设计一张员工信息表,要求如下:
  1. 编号(纯数字)
  1. 员工工号 (字符串类型,长度不超过10位)
  1. 员工姓名(字符串类型,长度不超过10位)
  1. 性别(男/女,存储一个汉字)
  1. 年龄(正常人年龄,不可能存储负数)
  1. 身份证号(二代身份证号均为18位,身份证中有X这样的字符)
  1. 入职时间(取值年月日即可)
📊表字段操作:

🐯DML

介绍:
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。 1. 添加数据(INSERT) 2. 修改数据(UPDATE) 3. 删除数据(DELETE)
 

🐳DQL

介绍:
DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录。 查询关键字: SELECT 在一个正常的业务系统中,查询操作的频次是要远高于增删改的,当我们去访问企业官网、电商网站,在这些网站中我们所看到的数据,实际都是需要从数据库中查询并展示的。而且在查询的过程中,可能还会涉及到条件、排序、分页等操作。
为了演示查询的过程,先准备数据:
🥭基本语法
我们在讲解这部分内容的时候,会将上面的完整语法进行拆分,分为以下几个部分:
  • 基本查询(不带任何条件)
  • 条件查询(WHERE)
  • 聚合函数(count、max、min、avg、sum)
  • 分组查询(group by)
  • 排序查询(order by)
  • 分页查询(limit)
接下来逐个讲解以上的内容。
🍐基础查询
🍊条件查询
条件 常用的比较运算符如下:
notion image
常用的逻辑运算符如下:
notion image
🦜演示案例(只演示需要注意的):
🐘聚合函数
介绍: 将一列数据作为一个整体,进行纵向运算。
常见的聚合函数:
notion image
语法:
案例:
🦌分组查询
语法:
where和having的区别
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。 判断条件不同:where不能对聚合函数进行判断,而having可以。
注意事项: • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。 • 执行顺序: where > 聚合函数 > having 。 • 支持多字段分组, 具体语法为 : group by columnA,columnB
案例:
🐸排序查询
🚧注意事项:
如果是升序, 可以不指定排序方式ASC ; 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 ;
案例:
🐧分页查询
🚧注意事项:
起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
案例:
根据前面的知识,进行下面综合的练习:

🦅执行顺序

这一部分的内容比较重要,因为这涉及到之后取别名的问题,别名不是随便取的,取了不是随便用的。
执行顺序如下:
notion image
到DQL语句的执行顺序为: from ... where ... group by ... having ... select ... order by ... limit ...

🦓DCL

DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。
🍇用户管理
查询结果为:
notion image
其中 Host代表当前用户访问的主机, 如果为localhost, 仅代表只能够在当前本机访问,是不可以远程访问的。 User代表的是访问该数据库的用户名。在MySQL中需要通过Host和User来唯一标识一个用户。
🚧注意事项
1.在MySQL中需要通过用户名@主机名的方式,来唯一标识一个用户。
2.主机名可以使用 % 通配。 3.这类SQL开发人员操作的比较少,主要是DBA( Database Administrator 数据库 管理员)使用。
案例:
🌽权限控制
MySQL中定义了很多种权限,常用的有以下几种:
notion image
上述只是简单罗列了常见的几种权限描述,其他权限描述及含义,可以直接参考官方文档
🚧注意事项
1.多个权限之间,使用逗号分隔。 2.授权时, 数据库名和表名可以使用 * 进行通配,代表所有。
案例:

🍁函数

函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着,这一段程序或代码在MySQL中已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。
🧵字符串函数
MySQL中内置了很多字符串函数,常用的几个如下:
notion image
🔢数值函数
常见的数值函数如下:
notion image
🗓️日期函数
常见的日期函数如下:
notion image
案例:
案例: 查询所有员工的入职天数,并根据入职天数倒序排序。 思路: 入职天数,就是通过当前日期 - 入职日期,所以需要使用datediff函数来完成。
🐌流程函数
流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率。
notion image
MySQL的常见函数我们学习完了,那接下来,我们就来分析一下,在前面讲到的两个函数的案例场景, 思考一下需要用到什么样的函数来实现? 1). 数据库中,存储的是入职日期,如 2000-01-01,如何快速计算出入职天数呢? 答案: datediff 2). 数据库中,存储的是学生的分数值,如98、75,如何快速判定分数的等级呢? 答案: case ... when ...

🌵约束

概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。 目的:保证数据库中数据的正确、有效性和完整性。 分类:
notion image
注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
案例需求: 根据需求,完成表结构的创建。需求如下:
notion image
对应的建表语句为:
在为字段添加约束时,我们只需要在字段之后加上约束的关键字即可,需要关注其语法。我们执行上面的SQL把表结构创建完成,然后接下来,就可以通过一组数据进行测试,从而验证一下,约束是否可以生效。
🔰外键约束
外键:用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。
notion image
左侧的emp表是员工表,里面存储员工的基本信息,包含员工的ID、姓名、年龄、职位、薪资、入职日期、上级主管ID、部门ID,在员工的信息中存储的是部门的ID dept_id,而这个部门的ID是关联的部门表dept的主键id,那emp表的dept_id就是外键,关联的是另一张表的主键。
注意:目前上述两张表,只是在逻辑上存在这样一层关系;在数据库层面,并未建立外键关联, 所以是无法保证数据的一致性和完整性的。
没有数据库外键关联的情况下,是否能够保证一致性和完整性呢,我们来测试一下。
准备数据:
notion image
接下来,我们可以做一个测试,删除id为1的部门信息。
notion image
结果,我们看到删除成功,而删除成功之后,部门表不存在id为1的部门,而在emp表中还有很多的员工,关联的为id为1的部门,此时就出现了数据的不完整性。 而要想解决这个问题就得通过数据库的外键约束
语法:
🐖删除/更新行为
添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行为有以下几种:
notion image
具体语法为:
演示如下:
由于NO ACTION 是默认行为,我们前面语法演示的时候,已经测试过了,就不再演示了,这里我们再演示其他的两种行为:CASCADE、SET NULL。
🐦CASCADE
A. 修改父表id为1的记录,将id修改为6
notion image
我们发现,原来在子表中dept_id值为1的记录,现在也变为6了,这就是cascade级联的效果。
在一般的业务系统中,不会修改一张表的主键值
B. 删除父表id为6的记录
notion image
我们发现,父表的数据删除成功了,但是子表中关联的记录也被级联删除了。
🐙SET NULL
在进行测试之前,我们先需要删除上面建立的外键 fk_emp_dept_id。然后再通过数据脚本,将 emp、dept表的数据恢复了。
接下来,我们删除id为1的数据,看看会发生什么样的现象。
notion image
我们发现父表的记录是可以正常的删除的,父表的数据删除之后,再打开子表 emp,我们发现子表emp的dept_id字段,原来dept_id为1的数据,现在都被置为NULL了
notion image
这就是SET NULL这种删除/更新行为的效果。

🐤多表查询

 

🌮练习

准备数据:
 
相关文章
MySQL-进阶篇爱吃甜食牙不坏
  • Giscus
  • Cusdis
  • Utterance