0


数据库语句执行过程理解,存储引擎的学习,字符集的理解,加各种sql数据类型理解介绍加之SQL各种数据查询分析和题目专练

一. 前言

嗨,您好呀,欢迎来到小杰的mysql学习随笔的博文章节,点进来就是缘分,如果您看目录获悉觉得小杰说的部分东西您还不过清晰,了解,您可以阅览本文给小杰提出宝贵的建议,小杰初次总结学习mysql 或有各式各样的错误,烦请您帮小杰纠正。如果觉着小杰写的不错,麻烦动动小手手给小杰来个三连支持,您的支持是小杰创作的动力喔, 蟹蟹你

  • 回溯前文,mysql入门第一学,其实就是知道下数据库是啥,了解一下各种基本操作数据库的指令,主要是DDL部分(数据库的创建定义),也介绍了简单的DML (操作) 如果您是和小杰一样对于数据库刚刚入门可以点开一观

MYSQL数据库初窥门径, SQL语句地熟练使用, 图形化界面提高效率_小杰312的博客-CSDN博客MYSQL数据库初窥门径, SQL语句地熟练使用, 图形化界面提高效率https://blog.csdn.net/weixin_53695360/article/details/123481586?spm=1001.2014.3001.5501

  • 前文重点回忆: 数据库是啥? 简单的理解就是对于数据进行存储,查询,管理操作的一款软件。 数据库必须要具备和磁盘一样的对于数据做持久化保存的能力
  • 数据库对比磁盘存储的优势:更加方便,快捷,安全.
  • **连接数据库 : mysql -u root -p **
  • 打开选择数据库: use 库名
  • 操作数据库:
  • show databases; 显示所有的数据库
  • **use 数据库名字; 选择进入数据库 **
  • select database(); 显示当前选择数据库
  • show tables; 显示所有的数据表
  • show create table 表名; 显示建表语句
  • desc 表名; 显示表结构
  • create table if not exists 表名(字段 类型); 如果表不存在才创建,存在就不创建
  • drop table if exists 表名; 如果表存在才删除, 不存在就不删除

**if not exists 才创建 + if exists 才删除 (两个出现的原因???) 为了避免报错。 如果没有 if not exists 你创建已经存在的会报错, 如果没有 if exists 你删除不存在的也会报错 ** (针对数据库创建删除也可用)

  • insert into 表名(指定字段) values(指定值);
  • \q(qiut) exit 退出mysql

二.你有理解过sql语句的执行过程, 存储引擎(表处理器)是什么吗?

  • 首先mysql是一个典型的C/S** 架构,即 Client/Server 架构**
  • 也就是典型的请求------响应的模式, 客户端向服务器进程发送一段文本 (mysql语句),服务端处理之后向客户端进程发送一段文本(处理结果) 如下是具体过程

  • 连接层:客户端和服务端建立连接,客户端发送SQL到服务器端
  • SQL层:对于SQL语句进行查询和处理 ( 其中查询缓存其实意义不大,因为维护这块缓存造成的额外开销. 而且每次都要先去这块缓存中查询。每次查询之后还需要跟新查询缓存 在mysql8.0 之后已经是废除掉了)
  • 存储引擎:跟文件系统进行交互,负责数据的存储和获取。

存储引擎

  • 真正进行数据的存储和提取操作的都是存储引擎的事情,SQL层仅作的是mysql语句的查询和处理解析优化
  • 存储引擎还存在一个名字叫做 表处理器 ???
  • 什么是表:表是由一行一行的记录组成的,这个也仅仅只是一个抽象的东西,你有没有想过我们平时从表中读取数据还有向表中写入数据,这些操作究竟是如何映射到物理内存上的操作的呢? 就近是如何将需要写入表中的数据写入到物理存储器中的。。。 (表仅为抽象出来的机构,实际上数据还是需要存储在真实存在的物理的存储器中) 这个如何存入到物理存储器还有从物理存储器中读出表数据的操作正 对应着存储引擎的功能.
  • 存储引擎有很多种,不同种的存储引擎 管理表的存储结构也可能是不同的, 采取的存储算法也是可能不同的。。。 (其实正对 不同的存储结构不同的存储算法,在不同的场景下,使用合适的存储引擎是可以提高对应操作的效率的).

