mysql面试中的坑

手机号存成什么类型,长度多长?

char(11)

字符集是哪个?需要注释吗?

由字符组成的集合则成为字符集,字符集由于包含字符的多少与异同而形成了各种不同的字符集
需要 不然我怎么知道是什么编码的

工作中使用存储过程、视图、触发器、Event?

视图
视图只是一种逻辑对象,是一种虚拟表,它并不是物理对象,因为视图不占物理存储空间,在视图中被查询的表称为视图的基表,大多数的select语句都可以用在创建视图中
优点:集中用户使用的数据,掩码数据的复杂性,简化权限管理以及为向其他应用程序输出而重新组织数据等等。

create view view_name [(column[,...n])]
     with encryption
     as select_statement
     with check option

存储过程
存储过程是存储在服务器上的一组预编译的Transact-SQL语句,存储过程是一种封装重复任务操作的一种方法,支持用户提供的变量,具有强大的编程功能
优点:与其他应用程序共享应用程序的逻辑,因此确保一致的数据访问和操纵。提供一种安全机制加速存储过程的执行,提高系统的性能减少网络交通
存储过程的类型:系统存储过程、本地存储过程、临时存储过程、远程存储过程和扩展存储过程。不同类型的存储过程具有不同的作用。
执行存储过程有两种方法:
方法一:直接执行存储过程,就是调用execute语句来执行存储过程
方法二:在insert语句中执行存储过程

create procedure procedure_name
     @parameter data_type
       with{recompile|encryption|recompile,encryption}
          as sql_statement

触发器
当有操作影响到触发器保护的数据时,触发器就自动发生,因此,触发器是在特定表上进行定义的,该表也称为触发器表,也是一种特殊类型的存储过程,与存储过程的区别:存储过程可以由用户直接调用执行,但是触发器不能被直接调用执行。
触发器的类型:insert类型,update类型,delete类型。
工作原理:
(insert)当向表中插入数据时,insert触发器触发执行,当insert触发器触发时,新的记录增加到触发器表中和inserted表中。触发器可以检查inserted表,来确定该触发器的操作是否应该执行和如何执行,在inserted表中的那些记录,总是触发器表中一行或多行记录的冗余;
(delete)当触发一个delete触发器时,被删除的记录放在一个特殊的deleted表中。deleted表是一个逻辑表,用来保存已经从表中删除的记录;
(update)修改一条记录就等于插入一条新记录和删除一条旧记录,当在某一个update触发器表的上面修改一条记录时,表中原来的记录移动到deleted表中,修改过的记录插入到了inserted表中,触发器可以检查deleted表和inserted表以及被修改的表。
语法:

 create trigger trigger_name
    on {table |view}
    with encryprion
    {for|after|instead of}{[delete][,][insert][,][update]}
    as sql _statement

主外键做什么,实际中你们用吗?

主键:是能够唯一的标识一组数据的数据元素;比如说:学号,姓名,年龄,性别,课程号课程中学号是唯一的,所以可以设它为主键;
外键:一组数据的主键是另一组数据的的元素;
比如说:课程名,课程号,任课老师,这组中可以吧课程号设为主键
这时,课程号是上一组的元素,下一组的主键,就可以称它为外键;

索引怎么用?

索引可以加快数据库访问的效率,相当于给原来的记录作一个key-value的结构
数据库里面索引是用树来做的,B+数
搜索中也用到了索引
索引分为:
普通索引
唯一索引
聚集索引
主键索引
联合索引
添加索引命令
ALTER TABLE <表名> ADD INDEX (<字段>);

存储过程用吗?

我觉得存储过程最大的优势,应该在于它可以将很多复杂的处理放到服务器端来处理,
比如,你要进行很复杂的业务处理,写一条单纯的sql文不行,这个时候,如果你通过java或其他程序来处理的话,可能要访问很多次数据库,然后进行数据整合啊,业务判断啊,等等一系列处理,那么这样的处理过程肯定是很花时间的,这个时候如果利用存储过程,比如把这些数据性的业务处理全部放到存储过程中来做,那么交由服务器来处理,肯定要比程序快的多,而且以后维护这部分东西,也只需要修改这个存储过程就可以,而不需要去修改程序,这样也变的容易维护!
但是如果是很简单的东西,那么把所有的sql都不要了,都放到服务器的存储过程中,也许某天,你的服务器就挂掉了!
所以必须从多方面来考虑,到底应该有那种方式来处理,不能单纯的只考虑能不能实现这一点,这样sql确实没必要了,但是这也是不现实的!

什么时候用TEXT、BLOB类型?大文件或者大照片怎么存的?

