當前位置:首頁 » 編程語言 » sql大題解析
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql大題解析

發布時間: 2023-04-16 00:01:49

sql題 求解

假設你的表是tablelist
SQL語句是:select name from tablelist where count>'25'

另附SQL語句用法:
一、簡單查詢
簡單的Transact-SQL查詢只包括選擇列表、FROM子句和WHERE子句。
它們分別說明所查詢列、查詢的
表或視圖、以及搜索條件等。
例如,下面的語句查詢testtable表中姓名為「張三」的nickname欄位和email欄位。
SELECT nickname,email
FROM testtable WHERE name='張三'

(一)選擇列表
選擇列表(select_list)指出所查詢列,它可以是一組列名列表、星號、表達式、變數(包括局部變 量和全局變數)等構成。

1、選擇所有列 例如,下面語句顯示testtable表中所有列的數據: SELECT * FROM testtable

2、選擇部分列並指定它們的顯示次序 查詢結果集合中數據的排列順序與選擇列表中所指定的列名排列順序相同。
例如: SELECT nickname,email FROM testtable

3、更改列標題 在選擇列表中,可重新指定列標題。定義格式為: 列標題=列名 列名 列標題 如果指定的列標題不是標準的標識符格式時,應使用引號定界符。
例如,下列語句使用漢字顯示列 標題: SELECT 昵稱=nickname,電子郵件=email FROM testtable

4、刪除重復行 SELECT語句中使用ALL或DISTINCT選項來顯示表中符合條件的所有行或刪除其中重復的數據行,默認 為ALL。使用DISTINCT選項時,對於所有重復的數據行在SELECT返回的結果集合中只保留一行。

5、限制返回的行數 使用TOP n [PERCENT]選項限制返回的數據行數,TOP n說明返回n行,而TOP n PERCENT時,說明n是 表示一百分數,指定返回的行數等於總行數的百分之幾。
例如: SELECT TOP 2 * FROM testtable SELECT TOP 20 PERCENT * FROM testtable

(二)FROM子句
FROM子句指定SELECT語句查詢及與查詢相關的表或視圖。在FROM子句中最多可指定256個表或視圖, 它們之間用逗號分隔。 在FROM子句同時指定多個表或視圖時,如果選擇列表中存在同名列,這時應使用對象名限定這些列 所屬的表或視圖。
例如在usertable和citytable表中同時存在cityid列,在查詢兩個表中的cityid時應使用下面語句格式加以限定:

SELECT username,citytable.cityid
FROM usertable,citytable
WHERE usertable.cityid=citytable.cityid

在FROM子句中可用以下兩種格式為表或視圖指定別名: 表名 as 別名 表名 別名
例如上面語句可用表的別名格式表示為:

SELECT username,b.cityid
FROM usertable a,citytable b
WHERE a.cityid=b.cityid

SELECT不僅能從表或視圖中檢索數據,它還能夠從其它查詢語句所返回的結果集合中查詢數據。
例如:
SELECT a.au_fname+a.au_lname
FROM authors a,titleauthor ta (SELECT title_id,title FROM titles WHERE ytd_sales>10000 ) AS t
WHERE a.au_id=ta.au_id AND ta.title_id=t.title_id
此例中,將SELECT返回的結果集合給予一別名t,然後再從中檢索數據。

(三)使用WHERE子句設置查詢條件
WHERE子句設置查詢條件,過濾掉不需要的數據行。
例如下面語句查詢年齡大於20的數據:
SELECT *
FROM usertable
WHERE age>20

WHERE子句可包括各種條件運算符:
比較運算符(大小比較):>、>=、=、<、<=、<>、!>、!<
范圍運算符(表達式值是否在指定的范圍):BETWEEN…AND… NOT BETWEEN…AND…
列表運算符(判斷表達式是否為列表中的指定項):IN (項1,項2……) NOT IN (項1,項2……)
模式匹配符(判斷值是否與指定的字元通配格式相符):LIKE、NOT LIKE
空值判斷符(判斷表達式是否為空):IS NULL、NOT IS NULL
邏輯運算符(用於多條件的邏輯連接):NOT、AND、OR

1、范圍運算符例:age BETWEEN 10 AND 30相當於age>=10 AND age<=30
2、列表運算符例:country IN ('Germany','China')
3、模式匹配符例:常用於模糊查找,它判斷列值是否與指定的字元串格式相匹配。
可用於char、 varchar、text、ntext、datetime和smalldatetime等類型查詢。
可使用以下通配字元: 百分號%:可匹配任意類型和長度的字元,如果是中文,請使用兩個百分號即%%。 下劃線_:匹配單個任意字元,它常用來限製表達式的字元長度。 方括弧[]:指定一個字元、字元串或范圍,要求所匹配對象為它們中的任一個。 [^]:其取值也[] 相同,但它要求所匹配對象為指定字元以外的任一個字元。
例如: 限制以Publishing結尾,使用LIKE '%Publishing' 限制以A開頭:LIKE '[A]%' 限制以A開頭外:LIKE '[^A]%' 4、空值判斷符例WHERE age IS NULL 5、邏輯運算符:優先順序為NOT、AND、OR

(四)查詢結果排序
使用ORDER BY子句對查詢返回的結果按一列或多列排序。
ORDER BY子句的語法格式為: ORDER BY {column_name [ASC|DESC]} [,…n]
其中ASC表示升序,為默認值,DESC為降序。
ORDER BY不能按ntext、text和image數據類型進行排序。
例如: SELECT * FROM usertable ORDER BY age desc,userid ASC 另外,可以根據表達式進行排序。

二、聯合查詢
UNION運算符可以將兩個或兩個以上上SELECT語句的查詢結果集合合並成一個結果集合顯示,即執行聯 合查詢。UNION的語法格式為: select_statement UNION [ALL] selectstatement [UNION [ALL] selectstatement][…n]
其中selectstatement為待聯合的SELECT查詢語句。 ALL選項表示將所有行合並到結果集合中。不指定該項時,被聯合查詢結果集合中的重復行將只保留一行。
聯合查詢時,查詢結果的列標題為第一個查詢語句的列標題。因此,要定義列標題必須在第一個查詢語句中定義。要對聯合查詢結果排序時,也必須使用第一查詢語句中的列名、列標題或者列序號。
在使用UNION 運算符時,應保證每個聯合查詢語句的選擇列表中有相同數量的表達式,並且每個查詢選 擇表達式應具有相同的數據類型,或是可以自動將它們轉換為相同的數據類型。在自動轉換時,對於數值類 型,系統將低精度的數據類型轉換為高精度的數據類型。 在包括多個查詢的UNION語句中,其執行順序是自左至右,使用括弧可以改變這一執行順序。
例如: 查詢1 UNION (查詢2 UNION 查詢3)

