MySQL面试题-数据库基础知识

1 . 使用数据库的原因:高效数据管理、查询能力,持久化保存。

内存存储:速度快,但断电丢失数据。

文件存储:可持久保存,但查询复杂,性能瓶颈。

数据库存储:SQL高效查询,管理方便,数据安全。

2 . SQL定义:结构化查询语言。

作用:存取、查询、更新、管理关系数据库。

3 . MySQL定义:关系型数据库管理系统。

特点:开源免费,扩展方便,性能优越,广泛应用。

4 . 数据库三大范式:
1 NF:列不可再分。

2 NF:非主键列完全依赖主键。

3 NF:非主键列不传递依赖主键。

5 . MySQL权限表:
user:全局用户权限。

db:数据库权限。

table_priv:表级权限。

columns_priv:列级权限。

host:主机连接限制。

6 . MySQL binlog格式:
statement:记录SQL语句,节约IO,但可能数据不一致。

row:记录行变化,保证一致性,但日志量大。

mixed:折中方案,结合statement和row,优化复杂。

实操提醒:根据业务需求选择合适的binlog格式。

SQL语句面试题

这个函数创建得有点问题。
首先,返回类型是varchar(8 000),但实际操作中你并没有处理数据长度,可能会超出预期。
其次,我看看哪里出错了。

1 . 你定义的变量@a2 和@Newvarhar类型对不上,@Newvarhar应该是varchar(8 000),但你在循环中用@a2 来更新它,这会导致数据丢失。
2 . 在循环中,你应该每次都从@a2 获取数据,然后拼接到@Newvarhar,而不是更新@a2
我来给你改改:
sql create function F_Getvarchar(@a1 int) returns varchar(8 000) as begin declare @a2 varchar(1 00), @Newvarhar varchar(8 000) set @Newvarhar = ''
declare cur_getvarchar cursor for select a2 from a where a1 = @a1 order by a2
open cur_getvarchar fetch next from cur_getvarchar into @a2 while @@fetch_status = 0 begin set @Newvarhar = @Newvarhar + @a2 fetch next from cur_getvarchar into @a2 end
close cur_getvarchar deallocate cur_getvarchar
return @Newvarhar end
现在,每次循环都会从@a2 获取数据,然后拼接到@Newvarhar。
这样,即使数据很多,也能正确处理。
你自己看,这个函数现在应该能正常工作了。