SQLyog基本操作(六)-排序、分頁、子查詢與嵌套查詢、分組過濾、select小結


4.6 排序 order by

 SELECT `SubjectNo`,`ClassHour` FROM `subject` -- 從subject表中選擇哪些字段進行顯示
 -- 排序:ORDER BY,其中,ASC表示升序,DESC表示降序
 ORDER BY `ClassHour` ASC -- 根據ClassHour進行升序顯示
 -- ORDER BY `ClassHour` DESC -- 根據ClassHour進行降序顯示

輸出結果:

(1)升序結果

(2)降序結果

 

4.7 分頁 limit

 -- 為什么要分頁?緩解數據庫壓力,給人更好的體驗,瀑布流需要不斷加載
 SELECT `SubjectNo`,`ClassHour` FROM `subject`
 ORDER BY `ClassHour` ASC
 -- 語法:limit 起始值 頁面的大小
 -- 每頁只顯示5條數據
 limit 0,5 -- 1-5條數據,下標從零開始,表示第1條數據 表示第1頁
 -- limit 1,5 -- 2-6條數據
 -- limit 5,5 -- 6-10條數據 表示第2頁
 -- limit 10,5 -- 11-15條數據 表示第3頁
 -- LIMIT (n-1)*5,5 -- (n-1)*5+1-(n-1)*5+5條數據 表示第n頁
 -- 詳細語法:LIMIT (n-1)*pageSize,pageSize,其中,pageSize表示頁面大小,(n-1)*pageSize表示起始值,n表示當前頁,總頁數=數據總數/頁面大小

語法

LIMIT (n-1)×pageSize,pageSize,pageSize表示頁面大小,其中,(n-1)*pageSize表示起始值,n表示當前頁,總頁數=數據總數/頁面大小

輸出結果:

(1)第1頁

(2)第2頁

練習題:

      查詢JAVA第一學年課程成績排名前十的同學,並且分數要大於80的學生信息,輸出:學號、姓名、課程名稱、分數。

 SELECT s.`StudentNo`,`StudentName`,`SubjectName`,`StudentResult`
 FROM `student` s
 INNER JOIN `result` r
 ON s.`StudentNo`=r.`StudentNo`
 INNER JOIN `subject` sub
 ON r.`SubjectNo`=sub.`SubjectNo`
 WHERE `SubjectName`= 'JAVA第一學年' AND `StudentResult`>=80
 ORDER BY `StudentResult` DESC
 LIMIT 0,10

 

4.8 子查詢與嵌套查詢

之前我們在寫sql,查詢條件中的值都是固定的,如果將條件中的值換成計算出來的話,就是子查詢了。

