1.消除重复
DISTINCT
select distinct 字段名 from empt;
字段名相同的就去除,保留一个
多个字段,多个字段都相同才会去重
2.算数运算符
select sal*12 from empt; //通过月工资查询年薪
select sal*12 '年薪' from empt;//使用别名
3.别名
列的 SQL 别名语法
SELECT column_name AS alias_name
FROM table_name;
表的 SQL 别名语法
SELECT column_name(s)
FROM table_name AS alias_name;
注意:别名不能作为非空判断
select *,(comm+sal)*12 as 'money' from emp WHERE (comm+sal)*12;
//正确
select *,(comm+sal)*12 as 'money' from emp WHERE 'money'; //错误
4.过滤查询
select * from dept where binary dname='selas' //binary大小写敏感
5.ifnull
ifnull(99,10) 如果第一个参数为null,就取第二个值,不为null取第一个值
select * from emp WHERE ISNULL(COMM); //查询COMM是null的
select * from emp WHERE COMM; //查询COMM是有值的
6.like匹配字符串 -单个字符,%多个字符
select * from emp where sal between 2000 and 4000;
select * from emp where 日期 like '1981%';
select * from emp where emp where 字段 like 'A%';
select * from emp where emp where 字段 like '_M%';
select * from emp where sal not between 2000 and 4000;
7.排序
asc 升序 缺省
desc 降序
order by 出现在select之后查询
select * from emp order by sal;//sal不加引号,加引号能查询,但没效果
select * from emp order by deptno ,(sal*12);
select * from emp order by deptno DESC,(sal*12) DESC;
8.连接

内连接
外连接
左连接
右连接
on后面接连接条件
9.分组函数
函数分类:
单行函数:将每条数据进行独立的计算,然后每条数据得到一条结果;
多行函数:多条数据同时计算,最终得到一条结果数据。也成为聚集函数、分组函数,主要用于完
成一些统计功能等等。
多行函数:
AVG():求出平均值;
SUM():求和;
MAX():求出最大值;
MIN():求出最小值。
统计函数忽略空值
10.分组查询
group by
不能在 WHERE 子句中对分组限定,限制组须使用 HAVING 子句;
不能在 WHERE 子句中使用统计函数,而在 HAVING 子句可使用统计函数。
SELECT YEAR(HIREDATE) , COUNT(EMPNO)
FROM emp
GROUP BY YEAR(HIREDATE)
HAVING y BETWEEN '1980' AND '1982'
SELECT MGR, AVG(SAL), MIN(SAL) AS minsal
FROM emp
GROUP BY MGR
HAVING MGR IS NOT NULL AND minsal >= 1300
11.单行函数
- NOW():获取当前时间;
- DAY(date):获取日期中的天数,范围是从 1 到 31;
- HOUR(time):返回 time 对应的小时数,范围是从 0 到 23;
- MINUTE(time):返回 time 对应的分钟数,范围是从 0 到 59;
- MONTH(date):返回 date 对应的月份,范围时从 1 到 12;
- YEAR(date):返回 date 对应的年份,范围是从 1000 到 9999;
- LAST_DAY(date):获取一个日期或日期时间值,返回该月最后一天对应的值。
12.练习



