數據庫學習筆記之數據查詢(一)
查詢之前先添加幾條數據叭~~
還是基於這個裏面建的那三個表(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可以進行聚集函數的判斷
這次總結的主要是單表查詢
沒了~~