项目代码第8讲【数据库基础知识】:SQL(DDL、DML、DQL、DCL);函数(聚合、字符串、数值、日期、流程);约束;多表查询;事务

黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括_哔哩哔哩_bilibili

一、数据库相关概念

1、主流的关系型数据库都支持SQL语言——SQL语言可以操作所有的关系型数据库

        像MySQL、Oracle Database、Microsoft SQL Server、IBM Db2等主流的关系型数据库系统都支持SQL,并将其作为主要的查询和数据操作语言。这些系统实现了SQL标准的大部分功能,但也添加了各自的扩展和特性。

        基础的SELECT、INSERT、UPDATE、DELETE等操作在大多数情况下是兼容的,但在涉及更复杂的查询或需要利用特定数据库特性的场合时,就需要针对具体数据库调整SQL代码了。【比如二、3、6>分页查询,不同关系型数据库用的不一样】

2、什么是 关系型数据库(RDBMS)?

反之,则称之为“非关系型数据库”。

二、SQL语句的分类——DDL、DML、DQL、DCL

下图中,注意SQL语句不区分大小写,关键字建议使用大写

        当使用引号时,使用单引号。

1、DDL

1>数据库操作

 上图中,“查询当前数据库”是结合“使用”的。“查询当前数据库”——就是看当前处于哪个数据库。

2>表操作——针对表+字段(即列名)

下图中,在对某个数据库进行操作时,要先通过上图的“使用”命令进入该数据库。

 

1》数据类型【略】:数值类型、字符串类型、日期时间类型
2》针对表——添加&修改&删除

下图中,TRUNCATE是只留下了表的结构,里面的数据都没有了

3》针对每个字段——添加&修改&删除

2、DML:对表中内容的增(INSERT)删(DELETE)改(UPDATE)

1>选择MySQL图形化界面

下载DataGrip,其功能比前两种都要强大。

DataGrip的基本操作,见下述链接:

11. 基础-SQL-图形化界面工具DataGrip_哔哩哔哩_bilibili

2>增(INSERT)——插入指定字段/全部字段;批量添加数据

        下图中,引号是单引号。

3>改(UPDATE)

4>删(DELETE)

3、DQL:查询表中内容(SELECT);及其执行顺序!

下图中,讲解分组查询前需要先讲聚合函数

验证上图右边的执行顺序:

先执行FROM:如下图,在FROM后给表加别名,发现其它地方都可以用

WHERE在SELECT之前:如下图,在SELECT后面给e.age取别名eage,想在WHERE后面使用eage却报错。证明WHERE的执行顺序在SELECT之前!

SELECT在ORDER BY之前:如下图,在SELECT后面给e.age取别名eage,可以在ORDER BY后面使用eage。

1>基本查询

2>条件查询(WHERE)

注意区别OR和IN,如下图:

上图中红色字体部分“不能省略!”,解释如下图:

3>聚合函数【讲“分组查询”前得先讲聚合函数】:是作用于某一列的,注意NULL值不参与所有聚合函数运算

比如select count(*) from emp; 答案=16,即一共有16行数据。

然而,如果select count(idcard) from emp; 如果idcard有一行的数据为null,那么答案=15。【NULL值不参与所有聚合函数运算】

4>分组查询(GROUP BY)

上图中,“分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。”

        比如下图的1.,如果加个name字段,是没有任何意义的。只是显示了性别是"女"的第一行数据的女生姓名。如下下图。

5>排序查询(ORDER BY)

6>分页查询(数据库方言,MySQL中是LIMIT)

下图中,“查询记录数”就是“每页显示记录数”

下图中,起始索引=(2-1)*10=10;“查询记录数”就是“每页显示记录数”=10.

        emp表里一共16行数据,所以第二页只显示6行数据。

举例:查询前5个员工

4、DCL:管理数据库 用户、控制数据库的访问 权限

1>管理用户

mysql数据库如下,里面有个user表存储着使用的用户。

举例:

2>权限控制

三、函数

1、聚合函数【见二、3、3>】

2、字符串函数

3、数值函数

4、日期函数

5、流程函数

四、约束:作用于表中字段上的规则,在创建/修改表的时候添加约束

1、概述

2、举例

在上图创建完表后,插入下图的两条数据,不用指定id字段

如下图所示,id字段会自增

3、外键约束:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性

1>外键关联到另一个表中的字段,被引用的列需要保证其值的 唯一性和非空性

这意味着,被引用的列是 主键(Primary Key)唯一约束(Unique Constraint)+ 非空

        唯一约束允许列包含空值(除非在定义约束时明确指定了不允许空值)。因此,在确保非空性的前提下,具有唯一约束的列也可以被外键引用。

在上图中,如果在父表dept中删除了id=1的部门,对子表emp没有任何影响。这违背了数据的一致性和完整性。

创建表后添加外键

现在如果要在父表dept中删除了id=1的部门,那么会报错

2>外键删除更新行为【级联操作等】

1》举例CASCADE

2》举例SET NULL

五、多表查询

1、多表关系:一对多(多对一)、多对多、一对一

3>一对一:多用于单表拆分

拆分上图中的表为两张表,如下图

增加外键,关联两张表。如下图

        注意要设置外键为唯一的。如下下图。

2、多表查询概述:需要消除掉无效的笛卡尔积【常为表取别名:在FROM后面取(因为执行DQL顺序是先执行FROM)】

需要消除掉无效的笛卡尔积,只显示有用的数据

3、多表查询分类:连接查询【内、外(左/右)、自连接】、子查询

1>内连接(隐式、显式):查询两张表交集的部分

2>外连接(左外、右外):谁取名就以谁为主

3>自连接:自己连接自己

举例:

把上图看作下图两张表

4、联合查询(union , union all):把多次查询的结果合并起来,形成一个新的查询结果集

5、子查询(嵌套查询):SQL语句中嵌套SELECT语句

1>标量子查询

2>列子查询

3>行子态询

4>表子查询

六、事务

1、事务:一组操作的集合,它是一个不可分割的工作单位(这些操作要么同时成功,要么同时失败)

2、事务操作

下面左/右两图作用一样的。

在左图中,SELECT @@autocommit;

        如果结果=1,则是自动提交事务;如果结果=0,则是手动提交事务,需要执行commit;

 

3、事务四大特性(ACID):原子性(A)、一致性(C)、隔离性(I)、持久性(D)

持久性:一旦事务提交,数据就会永久地存储在磁盘中,如下图

4、并发事务问题:脏读、不可重复读、幻读

1>脏读

在下图中,事务A要执行3个操作。事务A在第二个操作时把id的值更新了,但是此时事务A还没有提交。事务B却拿到了更新后的id的值。这种情况称为”脏读“。

1》问题分析

这属于典型的“脏读”问题。

如果事务 A 后续回滚(Rollback),那么事务 B 读取到的数据实际上是无效的,导致数据不一致。

2》如何避免

提高事务隔离级别到 READ COMMITTED(读已提交) 或更高。

  • READ COMMITTED:确保事务只能读取已提交的数据,避免脏读。

2>不可重复读

在下图中,事务A要执行4个操作。事务A执行第一个操作时,没有找到id=1。此后,事务B向数据库提交了id=1的更新。然后,事务A的第三个操作就读到了更新后的id数据。这种情况称为”不可重复读“。

1》问题分析

这属于“不可重复读”问题。

事务 A 在同一个事务中对同一条数据的两次查询结果不一致,可能导致业务逻辑错误

2》如何避免

提高事务隔离级别到 REPEATABLE READ(可重复读) 或更高。

  • REPEATABLE READ:在同一事务中,多次读取同一数据时,保证结果一致。即确保事务内多次读取结果一致。
  • 不过,在某些数据库(如 MySQL 的 InnoDB 引擎)中,即使在 REPEATABLE READ 隔离级别下,仍可能出现幻读问题。

