面试体复习

事物的基本特性:
原子性:一个事务必须视为不可分割的最小单元.整个事务的所有操作要么全部提交成功,要么回滚失败.
一致性: 数据库总数从一个以执行转换到另外一个一致性的状态.
间隔型: 一个事务所作的修改在最总提交前,对其他事务是不可见的.
持久性:一旦事务提交,则其所作的修改就会永久保存,计时系统崩溃,修改的数据也不会丢失.

默认的间隔级别:
读未提交:一个是事务可以读取另一个未提交事物的数据.最低级别,任何情况都无法改变,读已提交,一个事务要等待另一个事务提交后才能读取数据.可以避免脏读的放生.可重复读,就是在开始读取数据时,不在允许修改,可避免脏读,不可重复读得发生.
串行: 是最高事务隔离级别,在该级别下,事务串行顺序化执行,
可以避免脏读,不可重复读,幻读.但是这种事务隔离界别效率低下.比较耗数据库性能.

脏读: 事务A读取了事务B更新的数据.然后B又回滚.那么A读的就是张数据,
不可重复读: 事务A在多次读取同一数据,事务B在事务A多次读取的过程中对数据做了更新,并提交,导致事务A多次读的数据不一致.
幻读:解决了不重复读保证了同一个事务里,查询到结果都实时伍德开始状态.

数据表的类型: MyIASM InnoDB;

数据库的搜索引擎:
1、InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。这些功能增加了多用户部署和性能。在SQL查询中,可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合

MyISAM存储引擎

MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事物。

MEMORY存储引擎

MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。

如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择

如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率

如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果

如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive

使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能

innodb引擎的4大特性答:插入缓冲(insert buffer);二次写(double write);自适应哈希索引(ahi);预读(read ahead)

InnoDB引擎的行锁是通过加在什么上实现的?答:基于索引;

Mysql中的myisam与innodb的区别,至少五点InooDB支持事务,而MyISAM不支持事务;InnoDB支持行级锁,而MyISAM支持表级锁;InnoDB支持MVCC,而MyISAM不支持;InnoDB支持外键,而MyISAM不支持;InnoDB不支持全文索引,而MyISAM支持;InnoDB不能通过直接拷贝表文件的方法拷贝表到另外一台机器, myisam 支持;InnoDB表支持多种行格式, myisam 不支持;InnoDB是索引组织表, myisam 是堆表;
myisam与innodb select count(*)哪个更快,为什么答:myisam更快,因为myisam内部维护了一个计数器,可以直接调取。

