1. 用一條SQL 語句 查詢出每門課都大于80 分的學(xué)生姓名
name kecheng fenshu
張三 語文 81
張三 數(shù)學(xué) 75
李四 語文 76
李四 數(shù)學(xué) 90
王五 語文 81
王五 數(shù)學(xué) 100
王五 英語 90
答案1:select distinct name from table where name not in (select distinct name from table where fenshu<=80);
答案2:select name from table group by name having min(fenshu)>80;
答案3:? select name from table group by name having count(kecheng)>=3 and min(fenshu)>=80;
2. 刪除除了自動編號不同, 其他都相同的學(xué)生冗余信息
自動編號 學(xué)號 姓名 課程編號 課程名稱 分數(shù)
1 2005001 張三 0001 數(shù)學(xué) 69
2 2005002 李四 0001 數(shù)學(xué) 89
3 2005001 張三 0001 數(shù)學(xué) 69
答案1:delete from tablename where 自動編號 not in(select min(tmp.自動編號) as 自動編號 from tablename group by 學(xué)號, 姓名, 課程編號, 課程名稱, 分數(shù));
3. 面試題:怎么把這樣一個表兒
year month amount
1991 1 1.1
1991 2 1.2
1991 3 1.3
1991 4 1.4
1992 1 2.1
1992 2 2.2
1992 3 2.3
1992 4 2.4
查成這樣一個結(jié)果
year m1 m2 m3 m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4
答案一可训、
select year,
(select amount from aaa m where month=1 and m.year=aaa.year) as m1,
(select amount from aaa m where month=2 and m.year=aaa.year) as m2,
(select amount from aaa m where month=3 and m.year=aaa.year) as m3,
(select amount from aaa m where month=4 and m.year=aaa.year) as m4
from aaa group by year
4. 說明:拷貝表( 拷貝數(shù)據(jù), 源表名:a 目標表名:b)
SQL: insert into b(a, b, c) select d,e,f from a;
5.有一張表,里面有3個字段:語文速址,數(shù)學(xué),英語含末。其中有3條記錄分別表示語文70分谷炸,數(shù)學(xué)80分,英語58分,請用一條sql語句查詢出這三條記錄并按以下條件顯示出來(并寫出您的思路):
大于或等于80表示優(yōu)秀雏赦,大于或等于60表示及格,小于60分表示不及格芙扎。
顯示格式:
語文 數(shù)學(xué) 英語
及格 優(yōu)秀 不及格
——————————————
select
(case when 語文>=80 then ‘優(yōu)秀’
when 語文>=60 then ‘及格’
else ‘不及格’) as 語文,
(case when 數(shù)學(xué)>=80 then ‘優(yōu)秀’
when 數(shù)學(xué)>=60 then ‘及格’
else ‘不及格’) as 數(shù)學(xué),
(case when 英語>=80 then ‘優(yōu)秀’
when 英語>=60 then ‘及格’
else ‘不及格’) as 英語
from table
B(MYSQL)):
select
(case when 語文>=80 then ‘優(yōu)秀’
when 語文>=60 then ‘及格’
else ‘不及格’ end) as 語文,
(case when 數(shù)學(xué)>=80 then ‘優(yōu)秀’
when 數(shù)學(xué)>=60 then ‘及格’
else ‘不及格’?end) as 數(shù)學(xué),
(case when 英語>=80 then ‘優(yōu)秀’
when 英語>=60 then ‘及格’
else ‘不及格’?end) as 英語
from table
6星岗、編寫SQL語句
1) 創(chuàng)建一張學(xué)生表,包含以下信息戒洼,學(xué)號俏橘,姓名,年齡圈浇,性別寥掐,家庭住址,聯(lián)系電話
Create table stu (學(xué)號 int not null primary key,
姓名 varchar(8),
年齡 int,
性別 varchar(4),
家庭地址 varchar(50),
聯(lián)系電話 int
);
2) 修改學(xué)生表的結(jié)構(gòu)磷蜀,添加一列信息召耘,學(xué)歷
Alter table stu?add 學(xué)歷 varchar(6);
3) 修改學(xué)生表的結(jié)構(gòu),刪除一列信息褐隆,家庭住址
Alter table stu?drop column 家庭地址;
4) 向?qū)W生表添加如下信息:
學(xué)號 姓名年齡性別聯(lián)系電話學(xué)歷
1A22男123456小學(xué)
2B21男119中學(xué)
3C23男110高中
4D18女114大學(xué)
Insert into stu values(1,’A’,22,’男’,123456,’小學(xué)’)
Insert into stu values(2,’B’,21,’男’,119,’中學(xué)’)
Insert into stu values(3,’C’,23,’男’,110,’高中’)
Insert into stu values(4,’D’,18,’女’,114,’大學(xué)’)
5) 修改學(xué)生表的數(shù)據(jù)污它,將電話號碼以11開頭的學(xué)員的學(xué)歷改為“大專”
Update stu set 學(xué)歷=’大屖’ where 聯(lián)系電話 like ‘11%’
6) 刪除學(xué)生表的數(shù)據(jù)衫贬,姓名以C開頭,性別為‘男’的記錄刪除
Delect from stu where 性別=’男’ and 姓名 like ‘c%’
7) 查詢學(xué)生表的數(shù)據(jù)歇攻,將所有年齡小于22歲的祥山,學(xué)歷為“大專”的掉伏,學(xué)生的姓名和學(xué)號示出來
Select 姓名,學(xué)號 from stu where 年齡<22 and 學(xué)歷=’大專’
8) 查詢學(xué)生表的數(shù)據(jù)澳窑,查詢所有信息斧散,列出前25%的記錄
A(ANSI SQL)): Select top 25 percent * from stu;
B(MYSQL)): select * from stu limit 25;//前25條記錄,非25%
9) 查詢出所有學(xué)生的姓名摊聋,性別鸡捐,年齡降序排列
Select 姓名,性別 from stu order by 年齡 desc
10) 按照性別分組查詢所有的平均年齡
Select avg(年齡) from stu group by 性別
7、查詢A(ID,Name)表中第31至40條記錄麻裁,ID作為主鍵可能是不是連續(xù)增長的列箍镜,完整的查詢語句如下:
select top 10 * from A where ID >(select max(ID) from (select top 30 ID from A order by A ) T) order by A
?B(MYSQL)): SELECT * FROM A LIMIT 31,10;
8源祈、查詢表A中存在ID重復(fù)三次以上的記錄,完整的查詢語句如下:
select * from(select count(ID) as count from table group by ID)T where T.count>3//個人覺得有誤。
SELECT * FROM A WHERE ID IN(SELECT ID FROM A GROUP BY ID HAVING COUNT(ID)>3);//正確版本?
9色迂、說出以下聚合數(shù)的含義:avg ,sum ,max ,min , count ,count(*)
AVG:求平均值
SUM:求和
MAX:求最大值
MIN:求最小值
COUNT(*):返回所有行數(shù)
*****************************************************************
事務(wù) Transaction 觸發(fā)器 TRIGGER 繼續(xù) continue 唯一 unqiue
主鍵 primary key 標識列 identity 外鍵 foreign key 檢查 check
約束 constraint
*****************************************************************
10香缺、說明:隨機取出10條數(shù)據(jù)
select top 10 * from tablename order by newid()
?B(MYSQL)): select * from tablename order by rand() limit 10;
11、查詢平均成績大于60分的同學(xué)的學(xué)號和平均成績歇僧;
select?stuId,avg(score)
from?Scores
group?by?stuId?having?avg(score)?>60;
12图张、?一個叫?team?的表,里面只有一個字段name,?一共有4?條紀錄诈悍,分別是a,b,c,d,?對應(yīng)四個球?qū)雎郑F(xiàn)在四個球?qū)M行比賽,用一條sql?語句顯示所有可能的比賽組合.
你先按你自己的想法做一下侥钳,看結(jié)果有我的這個簡單嗎适袜?
答:select a.name, b.name?from team a, team b?where a.name < b.name;
13舷夺、請用SQL?語句實現(xiàn):從TestDB?數(shù)據(jù)表中查詢出所有月份的發(fā)生額都比101?科目相應(yīng)月份的發(fā)生額高的科目苦酱。請注意:TestDB?中有很多科目,都有1?-12?月份的發(fā)生額冕房。
AccID?:科目代碼躏啰,Occmonth?:發(fā)生額月份,DebitOccur?:發(fā)生額耙册。
數(shù)據(jù)庫名:JcyAudit?给僵,數(shù)據(jù)集:Select * from TestDB
答:select a.*from TestDB a
,(select Occmonth,max(DebitOccur) Debit101ccur from TestDB where AccID=’101’ group by Occmonth) b
where a.Occmonth=b.Occmonth and a.DebitOccur>b.Debit101ccur;
14详拙、說明:復(fù)制表(?只復(fù)制結(jié)構(gòu),?源表名:a?新表名:b)?
SQL: select * into b from a where 1<>1帝际; ? (where1=1,拷貝表結(jié)構(gòu)和數(shù)據(jù)內(nèi)容)
MYSQL: CREATE TABLE b AS ?SELECT * FROM a WHERE ?1<>1饶辙; (where1=1蹲诀,拷貝表結(jié)構(gòu)和數(shù)據(jù)內(nèi)容)
ORACLE:create table b?As?Select * from a where 1=2;
[<>(不等于)(SQL Server Compact)
比較兩個表達式弃揽。 當使用此運算符比較非空表達式時脯爪,如果左操作數(shù)不等于右操作數(shù),則結(jié)果為 TRUE矿微。 否則痕慢,結(jié)果為 FALSE。]
15涌矢、說明:拷貝表(?拷貝數(shù)據(jù),?源表名:a?目標表名:b)
SQL: insert into b(a, b, c) ?select d,e,f from a;
16掖举、 說明:顯示文章、提交人和最后回復(fù)時間
SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
17娜庇、說明:外連接查詢(?表名1?:a?表名2?:b)
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUTER JOIN b ON a.a = b.c 或
select a.a,a.b,a.c,b.d,b.f from a,b where a.a=b.c;//較簡潔
ORACLE?:select a.a, a.b, a.c, b.c, b.d, b.f from a ,b?where a.a = b.c(+)
18塔次、?說明:日程安排提前五分鐘提醒
SQL: select * from?日程安排?where datediff(‘minute’,f?開始時間,getdate())>5
19方篮、說明:兩張關(guān)聯(lián)表,刪除主表中已經(jīng)在副表中沒有的信息
SQL:?Delete from info where not exists (select * from infobz where info.infid=infobz.infid )
*******************************************************************************
20励负、?有兩個表A?和B?藕溅,均有key?和value?兩個字段,如果B?的key?在A?中也有熄守,就把B?的value?換為A?中對應(yīng)的value
這道題的SQL?語句怎么寫蜈垮?
update b set b.value=(select a.value from a where a.key=b.key) where b.id in(select b.id from b,a where b.key=a.key);
**********************************************************************************************************************************************************************************************************************************
高級sql?面試題
原表:
courseid coursename score
————————————-
1 java 70
2 oracle 90
3 xml 40
4 jsp 30
5 servlet 80
————————————-
為了便于閱讀,?查詢此表后的結(jié)果顯式如下(?及格分數(shù)為60):
courseid coursename score mark
—————————————————
1 java 70 pass
2 oracle 90 pass
3 xml 40 fail
4 jsp 30 fail
5 servlet 80 pass
—————————————————
寫出此查詢語句
select courseid, coursename ,score ,decode?(sign(score-60),-1,’fail’,’pass’) as mark from course
完全正確
SQL> desc course_v
Name Null? Type
—————————————– ——– —————————-
COURSEID NUMBER
COURSENAME VARCHAR2(10)
SCORE NUMBER
SQL> select * from course_v;
COURSEID COURSENAME SCORE
———- ———- ———-
1 java 70
2 oracle 90
3 xml 40
4 jsp 30
5 servlet 80
SQL> select courseid, coursename ,score ,decode(sign(score-60),-1,’fail’,’pass’) as mark from course_v;
COURSEID COURSENAME SCORE MARK
———- ———- ———- —-
1 java 70 pass
2 oracle 90 pass
3 xml 40 fail
4 jsp 30 fail
5 servlet 80 pass
SQL面試題(1)
create table testtable1
(
id int IDENTITY,
department varchar(12)
)
select * from testtable1
insert into testtable1 values(‘設(shè)計’)
insert into testtable1 values(‘市場’)
insert into testtable1 values(‘售后’)
/*
結(jié)果
id department
1?? 設(shè)計
2?? 市場
3?? 售后
*/
create table testtable2
(
id int IDENTITY,
dptID int,
name varchar(12)
)
insert into testtable2 values(1,’張三’)
insert into testtable2 values(1,’李四’)
insert into testtable2 values(2,’王五’)
insert into testtable2 values(3,’彭六’)
insert into testtable2 values(4,’陳七’)
/*
用一條SQL語句,怎么顯示如下結(jié)果
id dptID department name
1?? 1????? 設(shè)計??????? 張三
2?? 1????? 設(shè)計??????? 李四
3?? 2????? 市場??????? 王五
4?? 3????? 售后??????? 彭六
5?? 4????? 黑人??????? 陳七
*/
答案:
SELECT testtable2.* , ISNULL(department,’黑人’)
FROM testtable1 right join testtable2 on testtable2.dptID = testtable1.ID
也做出來了可比這方法稍復(fù)雜裕照。
sql面試題(2)
有表A攒发,結(jié)構(gòu)如下:
A: p_ID p_Num s_id
1 10 01
1 12 02
2 8 01
3 11 01
3 8 03
其中:p_ID為產(chǎn)品ID,p_Num為產(chǎn)品庫存量晋南,s_id為倉庫ID惠猿。請用SQL語句實現(xiàn)將上表中的數(shù)據(jù)合并,合并后的數(shù)據(jù)為:
p_ID s1_id s2_id s3_id
1 10 12 0
2 8 0 0
3 11 0 8
其中:s1_id為倉庫1的庫存量负间,s2_id為倉庫2的庫存量偶妖,s3_id為倉庫3的庫存量。如果該產(chǎn)品在某倉庫中無庫存量政溃,那么就是0代替趾访。
結(jié)果:
select p_id ,
sum(case when s_id=1 then p_num else 0 end) as s1_id
,sum(case when s_id=2 then p_num else 0 end) as s2_id
,sum(case when s_id=3 then p_num else 0 end) as s3_id
from myPro group by p_id
SQL面試題(3)
1?.觸發(fā)器的作用?
???答:觸發(fā)器是一中特殊的存儲過程董虱,主要是通過事件來觸發(fā)而被執(zhí)行的扼鞋。它可以強化約束,來維護數(shù)據(jù)的完整性和一致性愤诱,可以跟蹤數(shù)據(jù)庫內(nèi)的操作從而不允許未經(jīng)許可的更新和變化云头。可以聯(lián)級運算淫半。如溃槐,某表上的觸發(fā)器上包含對另一個表的數(shù)據(jù)操作,而該操作又會導(dǎo)致該表觸發(fā)器被觸發(fā)科吭。
2?昏滴。什么是存儲過程?用什么來調(diào)用对人?
答:存儲過程是一個預(yù)編譯的?SQL?語句影涉,優(yōu)點是允許模塊化的設(shè)計,就是說只需創(chuàng)建一次规伐,以后在該程序中就可以調(diào)用多次。如果某次操作需要執(zhí)行多次?SQL?匣缘,使用存儲過程比單純?SQL?語句執(zhí)行要快猖闪∠侍模可以用一個命令對象來調(diào)用存儲過程。
3?培慌。索引的作用豁陆?和它的優(yōu)點缺點是什么?
答:索引就一種特殊的查詢表吵护,數(shù)據(jù)庫的搜索引擎可以利用它加速對數(shù)據(jù)的檢索盒音。它很類似與現(xiàn)實生活中書的目錄,不需要查詢整本書內(nèi)容就可以找到想要的數(shù)據(jù)馅而。索引可以是唯一的祥诽,創(chuàng)建索引允許指定單個列或者是多個列。缺點是它減慢了數(shù)據(jù)錄入的速度瓮恭,同時也增加了數(shù)據(jù)庫的尺寸大小雄坪。
3?。什么是內(nèi)存泄漏屯蹦?
答:一般我們所說的內(nèi)存泄漏指的是堆內(nèi)存的泄漏维哈。堆內(nèi)存是程序從堆中為其分配的,大小任意的登澜,使用完后要顯示釋放內(nèi)存阔挠。當應(yīng)用程序用關(guān)鍵字?new?等創(chuàng)建對象時,就從堆中為它分配一塊內(nèi)存脑蠕,使用完后程序調(diào)用?free?或者?delete?釋放該內(nèi)存购撼,否則就說該內(nèi)存就不能被使用,我們就說該內(nèi)存被泄漏了空郊。
4?份招。維護數(shù)據(jù)庫的完整性和一致性,你喜歡用觸發(fā)器還是自寫業(yè)務(wù)邏輯狞甚?為什么锁摔?
答:我是這樣做的,盡可能使用約束哼审,如?check,?主鍵谐腰,外鍵,非空字段等來約束涩盾,這樣做效率最高十气,也最方便。其次是使用觸發(fā)器春霍,這種方法可以保證砸西,無論什么業(yè)務(wù)系統(tǒng)訪問數(shù)據(jù)庫都可以保證數(shù)據(jù)的完整新和一致性。最后考慮的是自寫業(yè)務(wù)邏輯,但這樣做麻煩芹枷,編程復(fù)雜衅疙,效率低下。
5?鸳慈。什么是事務(wù)饱溢?什么是鎖?
答:事務(wù)就是被綁定在一起作為一個邏輯工作單元的?SQL?語句分組走芋,如果任何一個語句操作失敗那么整個操作就被失敗绩郎,以后操作就會回滾到操作前狀態(tài),或者是上有個節(jié)點翁逞。為了確保要么執(zhí)行肋杖,要么不執(zhí)行,就可以使用事務(wù)熄攘。要將有組語句作為事務(wù)考慮兽愤,就需要通過?ACID?測試,即原子性挪圾,一致性浅萧,隔離性和持久性。
???鎖:在所以的?DBMS?中哲思,鎖是實現(xiàn)事務(wù)的關(guān)鍵洼畅,鎖可以保證事務(wù)的完整性和并發(fā)性。與現(xiàn)實生活中鎖一樣棚赔,它可以使某些數(shù)據(jù)的擁有者帝簇,在某段時間內(nèi)不能使用某些數(shù)據(jù)或數(shù)據(jù)結(jié)構(gòu)。當然鎖還分級別的靠益。
6?丧肴。什么叫視圖?游標是什么胧后?
答:視圖是一種虛擬的表芋浮,具有和物理表相同的功能】强欤可以對視圖進行增纸巷,改,查眶痰,操作瘤旨,試圖通常是有一個表或者多個表的行或列的子集。對視圖的修改不影響基本表竖伯。它使得我們獲取數(shù)據(jù)更容易存哲,相比多表查詢因宇。
???游標:是對查詢出來的結(jié)果集作為一個單元來有效的處理。游標可以定在該單元中的特定行宏胯,從結(jié)果集的當前行檢索一行或多行羽嫡。可以對結(jié)果集當前行做修改肩袍。一般不使用游標,但是需要逐條處理數(shù)據(jù)的時候婚惫,游標顯得十分重要氛赐。
7。為管理業(yè)務(wù)培訓(xùn)信息先舷,建立3個表:
???? S(S#,SN,SD,SA)S#,SN,SD,SA分別代表學(xué)號艰管,學(xué)員姓名,所屬單位蒋川,學(xué)員年齡
???? C(C#,CN)C#,CN分別代表課程編號牲芋,課程名稱
????? SC(S#,C#,G) S#,C#,G分別代表學(xué)號,所選的課程編號捺球,學(xué)習(xí)成績
??? (1)使用標準SQL嵌套語句查詢選修課程名稱為’稅收基礎(chǔ)’的學(xué)員學(xué)號和姓名?
????????? 答案:select s# ,sn from s where S# in(select S# from c,sc where c.c#=sc.c# and cn=’稅收基礎(chǔ)’)
????? (2) 使用標準SQL嵌套語句查詢選修課程編號為’C2’的學(xué)員姓名和所屬單位?
答:select sn,sd from s,sc where s.s#=sc.s# and sc.c#=’c2’
????? (3) 使用標準SQL嵌套語句查詢不選修課程編號為’C5’的學(xué)員姓名和所屬單位?
答:select sn,sd from s where s# not in(select s# from sc where c#=’c5’)
?????? (4)查詢選修了課程的學(xué)員人數(shù)
答:select 學(xué)員人數(shù)=count(distinct s#) from sc
?????? (5) 查詢選修課程超過5門的學(xué)員學(xué)號和所屬單位?
答:select sn,sd from s where s# in(select s# from sc group by s# having count(distinct c#)>5)
SQL面試題(4)
1.查詢A(ID,Name)表中第31至40條記錄缸浦,ID作為主鍵可能是不是連續(xù)增長的列,完整的查詢語句如下:
select top 10 * from A where ID >(select max(ID) from (select top 30 ID from A order by A ) T) order by A
2.查詢表A中存在ID重復(fù)三次以上的記錄,完整的查詢語句如下:
select * from(select count(ID) as count from table group by ID)T where T.count>3
SQL面試題(5)
在面試應(yīng)聘的SQL Server數(shù)據(jù)庫開發(fā)人員時氮兵,我運用了一套標準的基準技術(shù)問題裂逐。下面這些問題是我覺得能夠真正有助于淘汰不合格應(yīng)聘者的問題。它們按照從易到難的順序排列泣栈。當你問到關(guān)于主鍵和外鍵的問題時卜高,后面的問題都十分有難度,因為答案可能會更難解釋和說明南片,尤其是在面試的情形下掺涛。
你能向我簡要敘述一下SQL Server 2000中使用的一些數(shù)據(jù)庫對象嗎?
你希望聽到的答案包括這樣一些對象:表格、視圖疼进、用戶定義的函數(shù)薪缆,以及存儲過程;如果他們還能夠提到像觸發(fā)器這樣的對象就更好了。如果應(yīng)聘者不能回答這個基本的問題颠悬,那么這不是一個好兆頭矮燎。
NULL是什么意思?
NULL(空)這個值是數(shù)據(jù)庫世界里一個非常難纏的東西,所以有不少應(yīng)聘者會在這個問題上跌跟頭您也不要覺得意外赔癌。
NULL這個值表示UNKNOWN(未知):它不表示“”(空字符串)诞外。假設(shè)您的SQL Server數(shù)據(jù)庫里有ANSI_NULLS,當然在默認情況下會有灾票,對NULL這個值的任何比較都會生產(chǎn)一個NULL值峡谊。您不能把任何值與一個 UNKNOWN值進行比較,并在邏輯上希望獲得一個答案。您必須使用IS NULL操作符既们。
什么是索引?SQL Server 2000里有什么類型的索引?
任何有經(jīng)驗的數(shù)據(jù)庫開發(fā)人員都應(yīng)該能夠很輕易地回答這個問題濒析。一些經(jīng)驗不太多的開發(fā)人員能夠回答這個問題,但是有些地方會說不清楚啥纸。
簡單地說号杏,索引是一個數(shù)據(jù)結(jié)構(gòu),用來快速訪問數(shù)據(jù)庫表格或者視圖里的數(shù)據(jù)斯棒。在SQL Server里盾致,它們有兩種形式:聚集索引和非聚集索引。聚集索引在索引的葉級保存數(shù)據(jù)荣暮。這意味著不論聚集索引里有表格的哪個(或哪些)字段庭惜,這些字段都會按順序被保存在表格。由于存在這種排序穗酥,所以每個表格只會有一個聚集索引护赊。非聚集索引在索引的葉級有一個行標識符。這個行標識符是一個指向磁盤上數(shù)據(jù)的指針砾跃。它允許每個表格有多個非聚集索引骏啰。
什么是主鍵?什么是外鍵?
主鍵是表格里的(一個或多個)字段,只用來定義表格里的行;主鍵里的值總是唯一的蜓席。外鍵是一個用來建立兩個表格之間關(guān)系的約束器一。這種關(guān)系一般都涉及一個表格里的主鍵字段與另外一個表格(盡管可能是同一個表格)里的一系列相連的字段。那么這些相連的字段就是外鍵厨内。
什么是觸發(fā)器?SQL Server 2000有什么不同類型的觸發(fā)器?
讓未來的數(shù)據(jù)庫開發(fā)人員知道可用的觸發(fā)器類型以及如何實現(xiàn)它們是非常有益的祈秕。
觸發(fā)器是一種專用類型的存儲過程,它被捆綁到SQL Server 2000的表格或者視圖上雏胃。在SQL Server 2000里请毛,有INSTEAD-OF和AFTER兩種觸發(fā)器。INSTEAD-OF觸發(fā)器是替代數(shù)據(jù)操控語言(Data Manipulation Language瞭亮,DML)語句對表格執(zhí)行語句的存儲過程方仿。例如,如果我有一個用于TableA的INSTEAD-OF-UPDATE觸發(fā)器统翩,同時對這個表格執(zhí)行一個更新語句仙蚜,那么INSTEAD-OF-UPDATE觸發(fā)器里的代碼會執(zhí)行,而不是我執(zhí)行的更新語句則不會執(zhí)行操作厂汗。
AFTER觸發(fā)器要在DML語句在數(shù)據(jù)庫里使用之后才執(zhí)行委粉。這些類型的觸發(fā)器對于監(jiān)視發(fā)生在數(shù)據(jù)庫表格里的數(shù)據(jù)變化十分好用。
您如何確一個帶有名為Fld1字段的TableB表格里只具有Fld1字段里的那些值娶桦,而這些值同時在名為TableA的表格的Fld1字段里?
這個與關(guān)系相關(guān)的問題有兩個可能的答案贾节。第一個答案(而且是您希望聽到的答案)是使用外鍵限制汁汗。外鍵限制用來維護引用的完整性。它被用來確保表格里的字段只保存有已經(jīng)在不同的(或者相同的)表格里的另一個字段里定義了的值栗涂。這個字段就是候選鍵(通常是另外一個表格的主鍵)知牌。
另外一種答案是觸發(fā)器。觸發(fā)器可以被用來保證以另外一種方式實現(xiàn)與限制相同的作用斤程,但是它非常難設(shè)置與維護角寸,而且性能一般都很糟糕。由于這個原因忿墅,微軟建議開發(fā)人員使用外鍵限制而不是觸發(fā)器來維護引用的完整性袭厂。
對一個投入使用的在線事務(wù)處理表格有過多索引需要有什么樣的性能考慮?
你正在尋找進行與數(shù)據(jù)操控有關(guān)的應(yīng)聘人員。對一個表格的索引越多球匕,數(shù)據(jù)庫引擎用來更新、插入或者刪除數(shù)據(jù)所需要的時間就越多帖烘,因為在數(shù)據(jù)操控發(fā)生的時候索引也必須要維護亮曹。
你可以用什么來確保表格里的字段只接受特定范圍里的值?
這個問題可以用多種方式來回答,但是只有一個答案是“好”答案秘症。您希望聽到的回答是Check限制照卦,它在數(shù)據(jù)庫表格里被定義,用來限制輸入該列的值乡摹。
觸發(fā)器也可以被用來限制數(shù)據(jù)庫表格里的字段能夠接受的值役耕,但是這種辦法要求觸發(fā)器在表格里被定義,這可能會在某些情況下影響到性能聪廉。因此瞬痘,微軟建議使用Check限制而不是其他的方式來限制域的完整性。
如果應(yīng)聘者能夠正確地回答這個問題板熊,那么他的機會就非常大了框全,因為這表明他們具有使用存儲過程的經(jīng)驗。
返回參數(shù)總是由存儲過程返回干签,它用來表示存儲過程是成功還是失敗津辩。返回參數(shù)總是INT數(shù)據(jù)類型。
OUTPUT參數(shù)明確要求由開發(fā)人員來指定容劳,它可以返回其他類型的數(shù)據(jù)喘沿,例如字符型和數(shù)值型的值。(可以用作輸出參數(shù)的數(shù)據(jù)類型是有一些限制的竭贩。)您可以在一個存儲過程里使用多個OUTPUT參數(shù)蚜印,而您只能夠使用一個返回參數(shù)。
什么是相關(guān)子查詢?如何使用這些查詢?
經(jīng)驗更加豐富的開發(fā)人員將能夠準確地描述這種類型的查詢娶视。
相關(guān)子查詢是一種包含子查詢的特殊類型的查詢晒哄。查詢里包含的子查詢會真正請求外部查詢的值睁宰,從而形成一個類似于循環(huán)的狀況。
SQL面試題(6)
原表:
courseid coursename score
————————————-
1 java 70
2 oracle 90
3 xml 40
4 jsp 30
5 servlet 80
————————————-
為了便于閱讀,查詢此表后的結(jié)果顯式如下(及格分數(shù)為60):
courseid coursename score mark
—————————————————
1 java 70 pass
2 oracle 90 pass
3 xml 40 fail
4 jsp 30 fail
5 servlet 80 pass
—————————————————
寫出此查詢語句
ORACLE : select courseid, coursename ,score ,decode(sign(score-60),-1,’fail’,’pass’) as mark from course
(DECODE函數(shù)是ORACLE PL/SQL是功能強大的函數(shù)之一寝凌,目前還只有ORACLE公司的SQL提供了此函數(shù))
(SQL: select courseid, coursename ,score ,(case when score<60 then ‘fail’ else ‘pass’ end) as mark from course )
面試題中的一道sql題柒傻,比較考察對sql函數(shù)的掌握程度,記錄一下较木,方便學(xué)習(xí)红符。
需求:
????? ? 一張客戶表 tb_cust 如下:
CUST_IDvarchar(30)
客戶編號(primary key)
CERTIFICATE_NO
varchar(18)
身份證號(not null)
一張訂單表tb_oreder 如下:
CUST_IDvarchar(30)客戶編號
APPLY_IDvarchar(50)訂單編號(primary key)
AMOUNTdouble訂單金額
根據(jù)上面兩張表提供的信息,寫出如下效果圖所示的sql語句伐债。
注意:
1.年齡信息沒有具體提供松忍。
2.不能使用 union 等連接字符。
答案如下:
select
casewhenk.flag =1then'30歲以下'whenk.flag =2then'30-50歲之間'whenk.flag =3then'50歲以上'else'總計'endas'年齡區(qū)間',
COUNT(DISTINCT(a.CUST_ID))as'客戶數(shù)量',COUNT(flag)as'訂單數(shù)量',SUM(AMOUNT)as'訂單總額'
fromtb_order a
leftjoin
(selectc.CUST_ID,
IF(c.age<30,1,IF(c.age<50,2,3))asflag
from
(selectCUST_ID,
FLOOR(PERIOD_DIFF(EXTRACT(YEAR_MONTHfromNOW()),substring(CERTIFICATE_NOFROM7FOR6))/12)asage
fromtb_cust) c) k
ona.CUST_ID = k.CUST_ID
GROUPBYk.flagWITHROLLUP
1
知識點整理:
1.Mysql中的with rollup是用來在分組統(tǒng)計數(shù)據(jù)的基礎(chǔ)上再進行統(tǒng)計匯總履怯,即用來得到group by的匯總信息坑填。
2.if函數(shù):if(a > b ? true : false)效果等同于java中的三目運算符。
3.PERIOD_DIFF(P1,P2):計算周期P1和P2之間的月數(shù)虹蒋。 P1和P2格式為YYMM或YYYYMM糜芳。注意周期參數(shù) P1 和 P2 都不是日期值
4.mysql的 substring(str from pos for len) 起點從1開始。例如:當str為身份證號:37152719990101034時魄衅,substring(str from 7 for 6)的值為:199101