數據庫學習筆記之數據查詢(一)

數據庫學習筆記之數據查詢(一)

查詢之前先添加幾條數據叭~~
還是基於這個裏面建的那三個表(Student、Course、SC)進行插入查詢操作(數據都是書上的。。。)

爲Student表添加數據:

INSERT INTO Student VALUES('1512101', '張用', '男', 19, '計算機系');
INSERT INTO Student VALUES('1512102', '劉晨', '男', 20, '計算機系');
INSERT INTO Student VALUES('1512103', '王敏', '女', 18, '計算機系');
INSERT INTO Student VALUES('1512104', '李小玲', '女', 19, '計算機系');
INSERT INTO Student VALUES('1521101', '張立', '男', 22, '信息系');
INSERT INTO Student VALUES('1521102', '吳賓', '女', 21, '信息系');
INSERT INTO Student VALUES('1521103', '張海', '男', 20, '信息系');
INSERT INTO Student VALUES('1531101', '錢小平', '女', 18, '數學系');
INSERT INTO Student VALUES('1531102', '王大力', '男', 19, '數學系');

添加完成後的表:
在這裏插入圖片描述

爲Course表添加數據:

INSERT INTO Course VALUES('1', '數據庫', '5', 4);
INSERT INTO Course VALUES('2', '數學', null, 2);
INSERT INTO Course VALUES('3', '信息系統', '1', 4);
INSERT INTO Course VALUES('4', '操作系統', '6', 3);
INSERT INTO Course VALUES('5', '數據結構', '7', 4);
INSERT INTO Course VALUES('6', '數據處理', null, 2);
INSERT INTO Course VALUES('7', 'C語言', '6', 4);

添加成功後:
在這裏插入圖片描述

爲SC表添加數據:

INSERT INTO SC VALUES('1512101', 'c001', 90);
INSERT INTO SC VALUES('1512101', 'c002', 86);
INSERT INTO SC VALUES('1512101', 'c003', 92);
INSERT INTO SC VALUES('1512101', 'c005', 88);
INSERT INTO SC VALUES('1512101', 'c006', null);

INSERT INTO SC VALUES('1512102', 'c001', 76);
INSERT INTO SC VALUES('1512102', 'c002', 78);
INSERT INTO SC VALUES('1512102', 'c005', 66);

INSERT INTO SC VALUES('1512104', 'c002', 66);
INSERT INTO SC VALUES('1512104', 'c005', 78);
INSERT INTO SC VALUES('1512104', 'c008', 66);

INSERT INTO SC VALUES('1521102', 'c001', 82);
INSERT INTO SC VALUES('1521102', 'c005', 75);
INSERT INTO SC VALUES('1521102', 'c007', 92);
INSERT INTO SC VALUES('1521102', 'c009', 50);

INSERT INTO SC VALUES('1521103', 'c002', 68);
INSERT INTO SC VALUES('1521103', 'c006', null);
INSERT INTO SC VALUES('1521103', 'c007', null);
INSERT INTO SC VALUES('1521103', 'c008', 78);

INSERT INTO SC VALUES('1531101', 'c001', 80);
INSERT INTO SC VALUES('1531101', 'c005', 50);
INSERT INTO SC VALUES('1531101', 'c007', 45);

INSERT INTO SC VALUES('1531102', 'c001', 80);
INSERT INTO SC VALUES('1531102', 'c002', 75);
INSERT INTO SC VALUES('1531102', 'c005', 85);
INSERT INTO SC VALUES('1531102', 'c009', 88);

添加成功後(太長了就只截取一部分吧。。):
在這裏插入圖片描述
有數據以後就好查詢辣~~

查詢語句的基本格式:

SELECT <目標列名序列>
 FROM  <數據源>
 [WHERE <檢索條件>]
 [GROUP BY <分組依據列>]
 [HAVING <組提取條件>]
 [ORDER BY <排序依據列>]

幾個例子:
1、查詢全體學生的學號和姓名
執行語句:

SELECT Sno, Sname FROM Student;

查詢結果:
在這裏插入圖片描述
2、查詢全部列:

SELECT * FROM Student

