数据库设计三范式是什么?
1范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;(只要是关系型数据库都满足1NF)
2范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
3范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。没有冗余的数据库设计可以做到
但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据,具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑,降低范式就是增加字段,允许冗余。
SQL 语句有哪些分类?
-
DDL:数据定义语言(create alter drop)
-
DML:数据操作语句(insert update delete)
-
DTL:数据事务语句(commit collback savapoint)
-
DCL:数据控制语句(grant revoke)
数据库删除操作中的 delete、drop、 truncate 区别在哪?
-
当不再需要该表时可以用 drop 来删除表;
-
当仍要保留该表,但要删除所有记录时, 用 truncate来删除表中记录。
-
当要删除部分记录时(一般来说有 WHERE 子句约束) 用 delete来删除表中部分记录。
什么是MySql视图?
视图是虚拟表,并不储存数据,只包含定义时的语句的动态数据。
语法:
CREATE[OR REPLACE][ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}][DEFINER = user][SQL SECURITY { DEFINER | INVOKER }]VIEW view_name [(column_list)]AS select_statement[WITH [CASCADED | LOCAL] CHECK OPTION]
参数说明:
-
OR REPLACE:如果视图存在,则替换已有视图。
-
ALGORITHM:视图选择算法,默认算法是 UNDEFINED(未定义的)由 MySQL自动选择要使用的算法。
-
DEFINER:指定视图创建者或定义者,如果不指定该选项,则创建视图的用户就是定义者。
-
SQL SECURITY:SQL安全性,默认为DEFINER。
-
select_statement:创建视图的 SELECT语句,可以从基表或其他视图中选择数据。
-
WITH CHECK OPTION:表示视图在更新时保证约束,默认是 CASCADED。
使用 视图有何优点?
-
操作简单方便。视图用户完全不需要关心视图对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
-
数据更加安全。视图用户只能访问视图中的结果集,通过视图可以把对表的访问权限限制在某些行和列上面。
-
数据隔离。屏蔽了源表结构变化对用户带来的影响,源表结构变化视图结构不变。
MySql服务默认端口号是多少 ?
默认端口是 3306
查看端口命令:> show variables like 'port';
用 DISTINCT 过滤 多列的规则?
DISTINCT 用于对选择的数据去重,单列用法容易理解。比如有如下数据表 tamb
:
name numberTencent 1Alibaba 2Bytedance 3Meituan 3
查询语句:SELECT DISTINCT name FROM table tamb
结果如下:
name
Tencent
Alibaba
Bytedance
Meituan
如果要求按 number
列去重同时显示 name
,你可能会写出查询语句:
SELECT DISTINCT number, name FROM table tamb
多参数 DISTINCT 去重规则是:把 DISTINCT 之后的所有参数当做一个过滤条件,也就是说会对 (number, name)
整体去重处理,只有当这个组合不同才会去重,结果如下:
number name1 Tencent2 Alibaba3 Bytedance3 Meituan
从结果来看好像并没有达到我们想要的去重的效果,那要怎么实现「按 number
列去重同时显示 name
」呢?可以用 Group By
语句:
SELECT number, name FROM table tamb GROUP BY number
输出如下,正是我们想要的效果:
number name1 Tencent2 Alibaba3 Bytedance
什么是存储过程?
一条或多条sql语句集合,有以下一些特点:
-
存储过程能实现较快的执行速度。
-
存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
-
存储过程可被作为一种安全机制来充分利用。
-
存储过程能够减少网络流量
delimiter 分隔符
create procedure|proc proc_name()
beginsql语句
end 分隔符
delimiter ; --还原分隔符,为了不影响后面的语句的使用
--默认的分隔符是;但是为了能在整个存储过程中重用,因此一般需要自定义分隔符(除\外)show procedure status like ""; --查询存储过程,可以不适用like进行过滤
drop procedure if exists;--删除存储过程
存储过程和函数好像差不多,说说他们有什么区别?
存储过程和函数是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。
相同点
-
存储过程和函数都是为了可重复的执行操作数据库的 SQL 语句的集合。
-
存储过程和函数都是一次编译后缓存起来,下次使用就直接命中已经编译好的 sql 语句,减少网络交互提高了效率。
不同点
-
标识符不同,函数的标识符是 function,存储过程是 procedure。
-
函数返回单个值或者表对象,而存储过程没有返回值,但是可以通过OUT参数返回多个值。
-
函数限制比较多,比如不能用临时表,只能用表变量,一些函数都不可用等,而存储过程的限制相对就比较少。
-
一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强
-
函数的参数只能是 IN 类型,存储过程的参数可以是
IN OUT INOUT
三种类型。 -
存储函数使用 select 调用,存储过程需要使用 call 调用。