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