07.16自我總結
數據庫查找方式進階
一.單表查詢
1.查看表單選擇段落
1.disinct
- 所有內容去重:select disinct * from 表名稱;
- 指定字段去重:select disinct 字段 from 表名稱;
注意點
- disinct 必須寫在開頭
2.查看多個字段內容
- 查看多個字段內容:select 字段一,字段2 from 表名稱;
- 查看全部以及字段內容:select * 字段1 from 表名稱;
注意點
- 有*和字段的時候,*必須寫在字段的前面
3.對於查看段落橫坐標進行重命名顯示
- select 字段名稱 as 顯示字段名稱 from 表名稱;
- select 字段名稱 顯示字段名稱 from 表名稱
4.選擇指定表指定段落
select 指定表.字段 from 表1,表2
5.四則運算
四則運算包括加減乘除
select 字段1 四則運行符號 字段2 from 表名稱
6.函數運算
語法:select 函數(字段1) from 表名稱
統計函數
- max:最大值
- min:最小值
- avg:平均值
- sum:求和
- count:數量
2.where
1.常見的表達式
比較運算符 | 介紹 |
---|---|
<,<=,>,>=,=,!= | 小於,小於等於,大於,大於等於,等於,不等於 |
in(set) | 成員運算,看值有沒有再列表里面 |
like | 模糊查找:%代表零個或多個字符,_代表一個字符 |
is null | 判斷是否為空 |
between A and B | 顯示某個區間:A-B 包括A和B |
邏輯運算符 | 介紹 |
and | 且,多個條件同時滿足 |
or | 或者,滿足多個條件其中一條 |
not | 不成立 |
2.特殊的表達式
binary
區分大小寫
語法:select 段落 from 表明 where binary 字段....................................
3.group by/having
分組
語法
select....from 表名
where .......
group by 字段名稱 #如果這里有多個字段,A,B,用,連接表示具有相同字段A以及相同字段B進行分組
having 判斷內容
注意:
- having 必須分組后才能使用
- 分組后只能用having
- group_concat(字段),可以把由於分組后造成的折疊內的數據全部顯示
4.ord by
排序
語法:默認為升序
ord by 字段名稱
固定升序或者降序
- 升序 :ord by 字段名稱 asc
- 降序:ord by 字段名稱 desc
多個條件排序主次關系
ord by 主字段,次字段
5.limit
限制顯示記錄
對於單頁表操作
limit start count
- 其中start可以不填,不填默認從0開始,0是第一天記錄
- start表示起始位置,count 表示記錄的數量
對於多頁操作
分頁原理:先查詢總數據條數 設為a
確定每頁數量b
總頁數為c = a / b 如果除不盡則需要加1 例如 10 / 3 正確頁數為4
查詢語句的起始位置為s = 當前頁數d 減去1 乘以每頁數量
即 s = (d - 1) * b
limit s b
6.正則匹配
語法 :where 字段名稱 regexp '正則表達式'
注意:正則表達式不包括特殊字符如\w
二.多表查詢
1.笛卡爾積查詢
語法:select *from 表1,表2
他會把多個表每行與另外個表統統匹配上,其中會有一些臟數據,我們可以用里面值的關系進行連接
2.內連接查詢
其本質就是笛卡爾積查詢
區別是把,變成 join
且不能用where,要先用on根據里面值的關系拼接好了再用 where
3.左連接查詢
左表中記錄的無論是否有匹配關系都全部顯示,右表中僅顯示匹配成功的記錄
語法:select *from 表1 left join,表2
4.右連接查詢
右表中記錄的無論是否有匹配關系都全部顯示,左表中僅顯示匹配成功的記錄
語法:select *from 表1 right join 表2
5.全外連接查詢
無論是否匹配成功,兩邊表中的記錄都要全部顯示
select *from 表1 full join 表2
注意:mysql 不支持
我們要引入union
union 只能用於字段數量相同的兩個表 會自動去除重復的記錄
union all 則保留所有記錄
select *from dept left join emp on dept.id=emp.dept_id
union
select *from dept right join emp on dept.id=emp.dept_id;
可以完成全外連接
6.注意
在三表以及三表以上查詢的時候,表1 join 表2 join 表三,其意思是表1與表2連接后的表再與表3進行連接
如果三表連接時候沒有用join而是用,
進行連接表示同時查詢3個表
三.子查詢
1.查詢對象當查找對象
將查找后的內容作為查找的值或者查找的對象,
如果要作為一個表當作查找對象,要對於查找后的表進行重命名語法如下
select .... from (select ....from .......) as 新名字
2.in關鍵字查詢
"查詢平均年齡大於25的部門名稱
子查詢方式:
平均年齡大於25的部門id有哪些?
先要求出每個部門的平年齡! 篩選出平均年齡大於25的部門id
拿着部門id 去查詢部門表查詢"
select name from dept where id in (select dept_id from emp group by dept_id having avg(age) > 25);
"多表查詢方式:
先把數據拼接到一起 在加以篩選"
select dept.name from emp inner join dept
on emp.dept_id = dept.id
group by dept.name
having avg(age) >25;
3.exists關鍵字查詢
xists 后跟子查詢 子查詢有結果是為True 沒有結果時為False
為true時外層執行 為false外層不執行
select *from emp where exists (select *from emp where salary > 1000);
#查看exists 的返回結果: 只有 0 和 1
select (exists (select *from emp where salary > 10000));
#一個查詢結果也是一個表 既然是表就能鏈接起來
#綜合練習:
"查詢每個部門工資最高的員工信息
先查詢每個部門的最高工資
將查詢結果與員工表聯合起來
在加條件判斷部門id相同並且 最高工資相同 則顯示"
select *from emp inner join
(select dept_id,max(salary) m from emp group by dept_id) t2
on emp.dept_id = t2.dept_id
where
emp.salary = t2.m;