十、Oracle学习笔记:基本查询语句各子句用法


一、查询语句的组成
    select * from tname where 条件 group by colName having 条件 order by colName
    这些子句的先后执行顺序:
    1):from 子句:内部从右往左,从后往前执行
    2):where 子句:内部也是从右向左,从后往前执行条件
      (当有多个条件时,如果某一个条件限制的记录数多,应该写在最右边)
    3):group by 子句:多个字段字段时,从左往右进行分组
    4):having 子句;从左往右执行,但是比较消耗内存,应该尽可能的避免使用
    5):select 子句:选择字段进行显示,通配符'*'表示所有字段,尽量避免使用
    6):order by 子句:查询语句中最后执行的子句
    --因此根据执行顺序,在select中起的别名只能在order by中使用
    

二、基础查询语句:DQL

   select colName1,..... from tname;

1.select子句:查询语句中必不可少的一部分
    select后可以指定要显示字段名,可以使用通配符'*'来代替表中的所有字段名 字段名后可以起列别名,as可以忽略。

(1)去重限制

--关键字distinct,去掉重复的数据,重复数据仅显示一次,(此关键字必须紧跟着select关键字)
--练习:查询员工表中部门号,按部门号排序
  select distinct deptno from emp order by deptno;
--练习:查看员工表中有哪些职位,按照职位长度降序排序
  select distinct job from emp order by length(job);
--练习:查看员工表中有哪些奖金,按照奖金降序排序
  select distinct comm from emp order by comm;

2.from子句:查询语句中必不可少的一部分   
    from后用来指定要操作的表对象,表名也可以起别名,直接在表名后添加别名,不能使用'as'。

--练习:查询员工表中的员工编号,员工姓名,职位,月收入
  select empno 工号,ename 姓名,job 职位,sal+nvl(comm,0) 月收入 from emp;
--练习:查询员工表中的所有员工信息
  select * from emp;                
--练习:查询所有员工信息以及月收入
  select e.*,sal+nvl(comm,0) from emp e;
  select emp.*,sal+nvl(comm,0) from emp;

3.where子句:用来进行条件的限制,查询出来的结果是符合限制条件的记录

(1)符号(=,>,<,>=,<=,!=)限制

--练习:查询工资为1250的员工信息
  select * from emp where sal=1250;  

--多个条件时使用 and 或者 or 进行连接
--练习:查询工资大于1250和工资小于3000;
  select * from emp where sal>1250 and sal<3000;  
--练习:查询工资大于3000或小于1250的员工信息
  select * from emp where sal<1250 or sal>3000;
  select * from emp where sal not between 1250 and 3000;    

(2)区间限制

--当条件在某一区间或不在某一区间内时,[not] between p1 and p2,区间为闭区间,且p1一定小于p2 
--练习:查询工资大于1250和工资小于3000;
  select * from emp where sal between 1250 and 3000; 
--练习:查询工资大于3000或小于1250的员工信息
  select * from emp where sal not between 1250 and 3000;     

(3)in、any、all集合限制 

--当条件为某些固定值时可以使用集合,[not] in     用法:字段名 in (值1,值2,......)   
--练习:查询工资是1250和3000的信息
  select * from emp where sal=1250 or sal=3000;
  select * from emp where sal in (1250,3000);
--练习:查询工资不是1250和3000的信息
  select * from emp where sal!=1250 and sal!=3000;
  select * from emp where sal not in (1250,3000);
--练习:查询工资为1250,1500,3050,10000的员工信息
  select * from emp where sal in(1250,1500,3050,10000);
--练习:查询工资不为1250,1500,3050,10000的员工信息
    select * from emp where sal not in(1250,1500,3050,10000);
    
--当all/any与集合连用时
-->all(p1,p2......)大于集合中最大的
--<all(p1,p2......)小于集合中最小的
-->any(p1,p2......)大于集合中最小的
--<any(p1,p2......)小于集合中最大的
--练习:查询工资比这些工资(1250,2950,3000)都大,都小,任意一个大,任意一个小的员工信息
  select * from emp where sal>all(1250,2950,3000);
  select * from emp where sal<all(1250,2950,3000);
  select * from emp where sal>any(1250,2950,3000);
  select * from emp where sal<any(1250,2950,3000);

(4)关键字 like模糊查询限制

--通配符有两种:
--%:表示0到多个字符
--_:表示单个字符        
--练习:查找信息中第2个字符为L的员工信息
  select * from emp where ename like '_L%';
--练习:查询职位中第三个字符为N的员工信息
  select * from emp where job like '__N%';
--练习:查询10,20部门中,姓名中有E或L的员工信息
  select * from emp where deptno in (10,20) and (ename like '%E%' or ename like'%L%') ;
--练习:查询10,20部门中,姓名中有E和L的员工信息
  select * from emp where deptno in (10,20) and (ename like '%E%' and ename like'%L%');

(5)表达式或函数限制

--条件中可以使用表达式或者函数
--练习:查询年薪大于20000的员工信息
  select * from emp where ((sal+nvl(comm,0))*12)>20000;
--练习:查询姓名叫jones的员工的职位和月薪
  select job,sal+nvl(comm,0) from emp where upper(ename)='JONES';
--练习:查询姓名长度大于5的员工信息
  select * from emp where length(ename)>5;
   

4.order by子句:用来进行数据的显示排序限制

--排序,也是查询子句中的一个子句
--位置:一定是放在查询语句的最后
--用法:order by colName [desc/asc]
--升序:asc,默认情况不写  降序:desc
--练习:查询所有员工信息按照月薪降序排序
  select * from emp order by sal desc;
--练习:查询10和20部门的员工的姓名,部门号,月薪,奖金,按照奖金升序排序
  select ename,deptno,sal,comm from emp where deptno in (10,20) order by nvl(comm,0);
--排序时应该考虑null,null为无穷大
  
--按照两个字段排序:
--逻辑为:先按照第一个字段排序,当值一致时,才会按照第二个字段排序每个字段都有自己的排序规则,两个字段之间用逗号分隔开
--格式:order by colName1 desc,colName2 desc
--练习:查看所有员工信息,按照工资升序,奖金降序排序
  select * from emp order by sal asc,comm desc; 

5:group by子句,通过字段进行分组,字段值一样的为一组,分组字段的列,可以写进select子句中

--格式:group by colName,写在from 或where 后面
--练习:查看每个部门的最高月薪,最低月薪,平均月薪,平均奖金,总人数
  select deptno,max(sal),min(sal),avg(sal),avg(nvl(comm,0)),count(*) from emp group by deptno order by deptno;
--练习:查看每种职位的最高月薪
  select job,max(sal),avg(nvl(comm,0)) from emp group by job;
 
--按照多个字段进行分组(没有数据的值会被自动隐藏了) 
--练习:按照部门和职位进行分组,查看最高月薪,平均奖金
  select deptno,job,max(sal),avg(nvl(comm,0)) from emp group by deptno,job;

6:having子句:分组后再进行过滤作用,写在group by子句后面,起到条件限制的作用

--练习:查看部门平均工资大于两千的部门号
  select deptno from emp group by deptno having avg(nvl(sal,0))>2000;
--练习:查看部门最高月薪大于3000的部门号
  select deptno from emp group by deptno having max(sal)>3000;


  
 

猜你喜欢

转载自blog.csdn.net/qq_38741971/article/details/81412480