本質:在where條件下嵌套一個查詢語句

 -- 1.查詢“數據庫結構-1”的所有考試結果,輸出:學號、科目編號、成績,降序排列
 -- 方式1:使用連接查詢
 SELECT `StudentNo`,r.`SubjectNo`,`StudentResult`
 FROM `result` r
 INNER JOIN `subject` sub
 ON r.`SubjectNo`=sub.`SubjectName`
 WHERE `SubjectName`='數據庫結構-1'
 ORDER BY `StudentResult` DESC
 
 -- 方式2:使用子查詢(由里及外)
 -- 查詢所有“數據庫結構-1”的學生學號
 SELECT `StudentNo`,`SubjectNo`,`StudentResult`
 FROM `result`
 WHERE `SubjectNo`= ANY(
   SELECT `SubjectNo` FROM `subject`
   WHERE `SubjectName` = '數據庫結構-1'
 )
 ORDER BY `StudentResult` DESC
 -- Subquery returns more than 1 row:表示子查詢返回了多行數據
 -- 解決方法:在()前加ANY
 
 -- 2.查詢不小於80分的學生的學號和姓名
 SELECT DISTINCT s.`StudentNo`,`StudentName`
 FROM `student` s
 INNER JOIN `result` r
 ON s.`StudentNo`=r.`StudentNo`
 WHERE `StudentResult`>80
 
 -- 3.在2的基礎上,增加一個科目:高等數學-2
 -- 查詢“高等數學-2”的編號
 SELECT DISTINCT s.`StudentNo`,`StudentName`
 FROM `student` s
 INNER JOIN `result` r
 ON s.`StudentNo`=s.`StudentNo`
 WHERE `StudentResult`>80 AND `SubjectNo`=(
   SELECT `SubjectNo` FROM `subject`
   WHERE `StudentName`='高等數學-2'
 )
 
 -- 改造(由里及外)
 SELECT `StudentNo`,`StudentName` FROM `student` WHERE `StudentNo` IN (
   SELECT `StudentNo` FROM `result` WHERE `StudentResult`>80 AND `SubjectNo`= (
     SELECT `SubjectNo` FROM `subject` WHERE `SubjectName` = '高等數學-2'
   )
 )
 
 -- 用連接查詢實現
 SELECT s.`StudentNo`,`StudentName`
 FROM `student` s
 INNER JOIN `result` r
 ON s.`StudentNo`=r.`StudentNo`
 INNER JOIN `subject` sub
 ON r.`SubjectNo`=sub.`SubjectNo`
 WHERE `SubjectName`='高等數學-2' AND `StudentResult`>=80
 
 -- 練習:使用子查詢查詢“C語言-1”前5名同學的成績信息:學號、姓名、分數
 SELECT DISTINCT s.`StudentNo`,`StudentName`,`StudentResult`
 FROM `student` s
 INNER JOIN `result` r
 ON s.`StudentNo`=r.`StudentNo`
 WHERE `SubjectNo` = ANY(
   SELECT `SubjectNo` FROM `subject` WHERE `SubjectName`='C語言-1'
 )
 ORDER BY `StudentResult` DESC
 LIMIT 0,5

4.9 分組和過濾

 -- 查詢不同課程的平均分、最高分、最低分,平均分大於80的記錄
 -- 核心:根據不同課程進行分組
 SELECT `SubjectName`,AVG(`StudentResult`) AS `平均分`,MAX(`StudentResult`) AS `最高分`,MIN(`StudentResult`) AS `最低分`
 FROM `result` r
 INNER JOIN `subject` sub
 ON r.`SubjectNo`=sub.`SubjectNo`
 GROUP BY r.`SubjectNo` -- 通過什么字段來查詢
 HAVING `平均分`>80

4.10 select語法小結

SELECT語法

 SELECT [ALL | DISTINCT]
 {* | table.* | [table.field1[AS aliasl][,table.field2[AS alias2]][,...]]}
 FROM table_name [AS table_alias]
   [LEFT | RIGHT | INNER JOIN table_name2] -- 聯合查詢
   [WHERE ...] -- 指定結果需滿足的條件
   [GROUP BY ...] -- 指定結果按照哪幾個字段來分組
   [HAVING] -- 過濾分組的記錄必須滿足的次要條件
   [ORDER BY ...] -- 指定查詢記錄按一個或多個條件排序
   [LIMIT {[OFFSET,]ROW_COUNT | row_countoffset OFFSET}];
   -- 指定查詢的記錄從哪條至哪條
   -- 注意:[]括號代表可選的,{}括號代表必選的  
 -- all是默認的,查詢所所有,distinct是消除重復的;
 -- xxx join:代表要連接的表,on表示等值判斷;
 -- where:條件子句,后面跟查詢的值或者子查詢語句(注意不能跟聚合函數共同使用);
 -- group by:通過某個字段來分組;
 -- having: 過濾分組后的信息,作用和where差不多,只是放置的位置不同,且having能跟聚合函數一起使用;
 -- order by:通過某個字段來排序,[升序(asc)/ 降序(desc)];
 -- limit:分頁,從索引為某個值開始,查多少條數據 ;
 
 -- 順序很重要
 select 去重 要查詢的字段 from 表(注意:表和字段可以起別名,注意別名要用``可不是‘’括起來)
 xxx join 要連接的表 on 等值判斷
 where 具體的值,子查詢語句
 group by 通過哪個字段進行分組
 having 過濾分組后的信息,條件和where是一樣的,只是位置不同而已
 order by 通過哪個字段進行排序,升序asc、降序desc
 limit stratindex,pagesize 起始位置,頁面大小 進行分頁
 
 -- 業務層面的查詢:跨表、跨數據庫......
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM