oracle简单查询语句

学习oracle数据库也有一段时间了,现在将一些前期的总结再拿出来总结一下,希望能对初学习或自学的朋友有一定的帮助。

所需的表: (以下操作只涉及到ORACLE数据库中的emp表,如果没有表的朋友可以找我要,但基本都有的)

1.完整的查询语句(可以先了解一下完整的查询语句,下面再一步一步来)

SELECT ‘数据源中的某些具体的字段、函数、常量、*’

FROM  ‘数据源’

WHERE  ‘查询条件’

GROUP BY    ‘分组’           HAVING  筛选条件

ORDER BY  ‘排序’

语法解释:

从数据源中,按条件筛选出部分数据,对该部分数据以某规则进行分组,从分组后的结果中

再一次进行筛选,最终查出需要的字段,并以某排序规则进行排序

连接:||

    1. 逻辑运算

逻辑运算符:  =(等于),>=(大于等于),<=(小于等于),!=(不等于),< >(不等于),>(大于),<(小于)

注意点:空值不参与运算

--查询薪资大于1500的员工
SELECT * FROM EMP WHERE SAL>1500;

函数拓展:

字符串转日期:TO_DATE('字符串','与字符串对应的日期格式')

--查询1981年11月17日入职的员工(emp表中的日期都是很早的了)
SELECT * FROM EMP WHERE HIREDATE=TO_DATE('1981/11/17','YYYY/MM/DD');

日期转字符串:TO_CHAR('日期','日期转成字符串的目标格式')

SELECT * FROM EMP WHERE TO_CHAR(HIREDATE,'YYYYMMDD')='19811117';

    1. 模糊查询

LIKE:

谓词LIKE可以用来进行字符串的匹配

LIKE:符合

NOT  LIKE:不符合

通配符:

_:有且只有一个字符

%:有零个或者一个或多个字符

转义字符:ESCAPE  ‘/’  :要查询含有_和%的字符串需要将_和%转义为普通的字符,不然查询不了。

例子:

--查询首字母是S的员工
SELECT * FROM EMP WHERE ENAME LIKE 'S%';

--查询首字母不是S的员工
SELECT * FROM EMP WHERE ENAME NOT LIKE 'S%';

转义字符的运用(当需要查询的字段的数据含有%或下划线的时候需要加上转义字符,将通配符转义成普通的符号)如下:

--查询姓名中含有%的员工
SELECT * FROM EMP WHERE ENAME LIKE '%/%%' ESCAPE('/');

注意:/之后的%已经不是通配符%了,经过转义,它现在只是一个%符号。

    1. 包含查询

IN( ):

谓词IN可以用来查找属性值属于指定集合的元组,只要不在该集合中即条件成立。

集合:一组有着相同属性(相同数据类型)的数据

IN( ):包含

--查询10号和20号部门的员工
SELECT * FROM EMP WHERE DEPTNO IN(10,20);

NOT IN( ):不包含

--查询除了10号和20号部门外的所有员工
SELECT * FROM EMP WHERE DEPTNO NOT IN(10,20);

    1. 范围查询

BETWEEN AND  ‘在。。到。。之间’

NOT BETWEEN AND ‘不在。。到,,之间’

语法:SELECT COL_LIST FROM TB_NAME WHERE COL_NAME BETWEEN NUM1 AND NUM2;

--查询薪资在1500到2500的员工(包含1500和2500)
SELECT * FROM EMP WHERE SAL BETWEEN 1500 AND 2500;

注意:1.NUM1<=NUM2

  1. 包含边界值
    1. NULL值判断

NULL:空值

NOT NULL:非空 (前面都跟IS)

语法:SELECT COL_LIST FROM TB_NAME WHERE COL_NAME IS NULL ;

--空值

--查询奖金为空的员工
SELECT * FROM EMP WHERE COMM IS NULL;

SELECT COL_LIST FROM TB_NAME WHERE COL_NAME IS NOT NULL ;

 --非空值

--查询奖金不为空的员工
SELECT * FROM EMP WHERE COMM IS NOT NULL;

    1. ANY和ALL

ANY --任意一个

--查询10号和20号部门的员工
SELECT * FROM EMP WHERE DEPTNO=ANY(10,20);

注意:只要部门编号等于any里的任意一个就行,这与in有些相像,

但如果是>any()的话,只需要大于里面最小的行;如果是<any()的话只要小于里面最大的就行。

ALL --所有全部

SELECT * FROM EMP WHERE DEPTNO=ALL(10,20);

没有结果,因为这需要部门编号等于(10,20)的才行,这在表里是不存在的;当>all()时,需要大于里面最大的才行;而<all(),则是小于里面最小的才符合。

    1. 布尔连接

语法:

SELECT COL_NAME FROM TB_NAME WHERE CONDITION1 AND CONDITION2;

SELECT COL_NAME FROM TB_NAME WHERE CONDITION1 OR CONDITION2;

条件连接关键词:AND 和(且)  OR 或

注意:

1)通过布尔连接,可以合并相同字段的条件,也可合并不同字段的条件