查詢結果:
在這裏插入圖片描述
3、查詢全體學生的姓名及其出生年份

SELECT Sname, 2020-Sage FROM Student

在這裏插入圖片描述
4、查詢全體學生的姓名和出生年份,並在“出生年份” 列前加入一個新列,新列的每行數據均爲“出生年份”常量值

SELECT Sname, '出生年份:',2020-Sage FROM Student

在這裏插入圖片描述
可以看見上面查找出來的有些列是沒有名字的,那麼怎麼改變列的標題,即爲列取一個別名呢。
語法:

列名 | 表達式 [AS] 列別名

或者

列別名 = 列名 | 表達式

例如上面的第1個例子:

SELECT Sname, 2020-Sage  '出生年份' FROM Student

在這裏插入圖片描述
需要注意的是,一旦在FROM子句中給某個表定義了別名,則在SQL語句中各個引用該表名的地方都應以別名代替

一些簡單的查詢
1、消除取值相同的行:
要去掉重複行,可用DISTINCT:

一般查詢哪些學生選修了課程:

SELECT Sno FROM SC

在這裏插入圖片描述
有很多重複行
使用DISTINCT後:

SELECT DISTINCT Sno FROM SC

在這裏插入圖片描述
2、查詢滿足條件的元組:

查詢條件 謂詞
比較運算符 =, >, >=, <, <=, <>(或!=)
確定範圍 BETWEEN…AND,NOT BETWEEN…AND
確定集合 IN, NOT IN
字符匹配 LIKE, NOT LIKE
空值 IS NULL, IS NOT NULL
邏輯謂詞 AND, OR

例子:
比較運算符
1、查詢計算機系全體學生的姓名

SELECT Sname 
FROM Student
WHERE Sdept = '計算機系';

在這裏插入圖片描述
2、查詢年齡在20歲以下的學生的姓名和年齡

SELECT Sname, Sage 
FROM Student 
WHERE Sage < 20

在這裏插入圖片描述
3、查詢考試成績有不及格的學生的學號

SELECT DISTINCT Sno 
FROM SC 
WHERE Grade < 60

在這裏插入圖片描述
確定範圍:
1、查詢年齡在20~23歲之間的學生的姓名、所在系和年齡

SELECT Sname, Sdept,Sage 
FROM Student 
WHERE Sage BETWEEN 20 AND 23

在這裏插入圖片描述
2、查詢年齡不在20~23之間的學生姓名、所在系和年齡

SELECT Sname, Sdept,Sage 
FROM Student 
WHERE Sage NOT BETWEEN 20 AND 23

在這裏插入圖片描述
確定集合
1、查詢信息系、數學系和計算機系學生的姓名和性別

SELECT Sname, Ssex 
FROM Student 
WHERE Sdept IN ('信息系', '數學系', '計算機系')

在這裏插入圖片描述
2、查詢既不是信息系、數學系,也不是計算機系學生的姓名和性別

SELECT Sname, Ssex 
FROM Student 
WHERE Sdept NOT IN ('信息系', '數學系', '計算機系')

在這裏插入圖片描述
字符匹配
匹配串中可包含的四種通配符:

通配符 說明
_ 匹配任意一個字符
% 匹配0個或多個字符
[ ] 匹配[ ]中的任意一個字符;對於連續字母的匹配,例如匹配[abcd],可簡寫爲[a-d]
[ ^ ] 不匹配[ ]中的任意一個字符

1、查詢姓‘張’的學生的詳細信息

SELECT * FROM Student WHERE Sname LIKE '張%'

在這裏插入圖片描述
2、查詢學生表中姓‘張’、‘李’和‘劉’的學生的情況。

SELECT * FROM Student WHERE Sname LIKE '[張李劉]%'

在這裏插入圖片描述
3、查詢名字中第2個字爲‘小’或‘大’的學生的姓名和學號

SELECT Sname, Sno 
FROM Student 
WHERE Sname LIKE '_[小大]%';

在這裏插入圖片描述
4、查詢所有不姓“王”也不姓“張”的學生姓名

SELECT Sname 
FROM Student 
WHERE Sname LIKE '[^王張]%'

