SQLServer 常見SQL筆試題之語句操做題詳解

 

 

SqlServer 常見SQL筆試題之語句操做題詳解
java

by:授客 QQ1033553122數據庫


測試數據庫c#

CREATE DATABASE handWriting網絡

ON PRIMARYoracle

(jsp

    name = 'bishi',函數

    fileName = 'E:\數據庫\bishi.mbf',學習

    size = 5MB,測試

    maxSize = 30MB,spa

    fileGrowth = 10%

)

LOG ON

(

    name = 'bishilog',

    fileName = 'E:\數據庫\bishilog.ldf',

    size = 5MB,

    fileGrowth = 10%

)

 

一、   

有個表:

employee 職工(工號,姓名,性別,年齡,部門)(numnamesexagedepartmentno)

wage工資(編號,工資金額)(IDamount)

attend出勤(工號,工資編號,出勤率)(numIDattendance)

請根據要求,編寫相應的SQL語句。

 

--寫一個SQL語句,查詢工資金額爲8000的職工工號和姓名。

分析:多表查詢(3表或以上),先對第一個和第二個表按照兩錶鏈接作查詢,而後用查詢結果和第三個表作鏈接查詢,以此類推,直到全部的表都鏈接上爲止,最終造成一箇中間的結果表,而後根據WHERE條件過濾中間表的記錄,並根據SELECT 指定的列返回查詢結果。

SELECT  name,employee.num FROM  employee, wage, attend

WHERE employee.num = attend.num and attend.ID = wage.ID and wage.amount = 8000

 

--寫一個SQL語句,查詢職工張三的出勤率

分析:只涉及到兩張表。。以下

SELECT  attendance FROM  attend, employee

WHERE attend.num = employee.num AND employee.name = '張三'

--WHERE num = (SELECT  num FROM  employee WHERE employee.name = '張三')

 

--寫一個SQL語句,查詢3次出勤率爲0的職工姓名和工號【常見題目】

分析:設計到兩張表,相關子查詢,employee表中每給出一個工號,就去全表掃描attend表,先在表attend中查找知足WHERE條件的記錄,而後對結果進行分組,再過濾出勤率爲0的,對每個num,虛表都有值,那麼exists 虛表返回true,把結果放入結果集表中,而後再指向下一個記錄,給定一個num重複。。。。

SELECT  name, num FROM  employee

WHERE EXISTS(

SELECT  num FROM  attend

WHERE employee.num = attend.num and attendance = 0

GROUP BY num HAVING COUNT(*) = 3)

 

--寫一個SQL語句,查詢出勤率爲10而且工資金額小於2500的職工信息。[常見題目]

分析:不可行的思路:職工信息在表employee,工資在表wage,出勤率在表attend中,工資表只和出勤表相關聯,先從表attend和表wage選出知足條件的結果集,再經過num和表employee相關聯

SELECT  * FROM  employee,(

SELECT  * FROM  attend, wage

WHERE attendance = 10 AND attend.ID = wage.ID and amount <</span> 2500) A

WHERE employee.num = A.num

說明:屢次爲'A' 指定了列'ID'   這種方法不可行,字段太多,會同名,要所有寫出來。。

 

思路二:多表鏈接,【通常這種作法錯不了,具備廣泛性】,num的選擇,來自attendnum集合,ID來自知足條件的集合

SELECT  * FROM  employee

WHERE num IN(

SELECT  num FROM  attend

WHERE attendance = 10 and ID IN(

SELECT  ID FROM  wage

WHERE amount <</span> 2500))

 

二、   

