MySQL进阶,秒变大神(四)

候选键:是最小超键,即没有冗余元素的超键。

主键 :数据库表中对存储数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。

外键 :在一个表中存在的另一个表的主键称此表的外键。

25、mysql为什么建议用自增列作为主键?

如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引、如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引、如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。

使用自增列(INT/BIGINT类型)做主键,这时候写入顺序是自增的,和B+数叶子节点分裂顺序一致;

该表不指定自增列做主键,同时也没有可以被选为主键的唯一索引(上面的条件),这时候InnoDB会选择内置的ROWID作为主键,写入顺序和ROWID增长顺序一致;

除此以外,如果一个InnoDB表又没有显示主键,又有可以被选择为主键的唯一索引,但该唯一索引可能不是递增关系时(例如字符串、UUID、多字段联合唯一索引的情况),该表的存取效率就会比较差。

26、MySQL中的varchar和char的区别以及varchar(50)中的50代表的涵义?

char是一种固定长度的类型,varchar是一种可变长度的类型。

白嫖资料

varchar(50)中50的含义:

最多存放50个字符,varchar(50)和(200)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为order by col采用fixed_length计算col长度。ppp-

int(20)中20的含义:

是指显示字符的长度

但要加参数的,最大为255,比如它是记录行数的id,插入10笔资料,它就显示00000000001 ~~~00000000010,当字符的位数超过11,它也只显示11位,如果你没有加那个让它未满11位就前面加0的参数,它不会在前面加0.

20表示最大显示宽度为20,但仍占4字节存储,存储范围不变;

mysql为什么这么设计:

对大多数应用没有意义,只是规定一些工具用来显示字符的个数;int(1)和int(20)存储和计算均一样。

27、什么是视图?视图的使用场景有哪些?

视图(View)是一个命名的虚表,它由一个查询来定义,可以当作表使用。

视图有什么用(应用场景):

1、当一个查询你需要频频的作为子查询使用时,视图可以简化代码,直接调用而不是每次都去重复写这个东西。

2、系统的数据库管理员,需要给他人提供一张表的某两列数据,而不希望他可以看到其他任何数据,这时可以建一个只有这两列数据的视图,然后把视图公布给他。

创建视图sql语句:

CREATE VIEW view_name AS

SELECT column_name(s)

FROM table_name

WHERE condition

视图与表的区别:

1、视图是已经编译好的sql语句,而表不是。

2、视图没有实际的物理记录,而表有。

3、表是内容,视图是窗口。

4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能由创建的语句来修改。

5、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。

6、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。

7、视图的建立和删除只影响视图本身,不影响对应的基本表。

8、不能对视图进行update或者insert into操作。

白嫖资料

28、数据库三大范式?

第一范式(1NF)

(在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。)

所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,第一范式就是无重复的列。强调的是列的原子性,即列不能够再分成其他几列。

第二范式(2NF)

满足第二范式(2NF)必须先满足第一范式(1NF)。另外包含两部分内容,一是表必须有主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。

第三范式(3NF)

满足第三范式(3NF)必须先满足第二范式(2NF)第三范式就是非主键列必须直接依赖于主键,不能存在传递依赖。

29、sql优化

  1. explain sql 分析sql语句,这个语句可以打印出的各种item的意义:

select_type :表示查询中每个select子句的类型

type :表示MySQL在表中找到所需行的方式,又称“访问类型”

possible_keys :指出MySQL能使用哪个索引在表中找到行,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用。

key :显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL。

key_len :表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度

ref :表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

Extra :包含不适合在其他列中显示但十分重要的额外信息

2. 查询语句不同元素(where、jion、limit、group by、having等等)执行先后顺序?

查询中用到的关键词主要包含6个,并且他们的顺序依次为 select–from–where–group by–having–order by–limit。

其中select和from是必须的,其他关键词是可选的。

白嫖资料

(使用having字句对分组后的结果进行筛选,所以having只能用在group by之后;

limit 起始记录位置:取记录的条数对记录进行选取,主要用来实现分页功能)

30、非关系型数据库和关系型数据库区别,优势比较?

非关系型数据库的优势:

性能:NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。

可扩展性:同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。

关系型数据库的优势:

复杂查询:可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。

事务支持:使得对于安全性能很高的数据访问要求得以实现。

其他:

1.对于这两类数据库,对方的优势就是自己的弱势,反之亦然。

2.NOSQL数据库慢慢开始具备SQL数据库的一些复杂查询功能,比如MongoDB。

3.对于事务的支持也可以用一些系统级的原子操作来实现例如乐观锁之类的方法来曲线救国,比如Redis set nx。

白嫖资料

31、什么是 内连接、外连接、交叉连接、笛卡尔积等?

内连接: 只连接匹配的行

左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行

右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行

例如1:

SELECT a.,b. FROM luntan LEFT JOIN usertable as b ON a.username=b.username

例如2:

SELECT a.,b. FROM city as a FULL OUTER JOIN user as b ON a.username=b.username

全外连接: 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。

交叉连接: 生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配

例如:

SELECT type,pub_name FROM titles CROSS JOIN publishers ORDER BY type

1.以A,B两张表为例

A left join B

选出A的所有记录,B表中没有的以null 代替

right join 同理

2.inner join

A,B的所有记录都选出,没有的记录以null代替

3.cross join (笛卡尔积)

A中的每一条记录和B中的每一条记录生成一条记录

例如A中有4条,B中有4条,cross join 就有16条记录

32、SQL语言分类

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
7)]

[外链图片转存中…(img-jMnOR3HZ-1715852331867)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值