三、連接查詢
通過連接運算符可以實現多個表查詢。連接是關系資料庫模型的主要特點,也是它區別於其它類型 資料庫管理系統的一個標志。
在關系資料庫管理系統中,表建立時各數據之間的關系不必確定,常把一個實體的所有信息存放在 一個表中。當檢索數據時,通過連接操作查詢出存放在多個表中的不同實體的信息。連接操作給用戶帶 來很大的靈活性,他們可以在任何時候增加新的數據類型。為不同實體創建新的表,爾後通過連接進行查詢。
連接可以在SELECT 語句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出連接時有助於 將連接操作與WHERE子句中的搜索條件區分開來。所以,在Transact-SQL中推薦使用這種方法。
SQL-92標准所定義的FROM子句的連接語法格式為:
FROM join_table join_type join_table
[ON (join_condition)]
其中join_table指出參與連接操作的表名,連接可以對同一個表操作,也可以對多表操作,對同一 個表操作的連接又稱做自連接。
join_type 指出連接類型,可分為三種:內連接、外連接和交叉連接。內連接(INNER JOIN)使用比 較運算符進行表間某(些)列數據的比較操作,並列出這些表中與連接條件相匹配的數據行。根據所使用 的比較方式不同,內連接又分為等值連接、自然連接和不等連接三種。
外連接分為左外連接(LEFT OUTER JOIN或LEFT JOIN)、右外連接(RIGHT OUTER JOIN或RIGHT JOIN) 和全外連接(FULL OUTER JOIN或FULL JOIN)三種。與內連接不同的是,外連接不只列出與連接條件相匹 配的行,而是列出左表(左外連接時)、右表(右外連接時)或兩個表(全外連接時)中所有符合搜索條件的數據行。
交叉連接(CROSS JOIN)沒有WHERE 子句,它返回連接表中所有數據行的笛卡爾積,其結果集合中的 數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。
連接操作中的ON (join_condition) 子句指出連接條件,它由被連接表中的列和比較運算符、邏輯 運算符等構成。
無論哪種連接都不能對text、ntext和image數據類型列進行直接連接,但可以對這三種列進行間接 連接。
例如:
SELECT p1.pub_id,p2.pub_id,p1.pr_info
FROM pub_info AS p1 INNER JOIN pub_info AS p2
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)
(一) 內連接 內連接查詢操作列出與連接條件匹配的數據行,它使用比較運算符比較被連接列的列值。
內連接分 三種:
1、等值連接:在連接條件中使用等於號(=)運算符比較被連接列的列值,其查詢結果中列出被連接 表中的所有列,包括其中的重復列。
2、不等連接: 在連接條件使用除等於運算符以外的其它比較運算符比較被連接的列的列值。
這些 運算符包括>、>=、<=、<、!>、!<和<>。
3、自然連接:在連接條件中使用等於(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢 結果集合中所包括的列,並刪除連接表中的重復列。
例,下面使用等值連接列出authors和publishers表中位於同一城市的作者和出版社:
SELECT * FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
又如使用自然連接,在選擇列表中刪除authors 和publishers 表中重復列(city和state):
SELECT a.*,p.pub_id,p.pub_name,p.country
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
(二) 外連接 內連接時,返回查詢結果集合中的僅是符合查詢條件( WHERE 搜索條件或 HAVING 條件)和連接條件 的行。而採用外連接時,它返回到查詢結果集合中的不僅包含符合連接條件的行,而且還包括左表(左外 連接時)、右表(右外連接時)或兩個邊接表(全外連接)中的所有數據行。
如下面使用左外連接將論壇內容和作者信息連接起來:
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
ON a.username=b.username
下面使用全外連接將city表中的所有作者以及user表中的所有作者,以及他們所在的城市:
SELECT a.*,b.* FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username
(三) 交叉連接 交叉連接不帶WHERE 子句,它返回被連接的兩個表所有數據行的笛卡爾積,返回到結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。
例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉連接檢索到的記錄數將等 於6*8=48行。
SELECT type,pub_name FROM titles CROSS JOIN publishers
ORDER BY type

❷ sql語句分析。(名牌大學考試題)

首先要說,這些語法都是基於SQLSERVER資料庫的語法,DATEDIFF TOP等,在ORACLE等其他資料庫是沒有的。
1. 主要是datediff函數的用法,獲取兩個日期之間的時間差,可以得到年月日小時分秒等等,可以參看這個函數的說明。
這里第一個參數表示獲取時間差的類型,minute表示獲取兩個日期的時間差是分鍾。
第二個參數是起始時間,第二個是截止時間,都是datetime類型。
getdate(),獲取當前時間的函數。
我覺得你這個語句寫的有問題。第一,參數minute,不需要使用單引號,如果使用了單引號,參數就錯誤了,因為datediff第一個參數不是字元型的。
第二,datediff的函數第二個日期是開始時間,第二個是結束時間,你這個正好反了。
SQL: select * from 日程安排 where datediff(minute,f開始時間,getdate())>5
這個的意思是當前時間已經超過了開始時間5分鍾的,會顯示出來,而不是提前5分鍾提醒。
提前五分鍾提醒:SQL: select * from 日程安排 where datediff(minute,getdate(), f開始時間) < 5
距離當前時間小於5分鍾的記錄,才是提前5分鍾提醒。

2.
select top 10 b.* from (select top 20 主鍵欄位,排序欄位 from 表名 order by 排序欄位 desc) a,表名 b where b.主鍵欄位= a.主鍵欄位 order by a.排序欄位

先看from括弧內的語句:select top 20 主鍵欄位,排序欄位 from 表名 order by 排序欄位 desc,按照排序欄位降序排列取出前20行數據。
然後再整體看,把表和這個20行數據關聯,那麼能取到的最大范圍也就是這20行了。
然後取出前10行,我不知道這個為什麼叫做分頁查詢,因為根本沒有每頁多少行以及第幾頁的參數在。這個語句就是按照排序欄位倒敘排列的前20行,然後在按照排序欄位正序排列從這前20行中取出前10行。實際上就是取出了按照排序欄位倒敘排列的第11-20行的數據並正序排列。

3.內連接:實際上就是兩表直接連接,取出連接成立的所有數據。語法使用Inner join
距離:有學生表:student : student_id , student_name
001 張三
002 李四
003 王五
成績表: score : course_id student_id score
課程1 001 85
課程2 001 85
課程1 002 80
課程2 002 90
查詢學生選課成績,顯示 student_name, course_id, score
select a.student_name, b.course_id, b.score
from student a inner join score b on a.student_id = b.student_id
查詢結果 student_name, course_id, score
張三 課程1 85
張三 課程2 85
李四 課程1 80
李四 課程2 90
可以看到,直接符合連接條件的數據,都會被選擇出來,而王五,因為在成績表沒有成績,所以查詢結果並沒有王五的數據。

4.外連接,left join, right join,分別是左外連接和右外連接。
就是以一個表為主,而另一個表為輔。主表的數據都會被查詢出來,而符合兩表連接條件,那麼輔表的數據就會顯示,否則,為空(NULL)
還以上表和上述語句為例,查詢所有學生的成績清單,沒有成績顯示空,但是學生要顯示。
select a.student_name, b.course_id, b.score
from student a left join score b on a.student_id = b.student_id

查詢結果:
student_name course_id score
張三 課程1 85
張三 課程2 85
李四 課程1 80
李四 課程2 90
王五 NULL NULL

可以看到,雖然連接條件王五這條並不成立,但是王五的數據一樣會被顯示出來,只是成績表的相關數據位空。
有連接和左連接一樣,把上面的順序換過來,效果相同
select a.student_name, b.course_id, b.score
from score b right join student a on a.student_id = b.student_id

❸ SQL多項選擇題,急求答案,最好有解析

1.答案A,D,E DESC是降序,省略ASC和DESC,默認為升序。
2.答案A,C,D,E 創建視圖時不允許在所用SELECT語句中使用ORDER BY、COMPUTE子句
3.C,D,E 執行存儲過程時可用WITH RECOMPLE選項進行重新編譯;只有當執行存儲過程的語句是批處理中的第一個語句,才可以直接通過名稱來調用存儲過程
4.C,E 使用SQL Server Management Studio不能運行命令行實用程序sqlcmd
5.C,D,F 一個局部變數只能在一個語句批中使用,使用SET語句只能對一個局部變數賦值,剛定義的局部變數的初值為空值
6.B 用戶定義函數可以有輸入參數和返回值

❹ Mysql|數據分析搞懂這15道SQL題目筆試就穩了

現有以下三張表

寫出SQL語句:查詢產品名稱=「A葯品」,在北京醫院2018~2019兩年的銷售「金額」,排除兩年銷售金額總和>1000000的醫院,要求查詢結果如下表。

寫出SQL語句,查詢題1的銷量表中2019年任意連續三個月銷售額都>0的醫院。
返回欄位:HospitalId,SalesMonth(2019年銷量>0的所有月份,逗號隔開)

以下是微信聊天記錄表

寫出SQL語句:按月統計2020年的微信回復率

發送次數 = 一組好友在一個自然天內的所有發送記錄計為1次。

回復率計算公式 =(發送次數在兩個自然天內被回復)/發送次數*100%

未完。。。 持續更新中。。。

❺ sql題,讀不懂題意,請大家幫忙分析分析

select coutn(T1.T#),avg(t.age) from T,(select T# from TC where C# != C5) T1 where t.t#=t1.t#;
select t# from t where age=(select max(t.age) from t,(select t# from Tc where text=bj) t1 where t.t#=t1.t#);

❻ 請問各位大大如何解答這幾道SQL語言題目謝謝!

select date,sum(M) as 男生人數,sum(F) as 女生人數 from t1 group by date order by date

select w.職工號,e.出生行政區游羨伏,c.公司所在地行政區 from EMPLOYEE e,WORKS w,COMPANY c where w.工資>派鍵2000 and e.職工號=w.職工號 c.公司所在地行政區<>e.出生行政區 and w.公神攜司號=c.公司號

❼ sql經典50題

一、查詢課程編號為「01」的課程比「02」的課程成績高的所有學生的學號(重點)
一刷:
excel思路:
觀察原始表格數據,在excel中想得到01比02高,我們需要將原始表格拆分成兩個表,課程01表和課程02表,再進行vlookup得到c表,根據if條件判斷篩出最終數據。
重點是:1.拆表 2.匹配
轉成SQL語言:
1.拆表語言:

2.關聯加匹配語言 :

3.完整語言:

----到這里其實就可以結束了;
4.若想加student的信息,則需要以上所有結果再作為c表再關聯匹配:

若想讓欄位1和2為上下結果,即重復前面的信息,則語言如下:

二刷:

擴展一:查詢成績小於60分的學生的學號和姓名
1、先反向找出大於等於60分的學號 :

2、匹配:

擴展二:查詢平均成績小於60分的學生的學號、姓名和平均成績
第一種
1、先找出小於60分和空的作為c表:

2、匹配:

三、查詢所有學生的學號、姓名、選課數、總成績(不重要)

四、查詢姓「李」的老師的個數(不重要)

五、查詢沒學過「張三」老師課的學生的學號、姓名(重點)

六、查詢學過「張三」老師所教的所有課的同學的學號、姓名(重點)

七、查詢學過編號為「01」的課程並且也學過編號為「02」的課程的學生的學號、姓名(重點)

八、查詢課程編號為「02」的總成績(不重點)

九、查詢成績小於60分的學生的學號和姓名(同題目二)
十、查詢沒有學全所有課的學生的學號、姓名(重點)

十一、查詢至少有一門課與學號為「01」的學生所學課程相同的學生的學號和姓名(重點)

十二、查詢和「01」號同學所學課程完全相同的其他同學的學號(重點)

十五、查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績(重點)

十六、檢索"01"課程分數小於60,按分數降序排列的學生信息(和34題重復,不重點

十七、按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績(重重點與35一樣)

十八、查詢各科成績最高分、最低分和平均分:以如下形式顯示:課程ID,課程name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率
-- 及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90 (超級重點)

十九、按各科成績進行排序,並顯示排名

二十、查詢學生的總成績並進行排名(不重點)

二十一、查詢不同老師所教不同課程平均分從高到低顯示(不重點)

二十二、查詢所有課程的成績第2名到第3名的學生信息及該課程成績(重要 25類似

二十三、 使用分段[100-85],[85-70],[70-60],[<60]來統計各科成績,分別統計各分數段人數:課程ID和課程名稱(重點和18題類似)

二十四、查詢學生平均成績及其名次(同19題,重點)

二十五、查詢各科成績前三名的記錄(不考慮成績並列情況)(重點 與22題類似)

二十六、查詢每門課程被選修的學生數(不重點)

二十七、查詢出只有兩門課程的全部學生的學號和姓名(不重點)

二十八、查詢男生、女生人數(不重點)

二十九、查詢名字中含有"風"字的學生信息(不重點)

三十一、 查詢1990年出生的學生名單(重點year)

三十二、查詢平均成績大於等於85的所有學生的學號、姓名和平均成績(不重要)

三十三、查詢每門課程的平均成績,結果按平均成績升序排序,平均成績相同時,按課程號降序排列(不重要)

三十四、查詢課程名稱為"數學",且分數低於60的學生姓名和分數(不重點)

三十五、查詢所有學生的課程及分數情況(重點)

三十六、 查詢任何一門課程成績在70分以上的姓名、課程名稱和分數(重點)

三十七、 查詢不及格的課程並按課程號從大到小排列(不重點)

三十八、 查詢課程編號為03且課程成績在80分以上的學生的學號和姓名(不重要)

三十九、求每門課程的學生人數(不重要)

四十、查詢選修「張三」老師所授課程的學生中成績最高的學生姓名及其成績(重要top)

四十一、查詢不同課程成績相同的學生的學生編號、課程編號、學生成績 (重點)

四十二、查詢每門功課成績最好的前兩名(同22和25題)

四十三、統計每門課程的學生選修人數(超過5人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列(不重要)

四十四、檢索至少選修兩門課程的學生學號(不重要)

四十五、查詢選修了全部課程的學生信息(重點劃紅線地方)

四十六、查詢各學生的年齡(精確到月份)

四十七、 查詢沒學過「張三」老師講授的任一門課程的學生姓名(還可以,自己寫的,答案中沒有)

四十八、 查詢兩門以上不及格課程的同學的學號及其平均成績

四十九、查詢本月過生日的學生(無法使用week、date(now())

五十、 查詢下月過生日的學生

❽ 零基礎SQL自學,題目解析

x.continent=y.continent

上面是同州份

x.NAME<>y.NAME

一個國家是其他國家的三倍以上,那麼必須不能是同一個國家,上面的條件就是不是同一個國家

❾ SQL經典50題題解

本篇文章主要是對SQL經典50題進行詳細解析。

解析包含:1、解題思路,2、考核知識點,3、答案;

首先,表結構用腦圖輸出出來,如下所示:

先進行數據准備,建表以及插入數據。

1.查詢"01"課程比"02"課程成績高的學生的信息及課程分數

解題思路:

第一步:關鍵詞有「課程編號」、「課程成績」、「學生信息」,鎖定使用表:學生表、成績表。

第二步:給出學生信息及課程分數,通過主鍵sid關聯學生表和課程表。

第三步:比較同一個學生不同課程的成績,再關聯一次課程表,利用sid、cid進行關聯。

第四步:根據題目,用where比較分數篩選結果。

考核知識點: join,where

答案:

1.1 查詢存在" 01 "課程但可能不存在" 02 "課程的情況(不存在時顯示為 null )

解題思路:

第一步:關鍵詞有「課程編號」、「學生編號」,鎖定使用表:成績表。

第二步:分別查詢出存在" 01 "課程的學生和存在" 02 "課程的學生。

第三步:對兩個子查詢進行關聯,用sid進行左聯接。

考核知識點: where, 子查詢,left join

答案:

1.2 查詢同時存在01和02課程的情況

解題思路: 同1.1,把left join改為join

考核知識點: where, 子查詢,join

答案:

1.3 查詢選擇了02課程但沒有01課程的情況

解題思路: 類似1.1,把left join改為right join

考核知識點: where, 子查詢,right join

答案:

小結: 上面的題主要考察join、left join、right join。

2.查詢平均成績大於等於 60 分的同學的學生編號和學生姓名和平均成績

解題思路:

第一步:關鍵詞有「平均成績」、「學生編號」、「學生姓名」,鎖定使用表:成績表、學生表。

第二步:給出學生信息及課程分數,通過主鍵sid關聯學生表和課程表。。

第三步:根據題目,用group by聚合計算出平均成績,然後篩選出大於等於60分的學生。

考核知識點: join、group by、avg()

答案:

3.查詢在 SC 表存在成績的學生信息

解題思路:

第一步:關鍵詞有「SC」、「學生信息」,鎖定使用表:成績表、學生表。

第二步:用EXISTS判斷在SC表存在成績的學生信息

考核知識點: EXISTS語句

答案:

4.查詢所有同學的學生編號、學生姓名、選課總數、所有課程的成績總和

解題思路:

第一步:關鍵詞有「學生編號」、「學生姓名」、「選課總數」、「課程成績」,鎖定使用表:成績表、學生表。

第二步:通過主鍵sid關聯學生表成績表,得到學生信息、學生成績的寬表

第三步:根據題目,用group by聚合計算選課總數和總成績

考核知識點: left join、group by、count()、sum()、ifnull()

答案:

5.查詢「李」姓老師的數量

解題思路:

第一步:關鍵詞有「老師的數量」,鎖定使用表:教師表。

第二步:先篩選出「李」姓老師,再匯總統計「李」姓老師的數量

考核知識點: like、where、%、count()

答案:

6.查詢學過「張三」老師授課的同學的信息

解題思路:

第一步:關鍵詞有「老師」、「學生信息」,鎖定使用表:教師表、學生表、成績表、課程表。

第二步:通過sid關聯學生表、成績表,再通過cid關聯課程表,最後通過tid關聯教師表。

第三步:用where篩選出「張三」老師授課的同學的信息。

考核知識點: 多重連接join

答案:

7.查詢沒有學全所有課程的同學的信息。

解題思路:

第一步:關鍵詞有「課程」、「學生信息」,鎖定使用表:學生表、成績表、課程表。

第二步:先統計學生的課程數量,再篩選出小於所有課程數量的學生。

考核知識點: left join、group by、count()

答案:

8.查詢至少有一門課與學號為" 01 "的同學所學相同的同學的信息。

解題思路:

第一步:關鍵詞有「課程」、「學生信息」,鎖定使用表:學生表、成績表。

第二步:先查詢學號「01」的同學學習的課程。

第三步:通過sid關聯學生表和成績表,獲取所有學生信息、課程信息。

第四步:用EXISTS篩選出至少1門課相同的同學信息。

考核知識點: left join、子查詢、EXISTS

答案:

9.查詢和" 01 "號的同學學習的課程完全相同的其他同學的信息

解題思路:

第一步:關鍵詞有「課程」、「學生信息」,鎖定使用表:學生表、成績表。

第二步:用「01」號的同學學習的課程左關聯學生課程表,篩選出關鏈課程數一致的其他同學的sid

第三步:通過sid關聯學生表和成績表,獲取完整的學生信息。

考核知識點: left join、子查詢、group by

答案:

10.查詢沒學過"張三"老師講授的任一門課程的學生姓名

解題思路:

第一步:關鍵詞有「老師」、「學生姓名」,鎖定使用表:學生表、成績表、課程表、教師表。

第二步:反向求解。先查詢至少學過「張三」老師講授的課程的學生sid

第三步:用NOT EXISTS篩選出不在第二步查詢結果的學生信息,。

考核知識點: 多重連接join、NOT EXISTS、子查詢

答案:

11.查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績

解題思路:

第一步:關鍵詞有「姓名」、「平均成績」,鎖定使用表:學生表、成績表。

第二步:通過sid關聯學生表和成績表,得到學生成績信息寬表

第三步:用group by聚合統計,having對聚合的結果進行篩選。

考核知識點: join、group by、having、case when語句、avg()

答案:

12.檢索" 01 "課程分數小於 60,按分數降序排列的學生信息

解題思路:

第一步:關鍵詞有「課程分數」、「學生信息」,鎖定使用表:學生表、成績表。

第二步:通過sid關聯學生表和成績表,得到學生成績信息寬表

第三步:用where篩選" 01 "課程分數小於 60的記錄,並按照分數降序排列。

考核知識點: join、where、order by

答案:

13.按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績

解題思路:

第一步:關鍵詞有「平均成績」,鎖定使用表:成績表。

第二步:用group by將學生課程的成績由行轉換為列並計算平均成績。

第三步:按照平均成績降序顯示學生的所有課程的成績以及平均成績。

考核知識點: join

答案:

14.查詢各科成績最高分、最低分和平均分,以如下形式顯示:

以如下形式顯示:課程 ID,課程 name,最高分,最低分,平均分,及格率,中等率,

優良率,優秀率

及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90

要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列

解題思路:

第一步:關鍵詞有「課程name」、「最高分」,鎖定使用表:課程表、成績表。

第二步:用group by聚合計算課程最高分、最低分、平均分。

第三步:用case語句判斷及格、中等、優良、優秀,並結合group by計算。

考核知識點: join、group by、max()、min()、avg()、sum()、case when語句

答案:

15.按各科成績進行排序,並顯示排名, Score 重復時保留名次空缺

解題思路:

第一步:關鍵詞有「各科成績」,鎖定使用表:成績表。

第二步:用rank()排名。

考核知識點: rank() over(partition by)

答案:

15.1 按各科成績進行行排序,並顯示排名, Score 重復時合並名次

解題思路:

第一步:關鍵詞有「各科成績」,鎖定使用表:成績表。

第二步:用dense_rank()排名。

考核知識點: dense_rank() over(partition by)

答案:

16.查詢學生的總成績,並進行排名,總分重復時保留名次空缺

解題思路:

第一步:關鍵詞有「總成績」,鎖定使用表:成績表。

第二步:用group by統計學生的總成績。

第三步:用left join自關聯進行排名。

考核知識點: group by、 left join

答案:

16.1 查詢學生的總成績,並進行排名,總分重復時不保留名次空缺

解題思路:

第一步:關鍵詞有「總成績」,鎖定使用表:成績表。

第二步:用group by統計學生的總成績。

第三步:用變數進行排名。

考核知識點: group by、變數

答案:

17. 統計各科成績各分數段人數:課程編號,課程名稱,[100-85],[85-70],[70-60],[60-0] 及所佔百分比

解題思路:

第一步:關鍵詞有「各科成績」、「課程名稱」,鎖定使用表:成績表、課程表。

第二步:通過cid關聯課程表和成績表,得到課程、成績信息寬表。

第三步:用group by聚合統計各分段的人數及百分比。

考核知識點: join、group by、case when條件語句

答案:

18.查詢各科成績前三名的記錄

解題思路:

第一步:關鍵詞有「各科成績」,鎖定使用表:成績表。

第二步:篩選出各科比當前成績高的人數小於3的學生記為各科的前三名。

考核知識點: 子查詢

答案:

19.查詢每門課程被選修的學生數

解題思路:

第一步:關鍵詞有「每門課程」、「學生數」,鎖定使用表:課程表、成績表。

第二步:用left join關聯課程表和成績表,再用group by分組匯總各科的學生數。

考核知識點: left join、group by

答案:

20.查詢出只選修兩門課程的學生學號和姓名

解題思路:

第一步:關鍵詞有「選修課程」、「學生姓名」,鎖定使用表:學生表、成績表。

第二步:用join關聯學生表和成績表,再用group by分組匯總每個學生的選修課程數,最後用having對分組匯總結果篩選出選修兩門課程的學生。

考核知識點: join、group by、having

答案:

21. 查詢男生、女生人數

解題思路:

第一步:關鍵詞有「男生、女生」,鎖定使用表:學生表。

第二步:通過ssex學生表用group by分組匯總男生、女生人數。

考核知識點: group by

答案:

22. 查詢名字中含有「風」字的學生信息

解題思路:

第一步:關鍵詞有「學生信息」,鎖定使用表:學生表。

第二步:用like匹配姓名中含有風」字的學生。

考核知識點: like、%

答案:

23查詢同名同性學生名單,並統計同名人數

解題思路:

第一步:關鍵詞有「學生名單」,鎖定使用表:學生表。

第二步:使用group by,匯總同名同性人數,再用having篩選出大於1的記錄

考核知識點: group by、having

答案:

24.查詢 1990 年出生的學生名單

解題思路:

第一步:關鍵詞有「學生名單」,鎖定使用表:學生表。

第二步:用where篩選出1990年出生的學生名單

考核知識點: where、year

答案:

25.查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編

號升序排列。

解題思路:

第一步:關鍵詞有「平均成績」,鎖定使用表:成績表。

第二步:用group by分組計算各科平均成績,再用order by完成多列排序

考核知識點: group by、order by

答案:

26.查詢平均成績大於等於 85 的所有學生的學號、姓名和平均成績

解題思路:

第一步:關鍵詞有「平均成績」、「學生姓名」,鎖定使用表:成績表、學生表。

第二步:用join關聯學生表和成績表

第三步:用group by分組匯總計算每個學生的平均成績,再用having篩選平均成績>=85的記錄

考核知識點: join、group by、having

答案:

27.查詢課程名稱為「數學」,且分數低於 60 的學生姓名和分數

解題思路:

第一步:關鍵詞有「課程名稱」、「分數」、「學生姓名」,鎖定使用表:課程表、成績表、學生表。

第二步:用join關聯學生表、成績表、課程表,再用where篩選

考核知識點: 多重join、where

答案:

28. 查詢所有學生的課程及分數情況(存在學生沒成績,沒選課的情況)

解題思路:

第一步:關鍵詞有「所有學生」、「分數」,鎖定使用表:學生表、成績表

第二步:用left join關聯學生表、成績表

考核知識點: left join

答案:

29.查詢任何一門課程成績在 70 分以上的姓名、課程名稱和分數

解題思路:

第一步:關鍵詞有「課程成績」、「姓名」、「課程名稱」,鎖定使用表:學生表、成績表、課程表

第二步:用join關聯學生表、成績表、課程表,再篩選出課程成績在70分以上的。

考核知識點: 多重join

答案:

30.查詢不及格的課程

解題思路:

第一步:關鍵詞有「不及格的課程」,鎖定使用表:成績表、課程表

第二步:關聯課程表和成績表,再條件篩選出不及格的課程信息。

考核知識點: join、where、去重

答案:

31.查詢課程編號為 01 且課程成績在 80 分以上的學生的學號和姓名

解題思路:

第一步:關鍵詞有「課程編號」、「課程成績」、「姓名」,鎖定使用表:成績表、學生表

第二步:關聯成績表和學生表,再條件篩選出結果。

考核知識點: join、where

答案:

32.求每門課程的學生人數

解題思路:

第一步:關鍵詞有「課程」、「學生人數」,鎖定使用表:成績表

第二步:用group by分組匯總各科的學生人數。

考核知識點: group by

答案:

33.成績不重復,查詢選修「張三」老師所授課程的學生中,成績最高的學生信息及其成績

解題思路:

第一步:關鍵詞有「成績」、「「張三」老師」、「學生信息」,鎖定使用表:成績表、課程表、學生表、教師表

第二步:關聯所有表,篩選出選修「張三」老師所授課程的學生。

第三步:因為成績不重復,對學生成績由高到低排序,篩選出第一行記錄。

考核知識點: 多重join、order by、limit

答案:

34.成績有重復的情況下,查詢選修「張三」老師所授課程的學生中,成績最高的學生

信息及其成績

解題思路:

第一步:關鍵詞有「成績」、「「張三」老師」、「學生信息」,鎖定使用表:成績表、課程表、學生表、教師表

第二步:關聯所有表,篩選出選修「張三」老師所授課程的學生。

第三步:因為成績有重復,先求出最高成績,再匹配最高成績對應的學生信息。

考核知識點: 多重join、max()

答案:

35.查詢不同課程成績相同的學生的學生編號、課程編號、學生成績

解題思路:

第一步:關鍵詞有「成績」,鎖定使用表:成績表

第二步:自聯接,篩選出不同課程成績相同的記錄

考核知識點: 自聯接join

答案:

36. 查詢每門成績最好的前兩名

解題思路:

第一步:關鍵詞有「成績」,鎖定使用表:成績表

第二步:自聯接,篩選出各科低於自身成績的人數為2的。

考核知識點: left join

答案:

37. 統計每門課程的學生選修人數(超過 5 人的課程才統計)。

解題思路:

第一步:關鍵詞有「選修人數」,鎖定使用表:成績表

第二步:先用group by分組匯總各科的選修人數,再條件篩選出超過5人的課程。

考核知識點: group by、having

答案:

38.檢索至少選修兩門課程的學生學號

解題思路:

第一步:關鍵詞有「兩門課程」,鎖定使用表:成績表

第二步:先用group by分組匯總每個學生的選修課程數,再用having篩選出至少2門課程的學生學號

考核知識點: group by、having

答案:

39.查詢選修了全部課程的學生信息

解題思路:

第一步:關鍵詞有「全部課程」、「學生信息」,鎖定使用表:成績表、課程表、學生表

第二步:關聯學生表和成績表,再用group by分組統計每個學生的選修課程數

第三步:最後用having篩選出等於全部課程數的學生信息。

考核知識點: join、 group by、having、子查詢

答案:

40.查詢各學生的年齡,只按年份來算

解題思路:

第一步:關鍵詞有「學生的年齡」,鎖定使用表:學生表

第二步:用year和now來統計

考核知識點: year、now

答案:

41. 按照出生日期來算,當前月日 < 出生年月的月日則,年齡減一

解題思路:

第一步:關鍵詞有「出生日期」,鎖定使用表:學生表

第二步:用timestampdiff()統計年齡

考核知識點: timestampdiff()

答案:

42.查詢本周過生日的學生

解題思路:

第一步:關鍵詞有「過生日」,鎖定使用表:學生表

第二步:用week函數

考核知識點: week()

答案:

43. 查詢下周過生日的學生

解題思路:

第一步:關鍵詞有「過生日」,鎖定使用表:學生表

第二步:用week函數

考核知識點: week()

答案:

44.查詢本月過生日的學生

解題思路:

第一步:關鍵詞有「過生日」,鎖定使用表:學生表

第二步:用month函數

考核知識點: month()

答案:

45.查詢下月過生日的學生

解題思路:

第一步:關鍵詞有「過生日」,鎖定使用表:學生表

第二步:用month函數

考核知識點: month()

答案:

❿ 關於SQL語句。綜合分析題。急~

create database CPXS --1
/*2*/
create table 產品表(產品編號 varchar(10) not null PRIMARY KEY, 產品名稱 varchar(50) not null ,庫存量 int)

create table 銷售商表(
客戶編號 varchar(10) not null PRIMARY KEY,
客戶名稱 varchar(50) not null,
地區 varchar(50),
負責人 varchar(20),
電話 varchar(15)
)
create table 產品表(銷售日期 datetime not null,產品編號 varchar(10) not null,數量 int,價格 money)
--3
insert into 產品表(產品編號,產品名稱,庫存量)
values('0001','計算機',20)

update 銷售商表 set 電話='1398888888' where 客戶名稱='劉濤'
--5
create proc GetGoods
as
begin
select Distinct 產品名稱 from 產品表
end
--第四題是什麼意思