SQL語句學習

1、Select語句定義:

<SELECT clause> [<FROM clause>] [<WHERE clause>][<GROUP BY clause>] [<HAVING clause>][<ORDER By clause>][<LIMIT clause>]

2、SQL語句執行順序:
1>FROM
2>JION
3>ON
4>WHERE
5>GRUOP BY //開始可以使用SELECT中列的別名
6>AVG、SUM……
7>HAVING
8>SELECT
9>DISTINCT
10>ORDER BY

SELECT sid as 學號,sname as 姓名,SUM(record)as 總分 FROM student s join course c where s.sid=c.sid GROUP BY sid HAVING 總分>0 ORDER BY 總分

分析:
所有的查詢語句都是從FROM開始執行,在執行過程中,每個步驟都會爲下一個步驟生成一個虛擬的表,這個虛擬的表作爲下一個執行步驟的輸入。
(1)首先對FROM語句中的兩個表執行一個笛卡爾積(這裏有待求證),此時生成虛擬表vt1(較小的表做基礎表)
(2)然後用on篩選器中的邏輯表達式作用在vt1上,篩選出滿足條件的虛擬表vt2
(3)如果是 outer join(LEFT、RIGHT、FULL JOIN),這一步將添加外部行,生成一個新的虛擬表vt3
(4)如果FROM後面的表是大於兩個,則vt3與第三個表連接重複1-3步驟,最終得到一個新的虛擬表vt3
(5)用WHERE篩選器,作用於上一步生成的虛擬表vt3,過濾後生成新的虛擬表vt4
(6)使用Group BY 將指定的列值合併爲唯一的一列一般是配合聚合函數使用,生成虛擬表vt5
(7)HAVING是唯一也是第一個作用分組的篩選器,這裏的列名可以使用別名比如總分,生成虛擬表vt6
(8)處理SELECT語句,篩選出其選擇的列,生成虛擬表vt7
(9)應用DISTINCT,如果使用GROUP BY 則就已經去除重複行,所以這裏用不到
(10)按照ORDER BY condition排序vt7,此時返回的是遊標(應該是對應其實際位置映射表),而不是虛擬表。
(11)應用Top或limit選項,返回給請求的用戶
3、SQL語句中其他符號
IN、NOT IN
放在WHERE篩選器後面,對指定列進行排它範圍的篩選

SELECT sid,sname,saddress WHERE sname IN ('張三','李四','小紅')
SELECT sid,sname,saddress WHERE sname NOT IN ('張三','李四','小紅')

“-”、“%”
關鍵詞LIKE與”-“、“%”配套使用,其中”-“代表一位不確定的字符,而”%”則表示不確定長度的不確定字符。

SELECT * FROM student WHERE sname LIKE'張_'

表示匹配姓爲張且名字只有一個字的學生;比如 張三 、張明 而張曉紅 就排除在外 如果要查詢 姓名爲三個字的名字,則可以是:LIKE ‘張__’
但是這樣太精確 也有局現性,比如我要查找以“張”開頭的名字,那麼使用”%”就可以輕鬆實現

SELECT * FROM student WHERE sname like '張%'

當然對於名字字符較少,可以使用OR 把兩個字名字、三個字名字、四個字名字….等組合起來也能實現該效果,但對於比較多的可能就不適合了。
“%”與”“可以自己或互相組合使用,比如LIKE ‘%景區’ 、LIKE’西安%’、LIKE’%5A%’、LIKE ‘明’、LIKE’張‘、LIKE‘王剛’、LIKE’%光明區_幢’
內置函數SUM()、AVG()、MAX()、MIN()、COUNT()

SELECT sid,SUM(record)as 總分,AVG(record)as平均分,MAX(record)as單課最高分,MIN(record)as 單課最低分,COUNT(record)as 科目數 FROM course GROUP BY sid

子查詢
想要知道名爲 “Tom” 的員工所在部門做了幾個工程。員工信息儲存在 employee 表中,但工程信息儲存在project 表中。

SELECT of_dpt,COUNT(proj_name) AS count_project FROM project
WHERE of_dpt IN
(SELECT in_dpt FROM employee WHERE name='Tom');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章