牛客題解(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進行查找 .當最左側字段是常量引用時,索引就十分有效

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