查询
select empno,ename,sal from emp; -- 只看部分列 select empno,ename,sal from emp where sal>2000; -- 看部分列 和sal大于2000的数据 select empno as'员工 编号',ename as '姓名',sal as '工资' from emp; -- 起别名 -- 查询到的用运算符: select empno,ename,sal,sal+100 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 asc; -- 对sal进行升序排列 select * from emp order by sal desc; -- 对sal进行降序排列 select * from emp order by sal asc deptno desc; -- 再sal升序中 如果sal相同 deptno降序排列 -- where 将过滤条件放在where子句的后面,可以筛选/过滤出我们想要的符合条件的数据 -- where 子句+关系运算符 && (and) select * from emp where sal >1500 and sal<3500; select * from emp where sal >1500 && sal<3500; select * from emp where job = 'clerk'; -- m默认不区分大小写 select * from emp where binary job = 'clerk'; -- binary区分大小写 select * from emp where sal >1500 and sal <3000 order by sal asc; -- 再1500<sal<3000进行升序排列 [1500,3000) select * from emp where sal between 1500 and 3000; -- [1500,3000] -- 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('CLERK','ANALYST'); -- where 子句 +模糊查询 %代表任意多个字符 0,1,2。。。。 select * from emp where ename like '%A%'; -- _任意字符 可以加两个就表示第三位的查询(ADAMS,CLARK,BLAKE) select * from emp where ename like '__A%'; -- 关于null的判断 is(是) is not(不是) select * from emp where comm is null; select * from emp where comm is not null; -- 小括号的使用 select * from emp where job = 'SALESMAN' or job = 'CLERK' amd sal >= 1500; -- 先and 再 or amd > or select * from emp where job = 'SALESMAN' or (job = 'CLERK' amd sal >= 1500); select * from emp where (job = 'SALESMAN' or job = 'CLERK') amd sal >= 1500;
函数
单行函数
-- 1 单行函数 lower(转小写) upper(转大写) select empno,ename,lower(ename),upper(ename),sal from emp; -- 2 单行函数 length(长度) substrng(截取) select enmae,length(ename),substring(ename,2,3) from emp; -- 3 单行函数 abs(绝对值) ceil(向上取整数) floor(向下取整数) round(四舍五入) dual实际就是一张伪表 select abs(-5),ceil(5.3),floor(5.9),round(3.14) from dual; select abs(sal) as '工资绝对值',ceil(sal) as'工资向上取整数',floor(sal) as'向下取整数',round(sal) as '四舍五入' from emp; select 10/3,10%3 ,mod(10,3); -- mod 模型 -- 4 日期函数 --curdate()年月日 curtime()时分秒 sleep(3)睡了3秒 select curdate(),curtime() from emp; select now(),sysdate(),sleep(3),sysdate() from dual; -- now() 当前时间 sysdate()函数执行到这的时间 都表示 年月日 时分秒 -- 5 流程函数 -- if相关 select empno,ename,sal,if(sal>=2500,'高薪','底薪')as '薪资等级'from emp; -- if -else 双分子 select empno,ename,sal,comm,sal+ifnull(comm,0) from emp; -- 如果comm是null,那么取值为0 -- 单分子 select nullif(1,1),nullif(1,2) from dual; -- 如果value1=value2 ,则返回null, 否则 value1 -- case 相关的; -- case 等值判断 select empno,job, case job when 'CLERK' then '店员' -- 如果 job 是clerk 就是店员 when 'SALESMAN' then '销售' -- 如果 job是salesman 就是销售 when 'MANAGER'then '经理' else '其它' -- 其它 end '岗位', sal from emp; -- case 区间判断 select empno,ename,sal, case when sal<= 1000 then 'A' -- 0< sal <=1000 就是A when sal<= 2000 then 'B' -- 1000< sal <= 2000 就是B when sal<= 3000 then 'c' -- 2000< sal <= 3000 就是C else 'D' -- 其它 都是 D end '工资等级', sal from emp; -- 6 其它函数 database()当前用的数据是什么名字 user() 用户是什么 version() 数据库的版本 select database(),user(),version() from emp;
多行函数 除了多行函数(max,min,count,sum,avg),都是单行函数
-- 多行函数 max(最大值) min(最小值) count(个数) sum(求和) avg(平均值) select max(sal),min(sal),count(sal),sum(sal),avg(sal) from emp; -- count 计数 select count(*) from emp; -- *所有记录
group by 分组
-- group by 分组 select deptno,avg(sal) from emp group by deptno; -- 先分 按deptno 分组 然后进行 取平均值 -- 先按 deptno 分组 然后取平均值 然后按照deptno 进行排序升序 select deptno,avg(sal) from emp group by deptno order by deptno asc; -- 先按 deptno 分组 然后取平均值 然后按照deptno 进行排序降序 select deptno,avg(sal) from emp group by deptno order by deptno desc; select job,avg(sal) from emp group by job; -- 先按job分组 然后sal取平均值 select job,lower(job),avg(sal) from emp group by job; -- 先按job分组 然后sal取平均值 job小写
havign 分组后二次筛选
-- 分组后二次筛选 -- 先按照 deptno 分组 然后取平均值大于 2000的数据 select deptno,avg(sal) from emp group by deptno having avg(sal)> 2000; select deptno,avg(sal) as '平均工资' from emp group by deptno having 平均工资>2000; -- 起了别名 -- 升序排列 select deptno,avg(sal) as '平均工资' from emp group by deptno having 平均工资>2000 order by deptno asc; -- 降序排列 select deptno,avg(sal) as '平均工资' 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 则是在分组后进行过滤
总结
-- select 语句总结 -- 【1】select语句总结 -- select column, group_function(column) -- from table -- [where condition] -- where 进行第一次过滤 -- [group by group_by_expression] -- 分组 -- [having group_condition] -- 二次过滤 -- [order by column]; -- 进行排序 -- -- 注意:顺序固定,不可以改变顺序 -- -- 【2】select语句的执行顺序 -- from--where -- group by– select - having- order by
多表查询
-- 多表查询 cross join 交叉查询
-- 笛卡尔乘积 : 没有实际的意义
select *
from emp
cross join dept;
-- 自然连接 natural join
-- 优点 : 自动匹配所有的同名列
select *
from emp
natural join dept;
-- 内连接 -- using 子句
-- 缺点 using关联的字段必须是同名的
select *
from emp e
inner join dept d
using(deptno)
-- 内连接里面的 on子句
select *
from emp e
inner join dept d
on (e.deptno = d.deptno);
-- 多表查询的类型:1.交叉连接 cross join 2, 自然连接 natural join 3, 内连接 inner join - using子句 4, 内连接 - on子句
-- 条件
-- 1.筛选条件:where having
-- 2.连接条件:on, using, natural
-- 外连接 可以显示一些不匹配的数据
-- 左外连接 left outer join 展示全部 左边的信息
select *
from emp e
left outer join dept d
on e.deptno = d.deptno;
-- 右外连接 right outer join 展示全部 右边的信心
select *
from emp e
right outer join dept d
on e.deptno = d.deptno;
-- 全外连接 union 并集 union all 并集不去重复的
select *
from emp e
left outer join dept d
on e.deptno = d.deptno
union -- 取的并集
select *
from emp e
right outer join dept d
on e.deptno = d.deptno;