您的位置:首页 > 职场人生

数据相关面试题目

2017-05-12 16:25 267 查看

1. 视图的作用,视图可以更改?

视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询,它是不包含任何列和数据。视图可以简化复杂SQL操作,隐藏具体的细节,保护数据。视图不可以被索引,它主要用于简化检索,保护数据,并不用于更新,并且大部分的视图都不可以更新。

2. drop、delete与truncate的区别

drop直接删掉表 truncate删除表中数据,再插入时自增长id又从1开始 delete删除表中数据,可以加where字句。

(1)一般而言,drop > truncate > delete

(2)应用范围。truncate 只能对table;delete可以是table和view

(3)truncate 和delete只删除数据,而drop则删除整个表(结构和数据)

应用场景:

(1)不再需要一张表的时候,用drop

(2)想删除部分数据行时候,用delete,并且带上where子句

(3)保留表而删除所有数据的时候用truncate

3. 索引的工作原理及种类

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。索引就是加快检索表中数据的方法。类似于书籍的索引。

给表设置索引会为数据库增加存储空间,在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。

(1)在经常需要搜索的列上添加索引

(2)在主键的列上,该列应该为唯一性。

(3)经常用的连接列,主要是一些外键,加快连接的速度。

(4)对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。

(5)当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。

唯一索引--唯一索引是不允许其中任何两行具有相同索引值的索引。

主键索引–数据库表经常有一列或列组合,其值唯一标识表中的每一行。

聚集索引–在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。

4. 连接的分类

查询分析器中执行:

--建表table1,table2:
create table table1(id int,name varchar(10))
create table table2(id int,score int)
insert into table1 select 1,'lee'
insert into table1 select 2,'zhang'
insert into table1 select 4,'wang'
insert into table2 select 1,90
insert into table2 select 2,100
insert into table2 select 3,70
如表
-------------------------------------------------
table1 | table2 |
-------------------------------------------------
id name |id score |
1 lee |1 90|
2 zhang| 2 100|
4 wang| 3 70|
-------------------------------------------------


以下均在查询分析器中执行

一、外连接

1.概念:包括左向外联接、右向外联接或完整外部联接

2.左连接:left join 或 left outer join

(1)左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。

(2)sql 语句

select * from table1 left join table2 on table1.id=table2.id
-------------结果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
4wangNULLNULL
------------------------------
注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示


3.右连接:right join 或 right outer join

(1)右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

(2)sql 语句

select * from table1 right join table2 on table1.id=table2.id
-------------结果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
NULLNULL370
注释:包含table2的所有子句,根据指定条件返回table1相应的字段,不符合的以null显示


4.完整外部联接:full join 或 full outer join

(1)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

(2)sql 语句

select * from table1 full join table2 on table1.id=table2.id
-------------结果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
4wangNULLNULL
NULLNULL370
------------------------------


二、内连接

1.概念:内联接是用比较运算符比较要联接列的值的联接

2.内连接:join 或 inner join

3.sql 语句

select * from table1 join table2 on table1.id=table2.id
-------------结果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
------------------------------
注释:只返回符合条件的table1和table2的列


4.等价(与下列执行效果相同)

A:select a.*,b.* from table1 a,table2 b where a.id=b.id
B:select * from table1 cross join table2 where table1.id=table2.id (注:cross join后加条件只能用where,不能用on)


三、交叉连接(完全)

1.概念:没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉连接产生3*3=9条记录)

2.交叉连接:cross join (不带条件where…)

3.sql语句

select * from table1 cross join table2
-------------结果-------------
idnameidscore
------------------------------
1lee190
2zhang190
4wang190
1lee2100
2zhang2100
4wang2100
1lee370
2zhang370
4wang370
------------------------------
注释:返回3*3=9条记录,即笛卡尔积


4.等价(与下列执行效果相同)

A:select * from table1,table2

1. 数据库范式

1.第一范式(1NF)

第一范式就是无重复的列。所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体。

2 第二范式(2NF)

第二范式就是非主属性非部分依赖于主关键字。第二范式(2NF)第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。

3 第三范式(3NF)

第三范式就是属性不依赖于其它非主属性。

第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。

6.数据库优化

1、SQL语句优化

1)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num is null

可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

select id from t where num=0

3)很多时候用 exists 代替 in 是一个好的选择

4)用Where子句替换having子句 因为having只会在检索出所有记录之后才对结果集进行过滤

7.mysql的varchar(N)和int(N)的含义及其与char区别

1)varchar与char的区别

varchar存储可变长字符串,小于255字节时需要1个额外字节(大于255需要2个额外字节)存储长度,最大长度为65532字节(所有列总和);

char存储定长(right padding),读取时会截断末尾空格,长度最大为255字符;

2)varchar(30)中30的涵义

最大存储30个字符。varchar(5)和varchar(200)存储hello所占空间一样,但后者在排序时会消耗更多内存。

3)int(20)中20的涵义

20表示最大显示宽度为20,但仍占4字节存储,存储范围不变;

7.游标是什么?

游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

7.事务是什么?

事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性

数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。

乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作

乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

未完待续。。。。。。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试题 数据 索引 sql