数据库常见面试题
⑴ 数据库面试题 有四个表Student表,Course表,Score表,Teacher表
1.
select 英语.学号
from Score 英语
left join
(
select 学号,课程茄早御代码,成绩
from Score where 课程代码='数学课程代码'
) as 数学
on 英语.学号=数学.学号
where 英语.课程代码='英语课程代码' and 英语.成绩>数学.成绩
2
select Student.学号,Student.姓名,AVG(成绩) as 平均成绩
from Score
left join Student on Student.学号 =Score.学号
group by Student.学号,Student.姓名
having AVG(Score.成绩)>30
3
select Student.学号,Student.姓名, ISNULL(选课_成绩.选课数睁告,0) as 选课数,ISNULL(选课_成绩.总成绩,0) as 总成绩
from Student
left join
(
select 学号, COUNT(Score.课程代码) as 选课数,SUM(Score.成绩) as 总成绩
from Score group by 学号
) as 选课_成绩
on Student.学号= 选课_成绩.学号
4
select a.学号,a.姓颤岩名 from Student as a
where a.学号 not in(
select distinct(Student.学号) as 学号
from Student
left join Score on Score.课程代码 =
(
select Course.课程代码 from Course
where Course.教师编号 =
(
select Teacher.教师编号 from Teacher
where Teacher.教师姓名='王军'
)
)
)
仅供学习参考
⑵ 数据库存储过程有哪些,面试题
sql">/*
系统存储过程很多,有些常用,有些不常用
常用:
sp_attach_db附加数据库到一个服务器中
sp_columns返回在当前环境中列的信息
sp_databases列出当前系统中的数据库
sp_configure显示或修改当前服务器的全局配置
sp_depends显示数据库对象的依赖信息
sp_executesql执行动态的T-SQL语句
sp_help报告有关数据库对象的信息
sp_helpdb返回指定数据库或全部数据库的信息
sp_helptext显示规则、默认值、存储过程、触发器、视图等的未加密的文本定义信息
sp_indexes返回指定远程表的索引信息
sp_lock返回有关锁的信息
sp_password增加或者修改指定login的口令
sp_rename更改用户创建的数据库对象名称
sp_renamedb更改数据库名称
sp_spaceused显示数据库的空间使用情况
sp_tables返回在当前环境中可以被查询的对象的列表
sp_who提供当前用户和进程的信息
不常用:
sp_addlinkedserver创建一个允许执行分布式查询的链接服务器
sp_addlinkedsrvlogin在本地服务器和远程服务器之间创建login帐户的映射关系
sp_addlogin创建一个新的login帐户
sp_add_agent_parameter在代理文件中增加一个参数
sp_add_agent_profile为复制代理增加一个代理文件
sp_add_alert创建一个警报
sp_add_category在服务器上,增加一种作业、警报或者操作员的特定分类
sp_add_data_file_recover_suspect_db当数据库复原不能完成时,向文件组增加一个数据文件
sp_add_file_recover_suspect_db对于复原有问题的数据库增加一个文件
sp_add_job增加一个sqlserveragent可以执行的作业
sp_add_jobschele为作业创建调度
sp_add_jobserver把指定的作业增加到指定服务器上
sp_add_jobstep在作业中增加一步或一个操作
sp_add_log_file_recover_suspect_db当数据库复原不能完成时,向文件组增加一个日志文件
sp_add_notification为警报创建一个通知
sp_add_operator为警报或者作业创建一个操作员
sp_add_targetservergroup增加指定的服务器组
sp_add_targetsvrgrp_member在指定的目标服务器组增加一个目标服务器
sp_addalias在数据库中为login帐户增加一个别名
sp_addapprole在数据库中增加一个特殊的应用程序角色
sp_addarticle创建文章,并把该文章添加到出版物中
sp_adddistpublisher创建一个使用本地分布服务器的出版服务器
sp_adddistributiondb在分布服务器上创建一个新的distribution数据库
sp_adddistributor增加一个分布服务器
sp_addextendedproc在系统中增加一个扩展存储过程
sp_addgroup在当前数据库中增加一个组
sp_addmergearticle为一个已有的合并出版物创建一个文章
sp_addmergefilter为了连接另外一个表,创建一个合并过滤器
sp_addmergepublication创建一个新的合并出版物
sp_addmergepullsubscription增加一个拉回类型的订阅物
sp_addmergepullsubscription_agent在订阅服务器上,为合并拉回订阅物创建一个代理
sp_addmergesubscription创建一个推出或者拉回类型的订阅物
sp_addmessage在系统中增加一个新的错误消息
sp_addpublicaton创建一个快照复制或者事务复制出版物
sp_addpublicaton_snapshot创建一个快照代理
sp_addpullsusscription在当前订阅服务器的数据库中增加一个拉回或者匿名订阅物
sp_addpullsusscription_agent在订阅服务器的数据库中增加一个新的代理
sp_addremotelogin在本地服务器上增加一个远程login帐户,允许执行远程存储过程调用
sp_addrole在当前数据库中增加一个角色
sp_addrolemember为当前数据库中的一个角色增加一个安全性帐户
sp_addserver添加一个远程或者本地服务器
sp_addsrvrolemember为固定的服务器角色增加一个成员
sp_addsubscriber增加一个新的订阅服务器
sp_addsubscriber_schele为分布代理和合并代理增加一个调度
sp_addsubscription订阅文章并且设置订阅服务器的状态
sp_addsynctrigers在订阅服务器上创建一个立即修改触发器
sp_addtabletocontents在合并跟踪表中插入一个参考
sp_addtype创建一个用户定义的数据类型
sp_admpdevice增加一个备份设备
sp_adser在当前数据库中为一个新用户增加一个安全性帐户
sp_altermessage修改错误信息的状态
sp_addly_job_to_targets把作业应用到一个或者多个目标服务器
sp_approlepassword在当前数据库中改变应用程序角色的口令
sp_aarticle_validation为指定的文章初始化确认请求
sp_aarticlecolumn指定在文章中使用的列
sp_aarticlefilter创建一个用于水平过滤数据的过滤器
sp_articleview当表被过滤时,为文章创建一个同步化对象
sp_attach_single_file_db在当前服务器中,附加一个只有一个数据文件的数据库
sp_aautostats对于一个指定的索引或统计,自动显示updatestatistics的状态
sp_bindefault把默认值绑定到列或用户定义的数据类型上
sp_bindrule把规则绑定到列或用户定义的数据类型上
sp_bindsession绑定或解除绑定与实例中的其它事务的连接
sp_browsereplcmds在分布数据库中返回一种可读格式的结果集
sp_catalogs返回指定连接服务器中的系统目录列表,在本地服务器中等价于数据库列表
sp_certify_removable确认在可移动介质上用于分布的数据库是否正确配置
sp_change_agent_parameter修改复制代理配置使用的参数
sp_change_agent_profile修改复制代理配置使用的配置参数
sp_change_users_login修改login与当前数据库中用户之间的关系
sp_changearticle改变文章的属性
sp_changedbowner改变当前数据库的所有者
sp_changedistpublisher改变分布出版服务器的属性
sp_changedistributor_password改变分布服务器的口令
sp_changedistributor_property改变分布服务器的属性
sp_changedistribtutiondb改变分布数据库的属性
sp_changegroup改变安全性帐户所属的角色
sp_changemergearticle改变合并文章的属性
sp_changemergefilter改变一些合并过滤器的属性
sp_changemergepublication改变合并出版物的属性
sp_changemergepullsubscription改变合并拉回出版物的属性
sp_changemergesubscription改变合并的推出或者拉回出版物的属性
sp_changeobjectowner改变对象的所有者
sp_changepublication改变出版物的属性
sp_changesubscriber改变用于订阅服务器的选项
sp_changesubscriber_schele改变用于分布式代理和事务代理的订阅服务器的调度
sp_changesubstatus改变订阅服务器的状态
sp_column_privileges返回列的权限信息
sp_column_privileges_ex返回在链接服务器上指定表的列的权限信息
sp_columns_ex返回在链接服务器上列的信息
sp_create_removable创建一个可移动介质数据库
sp_createstats创建单列的统计信息
sp_cursor用于请求定位更新
sp_cursor_list报告当前打开的服务器游标属性
sp_cursorclose关闭和释放游标
sp_cursorfetch从游标中取出数据行
sp_cursoropen定义与游标和游标选项相关联的SQL语句,然后填充游标
sp_cursoroption用于设置各种游标选项
sp_cycle_errorlog关闭错误日志文件重新开始错误记录
sp_datatype_info返回当前环境支持的数据类型信息
sp_dbfixedrolepermission显示每一个固定数据库角色的许可
sp_dboption显示或修改数据库选项
sp_dbremove删除数据库和与该数据库相关的所有文件
sp_defaultdb设置登录帐户的默认数据库
sp_defaultlanguage设置登录帐户的默认语言
sp_delete_alert删除警报
sp_delete_backuphistory删除备份和恢复的历史信息
sp_delete_category删除指定类型的作业、警报和操作员
sp_delete_job删除一个作业
sp_delete_jobschele删除作业的调度
sp_delete_jobserver删除指定的目标服务器
sp_delete_jobstep从作业中删除指定的作业步骤
sp_delete_notfication删除发送给某个操作员的所有通知
sp_delete_operator删除操作员
sp_delete_targetserver从可以使用的目标服务器列表中删除指定的服务器
sp_delete_targetservergroup删除指定的目标服务器组
sp_delete_targetsvrgrp_member从目标服务器组中删除一个目标服务器
sp_deletemergeconflictrow删除冲突表中的记录行
sp_denylogin防止window用户或群组连接到sqlserver
sp_describe_cursor报告服务器游标的属性
sp_describe_cursor_columns报告在服务器游标的结果集中列的属性
sp_describe_cursor_tables报告服务器游标参考的基表信息
sp_detach_db分享服务器中的数据库
sp_drop_agentparameger删除配置文件中的一个或者多个参数
sp_drop_profile删除配置文件
sp_dropalias删除一个帐户的别名
sp_dropapprole删除当前数据库中的应用程序角色
sp_droparticle从出版物中删除一篇文章
sp_dropdevice删除数据库或者备份设备
sp_dropdistpublisher删除出版服务器
sp_dropdistributiondb删除分布数据库
sp_dropdistributor删除分布服务器
sp_dropdropextendedproc删除一个扩展存储过程
sp_dropgroup从当前数据库中删除角色
sp_droplinkedsrvlogin删除一个本地服务器和连接服务器的映射帐户
sp_droplogin删除一个登录帐户
sp_dropmergearticle从合并出版物中删除一篇文章
sp_dropmergefilter删除一个合并过滤器
sp_dropmergepublication删除一个合并出版物和与其相关的快照复制
sp_dropmergepullsubscription删除一个合并拉回订购物
sp_dropmergesubscription删除一个订阅物
sp_dropmessage删除一个消息
sp_droppublication删除出版物和与其相关的文章
sp_droppullsubscription删除当前订阅服务器数据库中的订阅物
sp_dropremotelogin删除一个远程登录帐户
sp_droprole从当前数据库中删除一个角色
sp_droprolemember从当前数据库中的一个角色中删除一个安全性帐户
sp_dropserver删除一个远程或者连接服务器列表中的服务器
sp_dropsrvrolemember从一个固定的服务器角色中删除一个帐户
sp_dropsubscriber删除一个订阅服务器
sp_dropsubscription删除订阅物
sp_droptype删除一种用户定义的数据类型
sp_dropuser从当前数据库中删除一个用户
sp_dropdropwebtask删除以前版本定义的web任务
sp_dsninfo从一个与当前服务器相关的分布服务器返回ODBC和OLEDB数据源的信息
sp_mpparamcmd返回存储在分布数据库中的参数化命令的详细信息
sp_enumcodepages返回一个字符集和代码页的列表
sp_enumcustomresovers返回所有可用的定制解决方案表表
sp_enumdsn返回所有可用的odbc和oledb数据源列表
sp_enumfullsubscribers返回订阅服务器的列表
sp_expired_subscription_cleanup周期性地检查订阅物的状态是否失效
sp_fkeys返回当前环境的外键信息
sp_foreignkeys返回参照连接服务器的表的主键的外键
sp_fulltext_catalog创建和删除全文本目录
sp_fulltext_column指定某一个列是否参加全文本索引
sp_fulltext_database从当前数据库中初始化全文本索引
sp_fulltext_service改变MicrosoftSearchService属性
sp_fulltext_table标记用于全文本索引的表
sp_generatefilters在外键表上创建一个过滤器
sp_get_distributor确定一个分布服务器是否安装在某个服务器上
sp_getbindtoken创建一个绑定的连接文本
sp_getmergedeletype返回合并删除的类型
sp_grant_publication_access在出版物的访问列表中增加一个用户
sp_grantdbaccess在当前数据库中增加一个安全性帐户
sp_grantlogin允许Windows用户或群组连接到SQLServer
sp_help_agent_default检索作为参数传送的代理类型的默认配置的标识号
sp_help_agent_parameter返回代理配置的所有参数
sp_help_agent_profile返回指定代理的配置
sp_help_alert报告有关警报的信息
sp_help_category提供有关作业、警报、操作员的指定种类的信息
sp_help_downloadlist列出有关作业的信息
sp_help_fulltext_catalogs返回有关全文本索引表的信息
sp_help_fulltext_columns返回标记全文本索引的列信息
sp_help_fulltext_columns_cursor使用游标检索标记为全文本的索引列
sp_help_fulltext_tables返回标记为全文本索引的表
sp_help_fulltext_tables_cursor使用游标返回标记为全文本索引的表
sp_help_job返回有关作业的信息
sp_help_jobhistory提供有关作业的历史信息
sp_help_jobschele返回作业的调度信息
sp_help_jobserver返回给定作业的服务器信息
sp_help_jobstep返回作业的步骤信息
sp_help_operator返回有关操作员的信息
sp_help_publication_access返回可以访问指定出版物的帐户列表
sp_help_targetserver列出全部目标服务器
sp_help_targetservergroup列出指定服务器组中的全部目标服务器
sp_helparticle显示有关文章的信息
sp_helpconstraint返回有关约束的类型、名称等信息
sp_helpdbfixedrole返回固定的服务器角色的列表
sp_helpdevice返回有关数据库文件的信息
sp_helpdistpublisher返回充当分布服务器的出版服务器的属性
sp_helpdistributiondb返回分布数据库的属性信息
sp_helpdistributor列出分布服务器、分布数据库、工作目录等信息
sp_helpextendproc显示当前定义的扩展存储过程信息
sp_helpfile返回与当前数据库相关的物理文件信息
sp_helpfilegroup返回与当前数据库相关的文件组信息
sp_helpgroup返回当前数据库中的角色信息
sp_helpindex返回有关表的索引信息
sp_helplanguage返回有关语言的信息
sp_helplinkedsrvlogin返回链接服务器中映射的帐户信息
sp_helplogins返回有关login和与其相关的数据库用户信息
sp_helpmergearticle返回有关合并文章的信息
sp_helpmergearticleconflicts返回有关冲突的出版物中的文章信息
sp_helpmergeconflictrows返回在指定冲突表中的行
sp_helpmergefilter返回有关合并过滤器的信息
sp_helpmergepublication返回有关合并出版物的信息
sp_helpmergepullsubscription返回有关拉回订阅物的信息
sp_helpmergesubscription返回有关推出订阅物的信息
sp_help_notification报告对于给定操作员的警报信息
sp_helppublication返回有关出版物的信息
sp_helprole返回当前数据库中的角色信息
sp_helprolemember返回当前数据库中角色成员的信息
sp_helprotect返回有关用户许可的信息
sp_helpserver显示特定远程或者复制服务器的信息
sp_helpsort显示系统的排列顺序和字符集的信息
sp_helpsrvrole显示系统中的固定服务器角色列表
sp_helpsrvrolemember显示系统中的固定服务器角色成员的信息
sp_helpsubscrberinfo显示有关订阅服务器的信息
sp_helpsubscription显示有特定出版物等有关的订阅物信息
sp_helpsubscription_properties检索安全性信息
sp_helptrigger显示触发器的类型
sp_helpuser显示当前数据库中的用户、WindowsNT用户和组、角色等信息
sp_indexoption为用户定义的索引设置选项
sp_link_publication设置立即修改订阅服务器的同步化触发器使用的配置和安全性信息
sp_linkedservers返回在本地服务器上定义的链接服务器的列表
sp_makewebtask创建一个执行html文档的任务
sp_manage_jobs_by_login删除或者重新指定属于login的作业
sp_mergemmyupdate制作用于合并复制的修改备份
sp_mergesubscription_cleanup删除元数据
sp_monitor显示系统的统计信息
sp_msx_defect从多个服务器操作中删除当前服务器
sp_msx_enlist增加当前服务器到可用的目标服务器列表中
sp_pkeys返回某个表的主键信息
sp_post_msx_operation插入一些目标服务器可以执行的信息
sp_primarykeys返回主键列的信息
sp_processmail使用扩展存储过程修改邮件信息
sp_procoption设置或者显示过程选项
sp_publication_validation初始化文章校验请求
sp_purge_jobhistory删除作业的历史记录
sp_recompile使存储过程和触发器在下一次运行时重新编译
sp_refreshsubscriptions在拉回出版物中增加订阅物到文章中
sp_refreshview刷新指定视图的元数据
sp_reinitmergepullsubscription标记一个合并拉回订阅
sp_reiniteergesubscription标记一个合并订阅
sp_reinitpullsubscription标记一个事务订阅或者匿名订阅
sp_reinitsubscription重新初始化订阅
sp_remoteoption显示或者修改远程登录帐户的选项
sp_remove_job_from_targets从给定的目标服务器中删除指定的作业
sp_removedbreplication从数据库中删除所有的复制对象
sp_replcounters返回复制的统计信息
sp_repldone修改服务器做的分布事务的统计信息
sp_replflush处理文章的高速缓冲存储区
sp_replication_agent_checkup检查每一个分布数据库
sp_replicationdboption在当前数据库中设置复制数据库的选项
sp_replsetoriginator用于在事务复制中检测循环登录
sp_replshowcmds返回标记复制的事务命令
sp_repltrans返回在出版数据库事务日志中的所有事务的结果集
sp_resetstatus重新设置异常数据库的形态
sp_resync_targetserver重新同步所有的多服务器作业
sp_revoke_publication_access从出版数据库的访问列表中删除login帐户
sp_revokedbaccess从当前数据库中删除安全性帐户
sp_revokelogin删除系统的login帐户
sp_script_synctran_commands生成一个可以用于立即修改订阅物的脚本
*/
⑶ 数据库经典笔试题和面试题答案
如下这些有关数据库知识考查的经典笔试题,非常全面,对计算机专业毕业生参加笔试会很有帮助,建议大家收藏。
一、选择题
1. 下面叙述正确的是___c___。
A、算法的执行效率与数据的存储结构无关
B、算法的空间复杂度是指算法程序中指令(或语句)的条数
C、算法的有穷性是指算法必须能在执行有限个步骤之后终止
D、以上三种描述都不对
2. 以下数据结构中不属于线性数据结构的是___c___。
A、队列B、线性表C、二叉树D、栈
3. 在一棵二叉树上第5层的结点数最多是__b____。2的(5-1)次方
A、8 B、16 C、32 D、15
4. 下面描述中,符合结构化程序设计风格的是___a___。
A、使用顺序、选择和重复(循环)三种基本控制结构表示程序的控制逻辑
B、模块只有一个入口,可以有多个出口
C、注重提高程序的执行效率 D、不使用goto语句
5. 下面概念中,不属于面向对象方法的是___d___。
A、对象 B、继承 C、类 D、过程调用
6. 在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是___b___。
A、可行性分析 B、需求分析 C、详细设计 D、程序编码
7. 在软件开发中,下面任务不属于设计阶段的是__d____。
A、数据结构设计 B、给出系统模块结构 C、定义模块算法 D、定义需求并建立系统模型
8. 数据库系统的核心是___b___。
A、数据模型 B、数据库管理系统 C、软件工具 D、数据库
9. 下列叙述中正确的是__c____。
A、数据库是一个独立的系统,不需要操作系统的支持
B、数据库设计是指设计数据库管理系统
C、数据库技术的根本目标是要解决数据共享的问题
D、数据库系统中,数据的物理结构必须与逻辑结构一致
10. 下列模式中,能够给出数据库物理存储结构与物理存取方法的是___a___。
A、内模式 B、外模式 C、概念模式 D、逻辑模式
11. Visual FoxPro数据库文件是___d___。
A、存放用户数据的文件 B、管理数据库对象的系统文件
C、存放用户数据和系统的文件 D、前三种说法都对
12. SQL语句中修改表结构的命令是___c___。
A、MODIFY TABLE B、MODIFY STRUCTURE
C、ALTER TABLE D、ALTER STRUCTURE
13. 如果要创建一个数据组分组报表,第一个分组表达式是"部门",第二个分组表达式是"性别",第三个分组表达式是"基本工资",当前索引的索引表达式应当是__b____。
A、部门+性别+基本工资 B、部门+性别+STR(基本工资)
C、STR(基本工资)+性别+部门 D、性别+部门+STR(基本工资)
14. 把一个项目编译成一个应用程序时,下面的叙述正确的是___a___。
A、所有的项目文件将组合为一个单一的应用程序文件
B、所有项目的包含文件将组合为一个单一的应用程序文件
C、所有项目排除的文件将组合为一个单一的应用程序文件
D、由用户选定的项目文件将组合为一个单一的应用程序文件
15. 数据库DB、数据库系统DBS、数据库管理系统DBMS三者之间的关系是_a___。
A、DBS包括DB和DBMS B、DBMS包括DB和DBS
C、DB包括DBS和DBMS D、DBS就是DB,也就是DBMS
16. 在"选项"对话框的"文件位置"选项卡中可以设置___b___。
A、表单的默认大小 B、默认目录
C、日期和时间的显示格式 D、程序代码的颜色
17. 要控制两个表中数据的完整性和一致性可以设置"参照完整性",要求这两个表_a_。
A、是同一个数据库中的两个表 B、不同数据库中的两个表
C、两个自由表 D、一个是数据库表另一个是自由表
18. 定位第一条记录上的命令是___a___。
A、GO TOP B、GO BOTTOM C、GO 6 D、SKIP
19. 在关系模型中,实现"关系中不允许出现相同的元组"的约束是通过__b____。
A、候选键 B、主键 C、外键 D、超键
20. 设当前数据库有10条记录(记录未进行任何索引),在下列三种情况下,当前记录号为1时;EOF()为真时;BOF()为真时,命令?RECN()的结果分别是___a___。
A、1,11,1 B、1,10,1 C、1,11,0 D、1,10,0
21. 下列表达式中结果不是日期型的是___c___。
A、CTOD("2000/10/01") B、{^99/10/01}+365
C、VAL("2000/10/01") D、DATE()
22. 只有满足联接条件的记录才包含在查询结果中,这种联接为___c___。
A、左联接 B、右联接 C、内部联接 D、完全联接
23. 索引字段值不唯一,应该选择的索引类型为___b___。
A、主索引 B、普通索引 C、候选索引 D、唯一索引
24. 执行SELECT 0选择工作区的结果是___b___。
A、选择了0号工作区 B、选择了空闲的最小号工作区
C、关闭选择的工作区 D、选择已打开的工作区
25. 从数据库中删除表的命令是___a___。
A、DROP TABLE B、ALTER TABLE C、DELETE TABLE D、USE
26. DELETE FROM S WHERE 年龄>60语句的功能是__b____。
A、从S表中彻底删除年龄大于60岁的记录
B、S表中年龄大于60岁的记录被加上删除标记
C、删除S表 D、删除S表的年龄列 1 2
⑷ 数据库老师会问哪些问题
1.MySQL 主键与索引的联系与区别
主键是为了标识数据库记录唯一性,不允许记录重复,且键值不能为空,主键也是一个特殊索引。
数据表中只允许有一个主键,但是可以有多个索引。
使用主键会数据库会自动创建主索引,也可以在非主键上创建索引,方便查询效率。
索引可以提高查询速度,它就相当于字典的目录,可以通过它很快查询到想要的结果,而不需要进行全表扫描。
主键索引外索引的值可以为空。
主键也可以由多个字段组成,组成复合主键,同时主键肯定也是唯一索引。
唯一索引则表示该索引值唯一,可以由一个或几个字段组成,一个表可以有多个唯一索引。
2.数据库索引是怎么回事?用的啥数据结构 为什么B+树比B树更合适
一个索引是存储的表中一个特定列的值数据结构(最常见的是B-Tree)。索引是在表的列上创建。所以,要记住的关键点是索引包含一个表中列的值,并且这些值存储在一个数据结构中。请记住记住这一点:索引是一种数据结构 。
什么样的数据结构可以作为索引?
B-Tree 是最常用的用于索引的数据结构。因为它们是时间复杂度低, 查找、删除、插入操作都可以可以在对数时间内完成。另外一个重要原因存储在B-Tree中的数据是有序的。数据库管理系统(RDBMS)通常决定索引应该用哪些数据结构。但是,在某些情况下,你在创建索引时可以指定索引要使用的数据结构。
当我们利用索引查询的时候,不可能把整个索引全部加载到内存,只能逐一加载每个磁盘页,磁盘页对应索引树的节点。那么Mysql衡量查询效率的标准就是磁盘IO次数。如果我们利用二叉树作为索引结构,那么磁盘的IO次数和索引树的高度是相关的。
那么为了提高查询效率,就需要减少磁盘IO数。为了减少磁盘IO的次数,就需要尽量降低树的高度,需要把原来“瘦高”的树结构变的“矮胖”,树的每层的分叉越多越好,因此B树正好符合我们的要求,这也是B-树的特征之一。
B树 B树的节点为关键字和相应的数据(索引等)
B+树 B+树是B树的一个变形,非叶子节点只保存索引,不保存实际的数据,数据都保存在叶子节点中,B+树的叶子节点为链表,链表放数据,非叶子节点是索引。
对比:
B树和B+树同样适用于高度越低,查询越快。
B树查找节点,B+树只需要查询所有节点(索引),B树查询索引和数据。虽然可能第一个就找到,但在极端情况下,需要全查询索引和数据,不如B+树稳定。
B+树和B树比,B+树的硬盘空间更少,io的读写代价更低。因为B+树节点只有索引,占位更少。在查询的情况下硬盘指针移动更低
表的主键、外键必须有索引;
数据量超过300的表应该有索引;
经常与其他表进行连接的表,在连接字段上应该建立索引;
经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
索引应该建在选择性高的字段上;
索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替
频繁进行数据操作的表,不要建立太多的索引;
删除无用的索引,避免对执行计划造成负面影响;
限制表上的索引数目。对一个存在大量更新操作的表,所建索引的数目一般不要超过3个,最多不要超过5个。索引虽说提高了访问速度,但太多索引会影响数据的更新操作。
避免在取值朝一个方向增长的字段(例如:日期类型的字段)上,建立索引;对复合索引,避免将这种类型的字段放置在最前面
对复合索引,按照字段在查询条件中出现的频度建立索引
删除不再使用,或者很少被使用的索引。
性能极高 – Redis能支持超过 100K+ 每秒的读写频率。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
哈希表索引是怎么工作的?
哈希表是另外一种你可能看到用作索引的数据结构-这些索引通常被称为哈希索引。使用哈希索引的原因是,在寻找值时哈希表效率极高。所以,如果使用哈希索引,对于比较字符串是否相等的查询能够极快的检索出的值。例如之前我们讨论过的这个查询(SELECT * FROM Employee WHERE Employee_Name = ‘Jesus’) 就可以受益于创建在Employee_Name 列上的哈希索引。哈系索引的工作方式是将列的值作为索引的键值(key),和键值相对应实际的值(value)是指向该表中相应行的指针。因为哈希表基本上可以看作是关联数组,一个典型的数据项就像“Jesus => 0x28939″,而0x28939是对内存中表中包含Jesus这一行的引用。在哈系索引的中查询一个像“Jesus”这样的值,并得到对应行的在内存中的引用,明显要比扫描全表获得值为“Jesus”的行的方式快很多。
哈希索引的缺点
哈希表是无顺的数据结构,对于很多类型的查询语句哈希索引都无能为力。举例来说,假如你想要找出所有小于40岁的员工。你怎么使用使用哈希索引进行查询?这不可行,因为哈希表只适合查询键值对-也就是说查询相等的查询(例:like “WHERE name = ‘Jesus’)。哈希表的键值映射也暗示其键的存储是无序的。这就是为什么哈希索引通常不是数据库索引的默认数据结构-因为在作为索引的数据结构时,其不像B-Tree那么灵活
3.创建索引的注意事项
索引可以提高数据的访问速度,但同时也增加了插入、更新和删除操作的处理时间,解决此问题就是分析应用程序的业务处理、数据使用,为经常被用作查询条件、或者被要求排序的字段建立索引。索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。
创建规则:
创建索引需要注意的地方:
4.MYSQL事务特性和实现原理
ACID表示原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(rability)。一个很好的事务处理系统,必须具备这些标准特性:
原子性(atomicity)
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性
是利用Innodb的undo log。undo log名为回滚日志,是实现原子性的关键,当事务回滚时能够撤销所有已经成功执行的sql语句,他需要记录你要回滚的相应日志信息。
一致性(consistency)
数据库总是从一个一致性的状态转换到另一个一致性的状态。(在前面的例子中,一致性确保了,即使在执行第三、四条语句之间时系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。)
数据库通过原子性、隔离性、持久性来保证一致性
隔离性(isolation)
通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外的一个账户汇总程序开始运行,则其看到支票帐户的余额并没有被减去200美元。)
利用的是锁和MVCC机制。MVCC,即多版本并发控制(Multi Version Concurrency Control),一个行记录数据有多个版本对快照数据,这些快照数据在undo log中。如果一个事务读取的行正在做DELELE或者UPDATE操作,读取操作不会等行上的锁释放,而是读取该行的快照版本。
持久性(rability)
一旦事务提交,则其所做的修改会永久保存到数据库。(此时即使系统崩溃,修改的数据也不会丢失。持久性是个有占模糊的概念,因为实际上持久性也分很多不同的级别。有些持久性策略能够提供非常强的安全保障,而有些则未必,而且不可能有能做到100%的持久性保证的策略。)
是利用Innodb的redo log。当做数据修改的时候,不仅在内存中操作,还会在redo log中记录这次操作。当事务提交的时候,会将redo log日志进行刷盘(redo log一部分在内存中,一部分在磁盘上)。当数据库宕机重启的时候,会将redo log中的内容恢复到数据库中,再根据undo log和binlog内容决定回滚数据还是提交数据。redo log体积小,刷盘快。redo log是一直往末尾进行追加,属于顺序IO。效率显然比随机IO来的快
5.redis的原理和优点
redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hashs(哈希类型)
这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.
在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步.
Redis的优点:
6.Mysql中的锁机制
Mysql用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。这些锁统称为悲观锁
MySQL的锁机制比较简单,其最 显着的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。
从上述特点可见,很难笼统地说哪种锁更好,只能就具体应用的特点来说哪种锁更合适!仅从锁的角度 来说:表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有 并发查询的应用,如一些在线事务处理(OLTP)系统。
7.ABC联合索引生效问题
对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c)。 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。
对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c)。 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。
⑸ mysql数据库面试题(学生表_课程表_成绩表_教师表)
Student(Sid,Sname,Sage,Ssex)学生表
Sid:学号
Sname:学生姓名
Sage:学生年龄
Ssex:学生性别
Course(Cid,Cname,Tid)课程表
Cid:课程编号
Cname:课程名称
Tid:教师编号
SC(Sid,Cid,score)成绩表
Sid:学号
Cid:课程编号
score:成绩
Teacher(Tid,Tname)教师表
Tid:教师编号:
Tname:教师名字
1、插入数据
2、删除课程表所有数据
3、将学生表中的姓名 张三修改为张大山
或者
4、查询姓’李’的老师的个数:
5、查询所有课程成绩小于60的同学的学号、姓名:
6、查询没有学全所有课的同学的学号、姓名
7、查询平均成绩大于60分的同学的学号和平均成绩
8、查询学过“100”并且也学过编号“101”课程的同学的学号、姓名
9、查询“100”课程比“101”课程成绩高的所有学生的学号
10、查询课程编号“100”的成绩比课程编号“101”课程高的所有同学的学号、姓名
11、查询学过“鲁迅”老师所教的所有课的同学的学号、姓名
12、查询所有同学的学号、姓名、选课数、总成绩
13、查询至少有一门课与学号为“1”同学所学相同的同学的学号和姓名
14、把“SC”表中“鲁迅”老师教的课的成绩都更改为此课程的平均成绩,
错误
15、查询和“2”学号的同学学习的课程完全相同的其他同学学号和姓名
16、删除学习“鲁迅”老师课的SC表记录
17、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、002号课的平均成绩
18、查询各科成绩最高和最低的分:以如下的形式显示:课程ID,最高分,最低分
19、按各科平均成绩从低到高和及格率的百分数从高到低顺序
20、查询如下课程平均成绩和及格率的百分数(用”1行”显示): 数学(100),语文(101),英语(102)
22、查询不同老师所教不同课程平均分从高到低显示
23、查询如下课程成绩第3名到第6名的学生成绩单:数学(100),语文(101),英语(102)
23、统计下列各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ 小于60]
24、查询学生平均成绩及其名次
25、查询各科成绩前三名的记录(不考虑成绩并列情况)
26、查询每门课程被选修的学生数
27、查询出只选修一门课程的全部学生的学号和姓名
28、查询男生、女生人数
29、查询姓“张”的学生名单
30、查询同名同姓的学生名单,并统计同名人数
31、1981年出生的学生名单(注:student表中sage列的类型是datetime)
32、查询平均成绩大于85的所有学生的学号、姓名和平均成绩
33、查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
34、查询课程名称为“英语”,且分数低于60的学生名字和分数
35、查询所有学生的选课情况
36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数
37、查询不及格的课程,并按课程号从大到小的排列
38、查询课程编号为“101”且课程成绩在80分以上的学生的学号和姓名
39、求选了课程的学生人数:
40、查询选修“鲁迅”老师所授课程的学生中,成绩最高的学生姓名及其成绩
41、检索至少选修两门课程的学生学号
42、查询全部学生都选修的课程的课程号和课程名(1.一个课程被全部的学生选修,2.所有的学生选择的所有课程)
43、查询没学过“鲁迅”老师讲授的任一门课程的学生姓名
44、查询两门以上不及格课程的同学的学号及其平均成绩
45、检索“101”课程分数小于60,按分数降序排列的同学学号
46、删除“2”同学的“101”课程的成绩
⑹ 面试的时候问你熟悉oracle数据库吗
如果是开发的话,那还是基于SQL这种语言的语法了,要多自己使用才能熟悉的。 对于oracle数据库来说,PL/SQL delelopment是重点,除了SQL,还要了解触发器trigger,存储过程procere,任务job,视图view等等。
⑺ 数据库开发工程师面试题
select LESSON_NAME as '科目',
max(case when sequence = 1 then NameGrade else null end) as '第一名(姓名+分数)',
max(case when sequence = 2 then NameGrade else null end) as '第二名(姓名+分数)',
max(case when sequence = 3 then NameGrade else null end) as '第三名(姓名+分数)'
(
select LESSON_NAME,STU_NAME+','+convert(varchar,GRADE) as NameGrade,sequence
(select b.LESSON_NAME,c.STU_NAME,a.GRADE,row_number() over(order by a.GRADE Desc, c.STU_NAME asc) as sequence from score a
inner join lession b on (a.LESSION_ID = b.LESSION_ID)
inner join student c on (a.STU_ID = c.STU_ID) ) d
where sequence < 4
) e
group by LESSON_NAME
order by case(when LESSON_NAME = '语文' then 1,
when LESSON_NAME = '数学' then 2,
when LESSON_NAME = '英语' then 3,
when LESSON_NAME = '物理' then 4,
when LESSON_NAME = '化学' then 5,
else 9999 end)
大概就是这个样子,没执行,你自己再调试下 。
如果两个人相同分数,根据名字顺序排列
⑻ MySQL数据库面试题:A表有10条数据B表有9条数据用左链接一共能查出多少条数据
10条数据,左连接就是把左边的表当成主表,即不管右边有多少数据,都会展示左边的10条
⑼ SQL数据库面试题 急急急
a)select pname as '商品名',avg(qty) as 平均销售量 from s,p,m where m.city='上海' and s.mno=m.mno and p.pno=s.pno,select p.Pno,p.pname,sum(s.qty)
from s left join p on s.pno=p.pno left join m on p.Mno=m.Mno
where m.city='上海市'
group by p.Pno,p.pname,p.city,p.color
b)、先删除Sale表的外键PNO,再删除gds表。
c)联系:视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系
区别:1、视图是已经编译好的sql语句。而表不是
2、视图没有实际的物理记录。而表有。
3、表是内容,视图是窗口
4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时四对它进行修改,但视图只能有创建的语句来修改
5、表是内模式,视图是外模式
6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
7、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
8、视图的建立和删除只影响视图本身,不影响对应的基本表。