愛悠閑 > SQL語言基礎-數據查詢

SQL語言基礎-數據查詢

分類: 數據庫  |  標簽: 語言,sql,join  |  作者: lwk2011 相關  |  發布日期 : 2014-05-09  |  熱度 : 304°

在SQL語言中,只提供了一個動詞SELECT用來進行數據查詢操作,但這個動詞的參數十分復雜,且能嵌套使用,其通用格式如下:

SELECT [All|Distinct]<目標列表達式>[,<目標列表達式>]...

FROM <表名或視圖名>[,<表名或視圖名>]...

[WHERE<條件表達式>]

[GROUP BY<列名1>[HAVING<條件表達式>]]

[ORDER BY<列名2>[ASC|DESC]];

 

1、單表查詢

  數據查詢主要通過一些例子來說明SELECT語句的使用。假設有學生表Student(Sno,Sname,Ssex,Sage,Sdept),還有課程表Course(Cno,Cname,Credit,Cpno)和選修表SC(Sno,Cno,Grade)。其中Cno為課程表,Cname為課程名稱,Cpno為先修課程號,Credit為學分,Grade為成績。

  • 查詢全體學生學號姓名的命令格式為:

SELECT Sno,Sname

FROM Student;

  • 查詢全體男同學詳細記錄的命令格式為:

SELECT *

FROM Student

WHERE Ssex="男";

  • 查詢所有年齡大于21歲的學生的姓名出生年份所在系,要求用小寫字母表示所在系名

SELECT Sname,'Year of birth',2004-Sage,lower(Sdept)

FROM Student

WHERE Sage>21;

  • 查詢IS系、MA系和CS系學生姓名性別的命令格式為:

SELECT Sname,Ssex

FROM Student

WHERE Sdept In('IS','MA','CS');

  • 查詢名字中第二個字為'陽'學生姓名學號的命令格式為:

SELECT Sname,Sno

FROM Student

WHERE Sname LIKE'_ _陽%';  //其中的“_”代表一個字符,而“%”代表0到若干個字符。

  • 查詢DB_Design課程課程號學分的命令格式為:

SELECT Cno,Credit

FROM Course

WHERE Cname LIKE 'DB/_Design'Escape'/';  

  • 查詢選修了3號課程的學生的學號成績,查詢結果按分數的降序排列所有有成績的學生學號和課程號。

SELECT Sno,Credit

FROM  SC

WHERE Cno='3'

ORDER BY Grade DESC;

在SQL語言中,也可以使用集函數:

Count([Distinct|All]*):統計元組個數;

Count([Distinct|All]<列名>):統計一列中值的個數;

Sum([Distinct|All]<列名>):計算一列值的總和;

Avg([Distinct|All]<列名>):計算一列值的平均值;

Max([Distinct|All]<列名>):求一列值中的最大值;

Min([Distinct|All]<列名>):求一列值中的最小值;

  • 求各個課程號相應的選課人數

SELECT Cno,Count(Sno)

FROM SC

GROUP BY Cno;

 

2、連接查詢

  • 查詢每個學生及其選修課程的情況

SELECT Student.*,SC.*

FROM Student,SC

WHERE Student.Sno=SC.Sno;

  • 查詢每個學生及其選修課程的情況

SELECT Student.Sno,Sname,Ssex,Sage,Cno,Grade

FROM Student Left Outer join SC

WHERE Student.Sno=SC.Sno;

  • 查詢每一門課程間接選修課   //區別間接選修課和直接選修課

SELECT F.Cno,S.Cpno

FROM Course F,Course S

WHERE F.Cpno=S.Cno;

其中的F和S稱為課程的別名

  • 查詢每個學生學號姓名選修的課程名稱成績

SELECT Sno,Sname,Cno,Grade

FROM Student,Course,SC

WHERE Student.Sno=SC.Sno And  Course.Cno=SC.Cno;

 

3、嵌套查詢

  • 查詢與“劉晨”在同一系學習的學生

SELECT Sno,Sname

FROM Student

WHERE Sdept IN

   (SELECT Sdept

FROM Student

WHERE Sname='劉晨');

  • 查詢選修了課程名為信息系統(MIS)的學生學號姓名

SELECT Sno,Sname

FROM Student

WHERE Sno IN(SELECT Sno

FROM SC

WHERE Cno IN(SELECT Cno

             FROM Course

             WHERE Cname='MIS'));

  • 查詢其它系中比信息系個學生年齡小的學生姓名年齡

SELECT Sname,Sage

FROM Student

WHERE Sage<Any

(SELECT Sage

FROM Student

WHERE Sdept='IS');

或者

SELECT Sname,Sage

FROM Student

WHERE Sage<(SELECT Max(Sage)

FROM Student

WHERE Sdept='IS')

  AND Sdept<>'IS';

  • 查詢沒有選修1號課程學生

SELECT Sname

FROM Student

WHERE Not Exists

(SELECT *

FROM SC

WHERE Sno=Student.Sno And Cno='1');

  • 查詢至少選修了95002選修表全部課程的學生的學號

SELECT Distinct Sno

FROM SC SCX

WHERE Not Exists(SELECT *

FROM SC SCY

WHERE SCY.Sno='95002'

And Not Exists(SELECT *

  FROM SC SCZ

  WHERE SCZ.Sno=SCX.Sno And SCZ.Cno=SCY.Cno));

 

4、集合查詢

  • 查詢計算機系的學生及年齡不大于19歲的學生

SELECT *

FROM Student

WHERE Sdept='CS'

UNION

SELECT *

FROM Student

WHERE Sage<19;



快乐彩中奖说明