目錄
分組查詢
創建分組
過濾分組
分組查詢練習
正則表達式
匹配單個實例
匹配多個實例
正則表達式練習
練習答案
分組查詢練習答案
正則表達式練習答案
分組查詢
創建分組
????????group by 子句:根據一個或多個字段對結果集進行分組,在分組的字段上可以使用count,sum,avg等聚合函數,但是聚合函數不能出現在group by的后邊,這點與where一樣。
select 字段1[,字段2,function(字段1),function(字段2),....]
from 表名
group by 字段;
?下面給兩個例子以區分where與group by的適用場景
#統計部門ID為20的員工數
select count(*) from emp where deptno=20
#統計每個部門的人數
select deptno,count(*)
from emp
group by deptno;
- 如果分組列中具有NULL值,則NULL值將作為一個分組返回,如果列中有多行NULL值,它們將作為一組。
- group by 子句必須出現在where子句后邊,order by子句之前,意思就是分組前過濾出符合where 條件的數據,再將這部分數據按照group by條件進行分組
過濾分組
having 子句:having 非常類似于where。唯一的差別是where過濾行,而having 過濾分組。having 必須和group by一起使用。
having和where的區別:where是分組前過濾,having是分組后過濾,但是聚合函數count()等可以在having后使用
舉兩個例子
#統計部門中員工超過5人的部門的員工數
select deptno,count(*)
from emp
group by deptno
having count(*) > 5;#統計部門中員工月薪超過1000的員工超過兩人的部門的員工數
select deptno,count(*)
from emp
where sal > 1000
group by deptno
having count(*) > 2;
分組查詢練習
練習答案仍在最后
1. 查詢 該 公司 有哪 幾種 崗位 以及 每個崗位 的 人數2.計算每個崗位的最高薪水,并且由低到高進行排序
3.計算每個部門平均薪水
4.計算不同部門不同崗位的最高薪水
5.找出每個工作崗位的最高薪水,除manager之外
6.找出每個工作崗位的平均薪水,顯示平均薪水大于2000的
正則表達式
????????regexp操作符,regexp操作符后邊跟的就是正則表達式,正則表達式的作用是匹配文本,將一個模式(正則表達式)與一個文本串進行比較。
like與regexp的區別:
????????like匹配整個列,如果被匹配的文本僅在列值中出現(沒有配合其他通配符),立刻將找不到。regexp在列值內進行匹配,如果被匹配的文本在列值中出現,regexp將會找到它,相應的行將被返回。
下面舉個例子幫助理解
#不加通配符時like僅僅會找到名字為s的員工
select * from emp where ename like "s";
#加通配符后like會找到名字包含s的員工
select * from emp where ename like "%s%";
#regexp則會直接找到名字里包含s的員工
select * from emp where ename regexp "s";
匹配單個實例
- |:表示匹配其中之一,使用 | 從功能上類似or
- [ ]:匹配字段之一,[ ]是另一種形式的or語句。例如[123]為[1|2|3]的縮寫
- [ - ]:匹配范圍,使用 - 來定義一個范圍。例如[1-3],[a-z]等。
- \\:轉義字符,多數正則表達式使用單個反斜杠作為轉義字符,但MySQL要求兩個反斜杠(MySQL自己解釋一個,正則表表達式庫解釋另一個)。
下面有幾個例子幫助理解
#查詢字段中是否包含a或b
select "acddp" regexp "[ab]";
#查詢字段中是否包含1-5的任意一個數字
select "89445687" regexp "[1-5]";
#查詢字段中是否包含"[1-5]"字段
select "_ajegdbas" regexp "\\[1-5]";
- 匹配字符類:存在找出你自己經常使用的數字,所有字母字符或者所有數字字母字符等的匹配。為了更方便地工作,可以使用預定義的字符集,稱為字符類。稍作了解,工作上用得到時能夠有印象找得到就好,可以做筆記上。
類 | 說明 |
[[:alnum:]] | 任意字母和數字(同[a-zA-Z0-9]) |
[[:alpha:]] | 任意字符(同[a-zA-Z]) |
[[:blank:]] | 空格和制表(同[\\t]) |
[[:cntrl:]] | ASCII控制字符(ASCII 0 到31 和127) |
[[:digit:]] | 任意數字(同 [0-9]) |
[[:graph:]] | 與[:print:] 相同,但不包括空格 |
[[:lower:]] | 任意小寫字母(同[a-z]) |
[[:print:]] | 任意可打印字符 |
[[:punct:]] | 既不在[[:alnum:]]也不在[[:cntrl:]]中的任意字符 |
[[:space:]] | 包括空格在內的任意空白字符(同[\\f\\n\\r\\t\\v]) |
[[:upper:]] | 任意大寫字母(同[A-Z]) |
[[:xdigit:]] | 任意十六進制數字(同[a-fA-F0-9]) |
匹配多個實例
- 常用元字符
元字符 | 說明 |
. | 匹配任意字符 |
^ | 匹配字符串的開始,^在[]中表示否定 |
$ | 匹配字符串的結束 |
給幾個例子幫助大家理解
#查詢字符串中是否包含任意字符+'a'的子字符串
select 'baan' regexp '.a';#'ba'就屬于任意字符+'a'的子字符串
#查詢字符串開頭是否包括'bn'子字符串
select 'baan' regexp '^bn';
#查詢字符串結尾是否包括'bn'子字符串
select 'baan' regexp 'bn$';
- 重復元字符(修飾前一個字符)
元字符 | 說明 |
* | 任意個匹配 |
+ | 一個或多個匹配(等于{1,}) |
? | 0個或1個(等于{0,1}) |
{n} | 指定數目的匹配 |
{n,} | 不少于只等數目的匹配 |
{n,m} | 匹配數目的范圍(m不超過255) |
給幾個例子幫助理解
#查詢字符串中是否出現'bn','ban','baan','baaan'等子字符串
select 'baaaaan' regexp 'ba*n';#'*'僅僅修飾'a'字符
#查詢字符串中是否出現'ban','baan','baaan'等'a'不少于1個的子字符串
select 'baaaan' regexp 'ba{1,}n';#同樣的'{1,}'僅修飾'a'字符
正則表達式練習
將下面利用正則表達式進行查詢的結果寫出來(字串存在為1或不存在為0),答案同樣放在最后
select 'baan' regexp '^ba*n';
select 'bn' regexp '^ba*n';
select 'bn' regexp '^ba+n';
select 'bn' regexp '^ba?n';
select 'baan' regexp '^ba?n';select 'pin' regexp 'pi|apa';
select 'pin' regexp '^(pi|apa)$';
select 'apa' regexp '^(pi|apa)$';
select 'pin' regexp '^(p|qin)$';
select 'pin' regexp '^([pq]in)$';select 'fofo' regexp '^fo';
select 'fo\no' regexp '^fo\no$';
select 'fo\no' regexp '^fp\\no';
select 'fo\eo' regexp '^fo\\eo$';
select 'fo\|o' regexp '^fo\\|o$';
select 'fofo' regexp '^fo';
練習答案
分組查詢練習答案
#查詢該公司有哪幾種崗位以及每個崗位的人數
select job,count(*)
from emp
group by job;
#計算每個崗位的最高薪水,并且由低到高進行排序
select job,max(sal)
from emp
group by job
order by max(sal) desc;
#計算每個部門平均薪水
select deptno,avg(sal)
from emp
group by deptno;
#計算不同部門不同崗位的最高薪水
select deptno,job,max(sal)
from emp
group by deptno,job;
#找出每個工作崗位的最高薪水,除manager之外
select job,max(sal)
from emp
where job not like "manager"
group by job;
#找出每個工作崗位的平均薪水,顯示平均薪水大于2000的
select job,avg(sal)
from emp
group by job
having avg(sal) > 2000;
正則表達式練習答案
select 'baan' regexp '^ba*n';#1
select 'bn' regexp '^ba*n';#1
select 'bn' regexp '^ba+n';#0
select 'bn' regexp '^ba?n';#1
select 'baan' regexp '^ba?n';#0select 'pin' regexp 'pi|apa';#1
select 'pin' regexp '^(pi|apa)$';#0
select 'apa' regexp '^(pi|apa)$';#1
select 'pin' regexp '^(p|qin)$';#0
select 'pin' regexp '^([pq]in)$';#1select 'fofo' regexp '^fo';#1
select 'fo\no' regexp '^fo\no$';#1
select 'fo\no' regexp '^fp\\no';#0
select 'fo\eo' regexp '^fo\\eo$';#1
select 'fo\|o' regexp '^fo\\|o$';#1
select 'fofo' regexp '^fo';#1