2020年最新版MySQL面试题(四)

存储过程与函数一、什么是存储过程?有哪些优缺点?存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次。
如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
优点存储过程是预编译过的,执行效率高。
存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。
安全性高,执行存储过程需要有一定权限的用户。
存储过程可以重复使用,减少数据库开发人员的工作量。
 缺点调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。
移植问题,数据库端代码当然是与数据库相关的。
但是如果是做工程型项目,基本不存在移植问题。
重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。
 触发器一、什么是触发器?触发器的使用场景有哪些?触发器是用户定义在关系表上的一类由事件驱动的特殊的存储过程。
触发器是指一段代码,当触发某个事件时,自动执行这些代码。
 使用场景可以通过数据库中的相关表实现级联更改。
实时监控某张表中的某个字段的更改而需要做出相应的处理。
例如可以生成某些业务的编号。
注意不要滥用,否则会造成数据库及应用程序的维护困难。
大家需要牢记以上基础知识点,重点是理解数据类型CHAR和VARCHAR的差异,表存储引擎InnoDB和MyISAM的区别。
二、MySQL中都有哪些触发器?在MySQL数据库中有如下六种触发器:Before InsertAfter InsertBefore UpdateAfter UpdateBefore DeleteAfter Delete常用SQL语句一、SQL语句主要分为哪几类①数据定义语言DDL(Data Ddefinition Language)CREATE,DROP,ALTER。
主要为以上操作 即对逻辑结构等有操作的,其中包括表结构,视图和索引。
②数据查询语言DQL(Data Query Language)SELECT。
这个较为好理解 即查询操作,以select关键字。
各种简单查询,连接查询等 都属于DQL。
 ③数据操纵语言DML(Data Manipulation Language)INSERT,UPDATE,DELETE。
主要为以上操作 即对数据进行操作的,对应上面所说的查询操作 DQL与DML共同构建了多数初级程序员常用的增删改查操作。
而查询是较为特殊的一种 被划分到DQL中。
 ④数据控制功能DCL(Data Control Language)GRANT,REVOKE,COMMIT,ROLLBACK。
主要为以上操作 即对数据库安全性完整性等有操作的,可以简单的理解为权限控制等。
 二、超键、候选键、主键、外键分别是什么?①超键:在关系中能唯一标识元组的属性集称为关系模式的超键。
一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。
超键包含候选键和主键。
②候选键:是最小超键,即没有冗余元素的超键。
③主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。
一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。
④外键:在一个表中存在的另一个表的主键称此表的外键。
三、SQL 约束有哪几种? NOT NULL: 用于控制字段的内容一定不能为空(NULL)。
UNIQUE: 控件字段内容不能重复,一个表允许有多个 Unique 约束。
PRIMARY KEY: 也是用于控件字段内容不能重复,但它在一个表只允许出现一个。
FOREIGN KEY: 用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
CHECK: 用于控制字段的值范围。
四、六种关联查询交叉连接(CROSS JOIN)内连接(INNER JOIN)外连接(LEFT JOIN/RIGHT JOIN)联合查询(UNION与UNION ALL)全连接(FULL JOIN)交叉连接(CROSS JOIN)SELECT * FROM A,B(,C)或者SELECT * FROM A CROSS JOIN B (CROSS JOIN C)#没有任何关联条件,结果是笛卡尔积,结果集会很大,没有意义,很少使用内连接(INNER JOIN)SELECT * FROM A,B WHERE A.id=B.id或者SELECT * FROM A INNER JOIN B ON A.id=B.id多表中同时符合某种条件的数据记录的集合,INNER JOIN可以缩写为JOIN1.内连接分为三类等值连接:ON A.id=B.id不等值连接:ON A.id > B.id自连接:SELECT * FROM A T1 INNER JOIN A T2 ON T1.id=T2.pid2.外连接(LEFT JOIN/RIGHT JOIN)左外连接:LEFT OUTER JOIN, 以左表为主,先查询出左表,按照ON后的关联条件匹配右表,没有匹配到的用NULL填充,可以简写成LEFT JOIN右外连接:RIGHT OUTER JOIN, 以右表为主,先查询出右表,按照ON后的关联条件匹配左表,没有匹配到的用NULL填充,可以简写成RIGHT JOIN3.联合查询(UNION与UNION ALL)SELECT * FROM A UNION SELECT * FROM B UNION ...就是把多个结果集集中在一起,UNION前的结果为基准,需要注意的是联合查询的列数要相等,相同的记录行会合并如果使用UNION ALL,不会合并重复的记录行效率 UNION 高于 UNION ALL4.全连接(FULL JOIN)MySQL不支持全连接可以使用LEFT JOIN 和UNION和RIGHT JOIN联合使用SELECT * FROM A LEFT JOIN B ON A.id=B.id UNIONSELECT * FROM A RIGHT JOIN B ON A.id=B.id5.表连接面试题有2张表,1张R、1张S,R表有ABC三列,S表有CD两列,表中各有三条记录。
R表S表交叉连接(笛卡尔积):select r.*,s.* from r,s内连接结果:select r.*,s.* from r inner join s on r.c=s.c左连接结果:select r.*,s.* from r left join s on r.c=s.c右连接结果:select r.*,s.* from r right join s on r.c=s.c全表连接的结果(MySql不支持,Oracle支持):select r.*,s.* from r full join s on r.c=s.c五、什么是子查询?条件:一条SQL语句的查询结果做为另一条查询语句的条件或查询结果嵌套:多条SQL语句嵌套使用,内部的SQL查询语句称为子查询。
 六、子查询的三种情况1.子查询是单行单列的情况:结果集是一个值,父查询使用:=、 <、 > 等运算符-- 查询工资最高的员工是谁?select  * from employee where salary=(select max(salary) from employee);2.子查询是多行单列的情况:结果集类似于一个数组,父查询使用:in 运算符-- 查询工资最高的员工是谁?select  * from employee where salary=(select max(salary) from employee);3.子查询是多行多列的情况:结果集类似于一张虚拟表,不能用于where条件,用于select子句中做为子表-- 1) 查询出2011年以后入职的员工信息-- 2) 查询所有的部门信息,与上面的虚拟表中的信息比对,找出所有部门ID相等的员工。
select * from dept d,  (select * from employee where join_date > '2011-1-1') e where e.dept_id =  d.id;     -- 使用表连接:select d.*, e.* from  dept d inner join employee e on d.id = e.dept_id where e.join_date >  '2011-1-1'  七、mysql中 in 和 exists 区别mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询。
一直大家都认为exists比in语句的效率要高,这种说法其实是不准确的。
这个是要区分环境的。
如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。
not in 和not exists:如果查询语句使用了not in,那么内外表都进行全表扫描,没有用到索引;而not extsts的子查询依然能用到表上的索引。
所以无论那个表大,用not exists都比not in要快。
八、varchar与char的区别char的特点char表示定长字符串,长度是固定的;如果插入数据的长度小于char的固定长度时,则用空格填充;因为长度固定,所以存取速度要比varchar快很多,甚至能快50%,但正因为其长度固定,所以会占据多余的空间,是空间换时间的做法;对于char来说,最多能存放的字符个数为255,和编码无关 varchar的特 varchar表示可变长字符串,长度是可变的;插入的数据是多长,就按照多长来存储;varchar在存取方面与char相反,它存取慢,因为长度不固定,但正因如此,不占据多余的空间,是时间换空间的做法; 对于varchar来说,最多能存放的字符个数为65532 总之,结合性能角度(char更快)和节省磁盘空间角度(varchar更小),具体情况还需具体来设计数据库才是妥当的做法。
 九、varchar(50)中50的涵义最多存放50个字符,varchar(50)和(200)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为order by col采用fixed_length计算col长度(memory引擎也一样)。
在早期 MySQL 版本中, 50 代表字节数,现在代表字符数。
 十、int(20)中20的涵义是指显示字符的长度。
20表示最大显示宽度为20,但仍占4字节存储,存储范围不变;不影响内部存储,只是影响带 zerofill 定义的 int 时,前面补多少个 0,易于报表展示。
 十一、mysql为什么这么设计对大多数应用没有意义,只是规定一些工具用来显示字符的个数;int(1)和int(20)存储和计算均一样; 十二、mysql中int(10)和char(10)以及varchar(10)的区别1.int(10)的10表示显示的数据的长度,不是存储数据的大小;chart(10)和varchar(10)的10表示存储数据的大小,即表示存储多少个字符。
int(10) 10位的数据长度 9999999999,占32个字节,int型4位char(10) 10位固定字符串,不足补空格 最多10个字符varchar(10) 10位可变字符串,不足补空格 最多10个字符 2.char(10)表示存储定长的10个字符,不足10个就用空格补齐,占用更多的存储空间。
3.varchar(10)表示存储10个变长的字符,存储多少个就是多少个,空格也按一个字符存储,这一点是和char(10)的空格不同的,char(10)的空格表示占位不算一个字符。
 十三、FLOAT和DOUBLE的区别是什么?FLOAT类型数据可以存储至多8位十进制数,并在内存中占4字节。
DOUBLE类型数据可以存储至多18位十进制数,并在内存中占8字节。
十四、drop、delete与truncate的区别?三者都表示删除,但是三者有一些差别:因此,在不再需要一张表的时候,用drop;在想删除部分数据行时候,用delete;在保留表而删除所有数据的时候用truncate。
 十五、UNION与UNION ALL的区别?如果使用UNION ALL,不会合并重复的记录行效率 UNION 高于 UNION ALL

返回列表
上一篇:
下一篇: