1、如何查找和刪除數據庫中的重複數據
法一: 用Group by語句 此查找很快的
select count(num), max(name) from student –查找表中num列重複的,列出重複的記錄數,並列出他的name屬性
group by num
having count(num) >1; –按num分組後找出表中num列重複,即出現次數大於一次
delete from student(上面Select的)
這樣的話就把所有重複的都刪除了。—–慎重
法二:當表比較大(例如10萬條以上)時,這個方法的效率之差令人無法忍受,需要另想辦法:
—- 執行下面SQL語句後就可以顯示所有DRAWING和DSNO相同且重複的記錄
SELECT * FROM EM5_PIPE_PREFAB
WHERE ROWID!=(SELECT MAX(ROWID) FROM EM5_PIPE_PREFAB D –D相當於First,Second
WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND
EM5_PIPE_PREFAB.DSNO=D.DSNO);
—- 執行下面SQL語句後就可以刪除所有DRAWING和DSNO相同且重複的記錄
DELETE FROM EM5_PIPE_PREFAB
WHERE ROWID!=(SELECT MAX(ROWID) FROM EM5_PIPE_PREFAB D
WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND
EM5_PIPE_PREFAB.DSNO=D.DSNO);
2、說一下數據表設計要遵守的三範式是什麼?除了這些你覺得數據表的設計還要注意哪些規則?
1、無重複列,實際上就是一個表中一個列不允許有多值屬性、複合屬性或者嵌套的表,即列的值域必須是原子值,表必須有主鍵。
2、屬性完全依賴於主鍵[消除部分子函數依賴]。第二範式其實是在第一範式上的擴展,所以第二範式必須符合第一範式,表中列不存在部分函數依賴。
3、屬性不依賴於其它非主屬性[消除傳遞依賴]。第三範式是在第二範式的基礎上進行的擴展,所以必須符合第二範式且表中不存在傳遞依賴。
數據量大的情況下如:百萬級數據肯定不能按第三範式來了,必須適當增加冗餘數據,減少查詢的關聯次數,當然做好索引是大前提。還可以考慮使用分區表。還不行的話那就換個牛叉點的database。
3、寫一個SQL存儲過程,建立一個表USER 字段是姓名,年齡,職位,權限,然後向裏面插入6條數據,然後查詢出年齡大於18的所有信息。
Create table user(
Name varchar(20),
Age int,
Position varchar(20)
Quanxian varchar(20)
)
Insert into user values(‘111’,11,’11111’,’1111111’)
Insert into user values(‘112’,12,’11112’,’1111112’)
Insert into user values(‘113’,13,’11113’,’1111113’)
Insert into user values(‘114’,14,’11114’,’1111114’)
Insert into user values(‘115’,15,’11115’,’1111115’)
Insert into user values(‘116’,16,’11116’,’1111116’)
Create procedure selectUser
As
Select * from user where age >18
4、1. 你對哪種數據庫最熟悉?使用該數據庫多少年?簡單描述對該數據庫的理解.
答:SQL,適合中小型企業使用
2. 對其它較熟悉的商業數據庫的瞭解及使用年限.
3. 如何將數據庫(實例)備份和還原?(針對自己最熟悉的)
答:SQL,在企業管理器上右點要備份或還原的數據,從所有任務選擇備份或還原。
4. 如何知道一個表或視圖的結構?
答:查詢系統表sysobjects
5. 描述INNER JOIN的功能和已在何種情況下使用INNER JOIN.
答:內聯接是用比較運算符比較要聯接列的值的聯接,連接的2個表都要滿足、
5、存儲過程和SQL語句的優缺點
存儲過程的優缺點:
優點:
1.由於應用程序隨着時間推移會不斷更改,增刪功能,T-SQL過程代碼會變得更復雜,StoredProcedure爲封裝此代碼提供了一個替換位置。
2.執行計劃(存儲過程在首次運行時將被編譯,這將產生一個執行計劃-- 實際上是 Microsoft SQL Server爲在存儲過程中獲取由 T-SQL 指定的結果而必須採取的步驟的記錄。)緩存改善性能。
……..但sql server新版本,執行計劃已針對所有 T-SQL 批處理進行了緩存,而不管它們是否在存儲過程中,所以沒比較優勢了。
3.存儲過程可以用於降低網絡流量,存儲過程代碼直接存儲於數據庫中,所以不會產生大量T-sql語句的代碼流量。
4.使用存儲過程使您能夠增強對執行計劃的重複使用,由此可以通過使用遠程過程調用 (RPC) 處理服務器上的存儲過程而提高性能。RPC 封裝參數和調用服務器端過程的方式使引擎能夠輕鬆地找到匹配的執行計劃,並只需插入更新的參數值。
5.可維護性高,更新存儲過程通常比更改、測試以及重新部署程序集需要較少的時間和精力。
6.代碼精簡一致,一個存儲過程可以用於應用程序代碼的不同位置。
7.更好的版本控制,通過使用 Microsoft Visual SourceSafe 或某個其他源代碼控制工具,您可以輕鬆地恢復到或引用舊版本的存儲過程。
8.增強安全性:
a、通過向用戶授予對存儲過程(而不是基於表)的訪問權限,它們可以提供對特定數據的訪問;
b、提高代碼安全,防止 SQL注入(但未徹底解決,例如,將數據操作語言--DML,附加到輸入參數);
c、SqlParameter 類指定存儲過程參數的數據類型,作爲深層次防禦性策略的一部分,可以驗證用戶提供的值類型(但也不是萬無一失,還是應該傳遞至數據庫前得到附加驗證)。
缺點:
1.如果更改範圍大到需要對輸入存儲過程的參數進行更改,或者要更改由其返回的數據,則您仍需要更新程序集中的代碼以添加參數、更新 GetValue() 調用,等等,這時候估計比較繁瑣了。
2.可移植性差
由於存儲過程將應用程序綁定到 SQL Server,因此使用存儲過程封裝業務邏輯將限制應用程序的可移植性。如果應用程序的可移植性在您的環境中非常重要,則將業務邏輯封裝在不特定於 RDBMS 的中間層中可能是一個更佳的選擇。
Sql語句靈活,可移植性強,查詢速度比存儲過程慢些
1. 索引能提高速度的關鍵就是索引所佔的空間要比表小得多
2. 注意索引的大小,有一些表可以建成索引組織表
3. 索引的列不要太多,要選擇一些selective比較低的列建B-tree索引,選擇selective高的列建bitmap索引(在更新比較多的表不不要建bitmap索引)
4. 將selective較低的列放在前面
5. 在更新不多的表上建索引時,可以考慮用compress選擇,以節約索引的空間
7、一組SQL相關操作面試題
1. 在表A中有數據
ID MO
1 Y
2 N
請用一個SELECT 語句寫出,如果MO的值爲“Y”,返回“YES”,爲N返回“NO”
效果如下:
ID MO
1 YES
2 NO
SELECT ID,MO=CASE
WHEN MO=’Y’ THEN ‘YES’
WHEN MO=’N’ THEN ‘NO’
END
FROM Az
2. 在表A中查詢出自動增長列中31到40之間的數據(注意可能不是連續的)
select * from A where id between 31 and 40
3. 有一個表table中有一個自動增長字段ID,如果在存儲過程中向這個表插入一條記錄後,如何獲得新記錄的ID.(寫出獲取新記錄ID的函數即可)
CREATE FUNCTION c_currentId()
RETURNS int
AS
BEGIN
declare @lastId int
select @lastId=max(cid) from c
RETURN (@lastId)
END
select tempdb.dbo.c_currentId() as ‘當前C表中最新的編號’
4. having的用法, 是用來做什麼的 having用來對group by分組後的記錄進行過濾。
5. sql中的什麼函數可以轉換爲時間 select convert(datetime,’2000/01/01′) select cast(’2001/02/02′ as datetime)
6. 查詢數據放入一張臨時表 select * into #A from Test select * from #A
8、如何使用SQL進行模糊查詢
LIKE條件一般用在指定搜索某字段的時候, 通過”% _” 通配符的作用實現模糊查找功能,通配符可以在前面也可以在後面或前後都有。
搜索以mian開頭:
SELECT * FROM teble WHERE title LIKE ‘mian%’
搜索以mian結束:
SELECT * FROM teble WHERE title LIKE ‘%mian’
搜索包含mian:
SELECT * FROM teble WHERE title LIKE ‘%mian%’
註釋:%表示0個或多個字符構成的字符串
_表示單個字符
9、說一下mysql, oracle等常見數據庫的分頁實現方案?
1.Oracle:
select * from ( select row_.*, rownum rownum_ from ( query_SQL ) row_ where rownum <= max) where rownum_ >= min
2.SQL Server:
select top @pagesize * from tablename where id not in (select top @pagesize*(@page-1) id from tablename order by id) order by id
3.MySQL
select * from tablename limit position, counter
4.DB2
select * from (select *,rownumber() as ROW_NEXT from tablename) where ROW_NEXT between min and max
——————————————————————————————–
1.分頁方案一:(利用Not In和SELECT TOP分頁)效率次之
語句形式:
SELECT TOP 10 * FROM TestTable
WHERE(ID NOT IN (SELECT TOP 20 id FROM TestTable ORDERBY id)) ORDERBYID
SELECT TOP 頁大小 * FROM TestTable
WHERE( ID NOT IN (SELECT TOP 每頁大小-1*待查詢頁數-1 id FROM 表 ORDERBY id)) ORDERBYID
思路:先查詢出待查詢頁之前的全部條數的id,查詢ID不在這些ID中的指定數量條數
2.分頁方案二:(利用ID大於多少和SELECT TOP分頁)效率最高
語句形式:
SELECT TOP 10 * FROM TestTable
WHERE(ID>(SELECT MAX(id) FROM(SELECT TOP20 id FROM TestTable ORDERBYid)AS T))ORDERBY ID
SELECT TOP 頁大小* FROM TestTable
WHERE(ID>(SELECT MAX(id) FROM(SELECT TOP 每頁大小*待查詢頁數-1 id FROM 表 ORDERBY id)AS T)) ORDERBY ID
思路:先獲得待查詢頁的之前全部條數id,獲得它們當中最大的ID號,以此最大ID號爲標誌,查找比這個ID號大的指定條數
3.分頁方案三:
SELECT TOP PageSize * FROM(SELECT TOP nPage*PageSize * from YOURTABLE order by id)as a order by id desc
SELECT TOP 每頁條數 * FROM (SELECT TOP 待查詢頁*每頁條數) * from YOURTABLE order by id)as a order by id desc
思路:先正排序查詢出待查詢頁之前(包括當前頁)的全部條數,然後將其倒排序,取指定條數
10、幾道SQL面試題
1. 解釋一下SQL裏面的null
答案:null代表一個unknown的值或者一個不存在的值
2. 如何用SQL判斷一個值是不是null?
答案:可以用is null來判斷一個值是不是null
3.所有包含null的計算表達式的返回結果都是null, 這句話正確嗎?比如5+ null返回null
答案:正確
4. 所有與null得比較運算都返回unknown正確嗎?
答案:正確
5. (unknown or true) = true正確嗎?
答案:正確
6. (unknown or false) = unknown正確嗎?
答案:正確
7. (unknown or unknown) = unknown正確嗎?
答案:正確
8. (true and unknown) = unknown正確嗎?
答案:正確
9. (false and unknown) = false正確嗎?
答案:正確
10. (unknown and unknown) = unknown正確嗎?
答案:正確
11. (not unknown) = unknown 正確嗎?
答案:正確
11、介紹一下游標
遊標是從數據表中提取出來的數據,以臨時表的形式存放在內存中,在遊標中有一個數據指針,在初始狀態下指向的是首記錄,利用fetch語句可以移動該指針,從而對遊標中的數據進行各種操作,然後將操作結果寫回數據表中。
由 SELECT 語句返回的行集包括所有滿足該語句 WHERE 子句中條件的行。由語句所返回的這一完整的行集被稱爲結果集。應用程序,特別是交互式聯機應用程序,並不總能將整個結果集作爲一個單元來有效地處理。這些應用程序需要一種機制以便每次處理一行或一部分行。遊標就是提供這種機制的結果集擴展。
遊標通過以下方式擴展結果處理:
允許定位在結果集的特定行。
從結果集的當前位置檢索一行或多行。
支持對結果集中當前位置的行進行數據修改。
爲由其他用戶對顯示在結果集中的數據庫數據所做的更改提供不同級別的可見性支持。
提供腳本、存儲過程和觸發器中使用的訪問結果集中的數據的 Transact-SQL 語句。
12、介紹一下SQL Server的全文索引
全文索引可以對存儲在SQL Server數據庫中的文本數據執行快速檢索功能。同LIKE謂詞不同,全文索引只對字符模式進行操作,對字和語句執行搜索功能。全文索引對於查詢非結構化數據非常有效。一般情況下,可以對char、varchar和nvarchar數據類型的列創建全文索引,同時,還可以對二進制格式的列創建索引,如image和varbinary數據類型列。對於這些二進制數據,無法使用LIKE謂詞。
爲了對錶創建全文索引,表必須包含單個、唯一、非空列。當執行全文檢索的時候,SQL Server搜索引擎返回匹配搜索條件的行的鍵值。一般情況,使用sql server中的全文索引,經過大體4個步驟:
安裝全文索引服務;
爲數據表建立全文索引目錄;
使全文索引與數據表內容同步;
使用全文索引進行查詢。
13、什麼是唯一索引
唯一索引可以確保索引列不包含重複的值。在多列唯一索引的情況下,該索引可以確保索引列中每個值組合都是唯一的。例如,如果在 last_name、first_name 和 middle_initial 列的組合上創建了唯一索引 full_name,則該表中任何兩個人都不可以具有相同的全名。
聚集索引和非聚集索引都可以是唯一的。因此,只要列中的數據是唯一的,就可以在同一個表上創建一個唯一的聚集索引和多個唯一的非聚集索引。
只有當唯一性是數據本身的特徵時,指定唯一索引纔有意義。如果必須實施唯一性以確保數據的完整性,則應在列上創建 UNIQUE 或 PRIMARY KEY 約束,而不要創建唯一索引。例如,如果打算經常查詢僱員表(主鍵爲 emp_id)中的社會安全號碼 (ssn) 列,並希望確保社會安全號碼的唯一性,則在 ssn 列上創建 UNIQUE 約束。如果用戶爲一個以上的僱員輸入了同一個社會安全號碼,則會顯示錯誤。
14、幾道數據庫筆試題
1.張表,學生表S,課程C,學生課程表SC,學生可以選修多門課程,一門課程可以被多個學生選修,通過SC表關聯;(SQL)
1)寫出建表語句;
答:建表語句如下(mysql數據庫):
create table s(id integer primary key, name varchar(20));
create table c(id integer primary key, name varchar(20));
create table sc(
sid integer references s(id),
cid integer references c(id),
primary key(sid,cid)
);
2)寫出SQL語句,查詢選修了所有選修課程的學生;
答:SQL語句如下:
select stu.id, stu.name from s stu
where (select count(*) from sc where sid=stu.id) =
(select count(*) from c);
3)寫出SQL語句,查詢選修了至少5門以上的課程的學生。
答:SQL語句如下:
select stu.id, stu.name from s stu
where (select count(*) from sc where sid=stu.id)>=5;
2.數據庫表(Test)結構如下:(SQL)
IDNAMEAGEMANAGER(所屬主管人ID)
106A30104
109B19104
104C20111
107D35109
112E25120
119F45NULL
要求:列出所有年齡比所屬主管年齡大的人的ID和名字?
答:SQL語句如下:
select employee.name from test employee where employee.age>
(select manager.age from test manager where manager.id=employee.manager);
3.有3個表(15分鐘):(SQL)
Student 學生表 (學號,姓名,性別,年齡,組織部門)
Course 課程表 (編號,課程名稱)
Sc 選課表 (學號,課程編號,成績)
表結構如下:
1)寫一個SQL語句,查詢選修了’計算機原理’的學生學號和姓名(3分鐘)
答:SQL語句如下:
select stu.sno, stu.sname from Student stu
where (select count(*) from sc where sno=stu.sno and cno =
(select cno from Course where cname=’計算機原理’)) != 0;
2)寫一個SQL語句,查詢’周星馳’同學選修了的課程名字(3分鐘)
答:SQL語句如下:
select cname from Course where cno in (select cno from sc where sno=(select sno from Student where sname=’周星馳’));
3)寫一個SQL語句,查詢選修了5門課程的學生學號和姓名(9分鐘)
答:SQL語句如下:
select stu.sno, stu.sname from student stu
where (select count(*) from sc where sno=stu.sno) = 5;
15、ORACLE面試題
1. 解釋FUNCTION,PROCEDURE和PACKAGE區別
答:function 和procedure是PL/SQL代碼的集合,通常爲了完成一個任務。procedure 不需要返回任何值而function將返回一個值在另一方面,Package是爲了完成一個商業功能的一組function和procedure的集合。
2. 取某個序列的當前值的PL/SQL語句怎麼寫?
答:SELECT 序列名.CURRVAL FROM DUAL;
3. 說明ORACLE數據庫實例與ORACLE用戶的關係?
答:實例可以包含多個用戶,一個用戶只能在一個實例下
4. 創建數據庫時,自動建立的tablespace名稱?
答:SYSTEM tablespace
5. 創建用戶時,需要賦予新用戶什麼權限才能使它連上數據庫?
答:CONNECT
6. IMPORT和SQL*LOADER這2個工具的不同點?
答:這兩個ORACLE工具都是用來將數據導入數據庫的。
區別是:IMPORT工具只能處理由另一個ORACLE工具EXPORT生成的數據。而SQL*LOADER可以導入不同的ASCII格式的數據源。
7.解釋冷備份和熱備份的不同點以及各自的優點?
答:熱備份針對歸檔模式的數據庫,在數據庫仍舊處於工作狀態時進行備份。而冷備份指在數據庫關閉後,進行備份,適用於所有模式的數據庫。熱備份的優點在於當備份時,數據庫仍舊可以被使用並且可以將數據庫恢復到任意一個時間點。冷備份的優點在於它的備份和恢復操作相當簡單,並且由於冷備份的數據庫可以工作在非歸檔模式下,數據庫性能會比歸檔模式稍好。(因爲不必將archive log寫入硬盤)
8.比較truncate和delete命令?
答:兩者都可以用來刪除表中所有的記錄。區別在於:truncate是DDL(data defining language數據定義語言),它移動HWK,不需要rollback segment(處理事務回滾操作)而Delete是DML(data manufacturing language數據操作語言)操作,需要rollback segment(處理事務回滾操作)且花費較長時間。
9.給出數據的相關約束類型?
答:主鍵約束,外鍵約束,非空約束,唯一約束,檢查約束。
10.說明索引的類型與作用?
答:索引類型上分爲聚集索引,非聚集索引其作用是加快查詢速度。
11.解釋歸檔和非歸檔模式之間的不同和它們各自的優缺點
答:歸檔模式是指你可以備份所有的數據庫 transactions並恢復到任意一個時間點。非歸檔模式則相反,不能恢復到任意一個時間點。但是非歸檔模式可以帶來數據庫性能上的少許提高。
12.解釋$ORACLE_HOME和$ORACLE_BASE的區別?
答:ORACLE_BASE是oracle的根目錄,ORACLE_HOME是oracle產品的目錄。
13.獲取某個字符字段的最後3個字符的函數是什麼?
答:select substr (字段,(length(字段)-3)) from 表
14.取當前系統時間點日期(不包括年月)的SQL寫法是怎樣的?
答:Select substr (to_char(sysdate,’YYYYMMDDh24hh:MM:SS’),5) from dual;
15.返回大於等於N的最小整數值?
答:select ceil(N) from dual;
16.將根據字符查詢轉換後結果,規則爲:’A’轉換爲’男’,’B’轉換爲’女’,其他字符轉換爲’未知’,請用一個SQL語句寫出。
答:select decode(字符,’A’,’男’,’B’,’女’,’未知’) from dual;
17.如何搜索出前N條記錄?
答:select * from 表 where Rownum <= N;
18.如何搜索出第N~M條記錄?
答:select * from 表 where Rownum <= M
Minus
select * from 表 where Rownum <= N;
19.有一個數據表(TEST),字段如下:
ID number
PARENT_ID number
NAME Varchar(20)
請使用PL/SQL來按父子層次關係查詢出該表的所有數據
答:Select * from test a, test b Where a.parent_id = b.id;
20.怎樣用SQL語句實現查找一列中的第N大值?
答:select * from (select * from 表 order by 列名 Desc) where Rownum <= N
Minus
select * from (select * from 表 order by 列名 Desc) where Rownum <= N-1;
16、什麼是事務,事務有哪些性質。
答:事務:是用戶定義的一個數據庫操作序列,這些操作要麼全做,要麼全不做,是一個不可分割的工作單位。一個事務可以是一條SQL語句,也可以是一組SQL語句。
性質:
(1)原子性:事務是數據庫的邏輯工作單位,被看做一個單一的、不可分割的操作單元。事務中包括的所有操作要麼都做,要麼都不做。
(2)一致性:事務執行的結果必須是使數據庫從一個一致狀態變到另一個一致狀態。
(3)隔離性:一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對其他併發事務是隔離的,併發執行的各個事務之間不能互相干擾。
(4)持續性:指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其執行結果有任何影響。
17、什麼是數據抽象,舉例說明
答:所謂數據抽象,是在對現實世界有一定的認識基礎上,對實際的人、物、事進行人爲的處理,忽略非本質的細節,抽取關心的共同和本質特徵,並把這些特徵用各種概念精確地加以描述。
18、數據庫設計包括那兩種,請分別說明。
答:廣義的數據庫設計,是指建立數據庫及其應用系統,包括選擇合適的計算機平臺和數據庫管理系統、設計數據庫、以及開發數據庫應用系統等。這種數據庫設計實際是“數據庫系統”的設計,其成果有二:一是數據庫,二是以數據庫爲基礎的應用系統。
狹義的數據庫設計,是指根據一個組織的信息需求、處理需求和相應的數據庫支撐環境,設計出數據庫,包括概念結構、邏輯結構和物理結構。其成果主要是數據庫,不包括應用系統。
19、簡述數據庫設計過程
答:數據庫設計分爲五個階段:
需求分析:主要是準確收集用戶信息需求和處理需求,並對收集的結果進行整理和分析,形成需求說明。
概念結構設計:對用戶需求進行綜合、歸納、抽象,形成一個與與具體的DBMS無關概念模型(一般爲ER模型)。
邏輯結構設計:將概念結構設計的概念模型轉化爲某個特定的DBMS所支持的數據模型,建立數據庫邏輯模式,並對其進行優化,同時爲各種用戶和應用設計外模式。
物理結構設計:爲設計好的邏輯模型選擇物理結構,包括存儲結構和存取方法等,建立數據庫物理模式。
實施和維護:實施就是使用DLL語言建立數據庫模式,將實際數據載入數據庫,建立真正的數據庫。維護階段是對運行中的數據庫進行評價、調整和修改。
20、SQL Server 2000有哪些文件,分別進行描述
答案:SQL Server 2000 數據庫有三種類型的文件:
主要數據文件
主要數據文件是數據庫的起點,指向數據庫中文件的其它部分。每個數據庫都有一個主要數據文件。主要數據文件的推薦文件擴展名是 .mdf。
次要數據文件
次要數據文件包含除主要數據文件外的所有數據文件。有些數據庫可能沒有次要數據文件,而有些數據庫則有多個次要數據文件。次要數據文件的推薦文件擴展名是 .ndf。
日誌文件
日誌文件包含恢復數據庫所需的所有日誌信息。每個數據庫必須至少有一個日誌文件,但可以不止一個。日誌文件的推薦文件擴展名是 .ldf。
21、查詢優化的一般準則有哪些
1. 選擇運算應儘可能先做。這是優化策略中最重要最基本的一條
2. 在執行連接前對關係適當的預處理,方法有兩種:在連接屬性上建立索引和對關係排序,然後執行連接,第一種稱爲索引連接方法,第二種稱爲排序合併連接方法
3. 把投影運算和選擇運算同時進行。
4. 把投影同其前或者其後的雙目運算結合起來,沒有必要爲了去掉某些字段而掃描一下關係
5. 把某些選擇同它前面要執行的笛卡爾積結合起來成爲一個連接運算,連接特別是等值連接運算要比同樣關係上的笛卡爾積節省很多時間
6. 找出公共子表達式,先計算出公共子表達式的值才參與運算。
22、Oracle 10問
14. 如何查看系統被鎖的事務時間?
select * from v$locked_object ;
15. 如何以archivelog的方式運行oracle。
init.ora
log_archive_start = true
RESTART DATABASE
16. 怎麼獲取有哪些用戶在使用數據庫
select username from v$session;
17. 數據表中的字段最大數是多少?
表或視圖中的最大列數爲 1000
18. 怎樣查得數據庫的SID ?
select name from v$database;
也可以直接查看 init.ora文件
19. 如何在Oracle服務器上通過SQLPLUS查看本機IP地址 ?
select sys_context(’userenv’,'ip_address’) from dual;
如果是登陸本機數據庫,只能返回127.0.0.1,呵呵
20. unix 下怎麼調整數據庫的時間?
su -root
date -u 08010000
23、幾道數據庫概念性面試題
這是幾道數據庫的概念性面試題,有的面試題在之前收錄的面試題裏面已經出現過了,不過還是要拿來強化一下概念:
1、觸發器的作用?
答:觸發器是一種特殊的存儲過程,它主要是通過事件來觸發而被執行的。它的作用是可以強化約束,維護數據的完整性和一致性,也可以可以跟蹤數據庫內的操作從而不允許未經許可的更新和變化。也可以聯級運算。如某表上的觸發器上包含對另一個表的數據操作,而該操作又會導致該表觸發器被觸發。
2、什麼是存儲過程?如何來調用存儲過程?
答:存儲過程是一個預編譯的SQL語句,他的優點是允許模塊化的設計,也就是說只需創建一次,在該程序中就可以調用多次。例如某次操作需要執行多次SQL,就可以把這個SQL做一個存儲過程,因爲存儲過程是預編譯的,所以使用存儲過程比單純SQL語句執行要快。可以用一個命令對象來調用存儲過程。
3、什麼是內存泄漏?
答:一般我們所說的內存泄漏指的是堆內存的泄漏。堆內存是程序從堆中爲其分配的,大小任意的,使用完後要顯示釋放內存。當應用程序用關鍵字new等創建對象時,就從堆中爲它分配一塊內存,使用完後程序調用free或者delete釋放該內存,否則就說該內存就不能被使用,我們就說該內存被泄漏了。
4、什麼是事務?
答:事務就是被綁定在一起作爲一個邏輯工作單元的SQL語句分組,如果任何一個語句操作失敗那麼整個操作就被失敗,以後操作就會回滾到操作前狀態,或者是上有個節點。爲了確保要麼執行,要麼不執行,就可以使用事務。事務有四個特性,分別是:原子性,一致性,隔離性和持久性。
5、索引的作用?和它的優點缺點是什麼?
答:索引就一種特殊的查詢表,數據庫的搜索引擎可以利用它加速對數據的檢索。索引很類似與現實生活中書的目錄,不需要查詢整本書內容就可以找到想要的數據。索引可以是唯一的,創建索引允許指定單個列或者是多個列。缺點是它減慢了數據錄入的速度,同時也增加了數據庫的尺寸大小。
6、什麼是鎖?
答:鎖是實現事務的關鍵,鎖可以保證事務的完整性和併發性。與現實生活中鎖一樣,它可以使某些數據的擁有者,在某段時間內不能使用某些數據或數據結構。當然鎖還分級別的。
7、維護數據庫的完整性和一致性,你喜歡用觸發器還是自寫業務邏輯?爲什麼?
答:儘可能使用約束,如check、主鍵、外鍵、非空字段等來約束。這樣做效率最高,也最方便。其次是使用觸發器,這種方法可以保證,無論什麼業務系統訪問數據庫都可以保證數據的完整新和一致性。最後考慮的是自寫業務邏輯,但這樣做麻煩,編程複雜,效率低下。
以上的答案不是很嚴謹,但是有利於理解,大家可以參考其他數據庫的資料進行記憶。
24、如果高效查詢出一個月內的數據
進行時間比較要儘量避免用sysdate. 比如:如果使用select * from eventtable where eventdate>sysdate-30進行查找,當數據量小的時候看不出來,數據量大一些就會發現執行很慢,但日期型字 段上也是有索引的,爲什麼會慢呢? 原來是Oracle在進行查找的時候不斷地去取sysdate這個不斷變化的值,而不是我們想象中的一次產生一個條件語句然後進行查找。爲了加快速度,我們可以先把當天的日期取出來,然後轉成字符串後再用如下語句查,select * from eventtable where eventdate > to_date(’2001-12-1′,’yyyy-mm-dd’)。速度相差幾十倍。
25、主鍵(Primary Key)約束和唯一性(UNIQUE)約束有什麼區別?
一個表只能由一個主鍵,一個表可以有很多個唯一鍵(UNIQUE Key)
主鍵不允許有null值,UNIQUE允許null值
26、Oracle中delete, truncate 和 drop的區別?
Delete命令用來刪除表的全部或者一部分數據行,執行delete之後,用戶需要提交(commmit)或者回滾(rollback) transaction 來執行刪除或者撤銷刪除, delete命令會觸發這個表上所有的delete觸發器。
Truncate刪除表中的所有數據, 這個操作不能回滾,也不會觸發這個表上的觸發器,TRUNCATE比delete更快,佔用的空間更小。
Drop命令從數據庫中刪除表, 所有的數據行,索引和權限也會被刪除,所有的DML觸發器也不會被觸發,這個命令也不能回滾。
27、MYSQL面試題:簡單敘述一下MYSQL的優化
1.數據庫的設計
儘量把數據庫設計的更小的佔磁盤空間.
1).儘可能使用更小的整數類型.(mediumint就比int更合適).
2).儘可能的定義字段爲not null,除非這個字段需要null.
3).如果沒有用到變長字段的話比如varchar,那就採用固定大小的紀錄格式比如char.
4).表的主索引應該儘可能的短.這樣的話每條紀錄都有名字標誌且更高效.
5).只創建確實需要的索引。索引有利於檢索記錄,但是不利於快速保存記錄。如果總是要在表的組合字段上做搜索,那麼就在這些字段上創建索引。索引的第一部分必須是最常使用的字段.如果總是需要用到很多字段,首先就應該多複製這些字段,使索引更好的壓縮。
6).所有數據都得在保存到數據庫前進行處理。
7).所有字段都得有默認值。
8).在某些情況下,把一個頻繁掃描的表分成兩個速度會快好多。在對動態格式表掃描以取得相關記錄時,它可能使用更小的靜態格式表的情況下更是如此。
2.系統的用途
1).儘量使用長連接.
2).explain 複雜的SQL語句。
3).如果兩個關聯表要做比較話,做比較的字段必須類型和長度都一致.
4).LIMIT語句儘量要跟order by或者 distinct.這樣可以避免做一次full table scan.
5).如果想要清空表的所有紀錄,建議用truncate table tablename而不是delete from tablename.
6).能使用STORE PROCEDURE 或者 USER FUNCTION的時候.
7).在一條insert語句中採用多重紀錄插入格式.而且使用load data infile來導入大量數據,這比單純的indert快好多.
8).經常OPTIMIZE TABLE 來整理碎片.
9).還有就是date 類型的數據如果頻繁要做比較的話儘量保存在unsigned int 類型比較快。
3.系統的瓶頸
1).磁盤搜索.
並行搜索,把數據分開存放到多個磁盤中,這樣能加快搜索時間.
2).磁盤讀寫(IO)
可以從多個媒介中並行的讀取數據。
3).CPU週期
數據存放在主內存中.這樣就得增加CPU的個數來處理這些數據。
4).內存帶寬
當CPU要將更多的數據存放到CPU的緩存中來的話,內存的帶寬就成了瓶頸.
28、一套經典的SQL面試題
1.一道SQL語句面試題,關於group by
表內容:
2005-05-09 勝
2005-05-09 勝
2005-05-09 負
2005-05-09 負
2005-05-10 勝
2005-05-10 負
2005-05-10 負
如果要生成下列結果, 該如何寫sql語句?
勝 負
2005-05-09 2 2
2005-05-10 1 2
——————————————
create table #tmp(rq varchar(10),shengfu nchar(1))
insert into #tmp values(’2005-05-09′,’勝’)
insert into #tmp values(’2005-05-09′,’勝’)
insert into #tmp values(’2005-05-09′,’負’)
insert into #tmp values(’2005-05-09′,’負’)
insert into #tmp values(’2005-05-10′,’勝’)
insert into #tmp values(’2005-05-10′,’負’)
insert into #tmp values(’2005-05-10′,’負’)
1)select rq, sum(case when shengfu=’勝’ then 1 else 0 end)’勝’,sum(case when shengfu=’負’ then 1 else 0 end)’負’ from #tmp group by rq
2) select N.rq,N.勝,M.負 from (
select rq,勝=count(*) from #tmp where shengfu=’勝’group by rq)N inner join
(select rq,負=count(*) from #tmp where shengfu=’負’group by rq)M on N.rq=M.rq
3)select a.col001,a.a1 勝,b.b1 負 from
(select col001,count(col001) a1 from temp1 where col002=’勝’ group by col001) a,
(select col001,count(col001) b1 from temp1 where col002=’負’ group by col001) b
where a.col001=b.col001
2.請教一個面試中遇到的SQL語句的查詢問題
表中有A B C三列,用SQL語句實現:當A列大於B列時選擇A列否則選擇B列,當B列大於C列時選擇B列否則選擇C列。
——————————————
select (case when a>b then a else b end ),
(case when b>c then b esle c end)
from table_name
3.面試題:一個日期判斷的sql語句?
請取出tb_send表中日期(SendTime字段)爲當天的所有記錄?(SendTime字段爲datetime型,包含日期與時間)
——————————————
select * from tb where datediff(dd,SendTime,getdate())=0
4.有一張表,裏面有3個字段:語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分,請用一條sql語句查詢出這三條記錄並按以下條件顯示出來(並寫出您的思路):
大於或等於80表示優秀,大於或等於60表示及格,小於60分表示不及格。
顯示格式:
語文 數學 英語
及格 優秀 不及格
——————————————
select
(case when 語文>=80 then ‘優秀’
when 語文>=60 then ‘及格’
else ‘不及格’) as 語文,
(case when 數學>=80 then ‘優秀’
when 數學>=60 then ‘及格’
else ‘不及格’) as 數學,
(case when 英語>=80 then ‘優秀’
when 英語>=60 then ‘及格’
else ‘不及格’) as 英語,
from table
5.在sqlserver2000中請用sql創建一張用戶臨時表和系統臨時表,裏面包含兩個字段ID和IDValues,類型都是int型,並解釋下兩者的區別?
——————————————
用戶臨時表:create table #xx(ID int, IDValues int)
系統臨時表:create table ##xx(ID int, IDValues int)
區別:
用戶臨時表只對創建這個表的用戶的Session可見,對其他進程是不可見的.
當創建它的進程消失時這個臨時表就自動刪除.
全局臨時表對整個SQL Server實例都可見,但是所有訪問它的Session都消失的時候,它也自動刪除.
6.sqlserver2000是一種大型數據庫,他的存儲容量只受存儲介質的限制,請問它是通過什麼方式實現這種無限容量機制的。
——————————————
它的所有數據都存儲在數據文件中(*.dbf),所以只要文件夠大,SQL Server的存儲容量是可以擴大的.
SQL Server 2000 數據庫有三種類型的文件:
主要數據文件
主要數據文件是數據庫的起點,指向數據庫中文件的其它部分。每個數據庫都有一個主要數據文件。主要數據文件的推薦文件擴展名是 .mdf。
次要數據文件
次要數據文件包含除主要數據文件外的所有數據文件。有些數據庫可能沒有次要數據文件,而有些數據庫則有多個次要數據文件。次要數據文件的推薦文件擴展名是 .ndf。
日誌文件
日誌文件包含恢復數據庫所需的所有日誌信息。每個數據庫必須至少有一個日誌文件,但可以不止一個。日誌文件的推薦文件擴展名是 .ldf。
7.請用一個sql語句得出結果
從table1,table2中取出如table3所列格式數據,注意提供的數據及結果不準確,只是作爲一個格式向大家請教。
如使用存儲過程也可以。
table1
月份mon 部門dep 業績yj
——————————-
一月份 01 10
一月份 02 10
一月份 03 5
二月份 02 8
二月份 04 9
三月份 03 8
table2
部門dep 部門名稱dname
——————————–
01 國內業務一部
02 國內業務二部
03 國內業務三部
04 國際業務部
table3 (result)
部門dep 一月份 二月份 三月份
————————————–
01 10 null null
02 10 8 null
03 null 5 8
04 null null 9
——————————————
1)
select a.部門名稱dname,b.業績yj as ‘一月份’,c.業績yj as ‘二月份’,d.業績yj as ‘三月份’
from table1 a,table2 b,table2 c,table2 d
where a.部門dep = b.部門dep and b.月份mon = ‘一月份’ and
a.部門dep = c.部門dep and c.月份mon = ‘二月份’ and
a.部門dep = d.部門dep and d.月份mon = ‘三月份’ and
2)
select a.dep,
sum(case when b.mon=1 then b.yj else 0 end) as ‘一月份’,
sum(case when b.mon=2 then b.yj else 0 end) as ‘二月份’,
sum(case when b.mon=3 then b.yj else 0 end) as ‘三月份’,
sum(case when b.mon=4 then b.yj else 0 end) as ‘四月份’,
sum(case when b.mon=5 then b.yj else 0 end) as ‘五月份’,
sum(case when b.mon=6 then b.yj else 0 end) as ‘六月份’,
sum(case when b.mon=7 then b.yj else 0 end) as ‘七月份’,
sum(case when b.mon=8 then b.yj else 0 end) as ‘八月份’,
sum(case when b.mon=9 then b.yj else 0 end) as ‘九月份’,
sum(case when b.mon=10 then b.yj else 0 end) as ‘十月份’,
sum(case when b.mon=11 then b.yj else 0 end) as ‘十一月份’,
sum(case when b.mon=12 then b.yj else 0 end) as ‘十二月份’,
from table2 a left join table1 b on a.dep=b.dep
8.華爲一道面試題
一個表中的Id有多個記錄,把所有這個id的記錄查出來,並顯示共有多少條記錄數。
——————————————
select id, Count(*) from tb group by id having count(*)>1
select * from(select count(ID) as count from table group by ID)T where T.count>1
29、爲什麼group by和 order by會使查詢變慢
group by 和 order by操作通常需要創建一個臨時表來處理查詢的結果,所以如果查詢結果很多的話會嚴重影響性能。
30、SQL一些基礎語法
1.增加字段
alter table docdsp add dspcode
char(200)
2.刪除字段
ALTER TABLE table_NAME DROP COLUMN
column_NAME
3.修改字段類型
ALTER TABLE table_name ALTER COLUMN
column_name new_data_type
4.sp_rename 改名
更改當前數據庫中用戶創建對象(如表、列或用戶定義數據類型)的名稱。
語法
sp_rename [ @objname = ]
'object_name' ,
[ @newname = ] 'new_name'
[ , [ @objtype =
] 'object_type' ]
如:EXEC sp_rename
'newname','PartStock'
5.sp_help 顯示錶的一些基本情況
sp_help 'object_name'
如:EXEC sp_help'PartStock'
6.判斷某一表PartStock中字段PartVelocity是否存在
if
exists (select * from syscolumns where
id=object_id('PartStock')and name='PartVelocity')
'PartVelocity exists'
else print 'PartVelocity not
exists'
另法:
判斷表的存在性:
select count(*) from sysobjects where type='U'
and name='你的表名'
判斷字段的存在性:
select count(*) from syscolumns
where
id = (select id from sysobjects where type='U' and name='你的表名')
and name = '你要判斷的字段名'
一個小例子
--假設要處理的表名爲:
tb
--判斷要添加列的表中是否有主鍵
if exists(select 1 from sysobjects where
parent_obj=object_id('tb') and xtype='PK')
begin
'表中已經有主鍵,列只能做爲普通列添加'
--添加int類型的列,默認值爲0
alter table tb add列名 int default
0
end
else
begin
print '表中無主鍵,添加主鍵列'
--添加int類型的列,默認值爲0
alter
table tb add 列名 int primary key default 0
end
7.隨機讀取若干條記錄
Access語法:SELECT top 10 * From表名 ORDER BY
Rnd(id)
Sql server:select top n * from表名 order by newid()
mysql select * From表名 Order By rand() Limit n
8.說明:日程安排提前五分鐘提醒
SQL:
select * from 日程安排 where datediff(minute,f開始時間,getdate())>5
9.前10條記錄
select top 10 * form table1 where範圍
10.包括所有在 TableA中但不在 TableB和TableC 中的行並消除所有重複行而派生出一個結果表
(select a
from tableA ) except (select a from tableB) except (select a from tableC)
11.說明:隨機取出10條數據
select top 10 * from tablename order by newid()
12.列出數據庫裏所有的表名
select name from sysobjects where type=U
13.列出表裏的所有的字段名
select name from syscolumns where
id=object_id(TableName)
14.說明:列示type、vender、pcs字段,以type字段排列,case可以方便地實現多重選擇,類似select
中的case。
select type,sum(case vender when A then pcs else 0
end),sum(case vender when C then pcs else 0 end),sum(case vender when B then pcs
else 0 end) FROM tablename group by type
15.說明:初始化表table1
TRUNCATE
TABLE table1
16.說明:幾個高級查詢運算詞
A: UNION 運算符
UNION 運算符通過組合其他兩個結果表(例如
TABLE1 和 TABLE2)並消去表中任何重複行而派生出一個結果表。當 ALL 隨 UNION 一起使用時(即 UNION
ALL),不消除重複行。兩種情況下,派生表的每一行不是來自 TABLE1就是來自 TABLE2。
B: EXCEPT 運算符
EXCEPT 運算符通過包括所有在 TABLE1 中但不在 TABLE2
中的行並消除所有重複行而派生出一個結果表。當 ALL隨 EXCEPT 一起使用時 (EXCEPT ALL),不消除重複行。
C: INTERSECT 運算符
INTERSECT 運算符通過只包括 TABLE1 和 TABLE2
中都有的行並消除所有重複行而派生出一個結果表。當 ALL隨 INTERSECT 一起使用時 (INTERSECT
ALL),不消除重複行。
注:使用運算詞的幾個查詢結果行必須是一致的。
17.說明:在線視圖查詢(表名1:a )
select * from (SELECT a,b,c FROM a) T where
t.a > 1;
18.說明:between的用法,between限制查詢數據範圍時包括了邊界值,not between不包括
select * from
table1 where time between time1 and time2
select a,b,c, from table1
where a not between數值1 and數值2
19.說明:in的使用方法
select * from table1 where a [not] in
(‘值1’,’值2’,’值4’,’值6’)
20.說明:兩張關聯表,刪除主表中已經在副表中沒有的信息
delete from table1 where not exists (
select * from table2 where table1.field1=table2.field1
)
21. 說明:複製表(只複製結構,源表名:a 新表名:b) (Access可用)
法一:select * into b from a
where 1<>1
法二:select top 0 * into b from a
22.說明:拷貝表(拷貝數據,源表名:a 目標表名:b) (Access可用)
insert into b(a, b, c)
select d,e,f from b;
23.說明:跨數據庫之間表的拷貝(具體數據使用絕對路徑) (Access可用)
insert into b(a, b, c)
select d,e,f from b in‘具體數據庫’ where條件
例子:..from b in
"&Server.MapPath(".")&"\data.mdb" &" where..
24.創建數據庫
CREATE DATABASE database-name
25.說明:刪除數據庫
drop database dbname
26.說明:備份sql server
--- 創建
備份數據的 device
USE master
EXEC sp_addumpdevice disk, testBack,
c:\mssql7backup\MyNwind_1.dat
--- 開始 備份
BACKUP DATABASE pubs TO testBack
27.說明:創建新表
create table tabname(col1 type1 [not null] [primary
key],col2 type2 [not null],..)
根據已有的表創建新表:
A:create table tab_new
like tab_old (使用舊錶創建新表)
B:create table tab_new as select col1,col2…
from tab_old definition only
28.說明:
刪除新表:drop table tabname
29.說明:
增加一個列:Alter table tabname add column col
type
注:列增加後將不能刪除。DB2中列加上後數據類型也不能改變,唯一能改變的是增加varchar類型的長度。
30.說明:
添加主鍵:Alter table tabname add primary key(col)
說明:
刪除主鍵:Alter table tabname drop primary key(col)
31.說明:
創建索引:create [unique] index idxname on tabname(col….)
刪除索引:drop index idxname
注:索引是不可更改的,想更改必須刪除重新建。
32.說明:
創建視圖:create view viewname as select statement
刪除視圖:drop view
viewname
33.說明:幾個簡單的基本的sql語句
選擇:select * from table1 where範圍
插入:insert into
table1(field1,field2) values(value1,value2)
刪除:delete from table1 where
範圍
更新:update table1 set field1=value1 where範圍
查找:select * from table1
where field1 like’%value1%’ ---like的語法很精妙,查資料!
排序:select * from table1
order by field1,field2 [desc]
總數:select count * as totalcount from
table1
求和:select sum(field1) as sumvalue from table1
平均:select
avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from
table1
最小:select min(field1) as minvalue from table1
31、簡單查詢
select name from bbc where population>=200000000; --查詢顯示出人口不小於2億的國家名字
select name ,(gdp/population)'人均GDP' from bbc where population>=200000000; --人口不小於200000000國家名稱及人均gdp
select name , round((populatio/1000000))'人口數(百萬)' from bbc where name in(south asia);
select name,popultion from bbc where name ='France', 'Germany', 'Italy'; --查詢出france,germany,italy三國的人口數
select name from bbc where name like '%united%'查詢出國家名稱包括united字符的的所有國家名稱;
表獲得諾貝爾獎
select yr,subject winner from nobel where yr = 1950; --顯示1950年獲得諾貝爾獎的人.的所有信息
select winner from nobel where yr =1962; --1962文學獎獲得者
select yr,subject from nodel where winner ='albert einstin'; --顯示'Albert Einstein'獲獎的年份和獎項.
select winner from nodel where yr>=2000 and subject = '和平獎';--2000年以來(包含2000年)和平獎的得主.
select * from nodel where yr between 1980 and 1989 and subject = '文學獎'; --1980到 1989間文學獎獲得者的所有信息
select *from nodel where winner=('Theodore Roosevelt', 'Woodrow Wilson', 'Jed Bartlet', 'Jimmy Carter');
select winner from nodel where winner like 'john%'
-DBA數據庫管理員JAVA程序員架構師必看