当前位置: 首页 > news >正文

MySql的基础讲解

一、初识MySql

数据库:按照数据结构来组织、存储和管理数据的仓库;是一个长期存储在计算机内的、有组织的、可共享 的、统一管理的大量数据的集合;

OLTP:联机事务处理,主要是对数据库的增删改查。 OLTP 主要用来记录某类业务事件的发生,数据会以增删改的方式在数据库中进行数据的更新处理 操作,要求实时性高、稳定性强、确保数据及时更新成功;

OLAP:联机分析处理,主要是对数据库的查询。 当数据积累到一定的程度,我们需要对过去发生的事情做一个总结分析时,就需要把过去一段时间内产生的数据拿出来进行统计分析,从中获取我们想要的信息。

二、SQL语句

        定义:结构化查询语言(Structured Query Language) 简称 SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。SQL 是关系数据库 系统的标准语言。 关系型数据库包括:MySQL, SQL Server, Oracle, Sybase, postgreSQL 以及 MS Access等; SQL 命令包括:DQLDMLDDLDCL以及TCL

DQL:数据查询语言,只包含select :从一个或者多个表中检索特定的记录;

DML:数据操作语言:包含 insert :插入记录; update :更新记录; delete :删除记录;

DDL:数据定义语言:包含 create :创建一个新的表、表的视图、或者在数据库中的对象; alter :修改现有的数据库对象,例如修改表的属性或者字段; drop :删除表、数据库对象或者视图;

DCL:数据控制语言:包含 grant :授予用户权限; revoke :收回用户权限;

TCL:事务控制语言:包含 commit :事务提交; rollback :事务回滚;

三、数据库术语

数据库:数据库是一些关联表的集合;

数据表:表是数据的矩阵;

:一列包含相同类型的数据;

:记录的是一组相关数据;

主键:主键是唯一的,一个数据表只能包含一个主键;

外键:外键用来关联两个表,来保证参照完整性;MyISAM 存储引擎本身并不支持外键,只起到注释作用;而 innoDB 完整支持外键;

复合键:或称组合键,将多个列作为一个索引键;

索引:用于快速访问数据表的数据,索引是对表中的一列或者多列的值进行排序的一种结构;

四、MySql的体系结构

其中包含连接池组件、管理服务和工具组件、SQL 接口组件、查询分析器组件、优化器组件、缓冲组件、插件式存储引擎、物理文件等。

MySql内部连接池:管理缓冲用户连接、用户名、密码、权限校验、线程处理等需要缓存的需求。需要注意的是,它并未使用Reactor模型而是采用了IO多路复用的select + 阻塞的IO。并且他的命令处理是多线程并发处理的;

管理服务和工具组件:系统管理和控制工具,例如备份恢复、MySQL 复制、集群等;

SQL 接口组件:将 SQL 语句解析生成相应对象;DML,DDL,存储过程,视图,触发器等;

查询分析器组件:将 SQL 对象交由解析器验证和解析,并生成语法树;

优化器组件:SQL 语句执行前使用查询优化器进行优化;

缓冲组件:当数据库进行读取页的操作的时候,他会将磁盘中读取到的页,存放到内存中,这样当下次再读取相同的页,首先会检查内存中有没有这个页,如果没有再重新读取。但是由于并未提升很大的效率,后面8.0版本已经删除。

五、数据库设计的三范式

        为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库, 必须满足一定的范式。因此三范式是为了减少空间占用。

范式一:确保每列保持原子性,数据库表中的所有字段都是不可分解的原子值;

范式二:满足范式一的基础上,确保表中的每列都和主键完全依赖,而不能只与主键的某一部分依赖(组合索引);

范式三:满足范式二的基础上,确保每列都和主键直接相关,而不是间接相关;减少数据冗余;

但是对于特殊情况下,没有必要做三范式,可能会导致数据库业务涉及的表变多,并且造成更多的联表查询,将导致整个系统的性能降低;因此基于性能考虑,可能需要进行反范式设计;

六、具体命令

1、五大约束:

not null:非空约束

auto_increment:自增约束

unique:唯一约束

primary:主键约束,非空且唯一

foreig:外键约束

2、删除数据:

drop(DDL):速度快,删除整张表结构和表数据,包括索引,约束,触发器等。但是删除后不能回滚,会进行释放空间。

truncate(DDL):速度比较快,会删除表数据,其他字段会保留(自增字段置为1),但是也不能回滚,会释放空间,以页单位进行删除。

