8.13 查询
1.为列指定别名(AS),也可以不使用。(列与别名之间用空格隔开)(不使用AS,用空格隔开也可以)
SELECT empno AS 工号 , ename AS 姓名 , job AS 岗位 , sal AS 薪水 FROM emp ;
2.使用DISTINCT可以剔除查询结果中的重复行(以行为单位看重复嘛)(DISTINCT必须跟在SELECT之后)
-- 使用 DISTINCT 可以剔除查询结果中的 "重复行"
SELECT DISTINCT deptno FROM emp;
SELECT DISTINCT deptno,job FROM emp;
3.处理空值
-- 查询emp表中所有员工的工号、姓名、岗位、薪水、提成,如果员工没有提出则显示 '无'
SELECT empono ,ename,job,sal,IFNULL(comm,'无')AS comm FROM emp;
4.数据过滤
-
WHERE子句
-
比较运算符
-
= 两者是否相等
-
!= 或者<> 不等于
-- 查询不在10部门工作的员工信息 SELECT * FROM emp WHERE deptno != 10 ; SELECT empno , ename , job , deptno FROM emp WHERE deptno <> 10 ;
-
表示大于>
-- 统计月薪大于2000的员工工号、姓名、岗位、薪水 SELECT empno , ename , job , sal -> FROM emp -> WHERE sal > 2000 ;
-
大于等于>=
-
小于 <
-
小于等于<=
-- 查询月薪不低于1500、不高于2000的员工信息 SELECT empno , ename , job , sal FROM emp WHERE sal >= 1500 AND sal <= 2000 ; -- 更加优化的写法 ,用between and SELECT empno , ename , job , sal FROM emp WHERE sal BETWEEN 1500 AND 2000 ;
-
5.sql运算符(mysql中的默认转义字符为)
-
is null 和 is not null 用法(,不能用=null判断是否为空,应该用is null判断)
-- 查询提成为空的员工信息 SELECT * FROM emp WHERE comm IS NULL ; -- 哪些员工的提成不是空 SELECT * FROM emp WHERE comm IS NOT NULL ;
-
in用于匹配列表中的任意值
-- 查询在 10 或 20 或 30 部门工作的员工信息 SELECT empno , ename , deptno -> FROM emp -> WHERE deptno IN (10,20,30);
-
between...and....(between之后的数字要小于and之后的值,不能颠倒 )
-- 查询月薪不低于1500、不高于2000的员工信息 SELECT empno , ename , job , sal FROM emp WHERE sal BETWEEN 1500 AND 2000 ;
-
like模糊查询
-
默认采用%匹配任意多个字符
-- 查询 ename 中包含 字母 o 的员工信息 SELECT empno , ename FROM emp WHERE ename LIKE '%O%' ;
-
默认采用_匹配任意单个字符
-- 查询ename第三个字母是o的员工信息 SELECT empno , ename FROM emp WHERE ename LIKE '__o%' ; -- 显示 ename 中第二个字母是下划线的员工信息,mysql中的默认转义字符为\ SELECT empno , ename FROM emp WHERE ename LIKE '_\_%' -- 使用 escape 来显式定义转义字符 SELECT empno , ename FROM emp WHERE ename LIKE '_$_%' ESCAPE '$' ; -- 尝试使用 单引号 作转义字符 -- 成对的单引号总是表示字符串边界,如果在字符串中需要出现单个单引号,只需要将单引号写两次即可 SELECT empno , ename FROM emp WHERE ename LIKE '_''_%' ESCAPE '''' ;
-- 让数据四舍五入的函数round() SELECT deptno , job , round( avg(sal) ) -> FROM emp -> WHERE deptno IS NOT NULL -> GROUP BY deptno , job ; -- GROUP BY 要跟在WHERE的后面。上面这段代码的执行顺序,先FROM,后WHERE,再GROUP BY,最后再是SELECT.
-
6 逻辑运算符(他们的优先级not>and>or)
-
not 逻辑取反
-
and 逻辑与
-
or 逻辑或
7 数据分组
-
常用组函数或者聚合函数
-
max最大值
-
min最小值
-
avg平均值
-
sum求和
-
count
-- 用于统计非空行数-- 统计提成不为空的员工个数 SELECT count(comm) FROM emp ;
-
-
GROUP BY子句实现分组查询
-- 统计emp表中各部门的最低工资、最高工资、平均工资 SELECT deptno , min(sal) , max(sal) , avg(sal) -> FROM emp -> GROUP BY deptno ; -- 在 select 语句之后出现的列,除非使用了组函数处理,否则它必须出现在 group by 之后 -- 但是 group by 之后出现的列不时必须要书写在 select 之后 SELECT min(sal) , max(sal) , avg(sal) -> FROM emp -> GROUP BY deptno ;
-
使用HAVING 子句实现数据筛选(在筛选完后还要满足条件)
-- 统计平均工资高于2000的部门信息 SELECT deptno , avg(sal) AS avgsal -> FROM emp -> WHERE deptno IS NOT NULL -> GROUP BY deptno -> HAVING avgsal > 2000 ; -- HAVING 之后尽量别使用别名,在MYSQL中也许可以执行,在oracle中是不行的,为了养成良好的编程习惯,尽量不使用别名,写的的组函数或者原名。 -- 在where子句中不能使用组函数 SELECT deptno , avg(sal) AS avgsal -> FROM emp -> WHERE deptno IS NOT NULL AND avgsal > 2000 -> GROUP BY deptno ; ERROR 1054 (42S22): Unknown column 'avgsal' in 'where clause' -- 在where子句中可以使用单行函数 WHERE empno > 9900
8.数据排序
-
ORDER BY 子句实现数据排序
-- 升序排列 -- 查询emp表中所有员工的工号、姓名、岗位、薪水,按照工号升序排列 SELECT empno , ename , job , sal FROM emp ORDER BY empno ASC ; -- 降序排列 -- 查询emp表中所有员工的工号、姓名、岗位、薪水,按照工号降序排列 SELECT empno , ename , job , sal FROM emp ORDER BY empno DESC ; -- 用别名、列数、组合函数跟在 ORDER BY 之后也可以排序 -- 查询emp表中所有员工的工号、姓名、岗位、薪水,按照薪水降序排列 SELECT empno , ename , job , sal FROM emp ORDER BY sal DESC ; SELECT empno , ename , job , sal AS 月薪 FROM emp ORDER BY 月薪 DESC ; SELECT empno , ename , job , sal AS 月薪 FROM emp ORDER BY 4 DESC; SELECT empno ,ename , job , sal * 12 FROM emp ORDER BY sal * 12 ; -- 若有多个条件,用,隔开 -- 查询emp表中所有员工的信息,按照月薪降序排列,如果月薪相同,则按照部门号再排序 SELECT * FROM emp ORDER BY sal DESC, deptno DESC ;