3>幻读

在下图中,事务A 执行 id=1(insert)时,由于事务B已经插入了id=1(id是主键),那么这句话就会报错。此时在事务A中再次执行id=1(select),会发现id=1这个主键又在了。

1》问题分析

这属于“幻读”问题。

幻读通常发生在范围查询中(例如 SELECT * FROM table WHERE id > 10),但由于主键冲突的存在,这种现象也可以被归类为幻读的一种表现形式。

2》如何避免

提高事务隔离级别到 SERIALIZABLE(串行化)。

  • SERIALIZABLE:最高隔离级别,完全避免脏读、不可重复读和幻读。
  • 代价是性能下降,因为事务之间会被串行化执行。

5、事务隔离级别——分析原因见4、

下图中,✔代表允许。

        SERIALIZABLE(串行化)隔离级别最高,性能却最差。

举例:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/75991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在阿里云linux主机上部署Node.Js

在阿里云的Linux服务器上搭建Node.js编程环境可以通过以下步骤完成。这里以常见的 Ubuntu/CentOS 系统为例,提供两种安装方式(包管理器、NVM多版本管理): 一、通过包管理器安装(适合快速安装指定版本) 1. …

Python爬虫:开启数据抓取的奇幻之旅(一)

目录 一、爬虫初印象:揭开神秘面纱​ 二、工欲善其事:前期准备​ (一)Python 环境搭建​ 1.下载 Python 安装包:​ 2.运行安装程序:​ 3.配置环境变量(若自动添加失败)&#x…

机器学习——集成学习框架(GBDT、XGBoost、LightGBM、CatBoost)、调参方法

一、集成学习框架 对训练样本较少的结构化数据领域,Boosting算法仍然是常用项 XGBoost、CatBoost和LightGBM都是以决策树为基础的集成学习框架 三个学习框架的发展是:XGBoost是在GBDT的基础上优化而来,CatBoost和LightGBM是在XGBoost的基础上…

第十五章:Python的Pandas库详解及常见用法

在数据分析领域,Python的Pandas库是一个不可或缺的工具。它提供了高效的数据结构和数据分析工具,使得数据处理变得简单而直观。本文将详细介绍Pandas库的基本功能、常见用法,并通过示例代码演示如何使用Pandas进行数据处理。最后,…

【Python桌面应用】PySide6 界面开发完全指南

文章目录 1. 引言2. PySide6 简介与安装2.1 什么是PySide62.2 PySide6 vs. PyQt62.3 安装PySide62.4 开发环境配置建议 3. Qt 设计原理3.1 Qt对象模型3.2 信号与槽机制3.3 Qt坐标系统3.4 Qt样式表(QSS) 4. 创建第一个应用4.1 基本应用结构4.2 主窗口与应用生命周期4.3 使用面向…

用 pytorch 从零开始创建大语言模型(三):编码注意力机制

从零开始创建大语言模型(Python/pytorch )(三):编码注意力机制 3 编码注意力机制3.1 建模长序列的问题3.2 使用注意力机制捕捉数据依赖关系3.3 通过自注意力关注输入的不同部分3.3.1 一个没有可训练权重的简化自注意力…

Spring中的IOC及AOP概述

