日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库实践LAB大纲 02 检索

發布時間:2024/3/13 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库实践LAB大纲 02 检索 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 單表查詢(基本查詢、分組查詢)
    • select子句
    • LIMIT
    • where
      • 關系/邏輯/取值/空值表達式
      • 模糊查詢
    • 分組查詢
      • 聚集函數
      • Group by
  • 多表查詢
    • 表連接
    • 子查詢
    • 子查詢與數據更新
    • 聯合查詢 UNION[ALL]
    • 查詢效率
  • 高級查詢(復雜子查詢)
    • 包含關系查詢
    • ROLLUP
    • CUBE
    • with

單表查詢(基本查詢、分組查詢)

select

/* SELECT [ALL | DISTINCT] <目標列表達式> [,<目標列 表達式>] FROM <表名或視圖名>[,<表名或視圖名>] [WHERE <條件表達式>] [GROUP BY <列名1> [HAVING <條件表達式>]] [ORDER BY <列名2> [ASC | DESC]] */

select子句

除了 select from 外其余內容可選

  • select 后面列出字段列名,列名之間逗號分隔
  • 若要顯示所有,直接用 *(多表連接若想指定某個表如q1的所有內容,可以寫 q1.*)
  • 定義別名
    • 列名 列標題
    • 列名 as 列標題
  • ALL顯示所有數據行,重復的也顯示(默認)
  • DISTINCT 只顯示不重復

LIMIT

選取確定數量行

LIMIT [start,] count

結果集中,第一行記錄為0

也可以用OFFSET配合LIMIT一起使用
OFFSET start LIMIT count等價于上面的操作

where