delete(DML):速度慢,删除部分字段或者全部字段,其他保留,他是一个条件删除,可以进行回滚,是标记删除(实际并未删除),可以进行逐行删除。

3、去重:

我们可以根据具体的命令进行去重,操作包括:group by column,select distinct column。

4、条件判断:

首先条件判断有where,group by ... having , ... join ... on ...。这三种都可以。

# 创建数据库
CREATE DATABASE `数据库名` DEFAULT CHARACTER SET utf8; # 字符集设置为 utf8# 删除数据库
DROP DATABASE `数据库名`;# 选择数据库
USE `数据库名`;# 创建表
CREATE TABLE `table_name` (column_name column_type);CREATE TABLE IF NOT EXISTS `0voice_tbl` (`id` INT UNSIGNED AUTO_INCREMENT COMMENT '编号',`course` VARCHAR(100) NOT NULL COMMENT '课程',`teacher` VARCHAR(40) NOT NULL COMMENT '讲师',`price` DECIMAL(8,2) NOT NULL COMMENT '价格',PRIMARY KEY ( `id` ), ## not null unique
)ENGINE=innoDB DEFAULT CHARSET=utf8 COMMENT = '课程表';# 删除表
DROP TABLE `table_name`; # 把数据和表都删除# 清空数据列
TRUNCATE TABLE `table_name`; -- 截断表 以页为单位(至少有两行数据),有自增索引的话,从初始值开始累加
DELETE TABLE `table_name`; -- 逐行删除,有自增索引的话,从之前值继续累加# 增
INSERT INTO `table_name`(`field1`, `field2`, ..., `fieldn`) VALUES (value1,value2, ..., valuen);
INSERT INTO `0voice_tbl` (`course`, `teacher`, `price`) VALUES ('C/C++Linux服务器开发/高级架构师', 'Mark', 7580.0);# 删
DELETE FROM `table_name` [WHERE Clause];
DELETE FROM `0voice_tbl` WHERE id = 3;# 改
UPDATE table_name SET field1=new_value1, field2=new_value2 [, fieldn=new_valuen]
UPDATE `0voice_tbl` SET `teacher` = 'Mark' WHERE id = 2;
-- 累加
UPDATE `0Voice_tbl` set `age` = `age` + 1 WHERE id = 2;# 查
SELECT field1, field2,...fieldN FROM table_name [WHERE Clause]

七、高级查询

1、分组聚合

sum():计算某列的总和

avg():计算某列的平均值

max():计算某列的最大值

min():计算某列的最小值

count():计算某列的行数

-- 分组加group_concat
SELECT `gender`, group_concat(`age`) as ages FROM `student` GROUP BY `gender`;
-- 可以把查询出来的结果根据某个条件来分组显示
SELECT `gender` FROM `student` GROUP BY `gender`;
-- 分组加聚合
SELECT `gender`, count(*) as num FROM `student` GROUP BY `gender`;
-- 分组加条件
SELECT `gender`, count(*) as num FROM `student` GROUP BY `gender` HAVING num > 6;

2、联表查询

INNER JOIN:只取两张表有对应关系的记录。

SELECTcid
FROM`course`
INNER JOIN `teacher` ON course.teacher_id = teacher.tid;

LEFT JOIN:在内连接的基础上保留左表没有对应关系的记录。

SELECTcourse.cid
FROM`course`
LEFT JOIN `teacher` ON course.teacher_id = teacher.tid;

REIGHT JOIN:

SELECTcourse.cid
FROM`course`
RIGHT JOIN `teacher` ON course.teacher_id = teacher.tid;

3、子查询

IN 关键字:运算符可以检测结果集中是否存在某个特定的值,如果检测成功就执行外部的查询。

EXISTS 关键字:内层查询语句不返回查询的记录。而是返回一个真假值。如果内层查询语句查询 到满足条件的记录,就返回一个真值( true ),否则,将返回一个假值( false )。当返回的值 为 true 时,外层查询语句将进行查询;当返回的为 false 时,外层查询语句不进行查询或者查 询不出任何记录。

ALL 关键字:表示满足所有条件。使用 ALL 关键字时,只有满足内层查询语句返回的所有结果,才 可以执行外层查询语句。

ANY 关键字:允许创建一个表达式,对子查询的返回值列表,进行比较,只要满足内层子查询中 的,任意一个比较条件,就返回一个结果作为外层查询条件。

在 FROM 子句中使用子查询:子查询出现在 from 子句中,这种情况下将子查询当做一个临时表 使用。

