一、简单查询语句
查看表结构
sql>desc dept;
查询所有列
sql>select * from dept;
※注意:不要轻易使用select * ,数据量大时 非常耗时
查询指定列
sql>select ename,sal,job,deptno from emp;
取消重复列
sql>select distinct deptno,job from emp;
查询simth的工资,职位,所在部门
sql>select sal,job,deptno from emp where ename = ‘simth‘;
※注意:约束条件区分大小写
使用算数表达式显示每个雇员的年工资并使用列的别名
sql>select ename ‘姓名‘,sal * 12 as ‘年收入‘ from emp;
使用nvl函数来处理null值
sql>selcet ename, sal * 12 + nvl(comm,0) * 12 as ‘年工资‘ from emp;
连接字符串
sql>select ename || ‘is a‘ || job from emp;
使用where字句
显示工资高于7k的员工
sql>select ename ,sal from emp where sal > 7000;
显示2020-01-01后入职的员工
sql>select ename,hiredate from emp where hiredate > ‘2020-01-01‘
显示工资在3k~4k的员工情况
sql>select ename,sal from emp where sal >= 3000 and sal <= 4000;
sql>select ename,sal from emp where sal between 3000 and 4000;
在where条件中使用in
显示empno为123,345,7844的员工情况
sql>select ename from emp where empno in (123,345,7844);
使用is null 操作符
显示没有上级的员工情况
sql>select ename from emp where mgr is null;
使用like操作符
% : 表示任意0到多个字符
- : 表示任意单个字符
显示首字符为s的员工姓名和工资
sql>select ename,sal from emp where ename like ‘s%‘;
显示第三个字符为小写o的所有员工的姓名和工资
sql>select ename,sal from emp where ename like ‘--o%‘;
使用逻辑操作符
显示工资高于3k或者岗位是manager的员工,并且姓名首字母为小写j
sql>select ename from emp where (sal > 3000 or job = ‘manager‘) and ename = ‘j%‘;
使用order by 字句
按照工资从小到大的顺序显示员工情况
sql>select ename from emp order by sal ;
按照部门番号升序而工资降序显示员工情况
sql>select ename from emp order by deptno asc,sal desc;
使用列的别名排序
sql>select ename, sal*12 ‘年薪‘ from emp order by "年薪" asc;
※注意:别名需要用双引号标注
延伸
插入一条
insert into user values(‘A001‘,‘西奥‘,‘123456790abcdefghijk‘);
复制自己表中数据插入(为了测试查询时间,短时间内有万条数据)
insert into user (userid,username,userpss) select * from user;
二、复杂查询
数据分组(max、min、avg、sum、count)
显示所有员工中最高工资和最低工资
sql>select max(sal),min(sal) from emp;
显示所有员工的平均工资和工资总和
sql>select avg(sal),sum(sal) from emp;
计算共多少员工
sql>select count(*) from emp;
显示工资最高的员工姓名,职位
sql>select ename, job from emp where sal = (select max(sal) from emp);
显示工资高于平均工资的员工情况
sql>select ename from emp where sal > (select avg(sal) from emp);
group by 和having字句
group by:对查询的结果分组统计
having :限制分组显示结果
显示每个部门的平均工资和最高工资
sql>select avg(sal),max(sal),deptno from emp group by deptno;
显示每个部门的每种岗位的平均工资和最低工资
sql>select avg(sal),min(sal),deptno,job from emp group by deptno,job;
显示平均工资低于5000的部门和平均工资
sql>select deptno,avg(sal) from emp group by deptno having avg(sal) < 5000;
多表查询
多表查询的条件是 至少不能少于 表的个数-1
显示员工名,工资,所在部门的名称
sql>select ename,sal,dname from emp a join dept b on a.deptno = b.deptno;
显示部门番号10的部门名,员工名,工资
sql>select dname,ename,sal from emp a join dept b on a.deptno = b.deptno where a.deptno = ‘10‘;
显示员工姓名,工资,工资级别
sql>select ename,sal,grade from emp a , salgrade b where sal between losal and hisal;
显示员工姓名,工资,所在部门名称 按部门排序
sql>select ename,sal,dname from emp a join dept b on a.deptno = b.deptno order by a.deptno;
自连接 :在同一张表的连接查询
显示‘ford‘员工的上级领导姓名
sql>select work.ename,boss.ename from emp worker,emp boss where work.mgr = boss.empno and work.ename = ‘ford‘;
子查询 :嵌在其它sql语句中的select语句也叫嵌套查询
※注意:最优约束条件写在第一位
单行子查询:只返回一行数据的子查询语句
多行子查询:返回多行数据的子查询
显示与smith同一部门的所有员工
sql>select ename from emp where deptno = (select deptno from emp where ename = ‘smith‘);
显示和部门番号10的工作相同的员工姓名,职位,工资,部门号
sql>select ename,job,sal,deptno from emp where job in (select distinct(job) from emp where deptno = ‘10‘);
在多行子查询中使用all操作符
显示工资比部门番号30的所有员工的工资高的员工姓名,工资,部门号
sql>select ename,sal,deptno from emp where sal > all(select sal from emp where deptno = ‘30‘);
sql>select ename,sal,deptno from emp where sal > (select max(sal) from emp where deptno = ‘30‘); //效率高
在多行子查询中使用any操作符
显示工资比部门番号30的任意员工的工资高的员工姓名,工资,部门号
sql>select ename,sal,deptno from emp where sal > any(select sal from emp where deptno = ‘30‘);
sql>select ename,sal,deptno from emp where sal > (select min(sal) from emp where deptno = ‘30‘); //效率高
多列子查询 : 返回多个列数据的子查询语句
显示与smith的部门和职位完全相同的员工
sql>select ename from emp where (deptno,job) = (select deptno,job from emp where ename = ‘smith‘);
在from子句中使用子查询
显示高于自己部门平均工资的员工情况
1、先查出各个部门的平均工资和部门号
sql>select avg(sal) as mysal,deptno from emp group by deptno;
2、把第一步的查询看做是一张子表存在
sql>select a.ename,a.deptno,a.sal from emp a,(select avg(sal) as mysal,deptno from emp group by deptno) b where a.deptno = b.deptno and a.sal > b.mysal
分页查询
1、rownum分页
sql>select * from emp;
2、显示rownum[oracle分配的]
sql>select a.*,rownum rn from (select * from emp) a;
3、
sql>select a.*,rownum rn from (select * from emp) a where rownum <= 10; //前10条
sql>select * from (select a.*,rownum rn from (select * from emp) a where rownum <= 10) where rn >= 6; //第6条到第10条
sql>select * from (select a.*,rownum rn from (select * from emp) a where rownum <= 9) where rn >= 4; //第4条到第9条
4、
查询指定列时,只需要修改最里层
sql>select * from (select a.*,rownum rn from (select ename,sal from emp) a where rownum <= 10) where rn >= 6;
排序也只需要修改最里层
sql>select * from (select a.*,rownum rn from (select ename,sal from emp order by sal desc) a where rownum <= 10) where rn >= 6;
※注意:所有改动只需要改最里层
用查询结果创建新表:快捷的建表方式(导表,备份表可以用到)
sql>create table mytable (id,name,sal,job,deptno) as select emptno,ename,sal,job,deptno from emp;
三、合并查询
union:取得两个结果集的并集(使用此操作符时,会自动去掉结果集中重复行)//或的关系
select ename,sal,job from emp where sal > 5000
union
select ename,sal,job from emp where job = ‘manager‘;
union all :不会去掉重复行且不会排序
select ename,sal,job from emp where sal > 5000
union all
select ename,sal,job from emp where job = ‘manager‘;
intersect :取得两个结果集的交集
select ename,sal,job from emp where sal > 5000
intersect
select ename,sal,job from emp where job = ‘manager‘;
minus:取得两个结果集的差集(显示存在第一个结果集中而不存在第二个结果集中的数据)
select ename,sal,job from emp where sal > 5000
minus
select ename,sal,job from emp where job = ‘manager‘;
创建数据库
1、通过Oracle提供的向导工具(推荐)
创建数据库使用工具
Oracle Database Configuration Assistant(数据库配置助手)
2、手工步骤直接创建
原文:https://www.cnblogs.com/yvette-hathaway/p/12792836.html