SQL查詢語句的基本使用方法
基本查詢
SELECT查詢語句
--查詢所有的學生的學號和姓名
USE JXGL
SELECT SNO,SNAME FROM S
簡單查詢
--查詢所有的學生的姓名,學號,所在系
SELECT SNAME,SNO,SDEPT FROM S
--查詢全體學生的詳細信息
SELECT * FROM S
--前一個語句等價於:
SELECT SNO,SNAME,SEX,AGE,SDEPT FROM S
--查詢經過計算的值
SELECT SNAME, YEAR(GETDATE())-AGE FROM S
--查詢全體學生的姓名、出生年份和所在院系,要求用小寫字母表示所有系名
SELECT SNAME,'Year of Birth: ' ,Year(GETDATE())-AGE,LOWER(SDEPT) FROM S
--定義列別名改變查詢結果的列標題對目標表達式有很大用處
SELECT SNAME,'Year of Birth:' AS 'BIRTH',YEAR(GETDATE())-AGE AS 'BIRTHDAY',LOWER(SDEPT) AS 'DEPATEMENT' FROM S
帶有WHERE子句的查詢
--查詢‘軟件工程’專業的學生的姓名
SELECT SNAME FROM S WHERE SDEPT ='軟件工程'
--查詢所有年齡在20歲以下的學生的姓名和年齡
SELECT SNAME,AGE FROM S WHERE AGE<20
--查詢考試成績有不及格的學生的學號
SELECT SNO FROM SC WHERE GRADE<60
--確定範圍
--查詢年齡在20-23之間的學生姓名、系別和年齡
SELECT SNAME,SDEPT,AGE FROM S WHERE AGE BETWEEN 20 and 23
--確定集合
--查詢‘軟件工程’,‘計算機科學與技術’,‘小學教育專科’的學生姓名和性別
SELECT SNO,SNAME,SEX FROM S WHERE SDEPT IN('軟件工程',' 計算機科學與技術 ',' 小學教育專科班 ')
--字符匹配
--運算符LIKE可以用來進行字符串匹配。一般語法如下
-- [NOT] LIKE <'匹配串'>'<換碼字符>']
--查找與屬性列值與<匹配串>相匹配的元組。<匹配串>可以是一個完整的字符串,也可以含有通配符%和_ %是通配任意長度,_通配單一長度
--查詢姓劉的學生的姓名,學號信息
SELECT SNO,SNAME FROM S WHERE SNAME LIKE '%劉%'
--查詢姓李且全名爲3個漢字的學生的姓名
SELECT SNO,SNAME FROM S WHERE SNAME LIKE '李__'
--查詢所有不姓李的學生的姓名
SELECT SNO,SNAME FROM S WHERE SNAME NOT LIKE '李--'
--涉及空值的查詢
SELECT SNO,CNO FROM SC WHERE GRADE IS NULL --分數GRADE是空值
–多重條件查詢
--查詢計算機科學班年齡在22歲以下的學生的姓名
SELECT SNO,SNAME,AGE FROM S WHERE AGE<22 AND SDEPT =' 計算機科學與技術 '
--查詢計科,軟工,新能源中學生 姓名 性別
SELECT SNAME,SEX,SDEPT FROM S WHERE SDEPT = ' 計算機科學與技術 ' OR SDEPT = '軟件工程' OR SDEPT = ' 新能源科學與工程 '
帶有ORDER BY 子句的查詢
–默認ASC升序排列,或者DESC降序排列
--查詢課程號爲C11的學生成績,結果按照降序排列
SELECT SNO,GRADE FROM SC WHERE CNO = 'C11' ORDER BY GRADE DESC
--查詢全體學生情況,結果按照所在系的系部名升序排列ASC,系部內部按照學生的年齡降序排列DESC
SELECT * FROM S ORDER BY SDEPT ,AGE DESC
帶有GROUP BY 子句的查詢
--查詢S表中的男生,女生數量
SELECT SEX AS '性別',COUNT (*) AS '人數' FROM S GROUP BY SEX
--查詢選修每門課程的課程號及參加該門考試的學生的總人數
SELECT CNO,COUNT(*) AS '人數' FROM SC WHERE GRADE IS NOT NULL GROUP BY CNO
--查詢出選課人數超過8人的課程號
SELECT CNO AS '課程號',COUNT (SNO) AS '人數' FROM SC GROUP BY CNO HAVING COUNT (SNO)>=8
--查詢選修超過3門課程的學生的學號
SELECT SNO FROM SC GROUP BY SNO HAVING COUNT(*)>3
輸出結果選項
--輸出前n行
--從SC表中輸出學習'C1'課程的學生的成績在前三名的學號和成績
SELECT TOP 3 SNO,GRADE FROM SC WHERE CNO = 'C1' ORDER BY GRADE DESC
--在SC表中查詢總分排在前面20%的學生的學號和總分
SELECT TOP 20 PERCENT SNO,SUM(GRADE) AS '總分' FROM SC GROUP BY SNO ORDER BY SUM(GRADE) DESC
--將SC中的不及格的學生的學號都存在GRADE_NPASS表中
SELECT DISTINCT(SNO)INTO GRADE_NPASS FROM SC WHERE GRADE <60
聯合查詢
—UNION(並) INTERSECT(交) EXCEPT(差)
--集合並運算
--查詢選修了C1或者C2的學生的學號
SELECT SNO FROM SC WHERE CNO ='C1' UNION SELECT SNO FROM SC WHERE CNO ='C2'
--集合交運算
--查詢選修了C1又選修了C3的學生的名單
SELECT SNO FROM SC WHERE CNO ='C1' INTERSECT SELECT SNO FROM SC WHERE CNO='C3'
--集合差運算
--查詢選修了C1但是沒有選修C3的學生的名單
SELECT SNO FROM SC WHERE CNO = 'C1' EXCEPT SELECT SNO FROM SC WHERE CNO='C3'
多表查詢
連接查詢
--連接查詢是指在兩個或兩個以上的表中對符合某些條件的元組進行連接查詢的操作
--早期FORM ...WHERE...已經捨棄,現在使用 INNER JOIN
--學生的基本信息情況放在S表中,學生的選課信息放在SC表中,本查詢是通過公共屬性SNO實現的
SELECT S.*,SC.* FROM S INNER JOIN SC ON S.SNO =SC.SNO
--查詢計科班的學生所選的課程號和平均成績
SELECT SC.CNO,ROUND(AVG(SC.GRADE),2) AS 'AVERAGE' FROM S INNER JOIN SC ON S.SNO = SC.SNO AND S.SDEPT= '計算機科學與技術 ' GROUP BY CNO
--在SC表中查詢選修了'C4'課程的分數高於20175104001的同學的所有元組,並按照成績降序排列
SELECT A.SNO,A.CNO,A.GRADE FROM SC A INNER JOIN SC B ON A.CNO='C4' AND A.GRADE>B.GRADE AND B.SNO = '20175104017' AND B.CNO = 'C4'
--查詢90分以上學生的學號,姓名,選修課程號,選修課程名和成績
SELECT S.SNO,S.SNAME,C.CNAME,SC.GRADE FROM S JOIN SC ON S.SNO=SC.SNO AND GRADE >=90 JOIN C ON SC.CNO = C.CNO
----外連接
---左外連接
--對左邊的表不加限制,當左邊的表元組與右邊表元組不匹配時,與右邊表相對應的列值爲NULL
--查詢每個學生及其選修課程的成績情況
SELECT S.*,CNO,GRADE FROM S LEFT JOIN SC ON S.SNO =SC.SNO
--查詢所有學生可能的選課情況
SELECT S.SNO,S.SNAME,C.CNAME FROM S CROSS JOIN C
子查詢
--無關子查詢
--(1.查詢‘李歡洋’所在系名)
SELECT SDEPT FROM S WHERE SNAME ='李歡洋' --先分步完成此查詢,然後構造子查詢。確定‘李歡洋’所在系名
--(2.查詢所有在‘軟件工程系學習的學生’)
SELECT SNO,SNAME,SDEPT FROM S WHERE SDEPT='軟件工程'
--將第一步查詢嵌入第二步查詢的條件中,構造嵌套查詢如下
SELECT SNO,SNAME,SDEPT FROM S WHERE SDEPT IN
(SELECT SDEPT FROM S WHERE SNAME='李歡洋')
--該查詢也可以用自身連接來完成
SELECT B.SNO,B.SNAME,B.SDEPT FROM S AS A JOIN S AS B ON A.SDEPT =B.SDEPT AND A.SNAME = '李歡洋'
--查詢選修了'C3'號課程的學生的姓名和所在專業
SELECT SNAME,SDEPT FROM S WHERE SNO in (SELECT SNO FROM SC WHERE CNO ='C3')
--查詢其他系比計科班中某一學生的年齡小的人姓名學號
SELECT SNAME ,AGE FROM S WHERE AGE<(SELECT MAX(AGE) FROM S WHERE SDEPT ='計算機科學與技術')AND SDEPT <>'計算機科學與技術'
--相關子查詢
--父查詢每循環一次,子查詢都會重新被執行一次,並且每次父查詢都會將查詢引用值傳給子查詢
--如果子查詢的任何元組與其匹配,父查詢就會返回結果元組
--再回到第一步,直到處理完父表的每一個元組
--1)帶有比較運算符的子查詢
--將一個表達式的值與子查詢返回的單個值進行比較。如果比較的結果爲TRUE,則返回TRUE
--查詢每個學生比他的平均成績高的所有成績,並輸出這些學生的學號,課程號,成績
SELECT SNO,CNO,GRADE FROM SC AS A WHERE GRADE >=(SELECT AVG(GRADE) FROM SC AS B WHERE A.SNO=B.SNO)
--2)帶有EXISTS的子查詢
--查詢所有選修了'C2'的學生的名單
SELECT SNAME FROM S WHERE EXISTS (SELECT * FROM SC WHERE SC.SNO=S.SNO AND SC.CNO ='C2')
--表數據維護的子查詢
--對每一個系,求學生平均年齡,並把結果存入數據庫
--首先在數據庫中建立一個新表,其中一列存放系名,另一列存放的是相應的學生的平均年齡。
CREATE TABLE DEPT_AGE(SDEPT CHAR(15),AVG_AGE REAL)
--然後對S表按系分組求平均年齡,再把系名和平均年齡存入新表中
INSERT INTO DEPT_AGE(SDEPT,AVG_AGE) SELECT SDEPT ,AVG(AGE) FROM S GROUP BY SDEPT
--帶子查詢的刪除語句
--刪除軟件工程系的所有學生的選課記錄 千萬不能用,下面僅作演示語句,數據庫中操作萬不得已不能用delete,常用update代替
DELETE FROM SC WHERE '軟件工程'=(SELECT SDEPT FROM S WHERE S.SNO=SC.SNO)
--帶子查詢的修改語句
--將軟件工程學生成績提高5%
UPDATE SC SET GRADE =GRADE +GRADE *0.05 WHERE '軟件工程'=(SELECT SDEPT FROM S WHERE S.SNO=SC.SNO)
參考文章:https://blog.csdn.net/weixin_41033871/article/details/83545036