select * from student where class_id in (select cid from course where teacher_id= 2);
select * from student where exists(select cid from course where cid = 5);
SELECTstudent_id,sname
FROM(SELECT * FROM score WHERE course_id = 1 OR course_id = 2) AS A
LEFT JOIN student ON A.student_id = student.sid;

八、视图和触发器

1、视图

        定义:视图( view )是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。其内容由查询定义。 基表:用来创建视图的表叫做基表; 通过视图,可以展现基表的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成;

简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。

安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。

数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

CREATE VIEW view_test1 AS SELECT
A.student_id
FROM(SELECTstudent_id,num    FROMscoreWHEREcourse_id = 1) AS A 
LEFT JOIN (SELECTstudent_id,numFROMscoreWHEREcourse_id = 2) AS B 
ON A.student_id = B.student_id
WHEREA.num >
IF (isnull(B.num), 0, B.num);

作用:可复用,减少重复语句书写;类似程序中函数的作用; 重构利器 假如因为某种需求,需要将 user 拆成表 usera 和表 userb;如果应用程序使用 sql 语句: select * from user 那就会提示该表不存在;若此时创建视图 create view user as select a.name,a.age,b.sex from usera as a, userb as b where a.name=b.name; ,则只需要更改数据库结构,而不需要更改应用程序; 逻辑更清晰,屏蔽查询细节,关注数据返回; 权限控制,某些表对用户屏蔽,但是可以给该用户通过视图来对该表操作; 

2、触发器

        定义:触发器(trigger)是 MySQL 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比 如当对一个表进行 DML 操作( insert , delete , update )时就会激活它执行。

监视对象: table

监视事件: insert 、 update 、 delete

触发时间: before , after

触发事件: insert 、 update 、 delete

CREATE TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW[trigger_order]
trigger_body -- 此处写执行语句
-- mysql c/c++ function udf 动态库
-- trigger_body: 可以一个语句,也可以是多个语句;多个语句写在 BEGIN ... END 间
-- trigger_time: { BEFORE | AFTER }
-- trigger_event: { INSERT | UPDATE | DELETE }
-- trigger_order: { FOLLOWS | PRECEDES } other_trigger_name

 NEW和OLD:在 INSERT 型触发器中, NEW 用来表示将要( BEFORE )或已经( AFTER )插入的新数据; 在 DELETE 型触发器中, OLD 用来表示将要或已经被删除的原数据;在 UPDATE 型触发器中, OLD 用来表示将要或已经被修改的原数据, NEW 用来表示将要或已经修 改为的新数据;

NEW.columnName (columnName为相应数据表某一列名)
OLD.columnName (columnName为相应数据表某一列名)

感谢大家的收看!0voice · GitHub

相关文章:

MySql的基础讲解

一、初识MySql 数据库:按照数据结构来组织、存储和管理数据的仓库;是一个长期存储在计算机内的、有组织的、可共享 的、统一管理的大量数据的集合; OLTP:联机事务处理,主要是对数据库的增删改查。 OLTP 主要用来记录…...

类型转换等 面试真题

题目1 请问哪个结果为NaN A. 123null B. 123‘1’ C. 123/0 D. 123undefined 在这四个表达式中,只有D. 123 undefined 的结果是 NaN,原因如下: A. 123 null 结果是:123原因:null 在数值运算中会被自动转换为 0&a…...

MySQL下载安装

MySQL下载安装 MySQL :: MySQL Community Downloads MySQL :: Download MySQL Installer 安装步骤1 一路向前即可。 我只安装Server,不清楚的建议选择Full ​ 安装步骤2 如果是正式运行的服务器,可以选择Server Computer...

golang实现正向代理http_proxy和https_proxy

