一、簡單查詢
1、列出全部學生的信息。
SELECT * FROM 學生
2、列出軟件專業全部學生的學號及姓名。
SELECT 學號,姓名 FROM 學生 WHERE專業="軟件"
3、列出所有必修課的課號。
SELECT DISTINCT 課號 FROM 必修課
4、求1號課成績大於80分的學生的學號及成績,並按成績由高到低列出。
SELECT 學號,成績 FROM 選課 WHERE 課號="1" AND成績>80 ORDER BY 成績 DESC
5、列出非軟件專業學生的名單。
方法一:SELECT 姓名 FROM 學生 WHERE專業<>"軟件"
方法二:SELECT 姓名 FROM 學生 WHERE NOT專業="軟件"
方法三:SELECT 姓名 FROM 學生 WHERE專業!="軟件"
6、查詢成績在70~80分之間的學生選課得分情況
方法一:SELECT * FROM 選課 WHERE成績>=70 AND 成績<=80
方法二:SELECT * FROM 選課 WHERE 成績 BETWEEN 70AND 80
不在此范圍內的查詢:(注意寫出和以下語句等價的語句)
SELECT * FROM 選課 WHERE 成績 NOT BETWEEN 70AND 80
7、列出選修1號課或3號課的全體學生的學號和成績。
方法一:SELECT 學號,成績 FROM 選課 WHERE 課號="1" OR課號="3"
方法二:SELECT 學號,成績 FROM 選課 WHERE 課號 IN("1","3")
相反條件查詢:SELECT 學號,成績 FROM 選課 WHERE 課號 NOTIN ("1","3")
8、列出所有98級學生的學生成績情況。
SELECT * FROM 選課 WHERE 學號 LIKE"98%"
SELECT * FROM 選課 WHERE 學號 LIKE "98_ _ __"
相反條件查詢:SELECT * FROM 選課 WHERE 學號 NOT LIKE"98%"
9、列出成績為空值(或不為空值)的學生的學號和課號。
答案一:SELECT 學號,課號 FROM 選課 WHERE 成績 ISNULL
答案二:SELECT 學號,課號 FROM 選課 WHERE 成績 IS NOTNULL
10、求出所有學生的總成績。
SELECT SUM(成績) AS 總成績 FROM 選課
11、列出每個學生的平均成績。
SELECT 學號,AVG(成績) AS 平均成績 FROM 選課 GROUP BY學號
12、列出各科的平均成績、最高成績、最低成績和選課人數。
SELECT 課號,AVG(成績) AS 平均成績,MAX(成績) AS最高分,;
MIN(成績) AS 最低分,COUNT(學號) AS 選課人數 FROM 選課GROUP BY 課號
二、連接查詢
(一)簡單連接
1、列出選修1號課的學生姓名及成績。
SELECT 姓名,成績 FROM 學生,選課 WHERE 學生.學號=選課.學號AND 課號="1"
2、列出選修1號課的學生的學號、姓名及成績。
SELECT 學生.學號,姓名,成績 FROM 學生 S,選課 X WHERES.學號=X.學號 AND 課號="1"
3、求出總分大於150的學生的學號、姓名及總成績。
SELECT 學生.學號,姓名,SUM(成績) AS 總成績 FROM學生,選課;
WHERE 學生.學號=選課.學號 GROUP BY 選課.學號 HAVINGSUM(成績)>150
(二)自連接查詢
1、列出那些專業相同的學生相應的姓名及專業信息。
SELECT a.姓名,b.姓名,專業 FROM 學生 a,學生 b WHEREa.學號<>b.學號 AND a.專業=b.專業
2、求至少選修1號課和2號課的學生的學號。
SELECT X.學號 FROM 選課 X,選課 Y WHERE X.學號=Y.學號AND X.課號="1" AND Y.課號="2"
3、有以下表rate.dbf
幣種1代碼 C(2)、幣種2代碼 C(2)、買入價 N(8,4)、賣出價 N(8,4)
外匯匯率.dbf
幣種1 C(4)、幣種2 C(4)、買入價 N(8,4)、賣出價 N(8,4)
外匯代碼.dbf
外匯名稱 C(10)、外匯代碼 C(10)
要求:將所有“外匯匯率”表中的數據插入rate表中並且順序不變,由於“外匯匯率”中的幣種1和幣種2存放的是外幣名稱,而rate表中的幣種1代碼和幣種2代碼應該存放外幣代碼,所以插入時要做相應的改動,外幣名稱與外向代碼的對應關系存儲在“外匯代碼”表中。
SELECT A.外幣代碼 AS 幣種1代碼,B.外幣代碼 AS幣種2代碼,;
買入價,賣出價 FROM 外匯代碼 A,外匯匯率,外匯代碼B;
WHERE A.外幣名稱=外匯匯率.幣種1 AND B.外幣名稱=外匯匯率.幣種2INTO TABLE rate
4、假定有“雇員”表(雇員號 C(2),雇員姓名 C(6),經理號C(2)),根據雇員關系列出上一級經理及其所領導的職員清單。(教案中的例題)
SELECT "領導",S.雇員姓名,"雇員",E.雇員姓名 FROM 雇員S,雇員 E WHERE S.雇員號=E.經理
(三)超連接
1、列出選修1號課的學生姓名及成績。
方法一:(使用簡單連接查詢格式)
SELECT 姓名,成績 FROM 學生,選課 WHERE 學生.學號=選課.學號AND 課號="1"
方法二:(使用內部連接格式)
SELECT 姓名,成績 FROM 學生 INNER JOIN 選課 ON學生.學號=選課.學號 WHERE 課號="1"
方法三:內部連接的INNER短語可以省略。(與方法二等價)
SELECT 姓名,成績 FROM 學生 JOIN 選課 ON學生.學號=選課.學號 WHERE 課號="1"
2、查詢訂貨管理數據庫中數據的倉庫號、城市、供應商名和地址信息。
方法一:使用簡單連接格式。
SELECT 倉庫.倉庫號,城市,供應商名,地址 FROM供應商,訂購單,職工,倉庫;
WHERE 供應商.供應商號=訂購單.供應商號 AND訂購單.職工號=職工.職工號;
AND 職工.倉庫號=倉庫.倉庫號
方法二:使用超連接的內部連接格式。(注意連接條件的順序)
SELECT 倉庫.倉庫號,城市,供應商名,地址 FROM 供應商 JOIN 訂購單JOIN 職工 JOIN 倉庫 ;
ON 職工.倉庫號=倉庫.倉庫號 ON 訂購單.職工號=職工.職工號 ON供應商.供應商號=訂購單.供應商號
3、查詢沒有選修任何課程的學生姓名。
方法一:使用嵌套查詢
SELECT 姓名 FROM 學生 WHERE 學號 NOT IN (SELECT學號 FROM 選課)
方法二:使用超連接的右連接。
SELECT 姓名 FROM 選課 RIGHT JOIN 學生 ON選課.學號=學生.學號 WHERE選課.學號<>學生.學號
方法三:使用超連接的左連接。(注意表名順序和方法二的不同)
SELECT 姓名 FROM 學生 LEFT JOIN 選課 ON選課.學號=學生.學號 WHERE選課.學號<>學生.學號
三、嵌套查詢
(一)普通嵌套與謂詞EXISTS
1、列出選修匯編語言課的學生的學號。
方法一:
SELECT 學號 FROM 選課 WHERE 課號=(SELECT 課號 FROM課程 WHERE 課名="匯編語言")
方法二:使用謂詞EXISTS。注意和方法一格式上的不同。
SELECT 學號 FROM 選課 WHERE EXIST (SELECT *FROM 課程 ;
WHERE 課名="匯編語言" AND選課.課號=課程.課號)
2、求軟件專業所有必修課的課程信息。
方法一:
SELECT * FROM 課程 WHERE 課號 IN; (SELECT 課號FROM 必修課 WHERE 必修專業="軟件")
方法二:
SELECT * FROM 課程 WHERE EXIST (SELECT *FROM 必修課 WHERE 必修專業="軟件" ;
AND 課程.課號=必修課.課號)
(二)量詞ANY、SOME、ALL
1、求選修2號課的學生中,成績比選修1號課的最低成績要高的學生的學號和成績。
方法一:
SELECT 學號,成績 FROM 選課 WHERE 課號="2" AND成績>;
(SELECT MIN(成績) FROM 選課 WHERE課號="1")
方法二:ANY等價於SOME,所以可將ANY換成SOME。
SELECT 學號,成績 FROM 選課 WHERE 課號="2" AND成績>ANY ;
(SELECT 成績 FROM 選課 WHERE課號="1")
2、求選修2號課的學生中,成績比選修1號課的任何學生的成績都要高的那些學生的學號和成績。
方法一:
SELECT 學號,成績 FROM 選課 WHERE 課號="2" AND成績>;
(SELECT MAX(成績) FROM 選課 WHERE課號="1")
方法二:
SELECT 學號,成績 FROM 選課 WHERE 課號="2" AND成績>ALL ;
(SELECT 成績 FROM 選課 WHERE課號="1")
(三)內外層互相關嵌套(外層依賴於內層的查詢結果,內層依賴於外層來進一步查詢)
1、列出每門課程中成績最高的選課信息。
SELECT * FROM 選課 A WHERE 成績=(SELECTMAX(成績) FROM 選課 B WHERE A.課號=B.課號)
2、列出每個學生中成績低於本人平均成績的選課信息。
SELECT * FROM 選課 A WHERE成績<(SELECT AVG(成績) FROM 選課 B WHEREA.學號=B.學號)
3、列出表“訂購單2.dbf”(其內容就是在訂購單表的基礎上增加一個總金額字段)中每個職工經手的具有最高總金額的訂購單信息。(教案中例題)
SELECTout.職工號,out.供應商號,out.訂貨單號,out.訂貨日期,out.總金額;
FROM 訂購單 out WHERE 總金額=(SELECT MAX(總金額)FROM 訂購單 inner1;
Where out.職工號=inner1.職工號)
四、操作功能
1、在課程表中插入新的元組(5,大學英語)。
INSERT INTO 課程(課號,課名)VALUES("5","大學英語")
2、給學生表中男生的記錄加上刪除標記。
DELETE FROM 學生 WHERE 性別="男"
3、將選課表中所有課程的成績分別提高5分。將課號為“4”的課程的成績置為空值。
UPDATE 選課 SET 成績=成績+5
UPDATE 選課 SET 成績=NULL WHERE課號="4"
五、定義表結構
1、建立研究生表,該表不屬於任何數據庫,其結構如表所示:
| 字段名 |
字段類型 |
字段長度 |
小數位數 |
特殊要求 |
| 學號 |
C |
6 |
|
|
| 姓名 |
C |
8 |
|
|
| 性別 |
C |
2 |
|
|
| 年齡 |
N |
3 |
0 |
|
| 入學年月 |
D |
|
|
允許空值 |
CREATE TABLE 研究生 FREE (學號 C(6),姓名 C(8),性別C(2),年齡 N(3,0),入學年月 D NULL)
2、假設已經建立了XSK數據庫,在XSK中建立“學生1”表,其結構如表所示
| 字段名 |
字段類型 |
字段長度 |
小數位數 |
特殊要求 |
| 學號 |
C |
6 |
|
主索引 |
| 姓名 |
C |
8 |
|
不能為空 |
| 性別 |
C |
2 |
|
|
| 年齡 |
N |
3 |
0 |
年齡大於10小於45 |
| 是否黨員 |
L |
|
|
|
| 入學年月 |
D |
|
|
默認值為1999年9月1日 |
OPEN DATABASE XSK
CREATE TABLE 學生1 (學號 C(6) PRIMARY KEY,姓名C(8) NOT NULL,性別 C(2),;
年齡 N(3,0) CHECK 年齡>10 AND年齡<45 ERROR "年齡必須大於10小於45",是否黨員 L,;
入學年月 D DEFAULT {^1999-9-1})
3、在XSK數據庫建立“課程1”表,其結構如表所示:
| 字段名 |
字段類型 |
字段長度 |
小數位數 |
特殊要求 |
| 課號 |
C |
4 |
|
主索引 |
| 課程名 |
C |
10 |
|
不能為空 |
| 學分 |
N |
2 |
|
|
CREATE TABLE 課程1 (課號 C(4) PRIMARY KEY,課程名C(10) NOT NULL,學分 N(2))
4、在XSK數據庫建立“選課1”表,其結構如表所示:
| 字段名 |
字段類型 |
字段長度 |
小數位數 |
特殊要求 |
| 學號 |
C |
6 |
|
外索引與學生表建立關系 |
| 課號 |
C |
4 |
|
外索引與課程表建立關系 |
| 成績 |
N |
5 |
2 |
|
CREATE TABLE 選課1 (學號 C(6) REFERENCE 學生,課號C(4) REFERENCE 課程,成績 N(5,2))
六、修改表結構
1、為“課程1”表添加一個開課學期字段,字段類型為數值型,長度為1。
ALTER TABLE 課程1 ADD COLUMN 開課學期N(1)
2、修改開課學期字段為字符型,合法值為1或2。
ALTER TABLE 課程1 ALTER COLUMN 開課學期 C(1)CHECK 開課學期="1" OR 開課學期="2"
3、刪除“課程1”表中對開課學期字段的合法值約束,設置默認值為1。
ALTER TABLE 課程1 ALTER 開課學期 DROPCHECK
ALTER TABLE 課程1 ALTER 開課學期 SET DEFAULT"1"
4、刪除“課程1”表中的開課學期字段。修改課程名字段為“課名”字段。
ALTER TABLE 課程1 DROP 開課學期 RENAME 課程名 TO課名
5、在“學生1”表的“年齡”字段上建立候選索引。
ALTER TABLE 學生1 ADD UNIQUE 年齡 TAG年齡
6、在“學生1”表中添加一個出生日期字段,刪除年齡字段。
ALTER TABLE 學生1 ADD 出生日期 D
ALTER TABLE 學生1 DROP UNIQUE TAG 年齡 DROP年齡
七、補充練習
利用訂貨管理數據庫中表數據,用SQL完成查詢。
1、檢索在北京的供應商的名稱。
SELECT 供應商名 FROM 供應商 WHERE地址="北京"
2、檢索出向供應商S3發過訂購單的職工的職工號和倉庫號。
方法一(嵌套查詢):
SELECT 職工號,倉庫號 FROM 職工 WHERE 職工號IN;
(SELECT 職工號 FROM 訂購單 WHERE供應商號="S3")
方法二(連接查詢):
SELECT 職工.職工號,倉庫號 FROM 職工,訂購單 ;
WHERE 職工.職工號=訂購單.職工號 AND供應商號="S3"
3、檢索出和職工E1、E3都有聯系的北京的供應商信息。
SELECT * FROM 供應商 WHERE 地址="北京" AND 供應商號IN;
(SELECT 供應商號 FROM 訂購單 WHERE 職工號="E1") AND供應商號 IN;
(SELECT 供應商號 FROM 訂購單 WHERE職工號="E3")
4、檢索出向S4供應商發出訂購單的倉庫所在的城市。
SELECT 城市 FROM 倉庫,職工,訂購單 WHERE倉庫.倉庫號=職工.倉庫號 ;
AND 職工.職工號=訂購單.職工號 AND供應商號="S4"
5、檢索出由工資多於1230元的職工向北京的供應商發出的訂購單號。
SELECT 訂貨單號 FROM 職工,訂購單,供應商 WHERE職工.職工號=訂購單.職工號;
AND 訂購單.供應商號=供應商.供應商號 AND工資>1230 AND 地址="北京"
6、檢索出所有倉庫的平均面積。
SELECT AVG(面積) AS 面積 FROM 倉庫
7、檢索出每個倉庫中工資多於1220元的職工個數。
SELECT 倉庫號,COUNT(*) 職工個數 FROM職工WHERE工資>1220 GROUP BY 倉庫號
8、檢索工資低於本倉庫平均工資的職工信息。
SELECT * FROM 職工 AA WHERE工資<(SELECT AVG(工資) FROM 職工 BB WHEREAA.倉庫號=BB.倉庫號)
