找工作筆試面試那些事兒(10)---SQL語句總結

weixin_34292959發表於2013-09-04

SQL語句中常用關鍵詞及其解釋如下:

1)SELECT

將資料從資料庫中的表格內選出,兩個關鍵字:從 (FROM) 資料庫中的表格內選出 (SELECT)。語法為
SELECT "欄位名" FROM "表格名"。

2)DISTINCT
在上述 SELECT 關鍵詞後加上一個 DISTINCT 就可以去除選擇出來的欄位中的重複,從而完成求得這個表格/欄位內有哪些不同的值的功能。語法為
SELECT DISTINCT "欄位名" FROM "表格名"。

3)WHERE
這個關鍵詞可以幫助我們選擇性地抓資料,而不是全取出來。語法為
SELECT "欄位名" FROM "表格名" WHERE "條件" 

4)AND OR
上例中的 WHERE 指令可以被用來由表格中有條件地選取資料。這個條件可能是簡單的 (像上一頁的例子),也可能是複雜的。複雜條件是由二或多個簡單條件透過 AND 或是 OR 的連線而成。語法為:
SELECT "欄位名"  FROM "表格名"  WHERE "簡單條件"  {[AND|OR] "簡單條件"}+

5)IN
在 SQL 中,在兩個情況下會用到 IN  這個指令;這一頁將介紹其中之一:與 WHERE 有關的那一個情況。在這個用法下,我們事先已知道至少一個我們需要的值,而我們將這些知道的值都放入 IN  這個子句。語法為:
SELECT "欄位名"  FROM "表格名"  WHERE "欄位名" IN ('值一', '值二', ...)  

6)BETWEEN
IN 這個指令可以讓我們依照一或數個不連續 (discrete)的值的限制之內抓出資料庫中的值,而 BETWEEN 則是讓我們可以運用一個範圍 (range)  內抓出資料庫中的值,語法為:
SELECT "欄位名"  FROM "表格名" WHERE "欄位名" BETWEEN '值一' AND '值二' 

7)LIKE
LIKE 是另一個在 WHERE  子句中會用到的指令。基本上, LIKE  能讓我們依據一個模式(pattern) 來找出我們要的資料。語法為:
SELECT "欄位名"  FROM "表格名"  WHERE "欄位名" LIKE {模式} 

8)ORDER BY
我們經常需要能夠將抓出的資料做一個有系統的顯示。這可能是由小往大 (ascending)  或是由大往小(descending)。在這種情況下,我們就可以運用 ORDER BY 這個指令來達到我們的目的。語法為:
SELECT "欄位名"  FROM "表格名 [WHERE "條件"] ORDER BY "欄位名" [ASC, DESC] 

9)函式
函式允許我們能夠對這些數字的型態存在的行或者列做運算,包括 AVG (平均)、COUNT (計數)、MAX (最大值)、MIN (最小值)、SUM (總合)。語法為:
SELECT "函式名"("欄位名") FROM "表格名"  

10)COUNT
這個關鍵詞能夠幫我我們統計有多少筆資料被選出來,語法為:
SELECT COUNT("欄位名") FROM "表格名"

11)GROUP BY
GROUP BY 語句用於結合合計函式,根據一個或多個列對結果集進行分組。語法為:
SELECT "欄位1", SUM("欄位2")  FROM "表格名"  GROUP BY "欄位1" 

12)HAVING
該關鍵詞可以幫助我們對函式產生的值來設定條件。語法為:
SELECT "欄位1", SUM("欄位2")  FROM "表格名"  GROUP BY "欄位1"  HAVING (函式條件)  

13)ALIAS
我們可以通過ALIAS為列名稱和表名稱指定別名,語法為:
SELECT "表格別名"."欄位1" "欄位別名"  FROM "表格名" "表格別名"  

下面為一個例子,通過它我們應該能很好地掌握以上關鍵詞的使用方法。


Student(S#,Sname,Sage,Ssex) 學生表
Course(C#,Cname,T#) 課程表
SC(S#,C#,score) 成績表
Teacher(T#,Tname) 教師表


問題:
1、查詢“001”課程比“002”課程成績高的所有學生的學號;
select a.S#
from (select s#,score from SC where C#=’001′) a,
(select s#,score from SC where C#=’002′) b
where a.score>b.score and a.s#=b.s#;

2、查詢平均成績大於60分的同學的學號和平均成績;
select S#,avg(score)
from sc
group by S# having avg(score) >60;

3、查詢所有同學的學號、姓名、選課數、總成績;
select Student.S#,Student.Sname,count(SC.C#),sum(score)
from Student left Outer join SC on Student.S#=SC.S#
group by Student.S#,Sname

4、查詢姓“李”的老師的個數;
select count(distinct(Tname))
from Teacher
where Tname like ‘李%’;

5、查詢沒學過“葉平”老師課的同學的學號、姓名;
select Student.S#,Student.Sname
from Student
where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=’葉平’);

6、查詢學過“001”並且也學過編號“002”課程的同學的學號、姓名;
select Student.S#,Student.Sname
from Student,SC

where Student.S#=SC.S# and SC.C#=’001′and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#=’002′);


7、查詢學過“葉平”老師所教的所有課的同學的學號、姓名;
select S#,Sname
from Student
where S# in
(select S#
from SC ,Course ,Teacher
where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=’葉平’ group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname=’葉平’));

8、查詢所有課程成績小於60分的同學的學號、姓名;
select S#,Sname
from Student
where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);

9、查詢沒有學全所有課的同學的學號、姓名;
select Student.S#,Student.Sname
from Student,SC
where Student.S#=SC.S#
group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);

10、查詢至少有一門課與學號為“1001”的同學所學相同的同學的學號和姓名;
select S#,Sname
from Student,SC
where Student.S#=SC.S# and C# in (select C# from SC where S#='1001');

11、刪除學習“葉平”老師課的SC表記錄;
Delect SC
from course ,Teacher
where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='葉平';

12、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分
SELECT L.C# 課程ID,L.score 最高分,R.score 最低分
FROM SC L ,SC R
WHERE L.C# = R.C#
and
L.score = (SELECT MAX(IL.score)
FROM SC IL,Student IM
WHERE IL.C# = L.C# and IM.S#=IL.S#
GROUP BY IL.C#)
and
R.Score = (SELECT MIN(IR.score)
FROM SC IR
WHERE IR.C# = R.C#
GROUP BY IR.C# );

13、查詢學生平均成績及其名次
SELECT 1+(SELECT COUNT( distinct 平均成績)
FROM (SELECT S#,AVG(score) 平均成績
FROM SC
GROUP BY S# ) T1
WHERE 平均成績 > T2.平均成績) 名次, S# 學生學號,平均成績
FROM (SELECT S#,AVG(score) 平均成績 FROM SC GROUP BY S# ) T2
ORDER BY 平均成績 desc;

14、查詢各科成績前三名的記錄:(不考慮成績並列情況)
SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數
FROM SC t1
WHERE score IN (SELECT TOP 3 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC)
ORDER BY t1.C#;

15、查詢每門功成績最好的前兩名
SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數
FROM SC t1
WHERE score IN (SELECT TOP 2 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC )
ORDER BY t1.C#;

相關文章