在這裏插入圖片描述

涉及空值的查詢
1、查詢沒有考試成績的學生的學號和相應的課程號

SELECT Sno, Cno 
FROM SC 
WHERE Grade IS NULL

在這裏插入圖片描述
2、查詢所有有考試成績的學生的學號和相應的課程號

SELECT Sno, Cno 
FROM SC 
WHERE Grade IS NOT NULL

在這裏插入圖片描述
多重條件查詢
1、查詢計算機系年齡在20歲以下的學生姓名和年齡

SELECT Sname, Sage 
FROM Student 
WHERE Sdept = '計算機系' AND Sage < 20

在這裏插入圖片描述
2、查詢計算機系和信息系年齡大於等於20歲的學生姓名、所在系和年齡

SELECT Sname, Sdept, Sage 
FROM Student 
WHERE (Sdept = '計算機系' OR Sdept = '信息系') AND Sage >= 20

在這裏插入圖片描述
對查詢結果進行排序
排序子句:

ORDER BY <列名> [ASC | DESC] [, <列名>...]

1、將學生按年齡的升序排序

SELECT * FROM Student ORDER BY Sage

在這裏插入圖片描述
2、查詢全體學生的信息,查詢結果按所在系的系名升序排列,同一系的學生按年齡降序排列

SELECT * FROM Student ORDER BY Sdept, Sage DESC

在這裏插入圖片描述
一些聚集函數

聚集函數 作用
COUNT ( * ) 統計表中元組個數
COUNT ( [DISTINCT] < 列名 > ) 統計本列列值個數
SUM ( < 列名 > ) 計算列值總和
AVG ( < 列名 > ) 計算列值平均值
MAX ( < 列名 > ) 求列值最大值
MIN ( < 列名 > ) 求列值最小值

例子
1、統計學生總人數

SELECT COUNT(*) FROM Student;

在這裏插入圖片描述
2、查詢“1512101”學生的選課門數、已考試課程門數以及考試最高分、最低分和平均分

SELECT COUNT(*) 選課門數, 
COUNT(Grade) 考試門數, 
MAX(Grade) 最高分, 
MIN(Grade) 最低分, 
AVG(Grade) 平均分 
FROM SC 
WHERE Sno = '1512101'

在這裏插入圖片描述
注意:聚集函數不能出現在WHERE子句中

分組查詢
一般形式:

[GROUP BY <分組條件>]
[HAVING <組過濾條件>]

例:
查詢每個課程的選課人數和課程號

SELECT Cno 課程號, COUNT(Sno) 選課人數 
FROM SC 
GROUP BY Cno;

在這裏插入圖片描述
注意:
GROUP BY 子句中的分組依據列必須是表中存在的列名,不能使用AS子句指派的結果集列別名;
帶有GROUP BY 子句的SELECT語句的查詢列表中只能出現分組依據列或聚集函數,因爲分組後每個組只返回一行結果

HAVING的使用
例:
1、查詢修了3門以上課程的學生的學號和選課門數

SELECT Sno 學號, COUNT(*) 選課門數 
FROM SC 
GROUP BY Sno 
HAVING COUNT(*) > 3;

在這裏插入圖片描述
2、統計每個系的男生人數,只列出男生人數大於等於2的系

SELECT Sdept 系別, COUNT(*) 人數 
FROM Student 
WHERE Ssex = '男' 
GROUP BY Sdept 
HAVING COUNT(*) >= 2;

在這裏插入圖片描述
3、查詢修課門數等於或大於4門的學生的平均成績和選課門數

SELECT Sno, AVG(Grade) 平均成績, COUNT(*) 修課門數 
FROM SC 
GROUP BY Sno 
HAVING COUNT(*) >= 4

在這裏插入圖片描述
WHERE 和 HAVING 的區別:
WHERE 在分組之前進行限定,如果不滿足條件,則不參與分組;HAVING在分組之後進行限定,如果不滿足結果,則不會被查詢出來。此外,WHERE後不可以跟聚集函數,HAVING可以進行聚集函數的判斷

這次總結的主要是單表查詢
沒了~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章