前言 Spring 框架的两大核心设计思想是 IOC(控制反转) 和 AOP(面向切面编程)。它们共同解决了代码耦合度高、重复逻辑冗余等问题。 IOC(控制反转) 1.核心概念 控制反转(Inversion of Control…

STM32_HAL开发环境搭建【Keil(MDK-ARM)、STM32F1xx_DFP、 ST-Link、STM32CubeMX】

安装Keil(MDK-ARM)【集成开发环境IDE】 我们会在Keil(MDK-ARM)上去编写代码、编译代码、烧写代码、调试代码。 Keil(MDK-ARM)的安装方法: 教学视频的第02分03秒开始看。 安装过程中请修改一下下面两个路径,避免占用C盘空间。 Core就是Keil(MDK-ARM)的…

python 第三方库 - dotenv读取配置文件

.env 文件是一种用于存储环境变量的配置文件,常用于项目的运行环境设置。环境变量是操作系统层面的一些变量,它们可以被应用程序访问和使用,通常包含敏感信息或特定于环境的配置,如数据库连接信息、API 密钥、调试模式等。 安装p…

用python压缩图片大小

下载库 cmd开命令或者PyCharm执行都行 pip install pillow2. 然后就是代码 from PIL import Imagedef compress_image(input_path, output_path, quality85, max_sizeNone):"""压缩图片大小。参数:- input_path: 输入图片路径- output_path: 输出图片路径- qu…

【自用记录】本地关联GitHub以及遇到的问题

最近终于又想起GitHub,想上传代码和项目到仓库里。 由于很早之前有在本地连接过GitHub(但没怎么用),现在需要重新搞起(操作忘得差不多)。 在看教程实操的过程中遇到了一些小问题,遂记录一下。 前…

在一个scss文件中定义变量,在另一个scss文件中使用

_variables.scss文件 : $line-gradient-init-color: linear-gradient(90deg, #8057ff 0%, #936bff 50%, #b892ff 100%); $line-gradient-hover-color: linear-gradient(90deg, #936bff 0%, #b892ff 50%, #f781ce 100%); $line-gradient-active-color: linear-gradient(90deg, …

从零开始研发GPS接收机连载——19、自制GPS接收机的春运之旅

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 从零开始研发GPS接收机连载——19、自制GPS接收机的春运之旅 许久未曾更新这个系列,并非我平日里对这事儿没了兴致,不再愿意折腾。实则是受限于自身条…

智能驾驶功能LCC车道保持居中

画龙现象就是LCC常见bug LDW车道偏离预警 LKA车道保持 声音其实就是蜂鸣器 有些车是40 有些是60

Java全栈面试宝典:线程机制与Spring依赖注入深度解析

目录 一、Java线程核心机制 🔥 问题3:start()与run()的底层执行差异 线程启动流程图解 核心差异对照表 代码验证示例 🔥 问题4:Thread与Runnable的六大维度对比 类关系UML图 最佳实践代码 🔥 问题5&#xff1…

使用ANTLR4解析Yaml,JSON和Latex

文章目录 ANTLR4基本使用**1. 安装 Java 运行时(必需)****2. 安装 ANTLR4 命令行工具****方法一:通过包管理器(推荐)****macOS/Linux (Homebrew)****Windows (Chocolatey)** **方法二:手动安装(…

NixVis 开源轻量级 Nginx 日志分析工具

NixVis NixVis 是一款基于 Go 语言开发的、开源轻量级 Nginx 日志分析工具,专为自部署场景设计。它提供直观的数据可视化和全面的统计分析功能,帮助您实时监控网站流量、访问来源和地理分布等关键指标,无需复杂配置即可快速部署使用。 演示…

黑盒测试的等价类划分法(输入数据划分为有效的等价类和无效的等价类)

重点: 有效等价和单个无效等价各取1个即可 1、正向用例:一条尽可能覆盖多条2、逆向用例:每一条数据,都是一条单独用例。 步骤: 1、明确需求 2、确定有效和无效等价 3、根据有效和无效造数据编写用例 3、适用场景 针对:需要有大量数据测试输入, …

Linux Mem -- 通过reserved-memory缩减内存

目录 1. reserved-memory缩减内存 2. 为什么要通过2段512GB预留内存实现该缩减呢? 3. reserved-momery中的no-map属性 4. 预留的的内存是否会被统计到系统MemTotal中? 本文是解决具体的一些思考总结,和Linux内核的reserved-memory机制相关…

多线程—synchronized原理

上篇文章: 多线程—锁策略https://blog.csdn.net/sniper_fandc/article/details/146508232?fromshareblogdetail&sharetypeblogdetail&sharerId146508232&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 synchronized的锁…