數據庫的查詢:
/選擇查詢結果輸出列/*
1.表示選擇一個表或視圖中的所有列
SELECT *
FROM STUD
WHERE 專業='計算機'
2.選擇一個表中的指定列
SELECT 學號,姓名,總學分
FROM STUD
WHERE 專業='計算機'
3.定義列別名
SELECT 學號 AS number,姓名 AS name
FROM STUD
WHERE 專業='計算機'
或者
SELECT 學號=number,姓名=name
FROM STUD
WHERE 專業='計算機'
當別名中有空格時,使用引號將標題括起來
SELECT 學號 AS ‘Student number’,姓名 AS name
FROM STUD
WHERE 專業='計算機'
不允許在WHERE子句中使用列別名。
4.替換查詢結果中的數據
SELECT 學號,姓名,等級=//將總學分的列值改爲等級
CASE
WHEN 總學分 IS NULL THEN'尚未選課'
WHEN <50 THEN'不及格'
WHEN >=50 AND <=52 THEN'合格'
ELSE ‘優秀’
END
FROM STUD
WHERE 專業='計算機'
5.計算列值
查詢‘c03’號課程成績加上10分後的學生學號和成績,要求給出臨時標題
SELECT Sno,Grade+10 as'成績'
FROM Course,SC
WHERE Course.Cno=SC.Cno AND Course.Cno='C03'
6.消除結果集中的重複行
SELECT DISTINCT 專業
FROM STUD
7.限制結果集返回行數//返回結果集的前6行
SELECT TOP 6 姓名 ,專業
FROM STUD
8.聚合函數
1)SUM ,AVG
SELECT SUM(成績) AS '總和',AVG(成績) AS '平均分分'
FROM STUD
WHERE 課程號=‘101’
2)MAX,MIN
SELECT MAX(成績) AS '最高分',MIN(成績) AS '最低分'
FROM STUD
WHERE 課程號=‘101’
3)COUNT,統計組中滿足條件的行數或總行數
SELECT COUNT(總學分) AS '總學分大於50人數'
FROM STUD
WHERE 總學分>50
如果使用COUNT(*)時將返回檢索行的總數目,不論其是否包含空值,如果COUNT()括號中爲列名的話,則忽略空值。
/選擇查詢條件 WHERE*/
1.表達式比較
當兩個表達式值中有一個爲空值或者都爲空值時,比較運算符將返回UNKNOWN。
表達式比較符有 <>,!=不等於,!< 不小於,!> 不大於等運算符。
SELECT *
FROM STUD
WHERE 專業=‘通信工程’ AND 學分>=42
2.模式匹配
% 代表0個或多個任意字符
_ 代表單個字符
[]指定屬於範圍,如屬於[0-9][absd]中的任何單個字符
[^]指定不屬於範圍,如不屬於[^0-9][^absd]中的任何單個字符
SELECT *
FROM STUD
WHERE 姓名 LIKE '王_'
當含有轉義字符時,LIKE '%5/%%' ESCAPE '/',這裏表示任意位置包含5%的字符串。
3.範圍比較(BETWEEN IN )
SELECT 出生時間
FROM STUD
WHERE 出生時間 NOT BETWEEN '1995-1-1' AND '1995-12-31'
SELECT *
FROM STDU
WHERE 專業 IN (‘軟件工程’,‘通信工程’)
4.空值比較
SELECT *
FROM STUD
WHERE 備註 IS NULL
5.子查詢,子查詢中不能使用ORDER BY子句
1)IN,判斷一個給定值是否在子查詢結果集中,先執行子查詢。
查詢選修了課程名爲“信息系統”的學生學號和姓名
SELECT Sno,Sname ③ 最後在Student關係中
FROM Student 取出Sno和Sname
WHERE Sno IN
(SELECT Sno ② 然後在SC關係中找出選
FROM SC 修了3號課程的學生學號
WHERE Cno IN
(SELECT Cno ① 首先在Course關係中找出
FROM Course “信息系統”的課程號,爲3號
WHERE Cname= ‘信息系統’
)
);
2)比較子查詢(ALL,SUM,ANY)
找出每個學生超過他選修課程平均成績的課程號。
SELECT Sno, Cno
FROM SC x
WHERE Grade >=
(
SELECT AVG(Grade)
FROM SC y
WHERE y.Sno=x.Sno
);
3)EXISTS子查詢
查詢沒有選修1號課程的學生姓名。
SELECT Sname
FROM Student
WHERE NOT EXISTS(
SELECT *
FROM SC
WHERE Sno = Student.Sno AND Cno='1');
/指定查詢對象*FROM/
1.表或視圖
2.導出表
SELECT Sname
FROM (
SELECT Sname
FROM STUD
WHERE SCORE>50
)AS Student//表的別名
WHERE 性別=1
/連接多表*/
1.連接謂詞
1)自然連接
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno = SC.Sno;
2)多表連接
查詢選修2號課程且成績在90分以上的所有學生
SELECT Student.Sno, Sname
FROM Student, SC
WHERE Student.Sno = SC.Sno
/* 連接謂詞*/
AND SC.Cno= ‘2’ AND SC.Grade > 90;
/* 其他限定條件 */
2.以JOIN關鍵字指定的連接
1)內連接 INNER JOIN
按照ON所指定的連接條件合併兩個表,返回滿足條件的行
查詢每個學生的情況以及選修課的課程情況
SELECT *
FROM Student INNER JOIN SC
ON Student.sno=SC.sno
2)外連接 OUTER JOIN
其中的OUTER關鍵字均可省略
外連接操作以指定表爲連接主體,將主體表中不滿足連接條件的元組一併輸出
左外連接(LEFT OUTER JOIN)結果表中除了包括滿足連接條件的所有行外,還包括左表的所有行
查詢每個學生及其選修課程的情況
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON Student.Sno=SC.Sno;
右外連接(RIGHT OUTER JOIN)結果表中除了包括滿足連接條件的所有行外,還包括右表的所有行
查找選修了的課程和所有開設的課程名
SELECT SC.*,課程名
FROM SC RIGHT OUTER JOIN Course
ON Sc.Sno=Course.Sno
完全外連接(FULL OUTER JOIN)結果表中除了包括滿足連接條件的所有行外,還包括兩個表的所有行
3)交叉連接 CROSS JOIN,實質是對兩個表進行笛卡爾積運算
列出所有學生的可能選課情況:
SELECT 學號,姓名,課程號,課程名
FROM COURSE CROSS JOIN SC
/指定查詢結果分組方法*GROUP BY/
根據字段對記錄分組,對結果集進行分組,常和聚合函數搭配使用。
在SELECT之後的字段名,除了GROUP BY之後的字段名和聚合函數之外,不能有其他字段名。
SELECT 專業,COUNT(*) AS 人數
FROM Student
GROUP BY 專業
/指定查詢結果分組後篩選條件*HAVING/
HAVING子句可以使用聚合函數,而WHERE不可以。常和GROUP BY搭配使用,對分組數據進行過濾。
子句的執行順序: FROM->WHERE->GROUP BY->HAVING
SELECT 學號
FROM Student
WHERE 成績>=80
GROUP BY 學號
HAVING COUNT(*) > 2
/指定查詢結果排序順序*ORDER BY/
1.對查詢結果排序輸出
對查詢結果排序輸出,ASC升序,DESC降序
SELECT *
FROM Student
WHERE 專業=‘通信工程’
ORDER BY 出生時間
2.對結果排序附加彙總
COMPUTE BY子句 常跟在ORDER BY子句之後搭配使用。
/其他參加集合操作的各查詢結果的列數必須相同,對應項的數據類型也必須相同 */
1.INTO 將SELECT查詢結果保存到新建的表中去 SELECT..INTO..FROM..WHERE
2.UNION(並) 將多個SELECT查詢結果集合併成一個結果集
查詢計算機科學系的學生及年齡不大於19歲的學生。
SELECT *
FROM Student
WHERE Sdept= 'CS'
UNION
SELECT *
FROM Student
WHERE Sage<=19;
UNION:將多個查詢結果合併起來時,系統自動去掉重複元組。
UNION ALL:將多個查詢結果合併起來時,保留重複元組
3.EXCEPT(交)
查詢計算機科學系的學生與年齡不大於19歲的學生的交集
SELECT *
FROM Student
WHERE Sdept='CS'
INTERSECT
SELECT *
FROM Student
WHERE Sage<=19
實際上就是查詢計算機科學系中年齡不大於19歲的學生
4**.INTERSECT(差)**
查詢計算機科學系的學生與年齡不大於19歲的學生的差集。
SELECT *
FROM Student
WHERE Sdept='CS'
EXCEPT
SELECT *
FROM Student
WHERE Sage <=19;
實際上是查詢計算機科學系中年齡大於19歲的學生
5.CTE 在SELECT語句的最前面可以使用一條WITH子句指定臨時結果集。