存储引擎官方解释:

**最常见的存储引擎:myisam 和 innodb **

  • MyISAM 存储引擎:在 MySQL 5.5 版本之前是默认的存储引擎,不支持事务,也不支持外键,最大的特点是速度快,占用资源少
  • InnoDB 存储引擎:它是 MySQL 5.5 版本之后默认的存储引擎,最大的特点是支持事务、行级锁定、外键约束等
  • 一般来说针对小型引用而言,我们往往可以采取myisam 存储引擎,因为他比较简单,效率上高于innode , 但是它不能支持事务,外键,行级锁 这些问题导致在 高并发的情况下使用innodb更加合适.** **
  • 应用场景分析(myisam, innodb):
  • myisam 管理非事物表,提供高速检索,以及全文搜索能力,所以应用中需要大量执行select操作的时候它是更好的选择
  • innodb 用于事物处理应用程序,具有众多特性,包括ACID事务支持。如果应用中大量需要进行Insert 或者 update 操作,应该使用innodb, 这样可以提高多用户并发操作的性能

对于存储引擎而言,肯定不是说固定的一定要用哪个,还是需要根据存储引擎的特性结合业务需求来使用合适的存储引擎。

三. mysql中的字符集为啥要是utf-8 如果不是会产生什么问题?

  • 首先要解释上面的问题,必须先理解什么叫做字符集
  • 我们知道在计算机中只能存储二进制数据,那该怎么存储字符串呢?当然是建立字符与二进制数据的映射关系了, 我们知道在计算机中只能存储二进制数据,那该怎么存储字符串呢?当然是建立字符与二进制数据的映射关系
  • 字符映射 :将一个字符映射成二进制数据的过程叫做 编码,将二进制数据映射到一个字符的过程叫做 解码
  • 不同的字符集:描述 某个范围的字符 的 编码规则

字符集发展史

字符范围在不断的扩大,编码规则也越发不同, 至此万国码他来了: (支持涵盖世界上所有语言的字符) utf-8 仅仅只是 Unicode 中的一种编码规则的字符集,也是现在Mysql默认使用的

所以我前面建表的时候都是指定的utf8mb4 就是这个原因,如果仅仅只是utf8默认的是1 - 3个字节表示字符,其中会存在一些问题,如果有需要使用4字节编码一个字符的情况下

  • 字符集错了最常见的问题就是乱码,在mysql中会体现出报错

四. SQL中常用的数据类型和表常见字段约束学习

  • SQL数据类型分类:串数据类型,数值数据类型,日期时间数据类型

  • 数据类型合适定义的重要性:
  • 数据库还有表一般是非常大的,一个数据类型其实就代表数据库表中的一整列数据的数据类型,如果类型定义出现问题,比如不够存储呀等等,我们就相当于是需要修改表的一整列的类型,这个是很危险的,(因为可能导致数据的丢失) 更改数据的列不是一件小事情 (重视类型定义很有必要)

  • 上述中比较重要的三种串数据类型的介绍我都全部框起来了,我们使用比较多的也就是这三种串类型.
  • 分析char 和 varchar的差异性 (是蛮必要的):
  • *char(len):定长串,意思就是说长度是固定的,在建表的时候就固定住对应字段 (***)的长度,不论你传入的串长度是小于里面的固定len 还是等于 len 都是固定的len 长度,说白了就是 ****存储空间固定分配 **(注意 不可以存储长度 > len 的串) 数据丢失,固定长度不合适
  • varchar(len):变长串,意思就是长度可以是不定的,****你写入多长的串就给多大的存储空间(位)进行存储,当然 还是不可以超过 len 的限制