package mainimport ("bytes""fmt""io""log""net""net/url""strings" )func main() {// tcp 连接,监听 8080 端口l, err := net.Listen("tcp", ":8080")if err != nil {log.Panic…...

数字IC设计\FPGA 职位经典笔试面试--整理

注: 资料都是基于网上一些博客分享和自己学习整理而成的 1:什么是同步逻辑和异步逻辑? 同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。 同步时序 逻辑电路的特点:各触发器的时钟端全部连接在一…...

Golang协程泄漏定位和排查

Golang协程泄漏定位和排查 1 场景:无缓冲channel写阻塞2 排查和定位思路2.1 Golang pprof2.2 协程数监控2.3 操作系统内存泄漏 参考 1 场景:无缓冲channel写阻塞 package mainimport ("log""net/http"_ "net/http/pprof"…...

【我的 PWN 学习手札】Unlink Attack

目录 前言 一、Unlink介绍 二、保护和限制 (1)FD->bk P AND BK->fd P (2)chunksize(P) prev_size(next_chunk(P)) (3)largebin chunk 三、适用场景 四、利用与绕过 (1&#…...

算法笔试-编程练习-好题-04

题目:堆盒子 礼盒大小不同,我们玩堆盒子的游戏,怎么堆盒子使得堆出的高度最高,每个礼盒的大小由长、宽、高表示,堆盒子的时候要求下面的盒子长、宽、高都必须大于上面的盒子,不包含等于。高度为堆出的礼盒的所有高度的…...

使用Rustup快速无缝升级Rust

rust update 升级 Rustup 是 Rust 官方的跨平台 Rust 安装工具。我们可以使用rustup升级rust版本 rustup updaterustup is not installed at ‘E:\cargo’ 意思是说’E:\argo’未安装rustup 将原来C:\Users\用户名\.cargo\bin下的文件复制到新的E:\cargo\bin $ rustup upda…...

pytorch qwen2-vl自定义数据全量微调

参考:https://github.com/zhangfaen/finetune-Qwen2-VL/tree/main 测试情况: 2B显存训练也很高,4090卡训练的 下载代码: git clone https://github.com/zhangfaen/finetune-Qwen2-VLtransformers包: 安装特定包,对qwen2vl支持 pip install git+https://github.com/hugg…...

切换淘宝最新npm镜像源是

切换淘宝最新npm镜像源是一个相对简单的过程,但首先需要明确当前淘宝npm镜像源的状态和最新的镜像地址。由于网络环境和服务更新,镜像源的具体地址可能会发生变化,因此,我将基于当前可获取的信息,提供一个通用的切换步…...

全国历年高考真题2008-2024

目录 分享链接: ⬇️⬇️⬇️ 点击下载...

【vue-media-upload】一个好用的上传图片的组件,注意事项

一、问题 media 的saved 数组中的图片使用的是location 相对路径&#xff0c;但是我的业务需要直接根据图片链接展示图片&#xff0c;而且用的也不是location 相关源代码 <div v-for"(image, index) in savedMedia" :key"index" class"mu-image-…...

linux第一课(操作系统核心)

一.关于linux (1)linux是一款开源的操作系统(是多用户&#xff0c;多任务&#xff0c;多线程)。 (2)一般所说的linux指的是linux核心&#xff0c;即对计算机硬件资源负责调度管理&#xff0c;主要职责是进程管理&#xff0c;内存管理文件系统&#xff0c;设备驱动&#xff0c…...

【期末复习】软件项目管理

前言&#xff1a; 关于软件项目管理这一科目的重要期末考点&#xff0c;希望对你有帮助。 目录 质量管理可能遇到的问题 软件项目质量管理 软件项目风险管理 进度 题1 题2 题3 成本 题1 题2 题3 质量管理可能遇到的问题 (1)没有制定质量管理计划&#xff1a; (2)…...

C# List定义和常用方法

栏目总目录 List的定义 列表&#xff08;List&#xff09;是一种常用的集合类型&#xff0c;它属于System.Collections.Generic命名空间。列表是一个有序集合&#xff0c;可以包含重复的元素&#xff0c;并且可以根据索引访问元素。 List< T > List<T> 是一个泛…...

如何在实际应用中更好地利用字典功能提高开发效率?

在当今数字化浪潮汹涌澎湃、技术迭代日新月异的时代&#xff0c;企业和开发者们犹如在信息的海洋中航行&#xff0c;迫切需要高效便捷的开发工具来指引方向、加速前行。开发工具的优劣直接关系到项目的进度、质量以及最终的商业价值实现。在众多开发工具的功能模块中&#xff0…...

Windows 环境下 vscode 配置 C/C++ 环境

vscode Visual Studio Code&#xff08;简称 VSCode&#xff09;是一个由微软开发的免费、开源的代码编辑器。它支持多种编程语言&#xff0c;并提供了代码高亮、智能代码补全、代码重构、调试等功能&#xff0c;非常适合开发者使用。VSCode 通过安装扩展&#xff08;Extension…...

[通信原理]绪论2:信息量 × 信息熵

我们知道信息是一个抽象的概念&#xff0c;它既不是物质也不是能量。那么我们要如何对一个抽象的概念进行一个定量的研究呢&#xff1f; 信息量 1、信息的度量 通信的本质是传递信息&#xff0c;为了定量表征信息的度量&#xff0c;引入信息量的概念。消息中所含信息量与其不…...

TCP套接字【网络】

文章目录 代码 创建套接字&#xff1a;&#xff08;TCP/UDP) int socket(int domain, int type, int protocol);inet_aton&#xff0c;将字符串IP转换成整数IP int inet_aton(const char *cp, struct in_addr *inp);监听套接字&#xff1a;&#xff08;TCP&#xff0c;服务器…...

【devops】devops-git之github使用

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…...

GPT对话知识库——串口通信的数据的组成?起始位是高电平还是低电平?如何用代码在 FreeRTOS 中实现串口通信吗?如何处理串口通信中的数据帧校验吗?

目录 1&#xff0c;问&#xff1a; 1&#xff0c;答&#xff1a; 串口数据的组成 串口数据传输帧的完整结构 起始位的电平状态&#xff1a;低电平 举例&#xff1a;UART数据传输的例子 适用场景 总结 2&#xff0c;问&#xff1a; 2&#xff0c;答&#xff1a; a. 如…...

从头开始学MyBatis—02基于xml和注解分别实现的增删改查

首先介绍此次使用的数据库结构&#xff0c;然后引出注意事项。 通过基于xml和基于注解的方式分别实现了增删改查&#xff0c;还有获取参数值、返回值的不同类型对比&#xff0c;帮助大家一次性掌握两种代码编写能力。 目录 数据库 数据库表 实体类 对应的实体类如下&#x…...

AI音乐创作的新时代:从创意到旋律的智能化转型

文章目录 &#x1f3bc; AI音乐创作的新时代&#xff1a;从创意到旋律的智能化转型1 AI在音乐创作中的应用1.1 AI如何生成音乐&#xff1f; 2 常见的AI音乐创作工具2.1 AIVA2.2 Ecrett Music2.3 Jukedeck 3 AI音乐创作的流程3.1 第一步&#xff1a;确定音乐风格和情感基调3.2 第…...

Spring Boot集成Akka remoting快速入门Demo

1.什么是Akka remoting&#xff1f; Akka-Remoting一种ActorSystem之间Actor对Actor点对点的沟通协议.通过Akka-Remoting来实现一个ActorSystem中的一个Actor与另一个ActorSystem中的另一个Actor之间的沟通 Akka Remoting限制&#xff1a; 不支持NAT&#xff08;Network Add…...

JVM 调优篇7 调优案例1-堆空间的优化解决

一 jvm优化 1.1 优化实施步骤* 1)减少使用全局变量和大对象&#xff1b; 2)调整新生代的大小到最合适&#xff1b; 3)设置老年代的大小为最合适&#xff1b; 4)选择合适的GC收集器&#xff1b; 1.2 关于GC优化原则 多数的Java应用不需要在服务器上进行GC优化&#xff1…...

文件格式转换:EXCEL和CSV文件格式互相转换

目录 1.EXCEl和CSV文件格式互相转换1.1首先安装所需的Python包1.2excel转换为csv代码如下:1.3csv转换为excel代码如下:由于excel文件在数学建模数据处理当中的局限性,我们通常把excel文件转换为csv文件来处理,下面是相关的代码,我直接封装成函数,你们直接调用即可,我会添…...

基于协同过滤的北京森林公园推荐---附源码74454

摘要 本论文主要论述了如何基于协同过滤开发一个北京森林公园推荐&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;通过爬虫技术对北京森林公园的景点信息数据进行爬取&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述北京森…...

002 JavaClent操作RabbitMQ

Java Client操作RabbitMQ 文章目录 Java Client操作RabbitMQ1.pom依赖2.连接工具类3.简单模式4.工作队列模式&#xff08;work&#xff09;公平调度示例 5.发布/订阅模式&#xff08;fanout&#xff09;交换机绑定示例代码 6.路由模式&#xff08;direct&#xff09;7.Topic匹配…...

lablelme标注的数据转成YOLO v8 格式

1 labelme 转 yolov8 格式 import json import cv2 import numpy as np import os def json2yolo(path):# dic{N_shaoxi:0, N_qiaoqi:1, N_qiaojie:2, N_pianyi:3, N_yiwu: 4, \# NV_shaoxi: 5, NV_qiaoqi: 6, NV_qiaojie: 7, NV_pianyi: 8, NV_yiwu: 9,\# …...