牛客题解(1)

1、 SQL语句性能分析的关键字是什么?
答案:explain。
解析:explain命令是在解决数据库性能上是第一推荐的使用命令,大部分的性能问题可以通过此命令来简单解决,explain的执行效果可以帮助选择更好的索引和优化查询语句。explain语法:explain select … from … [where …] 例如:explain select * from news;

2、数据库系统的特点:
数据结构化、数据共享性高、冗余度低,易扩展,数据独立性高,数据由DBMS统一管理和控制。

3、向表中增加列的sql语句:
增加列:alter table tableName add columnName varchar (30)
删除列:alter table tableName drop column columnName。

4、要删除表A中的数据,使用TRUNCATE TABLE A。运行的结果是:
答案:表A中的约束依然在。
解析:删除表的语句为:DROP TABLE table_name;
而DELETE和TRUNCATE TABLE都是删除表中的数据的语句,它们的不同之处在于:
a、TRUNCATE TABLE 比DELETE的速度快;
b、TRUNCATE TABLE 是删除表的所有行,而DELETE是删除表的一行或者多行(除非DELETE不带WHERE语句);
c、在删除时如果遇到任何一行违反约束(主要是外键约束),TRUNCATE TABLE仍然删除,只是表的结构及其列、约束、索引等保持不变,但DELETE是直接返回错误;
d、对于被外键约束的表,不能使用TRUNCATE TABLE,而应该使用不带WHERE语句的DELETE语句。
e、如果想保留标识计数值,要用DELETE,因为TRUNCATE TABLE会对新行标志符列搜用的计数值重置为该列的种子。

5、存储过程的好处:
a、执行速度更快,在数据库中保存的存储过程语句都是编译过的。
b、允许模块化程序设计,类似方法的复用
c、提高系统安全性,防止SQL注入
d、减少网络流通量,只需要传输存储过程的名称.
e、关于存储过程的几个简单例子:
例1:
create proc proc_stu
@sname varchar(20),
@pwd varchar(20)
as
select * from ren where sname=@sname and pwd=@pwd
go

查看结果:proc_stu ‘admin’,’admin’

例2:

下面的存储过程实现用户验证的功能,如果不成功,返回0,成功则返回1.

CREATE PROCEDURE VALIDATE @USERNAME CHAR(20),@PASSWORD CHAR(20),@LEGAL BIT OUTPUT
AS

IF EXISTS(SELECT * FROM REN WHERE SNAME = @USERNAME AND PWD = @PASSWORD)
SELECT @LEGAL = 1
ELSE
SELECT @LEGAL = 0

在程序中调用该存储过程,并根据@LEGAL参数的值判断用户是否合法。

例3:一个高效的数据分页的存储过程 可以轻松应付百万数据

CREATE PROCEDURE pageTest –用于翻页的测试
–需要把排序字段放在第一列

(
@FirstID nvarchar(20)=null, –当前页面里的第一条记录的排序字段的值
@LastID nvarchar(20)=null, –当前页面里的最后一条记录的排序字段的值
@isNext bit=null, –true 1 :下一页;false 0:上一页
@allCount int output, –返回总记录数
@pageSize int output, –返回一页的记录数
@CurPage int –页号(第几页)0:第一页;-1最后一页。
)

AS

if @CurPage=0–表示第一页
begin
–统计总记录数
select @allCount=count(ProductId) from Product_test

set @pageSize=10
–返回第一页的数据
select top 10
ProductId,
ProductName,
Introduction
from Product_test order by ProductId
end

else if @CurPage=-1–表示最后一页

select * from
(select top 10 ProductId,
ProductName,
Introduction

from Product_test order by ProductId desc ) as aa
order by ProductId
else

begin
if @isNext=1
–翻到下一页
select top 10 ProductId,
ProductName,
Introduction
from Product_test where ProductId > @LastID order by ProductId
else
–翻到上一页
select * from
(select top 10 ProductId,
ProductName,
Introduction
from Product_test where ProductId < @FirstID order by ProductId desc) as bb order by ProductId
end

6、从许多查询策略中找出最有效的查询执行计划,这种过程叫查询优化

7、数据库泛式
第一范式,原子性
第二范式,没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
第三范式, 不能存在传递依赖

8、通过JDBC访问数据库包含下面哪几步?
1、加载JDBC驱动程序:
2、提供JDBC连接的URL
3、创建数据库的连接
4、创建一个Statement
5、执行SQL语句
6、处理结果
7、关闭JDBC对象

9、如何在一个大表中创建索引:
1. 传统方式: alter table tb add index 。。。+ 调整key buffer + tmp buffer (一天一宿还没跑完,放弃)
2. openoak kit - oak-online-alter-table 在线重定义表,这个是openoak 提供的一个开源mysql管理包,可以进行类似oracle的
在线重定义表操作,减少了锁争用,可io还是比较慢。
3. Memory Tables + partition + merge tables ,这个确实比较快,但是操作有些繁琐,简单的说就是 利用mysql 内存表排序操作较快的特点,分批把数据拷贝到内存,然后排序后在写入myisam,最后通过合并表的方式完成最后的排序。下面是google搜的原文【Creating Indexes/Sorting on very large tables in Mysql】。

4.当然了,对于大表来说,无论何种数据库,通过事先规划,做好分区表或者水平分割、垂直分割,对于应用和管理来讲都是具有一定的战略性的。

10、数据库中having函数的使用
SQL语言中设定集合函数的查询条件时使用HAVING从句而不是WHERE从句。通常情况下,HAVING从句被放置在SQL命令的结尾处

11、复合索引的使用
因复合索引为idx_A_B_C,所以查询条件只能是在a,ab,abc,ac才算 使用到索引idx_A_B_C,复合索引: Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。 例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章