MySql的基础讲解

news/2024/9/18 17:30:21/ 标签: 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


http://www.ppmy.cn/news/1526550.html

相关文章

Ubuntu 软件仓库镜像使用帮助

选择镜像 CERNET - 校园网联合镜像站(mirrorz-302 智能选择)TUNA - 清华大学开源软件镜像站BFSU - 北京外国语大学开源软件镜像站BJTU - 北京交通大学自由与开源软件镜像站CQU - 重庆大学开源软件镜像站NJU - 南京大学开源镜像站DNUI - 大连东软信息学院…

科技与艺术完美融合的LED异形创意圆形(饼/盘)显示屏横空出世

随着LED技术的飞速发展,这款集科技与艺术于一体的异形创意圆形(饼/盘)显示屏,不仅以其独特的形态打破了传统显示屏的界限,更在视觉呈现上开启了前所未有的新篇章。它不再仅仅是信息传递的载体,而是成为了空…

html限制仅有一个音/视频可播放

html限制仅有一个音/视频可播放 /** 多个音频仅能播放一个 */ function audiosPlay() {const audios document.getElementsByTagName(audio);const videos document.getElementsByTagName(video);function pauseAll() {var self this;[].forEach.call(audios, function (i) …

【PostgreSQL】Npgsql.PostgresException:“3D000:

情景再现 原因 Npgsql.PostgresException 指出发生了一个 PostgreSQL 数据库的异常。错误代码 3D000 通常与 PostGIS 扩展有关,这是 PostgreSQL 中用于管理空间数据的扩展。错误信息 "SpatialDatabase2" 表明可能是在操作一个空间数据库对象时出现了问题…

VLMEvalKit 评测实践:InternVL2 VS Qwen2VL

一、InternVL2简介 InternVL2是由上海人工智能实验室OpenGVLab发布的一款多模态大模型,其中文名称为“书生万象”。该模型在多学科问答(MMMU)任务上表现出色,成为国内首个在该任务上性能突破60的模型,被誉为开源多模态…

MySQL练手题--体育馆的人流量(困难)

一、准备工作 Create table If Not Exists Stadium (id int, visit_date DATE NULL, people int); Truncate table Stadium; insert into Stadium (id, visit_date, people) values (1, 2017-01-01, 10); insert into Stadium (id, visit_date, people) values (2, 2017-01-02…

Linux-LVM逻辑卷管理

一、背景 Linux运维过程中大家有没有想过生产环境服务器磁盘分区如果数据量越来越膨胀(这些都是重要数据,不能删除),那么此时如何来应对这个问题呢? 既要不影响正在运行的程序,同时也不能中断关机等操作。 这么一想就很蛋疼了。假设你运行…

Maven 的多种打jar包方式详细介绍、区别及使用教程——附使用命令

文章目录 1. **标准 JAR 打包****打包方式****配置示例****使用方式****优点****缺点** 2. **可执行 JAR(Executable JAR)****打包方式****配置示例****使用方式****优点****缺点** 3. **Uber JAR(Fat JAR / Shadow JAR)****打包方…

Comsol 利用多孔材料填充复合吸声器,拓宽低频完美吸声

参考文献:Cheng B , Gao N , Huang Y ,et al.Broadening perfect sound absorption by composite absorber filled with porous material at low frequency:[J].Journal of Vibration and Control, 2022, 28(3-4):410-424.DOI:10.1177/1077546320980214. 为了提高低…

优化Web性能:Varnish中精准识别并缓存移动与桌面请求

引言 在现代Web开发中,为了提升用户体验,针对不同类型的设备提供定制化的内容是一项重要的策略。Varnish作为HTTP加速器和缓存代理服务器,能够帮助我们实现这一目标。本文将详细介绍如何利用Varnish来实现基于设备类型(PC端与移动…

Pr:首选项 - 媒体缓存

Pr菜单:编辑/首选项 Edit/Preferences Premiere Pro 首选项中的“媒体缓存” Media Cache选项卡的设置用于管理和优化媒体缓存文件的存储与清理。定期清除媒体缓存是优化 Pr 性能或进行故障排除的最佳做法。 将视频和音频导入 Pr 时,它会将这些文件处理成…

企业的终端安全该怎么防护?

安装金刚钻信息网站数据防泄密系统能够有效防止终端数据泄露,提供全面的安全保障。该系统通过对终端上的敏感数据进行加密,确保只有经过授权的用户才能访问或读取数据,即使设备丢失或遭到入侵,数据也不会被轻易获取。此外&#xf…

单硬盘安装Win10和麒麟V10双系统指导建议

随着信创电脑的普及,国产操作系统也逐渐走进了大家的视野,许多人选择了国产操作系统来体验其开源、安全、高效的特性,而Windows系统也是大多数人习惯使用的操作系统。一台电脑上同时安装银河麒麟V10和Windiows10双系统也成为了非常常见的需求。那么,如何在一台电脑上安装银…

SpringBoot框架下的房产销售系统设计与实现

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于房产销售系统当然也不能排除在外,随着网络技术的不断成熟,带动了房产销售系统,它彻底改变了过去传统的…

Android12_13左上角状态栏数字时间显示右移动

文章目录 问题场景解决问题 一、基础资料二、代码追踪三、解决方案布局的角度解决更改paddingStart 的默认值设置marginLeft 值 硬编码的角度解决 问题场景 1)早期一般屏幕都是方形的,但是曲面屏,比如:好多车机Android产品、魔镜…

Qt ORM模块使用说明

附源码:QxOrm是一个C库资源-CSDN文库 使用说明 把QyOrm文件夹拷贝到自己的工程项目下, 在自己项目里的Pro文件里添加include($$PWD/QyOrm/QyOrm.pri)就能使用了 示例test_qyorm.h写了表的定义,Test_QyOrm_Main.cpp中写了所有支持的功能的例子: 通过自动表单添加…

9.14工作笔记

M psy分析 冰红茶看看他的研究思路 https://bbs.quantclass.cn/thread/45169 psyv4计算:首先算因子H 然后放到回测框架里算12H 衰减加权 和psyv1做比较 transperiod这个函数里面的for循环再看看 比如df是小时数据,hold_period为3D,这里of…

【C++】入门基础(下)

Hi!很高兴见到你~ 目录 7、引用 7.3 引用的使用(实例) 7.4 const引用 【第一分点】 【第二分点1】 【第二分点2】 7.5 指针和引用的关系(面试点) 8、inline 9、nullptr Relaxing Time! ———…

Spring-IOC容器-ApplicationContext

IOC:Inversion of Control 控制反转,是一种设计原则,spring 中通过DI(dependency Injection)来具体实现。 比如原本对象的实例化,是通过程序主动New出来,IOC中的对象实例交给Spring框架来实例化&#xff0…

爬虫全网抓取

爬虫全网抓取是指利用网络爬虫技术,通过自动化的方式遍历互联网上各个网站、论坛、博客等,从这些网页中提取所需的数据。它通常涉及以下几个步骤: 目标设定:确定要抓取哪些类型的网页内容,比如新闻、商品信息、用户评论…