爲管理崗位業務培訓信息,創建個表:

  S (S#,SN,SD,SA) S#,SN,SD,SA 分別表明學號、學員姓名、所屬單位、學員年齡

  C (C#,CN ) C#,CN 分別表明課程編號、課程名稱

  SC ( S#,C#,G ) S#,C#,G 分別表明學號、所選修的課程編號、學習成績

-- 使用標準SQL嵌套語句查詢選修所有課程的學員姓名和所屬單位【常見題目】

錯誤作法以下,

SELECT  sn, sd FROM  s

WHERE EXISTS(

SELECT  * FROM  c

WHERE EXISTS(

SELECT  * FROM  sc

WHERE  s.s# = sc.s# and c.c# = sc.c#))

說明:先裝載s表,而後,指針p1指向第一個記錄了,而後裝載c表,指針p2指向第一個記錄,

而後裝載sc表,進行全sc表掃描,指針指向第一個記錄,而後查詢知足WHERE的記錄,若是找到記錄(無論一條仍是多條),則內層中的EXISTS虛表返回值爲真,執行SELECT  * FROM  C把結果放入虛表中,顯然虛表中有數據,外層EXISTS 虛表爲真,而後把snsd放入最終結果表,這不說明他選了所有課程,只能說明他至少選了一門課程

 

正確作法:語義上:查詢這樣的學生,他沒有選的課程不存在。--雙重否認

對每一個學生,去課程表中查找沒被他選修的課程,結果找不到數據。

SELECT sn, sd

FROM s

WHERE NOT EXISTS

(

    SELECT * FROM c

    WHERE NOT EXISTS

    (

        SELECT * FROM sc

        WHERE s.s# = sc.s# and sc.c# = c.c#

    )

)

 

--如下子查詢即爲查找他沒選修的課程

    SELECT * FROM c

    WHERE NOT EXISTS

    (

        SELECT * FROM sc

        WHERE s.s# = sc.s# and sc.c# = c.c#

    )

 

--查詢選修了課程的學員人數【常見題目】

分析:選修課中去掉重複的學員號s#,剩下的記錄個數就表示人數

SELECT  學員人數= COUNT(DISTINCT s#) FROM  SC

 

--查詢選修課程超過5門的學員學號和所屬單位【常見題目】

分析:同一個學生(分組使相同值的學號放在一組),選修課程超過5門(該組的記錄個數超過5個)

(HAVING提出要求,記錄個數用count實現)

先從sc表中查找,而後分組,選擇記錄大於5的,而後再從s表查找,條件是學生號在剛纔那個sc表查詢結果集中。

SELECT  sn, sd FROM  S

WHERE s# IN(

SELECT  s# FROM  SC

GROUP BY s#

HAVING COUNT(DISTINCT C#)>5)

 

注意:若是僅是group by,不帶having語句,那麼針對每一個分組僅會產生一條記錄,若是使用having語句則會產生1n條記錄,每條記錄都必須知足having給定的條件。

 

--使用標準SQL嵌套語句查詢選修課程名稱爲稅收基礎的學員學號和姓名

分析:三表csc,s

SELECT  s#,sn FROM  s

WHERE s# IN(

SELECT  s# FROM  sc WHERE c# IN(

SELECT  c# FROM  c

WHERE cn = '稅收基礎'))

 

-- 使用標準SQL嵌套語句查詢選修課程編號爲2的學員姓名和所屬單位

SELECT  s#,sd FROM  s

WHERE s# IN(

SELECT  s# FROM  sc WHERE c# IN(

SELECT  c# FROM  c

WHERE c# = '2'))

 

-- 使用標準SQL嵌套語句查詢不選修課程編號爲’5’的學員姓名和所屬單位

SELECT  s#,sd FROM  s

WHERE s# IN(

SELECT  s# FROM  sc WHERE c# IN(

SELECT  c# FROM  c

WHERE c# <> '5'))

 

--用一條SQL語句查詢出每門課都大於80分的學生姓名【常見題目】

分析:涉及選修表,學生表,對sc表裏的每一個s#,全表掃描他選修的成績,都要大於80

語義:查找這樣的學生,全表掃描他選修的成績,不存在小於80

SELECT  sn FROM  s

WHERE s# IN(

SELECT  x.s# FROM  sc x

WHERE NOT EXISTS(

SELECT  * FROM  sc y

WHERE y.s# = x.s# AND g <</span> 80))

 

三、   

問題描述:

已知關係模式:

S1 (SNO,SNAME) 學生關係。SNO 爲學號,SNAME 爲姓名

C1 (CNO,CNAME,CTEACHER) 課程關係。CNO 爲課程號,CNAME 爲課程名,CTEACHER 爲任課教師

SC1(SNO,CNO,SCGRADE) 選課關係。SCGRADE 爲成績

 

--3.1. 找出沒有選修過李明老師講授課程的全部學生姓名【常見題型】

法一:等值鏈接查詢

SELECT  SNAME FROM  S1,C1, SC1

 WHERE S1.SNO = SC1.SNO

   AND S1.SNO = C1.CNO

   AND C1.CTEACHER <> '李明'

 

法二:和方法一同樣的原理

SELECT  SNAME FROM  S1

 WHERE SNO IN(

  SELECT  SNO FROM  SC1

   WHERE CNO IN(

    SELECT  CNO FROM  C1

     WHERE CTEACHER <> '李明'))

 

法三

[錯誤作法]

SELECT  SNAME FROM  S1

 WHERE NOT EXISTS(

  SELECT  * FROM  C1

   WHERE NOT EXISTS(

    SELECT  * FROM  SC1

     WHERE CTEACHER = '李明' AND S1.SNO = SC1.SNO AND C1.CNO = SC1.CNO ))

 

[正解以下]

語義:查詢這樣的學生,不存在被李明老師講且被他選修的課程。

SELECT  SNAME FROM  S1

 WHERE NOT EXISTS(

  SELECT  * FROM  C1

   WHERE EXISTS(

    SELECT  * FROM  SC1

     WHERE CTEACHER = '李明' AND S1.SNO = SC1.SNO AND C1.CNO = SC1.CNO ))

 

--查找被李明老師講且被選修課程

  SELECT  * FROM  C1

   WHERE EXISTS(

    SELECT  * FROM  SC1

     WHERE CTEACHER = '李明' AND S1.SNO = SC1.SNO AND C1.CNO = SC1.CNO ))

 

--3.2. 列出有二門以上(含兩門)不及格課程的學生姓名及其平均成績【常見題型】

分析:

語義:查詢這樣的學生的姓名及學生的平均成績,選修課程至少有兩名門不及格

培養解題習慣-->涉及表:姓名--S1表,成績--SC1表,關聯字段SNO,條件--同一個學生,兩門或兩門以上不及格,用到函數--VAG()

條件WHERE,至少要有兩門用COUNT,同一個同窗,分組GROUP BY

 

假如這裏沒有要求查詢平均成績,那麼能夠以下

SELECT  S1.SNAME FROM  S1

WHERE EXISTS(

SELECT  * FROM  SC1 WHERE SC1.SNO = S1.SNO AND SC1.SCGRADE <</span> 60

GROUP BY SC1.SNO HAVING COUNT(*) >= 2);

 

可是這裏還要求平均成績,咱們能夠這樣,在上一步的基礎上,把EXISTS子句中的語句提取出來的結果表給取個別名,而後,兩表查詢

SELECT  S1.SNAME, A.AVGSCORE FROM  S1,

(SELECT  SNO, AVG(SCGRADE) AVGSCORE FROM  SC1

WHERE SCGRADE <</span> 60

GROUP BY SC1.SNO HAVING COUNT(*) >= 2) A

WHERE S1.SNO = A.SNO

 

--3.3. 列出既學過「1」號課程,又學過「2」號課程的全部學生姓名【常見題型】

作法1

SELECT  SNAME

  FROM  S1,(

SELECT  SNO FROM  SC1 

WHERE CNO = 1

INTERSECT

SELECT  SNO FROM  SC1

WHERE CNO = 2

)A

WHERE S1.SNO = A.SNO

 

作法2

涉及表:選課表,學生表,從表中查找號課程或者號課程的學生,而後分組取同一個學生,而後選擇記錄數大於等於選兩門的同窗,而後再與學生錶鏈接

SELECT  SNAME FROM  S1

WHERE SNO IN(

SELECT  SNO FROM  SC1

WHERE CNO = 1 OR CNO = 2

GROUP BY(SNO) HAVING COUNT(*) >= 2)--注意這裏要是隻寫等於,那麼要是還選了其餘課程的就

會被遺漏

 

--3.4 列出對同一學生,「1」號課成績比「2」號課成績高的全部學生的學號

分析:涉及表SC1,條件:同一個學生,號課程成績比號課程成績高,能夠爲該表起兩個別名,而後聯合查詢,同一學生--》兩表SNO相等,相關子查詢,給定一個sno,一個cno,全表掃描另外一個表,查找知足where的。。

SELECT  DISTINCT(X.SNO) FROM  SC1 X --注意這裏必定要加個DISTINCT

WHERE X.CNO = 1 AND X.SCGRADE > (

SELECT  SCGRADE FROM  SC1 Y

WHERE Y.SNO = X.SNO AND Y.CNO = 2);    

 

--3.5 列出「1」號課成績比「2」號課成績高的全部學生的學號及其「1」號課和「2」號課的成績

分析:涉及表一張,先從同同樣表中查找出1號課程,與2號課程的成績,及選修人SNO,而後SNO相等,肯定同一我的,而後再比較兩表中學生的成績。再從前面的結果查找學號。。。

SELECT  A.SNO, SCORE1, SCORE2 FROM  (

SELECT  SNO,SCGRADE SCORE1 FROM  SC1

WHERE CNO = 1)A, 

(SELECT  SNO, SCGRADE SCORE2 FROM  SC1

WHERE CNO = 2)B

WHERE A.SNO = B.SNO AND A.SCORE1 > B.SCORE2

 

四、   

請查詢出在ZD_ksBM有重複的值及重複的次數,沒有的不要列出。以下表:

BM  DUPCOUNT

001   

002   

 

採用SC1中的數據源

SELECT  SNO,COUNT(SNO)- 1 REPEAT FROM  SC1

GROUP BY SNO HAVING COUNT(*) > 1

 

五、   

問題描述:

本題用到下面三個關係表:

T_CARD     借書卡  CNO 卡號,NAME 姓名,CLASS 班級

T_BOOKS    圖書    BNO 書號,BNAME 書名,AUTHOR 做者,PRICE 單價,QUANTITY 庫存冊數

T_BORROW   借書記錄CNO 借書卡號,BNO 書號,RDATE 還書日期

備註:限定每人每種書只能借一本;庫存冊數隨借書、還書而改變。

 

--5.1.找出借書超過5本的讀者,輸出借書卡號及所借圖書冊數。

分析:涉及3表,並且輸出字段不在同一表中,這種狀況下用以下方式不錯

SELECT NAME, CNO, QUANTITY FROM CARD, T_BOOKS, T_BORROW

WHERE CARD.CNO=T_BORROW.CNO AND T_BOOKS.BNO = T_BORROW.BNO

GROUP BY NAME HAVING COUNT(*)>5

 

--5.2.查詢借閱了"水滸"一書的讀者,輸出姓名及班級。

SELECT  NAME, CLASS FROM  T_CARD

WHERE CNO IN (

SELECT  CNO FROM  T_BORROW

WHERE BNO IN (

SELECT  BNO FROM  T_BOOKS

WHERE BNAME = '水滸'))

 

--5.3.查詢過時未還圖書,輸出借閱者(卡號)、書號及還書日期。

SELECT  * FROM  T_BORROW

WHERE REDATE <</span> GETDATE();

 

--5.4.查詢書名包括"網絡"關鍵詞的圖書,輸出書號、書名、做者。

SELECT  BNO, BNAME, AUTHOR FROM  T_BOOKS

WHERE BNAME LIKE '%網絡%';

 

--5.5.查詢現有圖書中價格最高的圖書,輸出書名及做者。

SELECT  TOP 1 WITH TIES BNAME, AUTHOR FROM  T_BOOKS ORDER BY PRICE DESC;

--或者

SELECT  BNAME, AUTHOR FROM  T_BOOKS

WHERE PRICE = (SELECT  MAX(PRICE) FROM  T_BOOKS)

  

--5.6 查詢當前借了"計算方法"但沒有借"計算方法導論"的讀者,輸出其借書卡號,並按卡號降序排序輸出。

分析:涉及表,T_BORROW T_BOOKS,條件同一個學生,借了‘計算機方法’,沒借計算機方法導論,條件和條件都是同一個表中,考慮起別名

錯誤作法以下,子查詢中是排除了計算方法導論,可是父查詢中只要借了BNO的人就會被選出來,而借了BNO的人有可能借了計算方法導論

SELECT  CNO FROM  T_BORROW

WHERE BNO IN(

SELECT  A.BNO FROM  T_BOOKS A

WHERE  A.BNAME LIKE '計算方法'AND A.BNO NOT IN(

SELECT  B.BNO FROM  T_BOOKS B

WHERE A.BNAME = '計算方法導論'))

ORDER BY CNO DESC;

 

通常涉及同一個的狀況要麼是等值,要麼就是EIXSTS或等相關子查詢,但這裏沒T_BOOK表中沒有CNO這關聯字段;

先保證他借了計算方法,而後再保證他沒有再借計算方法導論,怎麼保證?給定同一個CNO,再對T_BORROW表中的BNO,對書表進行全表掃描,不存在借計算方法導論的記錄

SELECT  A.CNO FROM  T_BORROW A, T_BOOKS B

WHERE A.BNO = B.BNO AND B.BNAME = '計算方法'

AND NOT EXISTS(

SELECT  * FROM  T_BORROW A1, T_BOOKS B1

WHERE A.CNO = A1.CNO AND B1.BNO = A1.BNO AND B1.BNAME = '計算方法導論')

ORDER BY CNO DESC;

 

--5.7 將"1"班同窗所借圖書的還期都延長一週。

UPDATE T_BORROW SET REDATE = DATEADD(DAY,7,REDATE)--注意函數的用法

WHERE CNO IN (

SELECT  CNO FROM  T_CARD

WHERE CLASS = 1);

 

--5.8 從BOOKS表中刪除當前無人借閱的圖書記錄。

分析:對book表中的每一個書號,對借書表全表掃描,結果找不到數據

DELETE FROM  T_BOOKS WHERE NOT EXISTS(

SELECT  * FROM  T_BORROW

WHERE T_BOOKS.BNO = T_BORROW.BNO

);

 

--5.9.若是常常按書名查詢圖書信息,請創建合適的索引。

CREATE INDEX INDEX_A ON T_BOOKS(BNAME);

 

--5.10 在BORROW表上創建一個觸發器,完成以下功能:若是讀者借閱的書名是"數據庫技術及應用",--就將該讀者的借閱記錄保存在BORROW_SAVE表中(注ORROW_SAVE表結構同BORROW表)。

CREATE TRIGGER TRI_NAME  ON T_BORROW

FOR INSERT,UPDATE

AS

DECLARE

@booknum INT

SELECT  @booknum = BNO FROM  INSERTED  --注意這裏賦值【SET @變量名=值或SELECT   @變量名= 值 FROM  表

IF @booknum = (SELECT  BNO FROM  T_BOOKS

WHERE BNAME = '數據庫技術及應用')

BEGIN

--INSERT INTO  BORROW_SVAE SELECT  * FROM  INSERTED --注意這裏這種方式下,表BORROW_SAVE必定要先存在,否則執行的時候會提示對象名無效

SELECT  * INTO  BORROW_SVAE FROM  INSERTED

END;

 

--檢測

INSERT INTO  T_CARD VAlUES(3,'JJ',1);

INSERT INTO  T_BORROW VALUES(3,5, '2008-12-01');

SELECT  * FROM  BORROW_SVAE;

發現上面的作法無效

 

--稍微改動了下

CREATE TRIGGER TR_SAVE ON T_BORROW

FOR INSERT,UPDATE

AS

IF @@ROWCOUNT>0

SELECT  * INTO  BORROW_SAVE

FROM  INSERTED i,T_BOOKS b

WHERE i.BNO=b.BNO

    AND b.BNAME='數據庫技術及應用'

 

--檢測

DELETE FROM  T_BORROW WHERE BNO = 5;

INSERT INTO  T_BORROW VALUES(3,5, '2008-12-01');

--提示數據庫中已存在名爲'BORROW_SVAE' 的對象。

 

--改正

DROP TRIGGER TR_SAVE

DROP TRIGGER TRI_NAME

 

CREATE TRIGGER TR_SAVE ON T_BORROW

FOR INSERT,UPDATE

AS

IF @@ROWCOUNT>0

SELECT  * INTO  BORROW_SAVE 

FROM  INSERTED i,T_BOOKS b

WHERE i.BNO = b.BNO

    AND b.BNAME='數據庫技術及應用'

 

--檢測

DELETE FROM  T_BORROW WHERE BNO = 5;

INSERT INTO  T_BORROW VALUES(3,5, '2008-12-01');

--提示各表中的列名必須惟一。在表'BORROW_SAVE' 中屢次指定了列名'BNO'。

 

--改正

DROP TRIGGER TR_SAVE

 

CREATE TRIGGER TR_SAVE ON T_BORROW

FOR INSERT,UPDATE

AS

IF @@ROWCOUNT>0

SELECT  i.CNO,i.BNO,I.REDATE INTO  BORROW_SAVE 

FROM  INSERTED i,T_BOOKS b

WHERE i.BNO = b.BNO

    AND b.BNAME='數據庫技術及應用'

 

--檢測

DELETE FROM  T_BORROW WHERE BNO = 5;

INSERT INTO  T_BORROW VALUES(3,5, '2008-12-01');

SELECT  * FROM  BORROW_SVAE;

 

--5.10.創建一個視圖,顯示1.班學生的借書信息(只要求顯示姓名和書名)。

CREATE VIEW V_VIEW

AS

SELECT NAME, BNAME FROM T_BORROW, T_CARD

WHERE T_BORROW.CNO = T_CARD.CNO AND T_CARD.CLASS = 1

 

--檢測

SELECT * FROM V_VIEW

 

--5.11查詢當前同時借有"計算方法"和"組合數學"兩本書的讀者,輸出其借書卡號,並按卡號升序排序輸出。

分析:涉及表:T_BORROW,T_BOOKS 條件,同時在同一張表選了計算方法和組合數學

--法一.分別查出這兩個結果集,而後INTERCEPT取交集

SELECT  CNO FROM  T_BORROW

WHERE BNO IN (SELECT  BNO FROM  T_BOOKS--注意這裏只能用IN

WHERE BNAME = '計算方法')

INTERSECT

SELECT  CNO FROM  T_BORROW

WHERE BNO IN (SELECT  BNO FROM  T_BOOKS

WHERE BNAME = '組合數學')

ORDER BY CNO DESC

 

--法二.查出一個結果集,而後分組,而後記錄大於等於2

SELECT  CNO FROM  T_BORROW

WHERE BNO IN (SELECT  BNO FROM  T_BOOKS

WHERE BNAME = '計算方法' OR  BNAME = '組合數學')

GROUP BY CNO HAVING COUNT(*)>=2

ORDER BY CNO DESC

 

--5.12假定在建BOOKS表時沒有定義主碼,寫出爲BOOKS表追加定義主碼的語句。

ALTER TABLE T_BOOKS

ADD CONSTRAINT pk_key2

PRIMARY KEY CLUSTERED(BNO)

 

--5.15.對CARD表作以下修改:

--  a. 將NAME最大列寬增長到個字符(假定原爲個字符)。

ALTER TABLE T_CARD

ALTER COLUMN NAME VARCHAR(10)--注意這裏沒有SET

 

--  b. 爲該表增長列NAME(系名),可變長,最大個字符。

ALTER TABLE T_CARD

ADD 系名 VARCHAR(20)

 

--檢測結果

SELECT  * FROM  T_CARD

EXEC SP_HELP T_CARD--查看錶信息

 

六、   

學生表以下:

自動編號  學號  姓名課程編號課程名稱分數

1        2005001  張三 0001      數學   69

2        2005002  李四 0001      數學   89

3        2005001  張三 0001      數學   69

刪除除了自動編號不一樣,其餘都相同的學生冗餘信息

 

分析;分組

DELETE FROM  S2

WHERE 自動編號 NOT IN(

SELECT  MIN(自動編號) FROM  S2 GROUP BY 學號,姓名,課程編號,課程名稱,分數)

SELECT  * FROM  S2;

 

七、   

複製表(複製結構,可是也會複製數據,源表名:a 新表名:b)

SELECT  * INTO  b FROM  a WHERE 1<>1

說明:b能夠沒必要先建立

 

拷貝表(拷貝數據,源表名:a 目標表名:b)

INSERT INTO  a(a, b, c) SELECT  d,e,f FROM  b;

 

說明:要先建立a

 

八、   

有兩個表A和B,均有keyk和value兩個字段,若是B的keyk在A中也有,

就把B的value換爲A中對應的value

這道題的SQL語句怎麼寫?

 

UPDATE B SET VALUE =(

SELECT VALUE FROM A

WHERE B.KEYK = A.KEYK)

--結果:B中KEYK不在A中的,value就變成了NULL-->緣由沒對B中的key限制,很是容易忽略

 

--改正:刪除後從新插入上述數據

DELETE FROM B;

 

UPDATE B SET VALUE =(

SELECT VALUE FROM A

WHERE B.KEYK = A.KEYK)

WHERE B.KEYK IN (

SELECT KEYK FROM A WHERE A.KEYK = B.KEYK)

 

九、   

原表:

courseid coursename score

1           java        70

2           oracle      90

3           xml         40

4           jsp             30

5           servlet     80

爲了便於閱讀,查詢此表後的結果顯式以下(及格分數爲):

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,

(CASE WHEN SCORE > 60 THEN 'PASS' ELSE 'FAIL' END) AS MARK

FROM T_B

 

oracle中作法以下(未測試)

select courseid, coursename ,score ,decode(

sign(score-60),-1,'fail','pass') as mark from course

說明:SIGN返回指定表達式的正號(+1)、零(0) 或負號(-1)。

 

十、 

已知表T一、T2和T3的結構和數據以下

T1

NameID  CourseID    Score

1           1       90

1           2       85

2           1       75

2           2       95

 

T2

ID  Course

1   數學

2   語文

 

T3

ID  Name

1   張三

2   李四

請寫出查詢的SQL語句,使得查詢的結果爲:

Name         Course        Score

——–           ——–           ——–

張三          數學           90

張三          語文           85

李四          數學           75

李四          語文           95

 

SELECT NAME,COURSE,SCORE FROM T1, T2, T3

WHERE T1.NAMEID = T3.ID AND T1.COURSEID = T3.ID

GROUP BY NAME,COURSE,SCORE;

相關文章
相關標籤/搜索