0


MySQL(一)基本架构、SQL语句操作、试图

MySQL系列文章

MySQL(一)基本架构、SQL语句操作、试图
MySQL(二)索引原理以及优化
MySQL(三)SQL优化、Buffer pool、Change buffer
MySQL(四)事务原理及分析
MySQL(五)缓存策略
MySQL(六)主从复制
数据库三范式


文章目录


前言

MySQL是关系型数据库。数据库就是用来保存数据的。


那关系型又是什么意思?
关系型数据库就是类似于excel表格,每一行每一列中的每一个单元都能在表格中找到相关联的数据。
整个库就像一张关系网。
例如:
在这里插入图片描述


那非关系型数据库又是什么?
非关系型数据库就类似于redis这种,用键值来存储。类似于哈希表数据结构。可以想象,键值对存储中的每个存储数据之间是没有关联的。
例如:

tony:35
aries:18

一、MySQL网络结构

MySQL分为服务端和客户端。我们安装好MySQL需要启动服务端,然后用客户端连接。当然可以多个客户端连接一个MySQL服务端。因此客户端和服务端连接就涉及到网络通信。而MySQL 网络架构通常是指服务端实现的网络架构,因为要与多个客户端连接,所有需要考虑到并发的场景。
Mysql网络的主要处理方式是IO多路复用 select + 阻塞的 io;select只监听listenfd,不会管连接线程的读写。select是跨平台的,mysql可以在Linux和windows下运行;
而redis(使用epoll)只能在Linux下运行,在windows中使用的是用select替换的,并且windows没有fork子线程,功能不全。

二、一条SQL语句经历的步骤

一条SQL语句在服务端经历的步骤还是比较复杂:
首先经历连接器(建立,管理连接,校验用户信息)然后通过查询缓存,查到直接命中,没查到会继续运行然后sql语句被分析器语句分析,语法分析,生成语法树;经过优化器选择最优的执行步骤;通过执行器根据执行计划,从存储引擎获取数据,并返回客户端。
在这里插入图片描述

三、MySQL操作

insert

INSERT INTO `table_name`(`field1`, `field2`,...,`fieldn`)VALUES(value1, value2,..., valuen);//例如
INSERT INTO test_db(id, name, age)VALUES("3","lihua",27);

删除数据的三种方式:drop,truncate,delete速度依次降低

DROP TABLE `table_name`;//删除整张表,包括索引,约束,触发器等(不能回滚)
TRUNCATE TABLE `table_name`;//删除表数据,以以页为单位删除;其他保留(不能回滚)
DELETE TABLE `table_name`;//删除部分或全部数据,逐行删除,其他保留(条件删除)可以回滚

SELECT field1, field2,...fieldN FROM table_name[WHERE Clause]

UPDATE table_name SET field1=new_value1,field2=new_value2 [, fieldn=new_valuen]

高级查询

高级查询主要了解分组查询和聚合查询

分组查询

即增加条件判断:
1.where condition
2.group by column having condition

-- 分组加group_concat
| id | name   | gender | age ||----|--------|--------|-----||1| Alice  | Female |20||2| Bob    | Male   |22||3| Charlie| Male   |21||4| Dave   | Male   |23||5| Eve    | Female |19|
SELECT `gender`,group_concat(`age`) FROM `student` GROUP BY `gender`;//以gender分组,将同组的age合并起来组成一个年龄字符串| gender |group_concat(age)||--------|---------------------|| Female |20,19|| Male   |22,21,23|-- 分组加条件(having的条件可以用select中本条命令查到的,而where做不到)
SELECT `gender`,count(*)  FROM as num `student` where num >6;

————————————————

聚合查询

在这里插入图片描述

SELECT sum(`num`) FROM `score`;

多表联合查询

分为内联查询和外联查询
内联:inner join,只取两张表有对应关系的记录

//从两个名为"course"和"teacher"的表中获取课程ID和对应的教师ID。
假设"course"表中有以下数据:
| cid | name        | teacher_id ||-----|-------------|-----------||1| Calculus    |101||2| Physics     |102||3| Chemistry   |103||4| Computer Science |105||5| Biology     |104|"teacher"表中有以下数据:
| tid | name      ||-----|-----------||101| Smith    ||102| Johnson  ||103| Lee      ||104| Davis    |
SELECT cid FROM `course` INNER JOIN `teacher` ON course.teacher_id =teacher.tid;| cid ||-----||1||2||3||5|

外联:分为left join和 right join;在内连接的基础上保留左表/右表没有对应关系的记录

假设"course"表中有以下数据:

| cid | name        | teacher_id ||-----|-------------|-----------||1| Calculus    |101||2| Physics     |102||3| Chemistry   |103||4| Computer Science |101||5| Biology     |104|"teacher"表中有以下数据:

| tid | name      ||-----|-----------||101| Smith    ||102| Johnson  ||103| Lee      |
SELECT course.cid teacher.name FROM `course` LEFT JOIN `teacher` ON course.teacher_id =teacher.tid;| cid | name    ||-----|---------||1| Smith   ||2| Johnson ||3| Lee     ||4| Smith   ||5|NULL|
SELECT course.cid teacher.name FROM `course` RIGHT JOIN `teacher` ON course.teacher_id =teacher.tid;| cid | name    ||-----|---------||1| Smith   ||4| Smith   ||2| Johnson ||3| Lee     |

四、视图

视图( view )是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。其内容由查询定义。

视图只做select查询,不做增删改(虽然可以做,但是一般不用,限制比较多)。在工作项目中:比如一个充值表,我只给你一个视图,不会给你表,你就没法修改这个核心资源。只能查,不能改。

作用:

  • 可复用,减少重复语句书写;类似程序中函数的作用; 重构利器: (假如因为某种需求,需要将 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; 则只需要更改数据库结构,而不需要更改应用程序;) 逻辑更清晰,屏蔽查询细节,关注数据返回;
  • 权限控制,某些表对用户屏蔽,但是可以给该用户通过视图来对该表操作;
标签: mysql 架构 sql

本文转载自: https://blog.csdn.net/weixin_44477424/article/details/131736109
版权归原作者 Aries_Ro 所有, 如有侵权,请联系我们删除。

“MySQL(一)基本架构、SQL语句操作、试图”的评论:

还没有评论