** 数值数据类型主要也就是如下的 decimal(位数,小数点后位数),float , int tinyint**

注意 unsigned 的修饰,这个属于表字段修饰了, 后面会说

对应 time 类型的数据输出 curtime(); sql中的当前时间查询函数

** 对应datetime类型的输出 now() sql中当前时间的查询函数,按照年月日时分秒形式**

  • 常见常用表字段约束

  • ** 主键很重要,主键是每一行记录的唯一标识,几乎每一个表都需要设置主键 primary key **
  • 而且主键一般都会设置成 auto_increment 实现自动的递增.

  • ** 上述图片是很常用的建表方式,基本上是特别规范了,也涵盖了上面介绍的很多知识点,大家可以结合实例再理解,自己再去敲一下**

** 同样在末尾我们还可以进行auto_increment 自动递增的值的设置 在 确定字符集之前**

五. SQL中的select你是真的有够会用吗?

一个字段代表的就是一列 一个固定值的字段代表的是一行: 姓名:代表的是姓名字段这一列, 姓名 = '张三' 代表的是指定 名字 = 张三的这一行(记录)

** 之前解释过上述知识小点,此处再明确一下,字段意思就是列,字段值固定就是代表这个固定字段值标记的行(记录) **

  • ** 如下就是emp 表的整体结构和存储的数据, 后序的所有操作全部基于这个表**

  • select 查询多个列(多个字段)

**语法形式: select 指定字段1, 指定字段2, 指定字段3... from 表名; **

eg:

  • select 查询全部列

语法形式:select * from 表名; // 查询表中所有列,很容易使用,但是其实真正我们将来工作的时候是不建议使用, 检索出不必要的多余列 (降低检索性能) + 不能明确指定检索的字段名 * 通配符:通配所有列(字段)

eg:

  • select 条件查询 (查询固定字段,指定字段的行)

语法形式: select * from 表名 where 约束字段(条件约束);

如下是where的条件语句中可以使用的 各种运算符 和 限制约束

  • 再解释一下 like 的使用 like一般搭配 % 和 _一同使用: _含义是匹配任意的一个字符, % 匹配任意的多个字符

  • 聚合函数介绍, select 聚集聚合查询 (整合一整列字段)

语法形式:select 函数名(作用字段) from 表名;

解释:查询 函数处理指定字段(列)之后的结果:

有的时候我们需要整合一列的信息来看,这个时候就可以使用聚合函数,聚合函数就是用于整合一列的数据的

  • count() 和 count(指定字段(列))的区别: 会连着NULL 一起做统计,指定具体字段不会统计NULL

具体例子, 后序有专练

  • select 分组查询

语法形式: select 指定分组字段, 聚合函数(处理字段) from 表名 group by 前面的指定分组字段. (强调,前面的指定分组字段和后面的指定分组字段一定要一一对应,不能少)

  • 看不同语法不要着急,先搞清楚分组是个啥,分组需要用在哪里....
  • 分组现象那可是相当常见,男生女生各排成一列,分别统计不同职业的人数和。(不同的职业也可以用来分组)
  • ** 强调,前面的指定分组字段和后面的指定分组字段一定要一一对应,不能少. 这句话很重要. 如果不对应会报错.**

举几个栗子

  • 分解一下第一个查询每个工作岗位的人数,一步一步的来:

分组其实就是按照字段值不同将重复的哪些字段值分为一组 (相当于是按照字段值分组)

**然后接着加上 **

就很简单了 分组一般结合聚合函数一同操作使用,先进行分组,然后针对分组使用聚合函数进行一个聚合统计数据.

  • 针对where 和 having 做出解释区分:where 是对于记录行做筛选,筛选的是行,having 是对于分组进行筛选,筛选的是分组. (如何筛,条件限定限制)

**eg : **

上述操作筛除记录,也就是行:

然后是按照 分组 进行 having 筛选分组结果

  • **小结:聚合查询常常和分组一同使用,对于分组后的哪些组进行聚合处理数据,然后在过程中还需要筛选出复合我们要求的记录的话, where是针对 记录(行)筛选 (先筛), having 是针对分组后的结果进行筛选,后筛 **
  • (还有就是分组字段前后保持相同) 注意
  • select 排序查询

语法形式: select 字段 表名 ,,, order by 排序字段1 排序规则1, 排序字段2 排序规则2

  • 首先,排序字段可以给与多个,再给与多个排序字段的情况下,是依次按照排序字段进行比较排序,如果前面的排序字段相同再使用后序的排序字段进行排序
  • 默认排序规则是ASC 升序排序, DESC 降序排序

来几个栗子:

  • select 限制查询 limit

**语法形式: **

select 查询字段 from emp limit m, n; //查询emp 记录 省略前m 行记录查询后n 条

**select 查询字段 from emp limit n; //查询emp 前n 条记录 **

eg:

  • select 查询且设置别名 + 去除重复记录

**语法形式: **

上面两个都蛮简单的,就简单使用一下就是了:

eg :

** 注意一下distinct 需要加载修饰字段的前面就是了**

  • select 分页查询(小杰因为对于页还没有直观的理解,所以自己没敢尝试写,怕误导大家,有很会的大家可以给出解释,蟹蟹)

六.查询这些基本语法是学的差不多点了,可是需要练习呀,接下来请你按照我给的sql文件进行导入数据库,然后请你根据题目进行练习,练完之后最下面有答案. (数据库就是需要操作,小杰初学者小感受)

  • **第一步,导入数据库: 方式,两种: **
  • 第一种 指定导入:
  • source xxx/test.sql导入sql文件,sql文件实际上是一个脚本文件,里面有多行SQL语句,通过source命令可以批量执行。 (命令导入)

sql 文件代码:

    comm        SMALLINT ) ;
CREATE TABLE IF NOT EXISTS salgrade ( 
    grade        INT,
    losal        INT,
    hisal        INT );

