mysql查询、排序、分组
查询语句
简单的查询语句(DQL)
语法格式:select 字段名1,字段名2,字段名3,… from 表名;
mysql> select ENAME from emp;
+--------+
| ENAME |
+--------+
| SMITH |
| ALLEN |
| WARD |
| JONES |
| MARTIN |
| BLAKE |
| CLARK |
| SCOTT |
| KING |
| TURNER |
| ADAMS |
| JAMES |
| FORD |
| MILLER |
+--------+
-
sql语句以;结尾
-
sql语句不区分大小写
mysql> select ename,job from emp; +--------+-----------+ | ename | job | +--------+-----------+ | SMITH | CLERK | | ALLEN | SALESMAN | | WARD | SALESMAN | | JONES | MANAGER | | MARTIN | SALESMAN | | BLAKE | MANAGER | | CLARK | MANAGER | | SCOTT | ANALYST | | KING | PRESIDENT | | TURNER | SALESMAN | | ADAMS | CLERK | | JAMES | CLERK | | FORD | ANALYST | | MILLER | CLERK | +--------+-----------+
-
查询员工的年薪(字段可以参与数学运算)
mysql> select ename,sal * 12 from emp; +--------+----------+ | ename | sal * 12 | +--------+----------+ | SMITH | 9600.00 | | ALLEN | 19200.00 | | WARD | 15000.00 | | JONES | 35700.00 | | MARTIN | 15000.00 | | BLAKE | 34200.00 | | CLARK | 29400.00 | | SCOTT | 36000.00 | | KING | 60000.00 | | TURNER | 18000.00 | | ADAMS | 13200.00 | | JAMES | 11400.00 | | FORD | 36000.00 | | MILLER | 15600.00 | +--------+----------+
给查询结果的列重命名
mysql> select ename,sal * 12 as yearsal from emp; +--------+----------+ | ename | yearsal | +--------+----------+ | SMITH | 9600.00 | | ALLEN | 19200.00 | | WARD | 15000.00 | | JONES | 35700.00 | | MARTIN | 15000.00 | | BLAKE | 34200.00 | | CLARK | 29400.00 | | SCOTT | 36000.00 | | KING | 60000.00 | | TURNER | 18000.00 | | ADAMS | 13200.00 | | JAMES | 11400.00 | | FORD | 36000.00 | | MILLER | 15600.00 |
别名中有中文
mysql> select ename,sal * 12 as 年薪 from emp; +--------+----------+ | ename | 年薪 | +--------+----------+ | SMITH | 9600.00 | | ALLEN | 19200.00 | | WARD | 15000.00 | | JONES | 35700.00 | | MARTIN | 15000.00 | | BLAKE | 34200.00 | | CLARK | 29400.00 | | SCOTT | 36000.00 | | KING | 60000.00 | | TURNER | 18000.00 | | ADAMS | 13200.00 | | JAMES | 11400.00 | | FORD | 36000.00 | | MILLER | 15600.00 | +--------+----------+
as关键字可以省略
mysql> select ename,sal *12 '年薪' from emp; +--------+----------+ | ename | 年薪 | +--------+----------+ | SMITH | 9600.00 | | ALLEN | 19200.00 | | WARD | 15000.00 | | JONES | 35700.00 | | MARTIN | 15000.00 | | BLAKE | 34200.00 | | CLARK | 29400.00 | | SCOTT | 36000.00 | | KING | 60000.00 | | TURNER | 18000.00 | | ADAMS | 13200.00 | | JAMES | 11400.00 | | FORD | 36000.00 | | MILLER | 15600.00 | +--------+----------+
-
查询所有字段
select * from emp;//实际开发中不建议使用,效率较低
条件查询
语法格式 select字段,字段… from 表名 where 条件;
执行顺序:先from 然后where 最后select
-
查询工资等于5000的员工姓名
mysql> select ename from emp where sal = 5000; +-------+ | ename | +-------+ | KING | +-------+
-
查询SMITH的工资
mysql> select sal from emp where ename = smith; ERROR 1054 (42S22): Unknown column 'smith' in 'where clause' mysql> select sal from emp where ename = SMITH; ERROR 1054 (42S22): Unknown column 'SMITH' in 'where clause' mysql> select sal from emp where ename = 'SMITH'; +--------+ | sal | +--------+ | 800.00 | +--------+
-
找出工资高于3000的员工
mysql> select ename, sal from emp where sal > 3000; +-------+---------+ | ename | sal | +-------+---------+ | KING | 5000.00 | +-------+---------+
-
找出工资小于等于3000的员工
mysql> select ename, sal from emp where sal <= 3000; +--------+---------+ | ename | sal | +--------+---------+ | SMITH | 800.00 | | ALLEN | 1600.00 | | WARD | 1250.00 | | JONES | 2975.00 | | MARTIN | 1250.00 | | BLAKE | 2850.00 | | CLARK | 2450.00 | | SCOTT | 3000.00 | | TURNER | 1500.00 | | ADAMS | 1100.00 | | JAMES | 950.00 | | FORD | 3000.00 | | MILLER | 1300.00 | +--------+---------+
-
找出工资不等于3000的员工
mysql> select ename,sal from emp where sal <> 3000; +--------+---------+ | ename | sal | +--------+---------+ | SMITH | 800.00 | | ALLEN | 1600.00 | | WARD | 1250.00 | | JONES | 2975.00 | | MARTIN | 1250.00 | | BLAKE | 2850.00 | | CLARK | 2450.00 | | KING | 5000.00 | | TURNER | 1500.00 | | ADAMS | 1100.00 | | JAMES | 950.00 | | MILLER | 1300.00 |
-
找出工资位于1000到3000之间的员工
mysql> select ename, sal from emp where sal>= 1000 and sal <= 3000; +--------+---------+ | ename | sal | +--------+---------+ | ALLEN | 1600.00 | | WARD | 1250.00 | | JONES | 2975.00 | | MARTIN | 1250.00 | | BLAKE | 2850.00 | | CLARK | 2450.00 | | SCOTT | 3000.00 | | TURNER | 1500.00 | | ADAMS | 1100.00 | | FORD | 3000.00 | | MILLER | 1300.00 | +--------+---------+
//闭区间 mysql> select ename, sal from emp where sal between 1000 and 3000; +--------+---------+ | ename | sal | +--------+---------+ | ALLEN | 1600.00 | | WARD | 1250.00 | | JONES | 2975.00 | | MARTIN | 1250.00 | | BLAKE | 2850.00 | | CLARK | 2450.00 | | SCOTT | 3000.00 | | TURNER | 1500.00 | | ADAMS | 1100.00 | | FORD | 3000.00 | | MILLER | 1300.00 | +--------+---------+
-
找出名字位首字母在A和C中的员工
//左闭右开 mysql> select ename from emp where ename between 'A' and 'C'; +-------+ | ename | +-------+ | ALLEN | | BLAKE | | ADAMS | +-------+
-
找出津贴为NULL的员工
mysql> select ename, sal ,comm from emp where comm is null; +--------+---------+------+ | ename | sal | comm | +--------+---------+------+ | SMITH | 800.00 | NULL | | JONES | 2975.00 | NULL | | BLAKE | 2850.00 | NULL | | CLARK | 2450.00 | NULL | | SCOTT | 3000.00 | NULL | | KING | 5000.00 | NULL | | ADAMS | 1100.00 | NULL | | JAMES | 950.00 | NULL | | FORD | 3000.00 | NULL | | MILLER | 1300.00 | NULL | +--------+---------+------+
-
找出津贴不为NULL的员工
mysql> select ename, sal ,comm from emp where comm is not null; +--------+---------+---------+ | ename | sal | comm | +--------+---------+---------+ | ALLEN | 1600.00 | 300.00 | | WARD | 1250.00 | 500.00 | | MARTIN | 1250.00 | 1400.00 | | TURNER | 1500.00 | 0.00 | +--------+---------+---------+
-
找出没有津贴的员工(为NULL或者为0)
mysql> select ename, sal, comm from emp where comm is null or comm = 0; +--------+---------+------+ | ename | sal | comm | +--------+---------+------+ | SMITH | 800.00 | NULL | | JONES | 2975.00 | NULL | | BLAKE | 2850.00 | NULL | | CLARK | 2450.00 | NULL | | SCOTT | 3000.00 | NULL | | KING | 5000.00 | NULL | | TURNER | 1500.00 | 0.00 | | ADAMS | 1100.00 | NULL | | JAMES | 950.00 | NULL | | FORD | 3000.00 | NULL | | MILLER | 1300.00 | NULL | +--------+---------+------+
-
找出工资高于1000并且部门编号为20或者30的员工
//错误的 存在优先级 mysql> select ename, sal, deptno from emp where sal >= 1000 and deptno = 20 or deptno = 30; +--------+---------+--------+ | ename | sal | deptno | +--------+---------+--------+ | ALLEN | 1600.00 | 30 | | WARD | 1250.00 | 30 | | JONES | 2975.00 | 20 | | MARTIN | 1250.00 | 30 | | BLAKE | 2850.00 | 30 | | SCOTT | 3000.00 | 20 | | TURNER | 1500.00 | 30 | | ADAMS | 1100.00 | 20 | | JAMES | 950.00 | 30 | | FORD | 3000.00 | 20 | +--------+---------+--------+
mysql> select ename, sal, deptno from emp where sal >= 1000 and (deptno = 20 or deptno = 30); +--------+---------+--------+ | ename | sal | deptno | +--------+---------+--------+ | ALLEN | 1600.00 | 30 | | WARD | 1250.00 | 30 | | JONES | 2975.00 | 20 | | MARTIN | 1250.00 | 30 | | BLAKE | 2850.00 | 30 | | SCOTT | 3000.00 | 20 | | TURNER | 1500.00 | 30 | | ADAMS | 1100.00 | 20 | | FORD | 3000.00 | 20 | +--------+---------+--------+
-
找出工作岗位是MANAGER和SALESMAN的员工
mysql> select ename, job from emp where job = 'MANAGER' or job = 'SALESMAN'; +--------+----------+ | ename | job | +--------+----------+ | ALLEN | SALESMAN | | WARD | SALESMAN | | JONES | MANAGER | | MARTIN | SALESMAN | | BLAKE | MANAGER | | CLARK | MANAGER | | TURNER | SALESMAN | +--------+----------+
mysql> select ename, job from emp where job in ('MANAGER', 'SALESMAN'); +--------+----------+ | ename | job | +--------+----------+ | ALLEN | SALESMAN | | WARD | SALESMAN | | JONES | MANAGER | | MARTIN | SALESMAN | | BLAKE | MANAGER | | CLARK | MANAGER | | TURNER | SALESMAN | +--------+----------+
模糊查询 like
-
找出名字中含有o的员工
//%表示任意个字符 mysql> select ename from emp where ename like '%o%'; +-------+ | ename | +-------+ | JONES | | SCOTT | | FORD | +-------+
-
找出名字中第二个是’A’的员工
//_表示一个字符 mysql> select ename from emp where ename like '_A%'; +--------+ | ename | +--------+ | WARD | | MARTIN | | JAMES | +--------+
-
找出名字中第三个是’A’的员工
mysql> select ename from emp where ename like '__A%'; +-------+ | ename | +-------+ | BLAKE | | CLARK | | ADAMS | +-------+
-
找出名字中最后一个是’T’的员工
mysql> select ename from emp where ename like '%T'; +-------+ | ename | +-------+ | SCOTT | +-------+
排序(升序、降序)
-
按照工资排序(默认是升序) 找出员工名和薪资
mysql> select ename, sal from emp order by sal; +--------+---------+ | ename | sal | +--------+---------+ | SMITH | 800.00 | | JAMES | 950.00 | | ADAMS | 1100.00 | | WARD | 1250.00 | | MARTIN | 1250.00 | | MILLER | 1300.00 | | TURNER | 1500.00 | | ALLEN | 1600.00 | | CLARK | 2450.00 | | BLAKE | 2850.00 | | JONES | 2975.00 | | SCOTT | 3000.00 | | FORD | 3000.00 | | KING | 5000.00 | +--------+---------+
-
asc表示升序
mysql> select ename, sal from emp order by sal asc; +--------+---------+ | ename | sal | +--------+---------+ | SMITH | 800.00 | | JAMES | 950.00 | | ADAMS | 1100.00 | | WARD | 1250.00 | | MARTIN | 1250.00 | | MILLER | 1300.00 | | TURNER | 1500.00 | | ALLEN | 1600.00 | | CLARK | 2450.00 | | BLAKE | 2850.00 | | JONES | 2975.00 | | SCOTT | 3000.00 | | FORD | 3000.00 | | KING | 5000.00 | +--------+---------+
-
desc表示降序
mysql> select ename, sal from emp order by sal desc; +--------+---------+ | ename | sal | +--------+---------+ | KING | 5000.00 | | SCOTT | 3000.00 | | FORD | 3000.00 | | JONES | 2975.00 | | BLAKE | 2850.00 | | CLARK | 2450.00 | | ALLEN | 1600.00 | | TURNER | 1500.00 | | MILLER | 1300.00 | | WARD | 1250.00 | | MARTIN | 1250.00 | | ADAMS | 1100.00 | | JAMES | 950.00 | | SMITH | 800.00 | +--------+---------+
-
按工资降序排序 工资相同按名字升序排序
//要靠前的字段越能起到主导作用 只有前面的字段无法完成排序时,即相同 才会启用后面的字段 mysql> select ename, sal from emp order by sal desc, ename asc; +--------+---------+ | ename | sal | +--------+---------+ | KING | 5000.00 | | FORD | 3000.00 | | SCOTT | 3000.00 | | JONES | 2975.00 | | BLAKE | 2850.00 | | CLARK | 2450.00 | | ALLEN | 1600.00 | | TURNER | 1500.00 | | MILLER | 1300.00 | | MARTIN | 1250.00 | | WARD | 1250.00 | | ADAMS | 1100.00 | | JAMES | 950.00 | | SMITH | 800.00 | +--------+---------+
-
//按照第二列排序 mysql> select ename, sal from emp order by 2; +--------+---------+ | ename | sal | +--------+---------+ | SMITH | 800.00 | | JAMES | 950.00 | | ADAMS | 1100.00 | | WARD | 1250.00 | | MARTIN | 1250.00 | | MILLER | 1300.00 | | TURNER | 1500.00 | | ALLEN | 1600.00 | | CLARK | 2450.00 | | BLAKE | 2850.00 | | JONES | 2975.00 | | SCOTT | 3000.00 | | FORD | 3000.00 | | KING | 5000.00 | +--------+---------+
-
找出工作岗位是’SALESMAN’的员工,并且按照工资的降序排序
mysql> select ename, job, sal from emp where job = 'SALESMAN' order by sal desc; +--------+----------+---------+ | ename | job | sal | +--------+----------+---------+ | ALLEN | SALESMAN | 1600.00 | | TURNER | SALESMAN | 1500.00 | | WARD | SALESMAN | 1250.00 | | MARTIN | SALESMAN | 1250.00 | +--------+----------+---------+
-
执行顺序
select xxx 3 from tableName 1 where 条件 2 order by ... 4
分组函数
多行处理函数 输入多行 输出一行
所有的分组函数都是对某一组数据进行操作的
count 计数
-
找出总人数
mysql> select count(*) from emp; +----------+ | count(*) | +----------+ | 14 | +----------+
sum 求和
-
找出员工的工资总和
mysql> select sum(sal) from emp; +----------+ | sum(sal) | +----------+ | 29025.00 | +----------+
avg 平均值
-
找出平均工资
mysql> select avg(sal) from emp; +-------------+ | avg(sal) | +-------------+ | 2073.214286 | +-------------+
max 最大值
-
找出最高工资
mysql> select max(sal) from emp; +----------+ | max(sal) | +----------+ | 5000.00 | +----------+
min 最小值
-
找出最低工资
mysql> select min(sal) from emp; +----------+ | min(sal) | +----------+ | 800.00 | +----------+
-
所有分组函数会自动忽略NULL
mysql> select count(comm) from emp; +-------------+ | count(comm) | +-------------+ | 4 | +-------------+
-
计算每个员工的年薪
//有NULL参与运算 结果一定是NULL mysql> select ename, (sal + comm) * 12 as yearsal from emp; +--------+----------+ | ename | yearsal | +--------+----------+ | SMITH | NULL | | ALLEN | 22800.00 | | WARD | 21000.00 | | JONES | NULL | | MARTIN | 31800.00 | | BLAKE | NULL | | CLARK | NULL | | SCOTT | NULL | | KING | NULL | | TURNER | 18000.00 | | ADAMS | NULL | | JAMES | NULL | | FORD | NULL | | MILLER | NULL | +--------+----------+
-
ifnull(可能为null的数据, 处理为什么值)
//ifnull()属于单行处理函数 输入几行 输出几行 mysql> select ename, (sal + ifnull(comm, 0)) * 12 as yearsal from emp; +--------+----------+ | ename | yearsal | +--------+----------+ | SMITH | 9600.00 | | ALLEN | 22800.00 | | WARD | 21000.00 | | JONES | 35700.00 | | MARTIN | 31800.00 | | BLAKE | 34200.00 | | CLARK | 29400.00 | | SCOTT | 36000.00 | | KING | 60000.00 | | TURNER | 18000.00 | | ADAMS | 13200.00 | | JAMES | 11400.00 | | FORD | 36000.00 | | MILLER | 15600.00 | +--------+----------+
-
查找高于平均薪资的员工
//当一条sql语句没有group by时 整张表自成一张表 如果一条sql语句没有group by,相当于是缺省的 //先执行group by才能执行分组函数 group by语句是在where语句之后执行 分组函数又是在where语句里的 mysql> select ename, sal from emp where sal > avg(sal); ERROR 1111 (HY000): Invalid use of group function
mysql> select ename, sal from emp where sal > (select avg(sal) from emp); +-------+---------+ | ename | sal | +-------+---------+ | JONES | 2975.00 | | BLAKE | 2850.00 | | CLARK | 2450.00 | | SCOTT | 3000.00 | | KING | 5000.00 | | FORD | 3000.00 | +-------+---------+
任何一个分组函数语句都是在group by之后执行的
where语句后之不能用分组函数
group by 和 having
-
group by:按照某个字段或者某些字段进行分组
-
having :是对分组之后的数据再进行过滤(having必须和group by一起使用 不能单独使用)
-
找出每个工作岗位的最高工资
mysql> select job, max(sal) from emp group by job asc; +-----------+----------+ | job | max(sal) | +-----------+----------+ | ANALYST | 3000.00 | | CLERK | 1300.00 | | MANAGER | 2975.00 | | PRESIDENT | 5000.00 | | SALESMAN | 1600.00 | +-----------+----------+ //这条语句没有意义 最高薪资与员工不对应 select ename, job, max(sal) from emp group by job asc; +-------+-----------+----------+ | ename | job | max(sal) | +-------+-----------+----------+ | SCOTT | ANALYST | 3000.00 | | SMITH | CLERK | 1300.00 | | JONES | MANAGER | 2975.00 | | KING | PRESIDENT | 5000.00 | | ALLEN | SALESMAN | 1600.00 | +-------+-----------+----------+
-
当一条sql语句有group by时 select后面只能跟分组函数和参与分组函数的字段(按照什么分组)。
-
找出每个部门不同工作岗位的最高薪资(多个字段联合分组)
select deptno, job, max(sal) from emp group by deptno, job; +--------+-----------+----------+ | deptno | job | max(sal) | +--------+-----------+----------+ | 10 | CLERK | 1300.00 | | 10 | MANAGER | 2450.00 | | 10 | PRESIDENT | 5000.00 | | 20 | ANALYST | 3000.00 | | 20 | CLERK | 1100.00 | | 20 | MANAGER | 2975.00 | | 30 | CLERK | 950.00 | | 30 | MANAGER | 2850.00 | | 30 | SALESMAN | 1600.00 | +--------+-----------+----------+
-
找出每个部门的最高薪资,并显示2900以上的薪资
能用where用where 不能才用having
//此种方式效率低 select deptno, max(sal) from emp group by deptno having max(sal) > 2900; +--------+----------+ | deptno | max(sal) | +--------+----------+ | 10 | 5000.00 | | 20 | 3000.00 | +--------+----------+
select deptno, max(sal) from emp where sal > 2900 group by deptno; +--------+----------+ | deptno | max(sal) | +--------+----------+ | 10 | 5000.00 | | 20 | 3000.00 | +--------+----------+
-
找出每个部门的平均薪资并且显示大于2000的
select deptno, avg(sal) from emp group by deptno having avg(sal) > 2000; +--------+-------------+ | deptno | avg(sal) | +--------+-------------+ | 10 | 2916.666667 | | 20 | 2175.000000 | +--------+-------------+
关于查询结果的去重
//distinct只能出现在所有字段的最前面
select distinct job from emp;
+-----------+
| job |
+-----------+
| CLERK |
| SALESMAN |
| MANAGER |
| ANALYST |
| PRESIDENT |
+-----------+
//distinct放在所有字段的最前面表示联合去重
select distinct deptno, job from emp;
+--------+-----------+
| deptno | job |
+--------+-----------+
| 20 | CLERK |
| 30 | SALESMAN |
| 20 | MANAGER |
| 30 | MANAGER |
| 10 | MANAGER |
| 20 | ANALYST |
| 10 | PRESIDENT |
| 30 | CLERK |
| 10 | CLERK |
+--------+-----------+
-
统计岗位数量
mysql> select count(distinct job) from emp; +---------------------+ | count(distinct job) | +---------------------+ | 5 | +---------------------+
总结
//执行顺序
select
... 5
from
... 1
where
... 2
group by
... 3
having
... 4
order by
... 6
本文地址:https://blog.csdn.net/yiqiandewo/article/details/107299691
推荐阅读
-
mysql下按某一字段分组取最大(小)值所在行的数据的技巧分享
-
mysql自动生成排序列复杂sql的方法
-
自定义mysql类用于快速执行数据库查询以及将查询结果转为json文件
-
mysql慢查询操作实例分析【开启、测试、确认等】
-
MySQL千万级大数据SQL查询优化知识点总结
-
MySQL多表查询实例详解【链接查询、子查询等】
-
MySQL单表查询操作实例详解【语法、约束、分组、聚合、过滤、排序等】
-
mysql实现查询数据并根据条件更新到另一张表的方法示例
-
MySQL group by对单字分组序和多字段分组的方法讲解
-
[ExtNet] GridPanel怎么实现服务器端分页、排序、查询?--Oracel存储过程分页