数据库实践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
關系/邏輯/取值/空值表達式
- 等價于 <= B and >= A
使用關系運算符號 (詳見上一章數據庫實踐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使用
- 分組之后按條件給組篩選
HAVING對比WHERE
如果使用了 group by
select和having的內容要么在group by中出現,要么要用聚集函數框住。
多表查詢
表連接
SELECT ... FROM ... [JOIN TYPE] JOIN ... ON ... WHERE ...JOIN TYPE 三種類型
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- FULL OUTER JOIN (可以用LEFT 和 RIGHT 實現)
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是同義詞
EXIST關鍵字
不返回數據,只返回邏輯真值、假值
WHERE [NOT] EXISTS (子查詢)
子查詢與數據更新
insert into <table_name> [column_name] <子查詢>聯合查詢 UNION[ALL]
SELECT1 UNION [ALL] SELECT2ALL保留重復記錄,默認的時候自動刪除
查詢效率
子查詢多次遍歷數據 —— 內部創建臨時表
連接查詢只遍歷一次
- 一般來說 連接查詢效率更高
- 數據量較少,子查詢更容易控制
高級查詢(復雜子查詢)
查詢所有選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)
ROLLUP和ORDER BY 互斥
CUBE
CUBE在ROLLUP上繼續細分,所以可以用ROLLUP查詢表示CUBE
數據有NULL,rollup可能會出現問題
所以可以使用ifnull()轉換,ifnull(column_name, 0)
with
提供 定義臨時關系方法
只對包含with子句查詢有效
總結
以上是生活随笔為你收集整理的数据库实践LAB大纲 02 检索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【K210】K210学习笔记七——使用K
- 下一篇: linux cmake编译源码,linu