面试篇——mysql


背景:在面试过程中发现很多公司对sql查询有要求,虽然不高,但是简单常见的sql查询必须熟练的掌握,否则一面都无法通过,痛定思痛,必须要深入了解下!!!

注释符号

面试题1 查询没有成绩的学生信息

参考下面的连接建表:

https://cloud.tencent.com/developer/article/1070155

select a.SID , a.Sname
from Student a left join sc b
on a.SID = b.SID where  ISNULL(b.score) =1
group by a.SID , a.Sname
order by a.SID

# isnull作为函数参数
-- isnull作为函数参数
/*
isnull作为函数参数
*/
select a.SID , a.Sname, ISNULL(b.score) =1
from Student a left join sc b
on a.SID = b.SID 
group by a.SID , a.Sname
order by a.SID

 PS:如果ISNULL为1 就表示查询出所有有成绩的学生信息。上面三种注释方式都可以;

MySql 里的IFNULL、NULLIF和ISNULL用法

创建一个表,并设置联合主键

数据库B树和B+树理解

重温数据结构:理解 B 树、B+ 树特点及使用场景

为什么 B+ 树比 B 树更适合应用于数据库索引?
  1. B+树更加适应磁盘的特性,相比B树减少了I/O读写的次数。由于索引文件很大因此索引文件存储在磁盘上,B+树的非叶子结点只存关键字不存数据,因而单个页可以存储更多的关键字,即一次性读入内存的需要查找的关键字也就越多,磁盘的随机I/O读取次数相对就减少了。

  2. B+树的查询效率相比B树更加稳定,由于数据只存在在叶子结点上,所以查找效率固定为O(log n)。

  3. B+树叶子结点之间用链表有序连接,所以扫描全部数据只需扫描一遍叶子结点,利于扫库和范围查询;B树由于非叶子结点也存数据,所以只能通过中序遍历按序来扫。也就是说,对于范围查询和有序遍历而言,B+树的效率更高。

B+tree性质:

1.)n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引。

2.)所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3.)所有的非终端结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。

4.)B+ 树中,数据对象的插入和删除仅在叶节点上进行。

5.)B+树有2个头指针,一个是树的根节点,一个是最小关键码的叶节点


索引的基本原理

索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。

索引的原理很简单,就是把无序的数据变成有序的查询

1、把创建了索引的列的内容进行排序

2、对排序结果生成倒排表

3、在倒排表内容上拼上数据地址链

4、在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据

MySQL数据类型格式及长度

char:定长,效率高,一般用于固定长度的表单提交数据存储  ;例如:身份证号,手机号,电话,密码等

varchar:不定长,效率偏低

CHAR和VARCHAR最大的不同就是一个是固定长度,一个是可变长度。由于是可变长度,因此实际存储的时候是实际字符串再加上一个记录 字符串长度的字节(如果超过255则需要两个字节)。如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉 的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。

关于int的解释:

Mysql 中定义字段后的数据的用处: int(1)和int(10)似乎没有什么差别,都表示最大四个字节的整型数据。 例如定义一个名字为test的表: DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
  `id` int(1) NOT NULL,
  `ids` int(10) default NULL,
  `c` char(1) default NULL,
  `cs` varchar(2) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ----------------------------
-- Records
-- ----------------------------
INSERT INTO `test` VALUES ('1', '1', 'a', 'aa');
INSERT INTO `test` VALUES ('10', '10', 'a', 'aa');
INSERT INTO `test` VALUES ('2147483647', '2147483647', 'a', 'aa');
可以发现:   无论是int(1)还是int(10)都最大存取2147483647 (二进制31个1,因为正负取值),可见最大存取4个字节,即int的最大字节数。   varchar(1)最大存取一个字符,varchar(2)最大存取两个字符。  

联合索引在B+树上的存储结构及数据查找方式

联合索引在B+树上的存储结构及数据查找方式 我们看,联合索引是首先使用多列索引的第一列构建的索引树,用上面idx_t1_bcd(b,c,d)的例子就是优先使用b列构建,当b列值相等时再以c列排序,若c列的值也相等则以d列排序。我们可以取出索引树的叶子节点看一下。 理解了联合索引的结构,也就理解了为什么联合索引要满足最左匹配原则