MySQL单表查询
MySQL單表查詢
| select | 標(biāo)識(shí)查詢后的展示結(jié)果字段 | group by | 對(duì)表中的數(shù)據(jù)先根據(jù)字段值的不同進(jìn)行不同的組,來(lái)查詢組中共同擁有的數(shù)據(jù)和統(tǒng)計(jì)的語(yǔ)句 注意:分組查詢后的結(jié)果必須是分組的依據(jù)或聚合函數(shù) |
| from | having | having的使用是必須緊跟group by ,使用用來(lái)對(duì)分組后查詢的結(jié)果進(jìn)行二次篩選。 | |
| where | 放置的是查詢的條件 | ||
| order by | 主要是用來(lái)實(shí)現(xiàn)排序的 | ||
| limit | 對(duì)查詢后的結(jié)果進(jìn)行分頁(yè)展示 |
以下示例使用teacher進(jìn)行測(cè)試:
create table teacher(id int,name varchar(50),sex char(1),address varchar(100),age int,salary decimal(10,2),birthday date );-- 插入數(shù)據(jù) insert teacher(id,name,sex,address,age,salary,birthday) values (1,'孫老師','女','河南省鄭州市高新區(qū)',25,'7000.00','1999-02-12'), (2,'趙陽(yáng)老師','男','河南省鄭州市金水區(qū)',25,'6800.00','2020-03-13'), (3,'李如花老師','女','河南省鄭州市二七區(qū)',25,'7698.30','2021-02-02'), (4,'王富貴老師','男','河南省鄭州市金水區(qū)',25,'7200.00','2022-02-22'), (5,'李大釗老師','女','河南省鄭州市中原區(qū)',25,'6590.60','2008-10-21'), (6,'趙舒文老師','女','河南省鄭州市金水區(qū)',25,'8980.00','2000-11-12'), (7,'秦陽(yáng)老師','男','河南省鄭州市二七區(qū)',25,'9800.00','2009-05-12'), (8,'孫美勝老師','女','河南省鄭州市高新區(qū)',25,'102000.00','2012-02-02'), (9,'趙文博老師','女','河南省鄭州市惠濟(jì)區(qū)',25,'12300.00','2015-08-14'), (10,'王老師','男','河南省鄭州市高新區(qū)',25,'6809.00','2018-03-09'), (11,'孫老師','女','河南省鄭州市金水區(qū)',25,'5800.00','2019-06-16'), (12,'李老師','男','河南省鄭州市中原區(qū)',25,'7500.00','2011-04-19'), (13,'孫老師','女','河南省鄭州市高新區(qū)',25,'7600.00','2013-05-30');select
標(biāo)識(shí)查詢后的展示結(jié)果字段
*:代表的是表中的所有的字段信息
字段名 as 別名:查詢表中部分字段信息并取別名,as可以省略
distinct:去除重復(fù)行
四則運(yùn)算:查詢后的結(jié)果可以進(jìn)行四則運(yùn)算
示例:
select * from teacher -- 查詢老師的姓名、性別和住址 select name,address,sex from teacher -- 查詢老師的name取名為姓名,address為地址 select name as 姓名,address 地址 from teacher -- 查詢老師的性別,去重 select distinct sex from teacher -- 查詢老師的性別,地址,去重 select distinct sex,address from teacher -- 查詢老師的姓名和三年后的年齡 select name,age+3 from teacher -- 查詢老師的姓名和月薪 select name,salary from teacher -- 查詢老師的姓名和年薪,并取別名 select name 姓名,salary*12 年薪 from teacher -- 查詢姓名和月薪,合并兩列 select concat(name,salary) from teacherwhere
where放置的是查詢的條件。
? 1,比較運(yùn)算符 > >= < <= = != <>
? 2,連接符 and or
? 3,范圍運(yùn)算符 between … and … not between … and …
? in(…) not in(…)
? 4,模糊
? like …
? %: 零個(gè)或多個(gè)字符
? _: 一個(gè)字符
? 5,是否為null
? is null
? is not null
-- 查詢工資高于7000的員工的姓名及工資 select name,salary from teacher where salary>7000-- 查詢年薪高于100000的員工的姓名及年薪 select name,salary*12 from teacher where salary*12>100000order by
主要是用來(lái)實(shí)現(xiàn)排序的
排序規(guī)則:asc升序(不寫的話,默認(rèn)升序) desc 降序
-- 查詢老師信息,根據(jù)年齡降序排序,如果年齡相同則根據(jù)id升序排序 select * from teacher order by age desc,id asc-- 查詢所有的男老師,根據(jù)年齡降序排序,如果年齡相同,則根據(jù)工資降序排序 select * from teacher where sex='男' order by age desc,salary desc先寫select 再寫from 再寫where 再寫order by順序不能打亂
order by如果滿足第一個(gè)條件第二個(gè)就不會(huì)執(zhí)行
limit
對(duì)查詢后的結(jié)果進(jìn)行分頁(yè)展示
格式:
limit count; 展示count條數(shù)據(jù),默認(rèn)從0下標(biāo)開(kāi)始;
limit index, count; 從index下標(biāo)開(kāi)始,向后查詢count條數(shù)據(jù),展示count條數(shù)據(jù)
-- 根據(jù)編號(hào)升序排序,展示前三條數(shù)據(jù) select * from teacher order by id asc limit 3; select * from teacher order by id asc limit 0,3; select * from teacher order by id asc limit 3,3;-- 查詢所有的男老師,根據(jù)編號(hào)升序排序,只顯示前2條數(shù)據(jù) select * from teacher where sex='男' order by id asc limit 2-- 查詢年齡最大的兩位 select * from teacher order by age desc limit 2;group by
分組查詢
對(duì)表中的數(shù)據(jù)先根據(jù)字段值的不同進(jìn)行不同的組,來(lái)查詢組中的語(yǔ)句
注意:分組查詢后的結(jié)果必須是分組的依據(jù)或聚合函數(shù)
關(guān)鍵字:各個(gè)(這時(shí)候就需要使用group by)
例子(幫助理解group by的作用):
-- 會(huì)根據(jù)age的值分為多個(gè)不同的組(也就是行) select age,count(*) from teacher group by age;注:group by之后也可以進(jìn)行order by的排序和limit的分頁(yè)展示
問(wèn):使用group by查詢后的數(shù)據(jù)有多少條?
答:會(huì)根據(jù)分組依據(jù)值的不同分為不同的組
-- 創(chuàng)建一張職工表表并插入數(shù)據(jù) create table emp2( empno int primary key auto_increment, ename varchar(4), job varchar(4), mgr varchar(4),hiredate date, sal decimal(7,2), Comm decimal(7,2), deptno int );insert into emp2(empno,ename,job,mgr,hiredate,sal,Comm,deptno)values (1001,'甘寧','文員','1013','2020-12-17',8000.00,null,20), (null,'黛琦絲','銷售員','1006','2001-02-20',16000.00,3000.00,30), (null,'殷天正','銷售員','1006','2001-02-22',12500.00,5000.00,30), (null,'劉備','經(jīng)理','1009','2001-04-02',29750.00,null,20), (null,'謝','銷售員','1006','2001-09-28',12500.00,14000.00, 30), (null,'關(guān)羽','經(jīng)理','1009','2001-05-01', 28500.00, null, 30), (null,'張飛','經(jīng)理','1009',' 2001-09-01', 24500.00, null, 10), (null,'諸葛亮','分析師','1004',' 2007-04-19', 30000.00, null, 20);select * from emp2 -- 查詢不同的職位個(gè)有多少人,最高工資,最低工資 select job,count(1),max(sal),min(sal) from emp2 group by job-- 查詢各個(gè)不同的部門各有多少人,總工資多少? select deptno,count(1),sum(sal) from emp2 group by deptno-- 查詢?cè)?015年前入職的各個(gè)部門的人數(shù) select deptno,count(1) from emp2 where hiredate<'2015-1-1' group by deptno-- 查詢各個(gè)不同的部門各有多少人,結(jié)果按照人數(shù)降序排列 select deptno,count(1) as co from emp2 group by deptno order by co desc-- 查詢各個(gè)不同的部門各有多少人,結(jié)果按照人數(shù)降序排列并只展示一條 select deptno,count(1) as co from emp2 group by deptno order by co desc limit 1聚合函數(shù)
| count(字段) | 求數(shù)據(jù)個(gè)數(shù) |
| sum(字段) | 求和 |
| avg(字段) | 求平均值 |
| max(字段) | 求最大值 |
| min(字段) | 求最小值 |
特別需要說(shuō)明的是
count的三種用法:
| count(*) | 求表中的數(shù)據(jù)總條數(shù),正確率高,效率較低 | 查詢時(shí)會(huì)根據(jù)表中所有字段分別查詢有多少條然后進(jìn)行整合 即根據(jù)所有的字段判斷總條數(shù) |
| count(字段) | 求表中的該字段的值非空時(shí)的總條數(shù),正確率較低,效率較高 | 根據(jù)某個(gè)字段來(lái)統(tǒng)計(jì),如果該字段中有空值,則會(huì)出錯(cuò) |
| count(1)【推薦使用】 | 求表中的數(shù)據(jù)總條數(shù),正確率較高,效率較高 | 根據(jù)主鍵編號(hào)來(lái)統(tǒng)計(jì) |
having
having的使用必須緊跟group by,必須前面是分組
(可以理解為是try catch后的finally,需要了就用,不需要就不用)
用來(lái)對(duì)分組后查詢的結(jié)果進(jìn)行二次篩選
-- 查詢工資高于9000的各個(gè)不同職位的員工人數(shù),展示人數(shù)高于2人以上,結(jié)果以人數(shù)降序排列select job,count(1) co from emp2 where sal>9000 group by job having co>=2 order by co desc limit 1注:關(guān)鍵字的順序不能寫錯(cuò)
select --> from --> where --> group by -->having --> order by --> limit
where 和having的區(qū)別:
| 在分組查詢前進(jìn)行篩選 | 在分組查詢后查詢的結(jié)果中進(jìn)行二次篩選 |
| 可以單獨(dú)使用 | 必須和group by組合使用 |
總結(jié)
- 上一篇: XSS漏洞原理及攻击
- 下一篇: Clickhouse第三讲-数据库引擎