SQL乾貨篇

單表查詢

只在一個表中查詢數據git

SELECT * FROM student where Sno='13143';   //根據學號查詢數據

多表查詢

同時查詢多個表github

SELECT student.Sno,student.Sname,Grade
FROM student,SC where Grade>=90;

說明:這是在學生表student和成績表SC中查詢成績大於90的學生姓名和學號,由於這裏Sno,Sname在兩個表中都存在,所以要指定查詢哪個表中的數據,而Grade只在SC表中出現,所以不用指明哪張表sql

模糊查找

說明:模糊查找用likenot like進行查找函數

  • SELECT * FROM student where Sname like '劉%';查詢全部姓劉的學生搜索引擎

  • SELECT * FROM student where Sname like '%加%'查詢名字中含有加字的學生信息,不固定加字的位置,在任意位置都能查到,這裏通常搜索引擎都用是用這種模糊查找的方法來匹配搜索項code

  • SELECT * FROM student where Sname like '歐陽_';查找以姓歐陽而且名字爲個字的學生信息對象

  • SELECT * FROM student WHERE Sname like '_陽';查找全部姓名爲兩個字而且第二個字爲的學生信息排序

  • SELECT * FROM student where Sname like '_陽%';查詢全部姓名中第二個字爲的學生信息索引

  • SELECT * FROM Course where Cname like '\_IS' ESCAPE '\';查詢課程名字爲_is的課程信息,這裏若是要查詢的字符串本省就含有通配符"%"或者"_",這時就要使用ESCAPE<轉碼字符>來對字符進行轉義了,這裏的轉碼字符能夠是任意的,可是咱們一般都是用\,上面的查詢語句中的\就是轉碼字符字符串

空值查詢

判斷數據是否爲空用is not nullis null

SELECT * FROM student where Sname is null;查詢姓名爲空的學生信息

多重條件的查詢

多重條件的查詢用AND和OR,其區別不用多說了

SELECT Sname FROM student where Sdept='IS' and Sage>20;查找院系是IS而且年齡超過20歲的學生姓名

ORDER BY子句(排序)

用戶可使用ORDER BY子句對數據進行升序(ASC)或者降序(DESC)排列

  • SELECT * FROM student where Sage>20 ORDER BY Sno DESC;查詢年齡超過20歲的學生信息,而且按照降序排列輸出

  • SELECT * FROM student ORDER BY Sdept,Sage DESC;查詢全體學生狀況,查詢結果按照所在系的系號升序排列,同一系的按照年齡降序排列

彙集函數

  • COUNT(*) 統計元組個數

  • COUNT(DISTINCT|ALL <列名>) 計算一列中值的個數,其中DISTINCT表示去除重複的元素,ALL則保留全部的元素

  • SUM(DISTINCT|ALL <列名>) 計算一列值的總和

  • AVG(DISTINCT|ALL<列名>) 計算一列中的平均值

  • MAX(DISTINCT|ALL<列名> ) 求一列中的最大值

  • MIN(DISTINCT|ALL<列名> ) 求一列中的最小值

實例:

  • select count(*) from student; 查詢學生總數

  • select count(DISTINCT Sdept); 查詢總共有多少系

  • select AVG(Grade) from SC; 查詢學生的平均分

  • select SUM(Grade) from SC; 查詢學生的總分

  • select MAX(Grade) from SC where Cno='1'; 查詢課程1的最高分

  • select MIN(Grade) from SC where Cno='1'; 查詢課程1的最低分

注意:where子句中不能用匯集函數,只有在select子句和Group by子句中才能使用匯集函數

GROUP BY子句

  • GROUP BY子句將查詢結果按某一列或者多列的值分組,值相等的爲一組。

  • 對查詢結果分組的目的是爲了細化彙集函數的對象。若是未對查詢結果進行分組,那麼彙集函數將會做用於整個查詢結果,分組後彙集函數將會做用於每一組,即每一組都有一個函數值

實例:

  • select Cno,Count(Sno) from SC Group by Cno; 求各個課程號以及相應的選課人數

  • select Cno as '課程號',count(Sno) as '選課人數' from sc group by Cno;求各個課程號以及相應的選課人數

  • select Cno,count(Sno),AVG(Grade) from sc group by Cno Having AVG(Grade)>80; 查詢課程平均分大於80分的課程號和所選學生人數,這裏是先分組後而後對這些組進行篩選就用Having子句進行條件篩選,不能使用where子句進行篩選,固然這裏的sleect子句中的AVG(Grade)能夠去掉,能夠寫成select Cno,count(Sno) from sc group by Cno Having AVG(Grade)>80;

  • select Sno from sc Group by Sno having count(*)>2; 查詢選修了兩門以上課程的學生學號

  • select Sno,AVG(Grade) from sc Group by Sno; 查詢每個學生選修課程的平均成績,這裏先按照學號進行分組,而後對每個分組進行求平均成績

注意:這裏的若是使用了彙集函數,那麼select子句中出現的選項必定要在彙集函數或者Group by子句中出現,不然就會出現錯誤,如:select Sno,count(Cno) from sc;這條語句就是錯誤的,由於Sno沒有出如今彙集函數或者Group by子句中,若是改爲select Sno,count(Cno) from SC Group by Sno;就正確了,由於Sno出如今了Group by子句中了