-- 插入测试数据 —— dept
INSERT INTO dept VALUES    (10,'ACCOUNTING','NEW YORK');
INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
INSERT INTO dept VALUES    (30,'SALES','CHICAGO');
INSERT INTO dept VALUES    (40,'OPERATIONS','BOSTON');
-- 插入测试数据 —— emp
INSERT INTO emp VALUES (7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp VALUES (7499,'ALLEN','SALESMAN',7698,'1981-2-20',1600,300,30);
INSERT INTO emp VALUES (7521,'WARD','SALESMAN',7698,'1981-2-22',1250,500,30);
INSERT INTO emp VALUES (7566,'JONES','MANAGER',7839,'1981-4-2',2975,NULL,20);
INSERT INTO emp VALUES (7654,'MARTIN','SALESMAN',7698,'1981-9-28',1250,1400,30);
INSERT INTO emp VALUES (7698,'BLAKE','MANAGER',7839,'1981-5-1',2850,NULL,30);
INSERT INTO emp VALUES (7782,'CLARK','MANAGER',7839,'1981-6-9',2450,NULL,10);
INSERT INTO emp VALUES (7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp VALUES (7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp VALUES (7844,'TURNER','SALESMAN',7698,'1981-9-8',1500,0,30);
INSERT INTO emp VALUES (7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp VALUES (7900,'JAMES','CLERK',7698,'1981-12-3',950,NULL,30);
INSERT INTO emp VALUES (7902,'FORD','ANALYST',7566,'1981-12-3',3000,NULL,20);
INSERT INTO emp VALUES (7934,'MILLER','CLERK',7782,'1982-1-23',1300,NULL,10);
-- 插入测试数据 —— salgrade
INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);

新建一个文件命名为test.sql 将上述拷贝进去,导入执行上述语句创建数据库即可

  • 专项练习1: 练习基本的指定字段 去重,别名查询

  1. 查询指定字段 ename,job,sal的数据
  2. 查询所有字段
  3. 查询所有员工的职位,并起别名
  4. 查询员工的的职位有哪些(不要重复)
  5. 查询员工年薪 即 sal 12*
  • 专项练习2: 条件查询练习

  1. **查询工资等于3000的员工 **
  2. **查询工资小于1000的员工 **
  3. **查询工资小于等于1000的员工 **
  4. **查询没有奖金的员工 **
  5. **查询有奖金的员工 **
  6. 查询工资在1200到1800之间的员工(包含1200和1800岁)
  7. **查询职位为推销员,且工资小于1500的员工 **
  8. **查询工资为800 或 3000 或 5000的员工 **
  9. **查询姓名为四个字的员工 **
  10. 查询姓名最后一位是S的员工
  • ** 专项**训练3 聚合函数使用

  1. **统计该企业员工数量 **
  2. **统计该企业员工的平均工资 **
  3. **查询该企业员工的最高工资 **
  4. **查询该企业员工的最低工资 **
  5. 计算所有销售的工资之和
  • 专项训练4 : 聚合函数结合分组查询使用

  1. **统计出每个工作岗位的人数 **
  2. 统计出每种职位的最低和最高工资
  3. 显示不同职位薪资少于1500的人数
  4. 显示非销售人员(salesman)工作名称以及从事同一工作的员工的月工资的总和,并且要满足从事同一工作的员工的月工资合计大于等于5000。
  • 专项训练5 : 排序查询

  1. 根据姓名对员工进行排序(升序)
  2. **查询入职时间大于1981年6月6日的员工信息,并按照入职时间升序排列 **
  3. **根据工作职位,进行升序排列,职位相同的情况下,再根据入职时间降序排列 **
  4. **查询工资不在1000到2000之间的员工的姓名和工资,工资按降序排列 **
  5. 按工作职位进行分组,查看每个工作职位的人数,工作职位按升序排列

七. 总结本文

  • 上述专训答案获取地址 :链接:https://pan.baidu.com/s/1DCvAHmYcWEXOIJBE4YhLyg?pwd=928z 提取码:928z --来自百度网盘超级会员V1的分享
  • 本章首先是回顾了之前所学重点,然后接着是介绍了Mysql语句执行流程,SQL层仅仅只是做sql语句的优化处理,真正实现将数据存储到表中和从表中提取数据,其实实要存储到对应的物理内存,也是需要从物理内存上去取出数据的,这些数据存取的工作其实是表处理器 (存储引擎) 帮助我们完成的
  • 主要的存储引擎 myisam 查询速度快,对于小型数据库比较合适,还有查询多的,但是它不支持行级锁, 不支持事务,也不支持外键 在 5. 7 还是5点几版本之前他是默认的存储引擎 之后 是 innodb
  • 然后是字符集的介绍, 包含字符的范围 + 编码规则,现在默认mysql 使用的是utf8 最好我们写成utf8mb4;
  • 然后是各种表的字段修饰,主键,每个表都要有一个主键,主键是唯一且不为空的,不会出现重复.
  • 然后介绍了各种数据类型,主要就是串 (char, varchar text) 数值 (int, tinyint, float decimal(m, n) ) 日期数据类型 (time dte datetime)
  • 核心就是select 的多种查询方式, 指定字段查询(列查询),条件查询(指定行查询),聚合查询,分组查询group by,去重查询distinct , 排序查询 order by
  • 最后,小杰以初学者的感受斗胆给大家提出意见,数据库的学习绝非是只动头脑思考可行的,小杰认为初学一定要多写, 将学习时间拉长,理论知识慢慢积累,但是一定要学练并举,学习后马上训练 (如果您觉着小杰写的还有用,麻烦支持下小杰蟹蟹您)
标签: 学习

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

“数据库语句执行过程理解,存储引擎的学习,字符集的理解,加各种sql数据类型理解介绍加之SQL各种数据查询分析和题目专练”的评论:

还没有评论