数据查询语言(Data Query Language,DQL)- 单表查询

数据查询语言(Data Query Language,DQL)- 单表查询

基础select语句

-- 对员工表进行查询
select * from emp; -- * 代表所有数据

-- 部分列查询
select empno, ename, sal from emp;

-- 显示部分行 where 子句
select * from emp where sal>2000;
select empno, ename, job, mgr from emp where sal>2000;

-- 起别名
select empno 员工编号, ename 姓名, sal 工资 from emp;
select empno as 员工编号, ename s 姓名, sal as工资 from emp; -- 也可以使用as关键字  as是alias(别名)的缩写
select empno as '员工编号', ename s "姓名", sal as'工资' from emp; -- 别名中有特殊符号的时候,单引号(')或双引号(")不能省略不写

-- 算符运算符
select empno,ename,sal,sal+1000 as '涨薪后',deptno from emp where sal <2500;
select empno, ename, sal, comm, sal+comm from emp; -- 有空值的字段与其他字段运算之后,结果为空

-- 去重操作
select distinct job from emp;
-- 组合去重 
select distinct job, deptno from emp;

-- 排序
select * from emp order by sal; -- order by 默认升序排列
select * from emp order by sal asc; --  asc 升序,默认可以不写
select * from emp order by sal desc; --  desc 降序,指定排序方式
-- 组合排序
select * from emp order by sal asc, deptno desc; -- 在工资升序的基础下,deptbo按照降序排列

where子句

-- where子句,将过滤条件放在where子句的后面,可以筛选\过滤出我们想要的条件的数据
select * from emp where deptno = 10;
select * from emp where deptno > 10;
select * from emp where deptno >= 10;
select * from emp where deptno < 10;
select * from emp where deptno <= 10;
select * from emp where deptno <> 10;
select * from emp where deptno != 10;
select * from emp where job = 'CLERK'; -- 默认情况下 字符串不区分大小写
select * from emp where job = 'clerk'; 
-- 区分大小写查询
select * from emp where binary job = 'clerk'; -- 添加了binary之后,指明区分大小写

select * from emp where hiredate < "1981-12-25";

-- where子句 + 逻辑运算符:and
select * from emp where sal > 1500 and sal < 3000 order by sal;
select * from emp where sal > 1500 && sal < 3000 order by sal; -- 中间条件使用and与&& 效果都一样,
select * from emp where sal between 1500 and 3000 order by sal; -- 使用between的时候,左右都是包含的

-- where子句 + 逻辑运算符:or
select * from emp where deptno =10 or deptno =20;
select * from emp where deptno =10 || deptno =20;
select * from emp where deptno in(10,20);
select * from emp where job in ("MANAGER","CLERK","ANALYST");

-- where子句 + 模糊查询 
-- 查询名字带A的员工  "%" 代表任意多个字符
select * from emp  where  ename like "%a%";
-- 查询名字第二个字母是A的 "_" 代表一个任意字符
select * from emp  where  ename like "_a%";

-- where子句 + null的判断
select * from emp where comm is null;
select * from emp where comm is not null;
 
-- where子句 + 小括号的使用 不同运算符的优先级不同,加括号可以指定优先级
select * from emp where job = "salesman" or job = 'clerk' and sal > 1500; -- 先 and 再 or   and优先级大于or
select * from emp where job = "salesman" or (job = 'clerk' and sal > 1500); -- 小括号内的优先级最高,加了小括号的优先运行
select * from emp where (job = "salesman" or job = 'clerk') and sal > 1500;

函数(只列举常用的函数,函数详情可查阅API)

-- 函数
select empno, ename, lower(ename), upper(ename), sal from emp;
-- 函数的功能,就是封装的一些特殊功能,直接使用完成某些功能
-- 函数的作用是为了提升select的能力
-- 函数没有改变字段或数据自身的值,而是在查询出来的结果上面进行加工,从而展示出不同的效果

select max(sal), min(sal), count(sal), sum(sal),avg(sal) from emp;
-- lower(ename), upper(ename)改变每一条结果,每一条数据都会对应进行修改
-- max(sal), min(sal), count(sal), sum(sal),avg(sal) 多条数据,最终展示一个结果
/*
函数的分类
  单行函数: 对每一条记录进行计算,并得到相应的计算结果,然后返回给用户
	多行函数: 对一组数据进行运算,针对这一组数据只返回一个结果,也称为分组函数
	除了多行函数(max, min, count, sum,avg),都是单行函数
*/

-- 单行函数语句
-- 字符串函数
select ename,length(ename), substring(ename,2,3) from emp;
-- substring 字符串截取,从字符下标为2开始,截取两位,(这里下标是从1开始的)

-- 数值函数
select abs(-5),ceil(5.3),floor(5.9),round(3.14) from dual; -- dual实际上是一个伪表,实际上不存在,
select abs(-5) 绝对值,ceil(5.3) 向上取整,floor(5.9) 向下取整,round(3.14) 四舍五入 -- 如果没有where条件的话,伪表查询的时候,from dual可以不写
select ceil(sal) from emp;
select mod(sal, 3) from emp; -- 对sal的值进行取模操作

-- 日期与时间函数
select * from emp;
select curdate(), curtime();
-- curdate() 年月日
-- curtime() 时分秒
select now(), sysdate(),sleep(3),now(), sysdate() from dual;
-- now() 年月日时分秒 当前语句执行的时间, 
-- sysdate() 年月日时分秒 当前函数执行的时间
-- 虽然可以表示年月日时分秒,但是插入数据的时候,还是要参照表的结构
insert into emp values(9999,'lili','SALASMAN',7698,NOW(),1000,NULL,30);
select * from emp;

-- 流程函数
select empno,ename,sal,if(sal>=2500,"高薪","低薪") as "薪资水平" from emp; -- if else 双分支结构
select empno,ename,sal,comm,sal+ifnull(comm,0) from emp; -- 如果comm是空的话,那么取0
select nullif(1,1),nullif(1,2) from dual; -- nullif   如果value1等于value2,返回null,否则,返回value1
-- case相关
-- case 等值判断
select empno, ename, job,
case job
when "CLERK" then "店员"
when "SALESMAN" then "销售"
when "MANAGER" then "经理"
else "其他"
end as "岗位",
sal from emp;
-- case 区间判断
select empno,ename,sal,
case
when sal<=1000 then "A"
when sal<=2000 then "B"
when sal<=3000 then "C"
else "D"
end as "工资等级",
deptno from emp;

-- JSON函数,JSON函数后续补充

-- 其他函数
select database(),user(),version()

-- 多行函数 多行函数一共就只用以下5个
select max(sal),min(sal),count(sal),sum(sal),avg(sal) from emp;
-- 多行函数会自动忽略null值

-- count --计数   
-- 统计表的记录数:方式1:
select * from emp;
select count(ename) from emp;
select count(*) from emp;
-- 统计表的记录数:方式2
select 1 from dual;
select 1 from emp;
select count(1) from emp;

group by 进行分组

-- group by 对查询结果进行分组
-- 统计各个部门的平均工资
-- 字段和多行函数不可以同时使用,除非这个字段属于分组
select deptno,avg(sal) from emp group by deptno;

-- 统计各个岗位的平均工资
select job,avg(sal) from emp group by job;
select job, lower(job), avg(sal) from emp group by job;

having 进行二次筛选

-- having
-- 统计各个部门的平均工资,但是只显示平均工资2000以上的
-- 分组后进行第二次筛选  having
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
select deptno,avg(sal) 平均工资 from emp group by deptno having 平均工资>2000;
select deptno,avg(sal) 平均工资 from emp group by deptno having 平均工资>2000 order by deptno desc;

-- 统计各个岗位的平均工资,除了MANAGER
-- 方法1
select job, avg(sal) from emp where job != "MANAGER" group by job;
-- 方法2
select job, avg(sal) from emp group by job having job != "MANAGER";
-- where是在分组前进行过滤  having是在分组后进行过滤

分页

-- 当一次查询的结果过多,想要只展示一部分的时候,就可以使用分页的方式进行展示
-- 分页需要使用limit进行操作
-- limit后面需要接上两个参数,参数之间使用逗号(,)隔开
-- 前一个参数标识展示数据的起始位置,后面一个参数标识展示数据个数
-- 格式为 limit start,count
-- 所以,如果想要展示第N页   那么起始位置的数字就是 (N-1)*count
select * from emp limit 10,5;
posted @ 2021-01-24 22:45  殃奕  阅读(382)  评论(0编辑  收藏  举报