【數據庫】1.mysql相關知識(二)

1. 什麼聚合函數

  • 對一組值進行計算,並返回計算後的值,一般用來統計數據

1.1 SUM

  • 累加所有行的值
    SELECT SUM(age) AS '總年齡' FROM studb.student WHERE city='上海';
    //返回結果
    總年齡
    70

1.2 AVG

  • 計算所有行的平均值
    SELECT AVG(age) AS '平均年齡' FROM student WHERE city='上海';
    //返回結果
    平均年齡
    35.0000

1.3 MAX、MIN

  • 計算所有行的最大值、最小值
    SELECT MAX(age) AS '最大年齡',MIN(age) AS '最小年齡' FROM student WHERE city='上海';
    //返回兩個表
    //最大值表
    最大年齡
    40
    //最小值表
    最小年齡
    30

1.4 COUNT

  • 計算記錄的條數
  • 舉例:計算來自上海的人有多少
    SELECT COUNT(*) AS '上海人數' FROM student WHERE city='上海';
    //返回結果爲
    上海人數
    2

2. 分組

  • 分組查詢就是按牟烈的值進行分組,相同的值分成一組,然後可以對此組內進行求平均值、和等計算

2.1 語法

SELECT 列名,查詢表達式/聚合表達式
FROM <表名>
WHERE <條件>
GROUP BY <分組字段>
HAVING 分組後的過濾條件
ORDER BY 列名 [ASC,DESC]
LIMIT 偏移量,條數
  • 上面的關鍵字可以不出現,但是如果出現,順序是固定的
  • SELECT列表中只能包含:
    • 被分組的列
    • 爲每個分組返回一個值的表達式,如聚合函數

2.2 練習

  • 單列分組
    • 統計每位同學的平均成績 - 單列分組
        SELECT student_id,AVG(grade)
        FROM score
        GROUP BY student_id
    
    • 統計每門課程的最高分,並按分數從高到低排列 - 單列分組
        SELECT course_id,MAX(grade)
        FROM score
        GROUP BY course_id
        ORDER BY MAX(grade) DESC
        //注意排序的時候是根據MAX(grade),而不是根據grade
    
  • 多列分組
    • 統計各省男女的總人數 - 多列分組
        SELECT province,gender,COUNT(*) AS '總人數'
        FROM student
        GROUP BY province,gender
    

2.3 分組篩選

2.3.1 語法

  • 對分組後的結果進行過濾,就是分組篩選
  • 使用HAVING關鍵字

2.3.2 練習

  • 舉例:統計人數大於1的省份及人數
    SELECT province,COUNT(*)
    FROM student
    GROUP BY province
    HAVING COUNT(*) > 1
  • 統計不及格次數大於1的同學
    SELECT student_id,COUNT(*) 不及格次數
    FROM score
    WHERE grade<60
    GROUP BY student_id
    HAVING COUNT(*) > 1;

3. 子查詢

  • 子查詢就是指出現在其他SQL語句中的SELECT語句,必須使用出現在圓括號()中
  • 子查詢可以包含多個關鍵字或條件
  • 子查詢的外層查詢可以是:SELECT、INSERT、UPDATE、SET等
  • 子查詢可以返回常量、一行數據、一列數據或其他字查詢

3.1 比較運算符的子查詢

  • = 等於
  • > 大於
  • < 小於
  • >= 大於等於
  • <= 小於等於
  • <> 不等於
  • != 不等於
  • <=> 安全不等於

3.2 舉例:查詢年齡大於平均年齡的學生

    SELECT *
    FROM student
    WHERE age > (SELECT AVG(age) FROM student);

3.3 ANY SOME ALL

  • ANY 任何
  • SOME 存在
  • ALL 所有
    • 舉例:查詢年齡大於陝西省任何一位同學的學生信息
        SELECT *
        FROM student
        WHERE age > ANY (SELECT age FROM student WHERE province='陝西省');
    
    • 舉例:查詢年齡大於陝西省所有同學的學生信息
        SELECT * 
        FROM student
        WHERE age > ALL (SELECT age FROM student WHERE province='陝西省');
    
    • 舉例:查詢年齡與陝西省裏面部分同學一樣的學生信息
        SELECT *
        FROM student
        WHERE age = SOME (SELECT age FROM student WHERE provice='陝西省');
    

3.4 IN與NOT IN

  • IN 在…範圍內
  • NOT IN 不在…範圍內
  • 舉例:查詢一下有考試成績的學生信息
    SELECT *
    FROM student
    WHERE id IN (SELECT student_id FROM score WHERE grade IS NOT NULL);

3.5 EXITS與NOT EXITS 這個性能比 IN與NOT IN 要高

  • EXITS 存在於
  • NOT EXITS 不存在於…
  • 舉例:查詢下有考試成績的學生信息
    SELECT * 
    FROM student
    WHERE EXITS (SELECT * FROM score WHERE score.student_id = student.id)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章