-- 查询所有员工的年薪((月薪 + 奖金) * 12)
select (sal+IFNULL(comm,0))*12 'money' from emp;
-- 查询有奖金的员工信息
select * from emp WHERE COMM;
-- 查询公司的老板
select * from emp WHERE ISNULL(mgr);
-- 查询出基本工资高于 1500 的所有员工信息
SELECT * FROM emp WHERE SAL > 2000
-- 查询名字叫 SCOTT 的员工所从事的工作
SELECT JOB FROM emp WHERE ENAME = 'scott'
-- 查询 1981 年入职的员工信息
SELECT * FROM emp WHERE YEAR(HIREDATE) = 1981
-- 查询年薪小于 3W 的员工
SELECT * FROM emp WHERE (sal+IFNULL(comm,0))*12 < 30000
-- 查询所有不是销售人员的员工信息
SELECT * FROM emp WHERE JOB != 'SALESMAN'
-- 查询工资在 2000-3000 之间的员工信息
SELECT * FROM emp WHERE sal BETWEEN 2000 AND 3000
-- 查询 1981 年入职的员工
SELECT ENAME FROM emp WHERE YEAR(HIREDATE) = 1981
-- 查询工资为 800 或 1600 或 3000 的员工
SELECT ENAME FROM emp WHERE SAL = 800 or SAL = 1600 or SAL = 3000
-- 查询出所有雇员姓名是以 A 开头的全部雇员信息。
SELECT * FROM emp WHERE ENAME LIKE 'A%'
-- 查询出雇员姓名第二个字母是 M 的全部雇员信息。
SELECT * FROM emp WHERE ENAME LIKE '_M%'
-- 查询出雇员姓名任意位置上包含字母 A 的全部雇员信息。
SELECT * FROM emp WHERE ENAME LIKE '%A%'
-- 查询姓名中有 e 或者 a 的员工姓名
SELECT ENAME FROM emp WHERE ENAME LIKE '%e%' OR ENAME LIKE '%a%'
-- 查询工资在 1500~3000 之间的全部员工信息
SELECT * FROM emp WHERE SAL BETWEEN 1500 AND 3000
-- 查询工资不在 2000-3000 之间的员工信息
SELECT * FROM emp WHERE SAL NOT BETWEEN 1500 AND 3000
-- 查询工资不为 800 或 1600 或 3000 的员工
SELECT * FROM emp WHERE SAL != 800 AND SAL != 1600 AND SAL != 3000
-- 查询出职位是办事员 (CLERK) 或者是销售人员 (SALESMAN) 的全部信息,且工资在 1000 以上
SELECT * FROM emp WHERE (JOB = 'CLERK' OR JOB = 'SALESMAN') AND SAL > 1000
-- 查询所有员工信息,按照工资排序
SELECT * FROM emp ORDER BY SAL DESC
-- 查询所有员工信息,按照年薪降序排序
SELECT * FROM emp ORDER BY (sal+IFNULL(comm,0))*12 DESC
SELECT *,(sal+IFNULL(comm,0))*12 money FROM emp ORDER BY money DESC
-- 查询所有员工信息,按照部门和年薪降序排序
SELECT * FROM emp ORDER BY DEPTNO DESC, (sal+IFNULL(comm,0))*12 DESC
-- 查询员工编号,员工名称,员工所属部门的编号和名称
SELECT EMPNO,ENAME,emp.DEPTNO,dept.DNAME FROM emp,dept
-- 查询员工的姓名,工资,所在部门的名称,以及工资的等级
SELECT ENAME,SAL,dept.DNAME,salgrade.GRADE FROM emp,dept,salgrade WHERE emp.DEPTNO=dept.DEPTNO AND SAL BETWEEN salgrade.LOSAL AND salgrade.HISAL
-- 查询所有员工每个月的平均工资及总工资
SELECT AVG(SAL),SUM(SAL+COMM) FROM emp
-- 查询月薪在 2000 以上的员工总人数
SELECT COUNT(*) FROM emp WHERE (sal+IFNULL(comm,0))>2000
-- 查询员工最高工资和最低工资差距
SELECT MAX(SAL)-MIN(SAL) FROM emp
-- 按照职位分组,求出每个职位的最高和最低工资
SELECT JOB,MAX(SAL),MIN(SAL) FROM emp GROUP BY JOB
-- 查询出每一个部门员工的平均奖金
SELECT dept.DNAME,AVG(IFNULL(COMM,0)) FROM emp INNER JOIN dept ON emp.DEPTNO=dept.DEPTNO GROUP BY dept.DNAME
-- 查询出每一个部门员工的平均工资
SELECT dept.DNAME,AVG(IFNULL(sal,0)) FROM emp INNER JOIN dept ON emp.DEPTNO=dept.DEPTNO GROUP BY dept.DNAME
-- 查询各个部门和岗位的平均工资
SELECT DEPTNO,JOB,AVG(IFNULL(SAL,0)) FROM emp GROUP BY DEPTNO,JOB
-- 查询部门平均工资高于 2000 的部门及其平均工资
SELECT DEPTNO,AVG(IFNULL(SAL,0)) money FROM emp GROUP BY DEPTNO HAVING AVG(IFNULL(SAL,0))>2000
-- 查询在 80, 81, 82 年各进公司多少人
SELECT YEAR(HIREDATE) y, COUNT(EMPNO) FROM emp GROUP BY YEAR(HIREDATE) HAVING y BETWEEN '1980' AND '1982'
-- 查询各个管理人员下员工的平均工资,其中最低工资不能低于 1300,不计算老板
SELECT MGR, AVG(SAL), MIN(SAL) AS minsal FROM emp GROUP BY MGR HAVING MGR IS NOT NULL AND minsal >= 1300
-- 查询出工资比 MARTIN 还要高的全部雇员信息
SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename = 'MARTIN')
-- 查询平均工资高于公司平均工资的部门信息
SELECT e.deptno, d.dname, AVG(sal)
FROM emp e JOIN dept d ON e.deptno = d.deptno
GROUP BY deptno HAVING AVG(sal) >= (SELECT AVG(sal) FROM emp)
-- 查询工资等于部门经理(职位是 MANAGER)的员工信息。
SELECT * FROM emp WHERE SAL IN (SELECT SAL FROM emp WHERE JOB='MANAGER') AND JOB != 'MANAGER'
Comments | NOTHING