数据库三大范式第一范式:数据库表中的字段都是单一属性的,不可再分(保持数据的原子性);第二范式:第二范式必须符合第一范式,非主属性必须完全依赖于主键。第三范式:在满足第二范式的基础上,在实体中不存在其他实体中的非主键属性,传递函数依赖于主键属性,确保数据表中的每一列数据都和主键直接相关,而不能间接相关(表中字段[非主键]不存在对主键的传递依

说一说你能想到的sql语句优化,至少五种避免select *,将需要查找的字段列出来;使用连接(join)来代替子查询;拆分大的delete或insert语句;使用limit对查询结果的记录进行限定;用 exists 代替 in 是一个好的选择;用Where子句替换HAVING 子句 因为HAVING 只会在检索出所有记录之后才对结果集进行过滤;不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引尽量避免在where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描;尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描;尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描;

说一说你能想到的表结构优化,至少五种永远为每张表设置一个ID (所有建表的时候不设置主键的程序猿都应该被辞退);选择正确的存储引擎 ;使用可存下数据的最小的数据类型,整型 < date,time < char,varchar < blob;使用简单的数据类型,整型比字符处理开销更小,因为字符串的比较更复杂。如,int类型存储时间类型,bigint类型转ip函数;使用合理的字段属性长度,固定长度的表会更快。使用enum、char而不是varchar;尽可能使用not null定义字段(给空字段设置默认值);尽量少用text;给频繁使用和查询的字段建立合适的索引;

说几个mysql中你常用的函数答:sum、count 、avg、min、max
说几个你除了增删改查之外在mysql中常用的命令答:Explain(可以帮助选择更好的索引和写出更优化的查询语句。)、describe(使用describe语句显示mysql表结构)、show、truncate(当你不再需要该表时, 用 drop;当你仍要保留该表,但要删除所有记录时, 用 truncate;当你要删除部分记录时(always with a WHERE clause), 用 delete.)

说几个除了增删改查之外常用的关键字答:distinct、limit、offset、order by、union、union all、between、group by;

什么是存储过程?用什么来调用?答:存储过程是一个预编译的SQL 语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL ,使用存储过程比单纯SQL 语句执行要快。可以用一个命令对象来调用存储过程。

什么是触发器?触发器的作用?答:触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

触发器也是SQL语句集,两者唯一的区别是触发器不能用EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。

某一表进行诸如UPDATE、INSERT、DELETE这些操作时,SQLSERVER就会自动执行触发器所定义的SQL语句

SQL主要的索引类型普通索引:是最基本的索引,它没有任何限制;唯一索引:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一;主键索引:是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值;组合索引:指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合;全文索引:主要用来查找文本中的关键字,而不是直接与索引中的值相比较,mysql中MyISAM支持全文索引而InnoDB不支持;

命令: desc 查看表结构
show charset; 查看字符
show create table "stdent";查看创建过程
改变表中列的字符集
alter table score change score score varchar(50) character utf8;



create table `Teacher` (
`Tno` varchar(20) not null COMMENT '教工编号',
`Tname` varchar(20) not null COMMENT '教工姓名',
`Tsex` varchar(20) not null COMMENT '教工性别',
`Tbirthday` datetime null COMMENT '教工出生日期',
`Prof` varchar(20) null COMMENT '职称',
`Depart` varchar(20) null COMMENT '教工所在部门'
) default charset = utf8;

第八题 以Cno升序、Degree降序查询Score表的所有记录。
select * from `Score` order by Cno asc,Degree desc ;


查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。

selct agv(Degreee) from Score where con like "3%" group by cno bving count(Cno)>4;
查询所有学生的Sname、Cname和Degree列。

左连接LEFT JOIN的含义就是求两个表的交集外加左表剩下的数据。

同理右连接RIGHT JOIN就是求两个表的交集外加右表剩下的数据

SELECT * FROM t_blog RIGHT JOIN t_type ON t_blog.typeId=t_type.id;

外连接就是求两个集合的并集。

SELECT * FROM t_blog LEFT JOIN t_type ON t_blog.typeId=t_type.id
UNION
SELECT * FROM t_blog RIGHT JOIN t_type ON t_blog.typeId=t_type.id;
当模式设计对联接表的列采用了相同的命名样式时,就可以使用 USING 语法来简化 ON 语法,

自然连接就是USING子句的简化版,它找出两个表中相同的列作为连接条件进行连接。有左自然连接,右自然连接和普通自然连接之分


具体命令格式 SELECT 列名1, 列名2 FORM 表名1,表名2 WHERE 表名1.列名1=表名2.列名2

导致SQL执行慢的原因:
1.硬件问题。如网络速度慢,内存不足,I/O吞吐量小,磁盘空间满了等。
2.没有索引或者索引失效。
3.数据过多(分库分表)
4.服务器调优及各个参数设置(调整my.cnf)


MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。我们可以简单理解为:快速查找排好序的一种数据结构。Mysql索引主要有两种结构:B+Tree索引和Hash索引。我们平常所说的索引,如果没有特别指明,一般都是指B树结构组织的索引(B+Tree索引)。

CREATE TABLE `user_info` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL DEFAULT '',
`age` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name_index` (`name`)
)ENGINE = InnoDB DEFAULT CHARSET = utf8;

如果要查询不重复的记录,有时候可以用group by :

select id,name from user group by name;

引跟目录的作用类似,在数据库表记录中,利用索引,可以快速过滤查找到数据记录。
查找字段中重复的数据:
student表 name字段 score 重复的名字:

先用group by 对name 进行分组, 同时使用cout(*) 进行统计 再用having 来过滤大于1 的

select name ,count(*) As sunCont from student group by name haveing sumCount>1;

selct * from student order by score desc limit 1;


selct stockcode from Trade_info where data = data order by sum desc linit 5;


猜你喜欢

转载自www.cnblogs.com/countryboy666/p/10982930.html