關系/邏輯/取值/空值表達式

  • 關系 = < > >= <= != <> <=>
  • 邏輯 AND OR NOT
  • 取值范圍 BETWEEN A AND B
    • 等價于 <= B and >= A
  • 空值 is null / is not null
  • 使用關系運算符號 (詳見上一章數據庫實踐LAB大綱 01 管理

    模糊查詢

  • % 任意多個字符
  • _ 任意一個字符
  • 使用LIKE關鍵字

    SELECT B_Name,B_Publisher,B_SalePrice FROM BookInfo WHERE B_Name LIKE '%MySQL%';

    轉義字符

    字符有通配符,要使用ESCAPE關鍵字

    查詢會員中含 _ 的會員信息

    SELECT * FROM Users WHERE U_Name LIKE '%/_%' ESCAPE '/';

    分組查詢

    聚集函數

    聚合函數說明
    SUM()返回某列所有值的總和
    AVG()返回某列的平均值
    MAX()返回某列的最大值
    MIN()返回某列的最小值
    COUNT()返回某列的行數

    除了COUNT, 其他聚合函數忽略NULL的行

    Group by

    SELECT B_Publisher,MAX(B_MarketPrice) AS max_price, MIN(B_MarketPrice) AS min_price FROM BookInfo GROUP BY B_Publisher;

    GROUP BY 可配合 HAVING使用

    • 分組之后按條件給組篩選
    SELECT B_Publisher ,COUNT(*) AS total_number FROM BookInfo WHERE B_MarketPrice>=50 GROUP BY B_Publisher HAVING COUNT(*)>=2;

    HAVING對比WHERE

  • WHERE在group by前過濾, having在 group by之后過濾
  • 如果使用了 group by
    select和having的內容要么在group by中出現,要么要用聚集函數框住。

    多表查詢

    表連接

    SELECT ... FROM ... [JOIN TYPE] JOIN ... ON ... WHERE ...

    JOIN TYPE 三種類型

  • INNER JOIN(默認)
  • OUTER JOIN
    • LEFT OUTER JOIN
    • RIGHT OUTER JOIN
    • FULL OUTER JOIN (可以用LEFT 和 RIGHT 實現)
  • CROSS JOIN
  • LEFT和RIGHT OUTER JOIN的 結果集中包含左(右)表全部記錄,若右(左)表沒有滿足鏈接的記錄,相應數據填為NULL

    可以join兩邊使用相同的table形成 自連接

    使用 CROSS JOIN
    不帶where直接返回笛卡爾積
    MySQL中和inner join的區別在于 CROSS join 不能用 on 而inner join 可以

    子查詢

    返回單行的子查詢(這種子查詢可以使用比較運算符來連接)

    SELECT OD_ID,OD_Number,OD_Price FROM OrderDetails WHERE B_ID= (SELECT B_ID FROM BookInfo WHERE B_Name='ASP.NET4 5016789:')

    多行子查詢
    要配合IN EXISTS ALL ANY SOME使用
    ANY和SOME是同義詞

    SELECT U_ID,U_Name,U_Phone FROM Users WHERE U_ID IN (SELECT U_ID FROM Orders WHERE O_TotalPrice<50);

    EXIST關鍵字
    不返回數據,只返回邏輯真值、假值

    WHERE [NOT] EXISTS (子查詢)

    子查詢與數據更新

    insert into <table_name> [column_name] <子查詢>

    聯合查詢 UNION[ALL]

    SELECT1 UNION [ALL] SELECT2

    ALL保留重復記錄,默認的時候自動刪除

    查詢效率

    子查詢多次遍歷數據 —— 內部創建臨時表
    連接查詢只遍歷一次

    • 一般來說 連接查詢效率更高
    • 數據量較少,子查詢更容易控制

    高級查詢(復雜子查詢)

    查詢所有選1號課的學生姓名

  • 連接查詢
  • SELECT Sname FROM Student,SC WHERE Student.Sno=SC.Sno AND SC.Cno='1';SELECT Sname FROM Student INNER JOIN SC ON Student.Sno=SC.Sno WHERE SC.Cno= '1';
  • exists
  • select Sname from Student where exists ( select * from SC where Sno = Student.Sno AND Cno= '1');

    包含關系查詢

    B ? A = ? ? B ? A B-A=\empty \Leftrightarrow B\sube A B?A=??B?A

    包含B的A結構
    not exists (B except A)

    選了所有課程的學生姓名

    select Sname from Student where not exists(select * from Course where not exists(select * from SC where Sno=Student.Sno AND Cno=Course.Cno ));-- 沒有一門課 他不選修 -- B是全部課程 -- B except A就是把學生已經學的去掉 那么剩下的課程就是沒上的 -- 因此還有剩下的課程的B except A的學生再去掉,就是已經修完課程的學分 select distinct Sno from SC SCX where not exists(select * from SC SCYwhere SCY.Sno='200215122' ANDnot exists (select * from SC SCZ where SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno)); -- B為200215122選的課 -- A為其他學生選的課 -- B減去其他學生選的課,那么如果還有數據,說明某個學生沒選B選過的課

    ROLLUP

    GROUP BY ROLLUP(A,B,C)

  • 先對 A,B,C group by
  • 然后分開的部分對 A,B進行 GROUP BY
  • 然后A進行GROUP BY
  • 最后對全表 GROUP BY —— 湊成一張表
  • select classNo,studentNo,SUM(absent) ,SUM(sickleave), SUM(late) from test_rollup_class group by classNo,studentNo with rollup

    ROLLUP和ORDER BY 互斥

    CUBE

  • 先對 A,B,C group by
  • 然后對 (A,B) (A,C) (B,C) (A) (B) ? GROUP BY
  • 全表group by 并拼起來
  • select classNo,studentNo,SUM(absent) ,SUM(sickleave), SUM(late) from test_rollup_class group by classNo,studentNo with cube

    CUBE在ROLLUP上繼續細分,所以可以用ROLLUP查詢表示CUBE

    數據有NULL,rollup可能會出現問題
    所以可以使用ifnull()轉換,ifnull(column_name, 0)

    with

    提供 定義臨時關系方法
    只對包含with子句查詢有效

    with max_budget (value) as (select max(budget)from department) select budget, dept_name from department, max_budget where department.budget = max_budget.value; -- 有最大預算值的系

    總結

    以上是生活随笔為你收集整理的数据库实践LAB大纲 02 检索的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。