在保存较大文本时,
通常会选择使用 TEXT 或者 BLOB,二者之间的主要差别是 BLOB 能用来保存二进制数据,比
如照片;而 TEXT 只能保存字符数据,比如一篇文章或者日记。TEXT 和 BLOB 中有分别包括
TEXT、MEDIUMTEXT、LONGTEXT 和 BLOB、MEDIUMBLOB、LONGBLOB3 种不同的类型,它们
之间的主要区别是存储文本长度不同和存储字节不同,用户应该根据实际情况选择能够满足
需求的最小存储类型。
BLOB 和 TEXT 值会引起一些性能问题,特别是在执行了大量的删除操作时.
可以使用合成的(Synthetic)索引来提高大文本字段(BLOB 或 TEXT)的查询性能;
如果散列算法生成的字符串带有尾部空格,就不要把它们存储在 CHAR 或 VARCHAR 列中,它们会受到尾部空格去除的影响。合
成的散列索引对于那些 BLOB 或 TEXT 数据列特别有用。用散列标识符值查找的速度比搜索BLOB列本身的速度快很多。

文件保存到本地,存储他的地址

你们使用什么引擎?

①Mylsam 不支持事务,适用于选择密集型,插入密集型,mysql默认的引擎
②innodb 适用于更新密集型,支持事务,自动灾难恢复,行级锁,外键约束
③memory出发点是速度,采用逻辑存储介质是内存
④merge 一组myisam 表的集合
我们使用2

int(11),是什么意思,varchar(20)是什么意思?

在mysql5.x版本的数据库中:
int类型数据的字节大小是固定的4个字节;
但是int(5)和int(11)区别在于,显示的数据位数一个是5位一个是11位,在开启zerofill(填充零)情况下,若int(5)存储的数字长度是小于5的则会在不足位数的前面补充0,但是如果int(5)中存储的数字长度大于5位的话,则按照实际存储的显示(数据大小在int类型的4个字节范围内即可),也就是说int(M)的M不代表数据的长度;
varchar(20)中的20表示的是varchar数据的数据长度最大是20,超过则数据库不会存储;
总结: int(M) M表示的不是数据的最大长度,只是数据宽度,并不影响存储多少位长度的数据;

varchar(M) M表示的是varchar类型数据在数据库中存储的最大长度,超过则不存;

删除命令你知道哪些?

drop table
drop 是直接删除表信息,速度最快,但是无法找回数据
例如删除 user 表:
drop table user;
truncate (table)
truncate 是删除表数据,不删除表的结构,速度排第二,但不能与where一起使用
例如删除 user 表:
truncate table user;
delete from
delete 是删除表中的数据,不删除表结构,速度最慢,但可以与where连用,可以删除指定的行
例如删除user表的所有数据
delete from user;
删除user表的指定记录
delete from user where user_id = 1;
三种方式的区别

相同点

truncate和不带where子句的delete,drop都会删除表内的数据;
drop,truncate都是DDL语句(数据定义语言),执行后会自动提交;

不同点

语句类型:delete语句是数据库操作语言(DML),truncate,drop是数据库定义语言(DDL);
效率:一般来说 drop > truncate> delete;
是否删除表结构:truncate和delete 只删除数据不删除表结构,truncate 删除后将重建索引(新插入数据后id从0开始记起),而 delete不会删除索引 (新插入的数据将在删除数据的索引后继续增加),drop语句将删除表的结构包括依赖的约束,触发器,索引等;
安全性:drop和truncate删除时不记录MySQL日志,不能回滚,delete删除会记录MySQL日志,可以回滚;
返回值:delete 操作后返回删除的记录数,而 truncate 返回的是0或者-1(成功则返回0,失败返回-1);
小知识

delete 与 delete from 区别

如果只针对一张表进行删除,则效果一样;如果需要联合其他表,则需要使用from
delete tb1 from tb1 m where id in (select id from tb2);
用法总结
希望删除表结构时,用 drop;
希望保留表结构,但要删除所有记录时, 用 truncate;
希望保留表结构,但要删除部分记录时, 用 delete。

你了解事务吗?

事务是作为单个逻辑工作单元执行的一系列操作。可以是一条SQL语句也可以是多条SQL语句。
事务具有四个特性
原子性:不可分隔、成则具成、败则具败。
一致性:事务在完成时,必须使所有的数据都保持一致状态
隔离性:独立的执行互不干扰。由并发事务所作的修改必须与任何其他并发事务所作的修改隔离。
持久性:事务务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
应用程序主要通过指定事务启动和结束的时间来控制事务。

你可能感兴趣的:(笔记,mysql,面试,数据库)