--相同字段的条件
--查询部门编号是10号或20号的员工
SELECT * FROM EMP WHERE DEPTNO=10 OR DEPTNO=20;

--不同字段的条件
--查询部门编号是10号和岗位是CLERK的员工
SELECT * FROM EMP WHERE DEPTNO=10 AND JOB='CLERK';

2)AND和OR一块使用时 AND的优先级高于OR

3)如果有小括号 先考虑括号中的条件

2.0 排序查询

语法:

SELECT COL_LIST FROM TB_NAME ORDER BY ODR_CONDITION [ASC|DESC];

语法解释:

对于从TB_NAME中查出的COL_LIST数据按照规则ODR_CONDITION进行排序

ASC:升序(不写的话默认升序)                                          DESC:降序

--按薪资降序排
SELECT * FROM EMP ORDER BY SAL DESC;
--按薪资升序排
SELECT * FROM EMP ORDER BY SAL;

函数扩展:

1)NULL值的默认排序与强制排序

  NULL值默认排序为极大值,即升序排列时,空值排在最后,降序排列时,空值排在最前

  强制空值排在最前:NULLS FIRST

SELECT * FROM EMP ORDER BY COMM NULLS FIRST;

  强制空值排在最后:NULLS LAST

SELECT * FROM EMP ORDER BY COMM NULLS LAST;

2)函数NVL()

  用法:NVL(COL_NAME,DEFAULT_VALUE)

--给没有奖金的员工加100奖金
SELECT ENAME,NVL(COMM,100) FROM EMP;  --当comm字段的数据为空时,给它复制100;

3)函数CASE

  用法:

CASE WHEN CONDITION1 THEN RESULT1

     WHEN CONDITION2 THEN RESULT2

     ...

     ELSE DEFAULT_RESULT

 END

--薪资小于等于1500的为低工资,大于1500,小于2500的为中工资,大于或等于2500的为高工资
SELECT A.*,
       CASE
         WHEN SAL <= 1500 THEN
          '低工资'
         WHEN SAL > 1500 AND SAL < 2500 THEN
          '中工资'
         WHEN SAL >= 2500 THEN
          '高工资'
       END 待遇情况
  FROM EMP A;

3.0 分组查询

聚合函数

概念:把分散的数据按某种规则将数据分成不同的组、或所有数据整体作为一个组,对组级别的数据进行分析,每组得到一个返回值。

五个聚合函数:

SUM():求合计值

  --求所有员工的薪资合计
  SELECT SUM(SAL) FROM EMP;

MAX():求最大值

  --求最大薪资
  SELECT MAX(SAL) FROM EMP;

MIN():求最小值

 --求最小薪资
SELECT MIN(SAL) FROM EMP;

AVG():求平均值

  --求工资的平均薪资
  SELECT AVG(SAL) FROM EMP;

COUNT():计数

--求所有人数
  SELECT COUNT(ENAME) FROM EMP; 

注意:

1)所有聚合函数都是针对非空值进行的统计

2)COUNT()的特殊用法:若是在不确定哪些字段不含空值的情况下统计总数据量,可以使用COUNT(1)或COUNT(*)来统计

3)SUM和AVG只针对数值,其他三个可针对任意类型

GROUP BY ‘分组查询’  

语法:

SELECT COL_LIST,聚合函数,常量

  FROM TB_NAME

 GROUP BY COL_LIST;

语法解释:

对数据源TB_NAME按照COL_LIST分组,统计各分组的分析情况

--统计各部门的平均薪资
SELECT DEPTNO,AVG(SAL) FROM EMP GROUP BY DEPTNO;

注意:

1.对于含有GROUP BY子句的SQL语句,SELECT子句中仅允许出现

  1)GROUP BY中出现过的字段

  2)聚合函数

  3)常量

2.对于不含有GROUP BY子句但SELECT子句中含有聚合函数的情况,SELECT子句中除聚合函数与常量外,不能再出现其他字段

分组过滤

语法:

SELECT COL_LIST,聚合函数,常量

  FROM TB_NAME

 GROUP BY COL_LIST

HAVING 以聚合函数为基础的条件判断;

语法解释:

对数据源TB_NAME按照COL_LIST分组,统计各分组的分析情况,并对分析结果进行筛选

--查询平均薪资大于1500的部门
SELECT DEPTNO FROM EMP GROUP BY DEPTNO HAVING AVG(SAL)>1500;

WHERE与HAVING的区别和联系

1.都是做条件筛选用的

2.WHERE不必和GROUP BY连用,HAVING必须和GROUP BY连用

3.WHERE筛选的是针对FROM后表的数据,HAVING是针对GROUP BY分组之后的数据进行筛选

4.WHERE中的部分条件可以写在HAVING中,但非常影响执行效率,不建议使用

5.只有在GROUP BY子句中出现的字段,才能够由WHERE子句中转写到HAVING子句中

6.WHERE 后面不能跟聚合函数

区分:

书写顺序:SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...

执行顺序:FROM ... WHERE ... GROUP BY ... HAVING ... SELECT ... ORDER BY ...

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值