鏈接查詢

若是一個查詢涉及兩個以上的表則稱之爲鏈接查詢,鏈接查詢包括等值鏈接查詢,天然鏈接查詢,自身鏈接查詢,非等值鏈接查詢,外鏈接查詢,複合條件查詢

等值和非等值鏈接查詢

當鏈接運算符爲=時爲等值鏈接查詢,不然爲非等值鏈接查詢

實例:

  • select student.*,SC.* from student,SC where student.Sno=SC.Sno;查詢每一個學生及其選修課程的狀況

天然鏈接查詢

在等值鏈接的基礎上去掉相等的屬性組就是天然鏈接查詢

實例:
select student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade from student,SC where student.Sno=SC.Sno;

嵌套查詢

SQL語言中一個SELECT-FROM-WHERE語句稱爲一個查詢塊,將一個查詢塊嵌套在另一個查詢塊的WHERE子句或HAVING短語的條件查詢稱之爲嵌套查詢
實例:

SELECT SNAME FROM STUDENT WHERE SNO IN    /*外層查詢*/
(SELECT SNO FROM SC WHERE CNO='2');    /*內層查詢或者子查詢*/

注意:

  • 這裏的查詢條件Sno只能有一個,而且外層查詢的where子句中出現的Sno屬性要和內層查詢select語句中的Sno屬性要對應。

  • 子查詢中不能使用ORDER BY子句,ORDER BY子句只能對最終的查詢結果排序

帶有IN謂詞的嵌套查詢

實例:

SELECT Sno,Sname,Sdept from student where Sdept IN
(SELECT Sdept From student Where Sname='劉晨');

查詢與劉晨在同一個系的學生信息,固然本例中也能夠用自身鏈接查詢來完成,以下:

select first.Sno,first.Sname,first.Sdept 
from student first,student second
where first.Sdept=second.Sdept and second.Sname='劉晨';

帶有比較運算符的子查詢

select Sno,Cno from sc x where Grade >
(select AVG(Grade) from sc y where x.Sno=y.Sno);

查詢了全部學生成績超過選修課程平均成績的課程號

帶有ANY或者ALL的謂詞子查詢

ANY表示查詢條件只要知足其中一個便可,而ALL表示查詢條件要知足全部的才行
實例:

  • SELECT SNAME,SAGE FROM STUDENT WHERE SAGE<ANY(SELECT SAGE FROM STUDENT WHERE SDEPT='CS') AND SDEPT!='CS';查詢非計算機系的比計算機系任意一個學生年齡小的學生姓名和年齡,這裏只要知足比一個學生的年齡小便可

  • SELECT SNAME,SAGE FROM STUDENT WHERE SAGE<ALL(SELECT SAGE FROM STUDENT WHERE SDEPT='CS') AND SDEPT!='CS';查詢非計算機系的比計算機系的全部學生年齡小的學生信息,這裏要知足比全部的學生信息都要小,就是比計算機系年齡最小的都要小

帶有EXISTS謂詞的子查詢

EXISTS表示存在的意思,帶有EXISTS的子查詢步返回任何的數據,只產生邏輯真或者假

  • SELECT Sname From student where EXISTS (SELECT Sname from SC where Sno=student.Sno and Cno='2');查詢選擇課程2的學生姓名,這裏只判斷是否存在這樣的學生,若是子查詢中沒有找到課程2這項,那麼查到的就是空,子查詢只判斷是否爲true or false,固然還有NOT EXISTS

集合查詢

集合操做包括並操做UNION、交操做INTERSECT、差操做EXCEPT

實例:

  • select * from student where Sdept= 'CS' UNION select * from student where Sage>19;查找計算機系的學生以及年齡不大於19歲的學生信息,這裏UNION會自動去掉重複的元組,若是想要保留所有的數據須要用UNION ALL

  • select Sno from SC where Cno='1' UNION select Sno from SC where Cno='2';查詢選修課程1或者選修課程2的學生學號,這裏並集就是去掉重複的元組,使用UNION ALL 能夠保留

  • select Sno from SC where Cno='1' Intersect select Sno from SC where Cno='2';查詢同時選修課程1和課程2的學生學號

基於派生表的查詢

select Sno,Cno from SC,(select Sno,AVG(Grade) from SC Group by Sno) 
AS AVG_SC(avg_Sno,avg_grade)
where SC.Sno=AVG_SC.avg_Sno and SC.Grade>=AVG_SC.avg_grade;

這裏的From子句中將會派生出一個AVG_SC表,該表由avg_Sno、avg_grade組成,主查詢將SC表和AVG_SC表進行鏈接,選出修課成績大於其平均成績的課程號

注意:若是子查詢中沒有彙集函數,那麼派生表不用指定屬性列,子查詢後面的列名爲其屬性,以下:

select Sname from student,(select Sno From SC where Cno='1') AS SCI where student.Sno=SCI.Sno;這裏的SCI默認的列屬性名是Sno,AS關鍵詞能夠省略,可是必需要爲派生表指定一個別名。

本人博客

相關文章
相關標籤/搜索