1 where子句

Where子句的作用:用where子句来指定查询条件

1.1 用法示例

select * from emp where deptno=10;

select * from emp where ename = 'SMITH';

select * from emp where hiredate = '02-4月-81';

注意:

1).字符串和日期值要用单引号括起来

2).字符串大小写敏感

3).日期值格式敏感,缺省的日期格式是'DD-MON-RR‘(RR表示2位数的年份)

1.2 查询条件中使用比较运算符

运算符

含义

>

大于

>=

大于等于

<

小于

<=

小于等于

=

等于

<> ,!=

不等于

IN(set)

出现在集合中

BETWEEN...AND...

介于两值之间(包含边界)

例如:

select * from emp where sal > 2900;

-- 查询部门号不等于30的所有员工信息

select * from emp where deptno <> 30;

--  查询月薪在1600到2900之间的所有员工信息

select * from emp where sal between 1600 and 2900;

select * from emp where ename in('SMITH','CLARK','KING');

1.3 like运算符执行模糊查询

使用like运算符执行模糊查询(通配查询)

% 表示零或多个字符,  _ 表示一个字符

对于特殊符号可使用ESCAPE 标识符来查找

用法举例:

select * from emp where ename like 'S%';

select * from emp where ename like '_A%';

select * from emp where ename like '%\_%' escape '\';

上面的escape表示\后面的字符不被当作特殊字符处理,就是普通的'_'符,将查询ename中带有’_’的所有记录

1.4 IS NULL运算符进行空值判断

使用IS NULL判断某个字段的值是否为空值

select * from emp where comm is null;

select * from emp where comm is not  null;

1.5 查询条件中使用逻辑运算符

select * from emp where deptno = 10 and sal > 1000;

select * from emp where deptno = 10 or job = ‘CLERK’;

select * from emp where sal not in (800, 1500, 2000);

And: 并且  or:或者  not:非

SQL优化问题:

AND:  把检索结果较少的条件放到后面

OR:  把检索结果较多的条件放到后面

1.6 运算符优先级

四种运算符优先级:算术>连接>比较>逻辑

优先级

运算符

1

*   /

2

+  -

3

||

4

= , >,  >=,  <,  <=,   <>

5

IS [NOT] NULL,   LIKE,  [NOT]  IN

6

[NOT]   BETWEEN... AND

7

NOT

8

AND

9

OR

可使用小括号强行改变运算顺序

select * from emp where job='SALESMAN' or job='CLERK' and sal>=1280;

select * from emp where (job='SALESMAN' or job='CLERK') and sal>=1280;

2 在查询中使用函数

2.1 函数概述

使用函数可以大大提高SELECT语句操作数据库的能力。它给数据的转换和处理提供了方便。

函数只是将取出的数据进行处理,不会改变数据库中的值。

Oracle函数分为单行函数和多行函数两大类

单行函数分类:

1. 字符函数     2. 数值函数     3. 日期函数

4. 转换函数     5. 通用函数

多行函数分类:

1.sum()  avg()   仅适用数值型

2.count()   max()   min()   适用任何类型数据

2.2 单行函数

2.2.1 字符函数

使用:

SELECT UPPER('hello world') FROM dual;

2.2.2 数值函数

使用

SELECT ABS(-10) FROM dual;

2.2.3 日期函数

使用:

SELECT last_day(SYSDATE) FROM dual;

SELECT next_day(SYSDATE,'星期一') FROM dual;

2.2.4 转换函数

Oracle的类型转换分为自动类型转换和强制类型转换。

select '12.5'+30 from dual;

select '12.5'||30 from dual;

尽管数据类型之间可以进行自动转换,仍建议使用显式转换函数,以保持良好的设计风格。常用类型转换函数有to_char(), to_date(), to_number()。

tochar(num,format):使用指定格式把数字转换为字符串

select to_char(12304.560,'99999.99') from dual;

select to_char(104.560,'999.99') from dual;

select to_char(14.560,'0099.990') from dual;

tochar(date,format):使用指定格式把日期转换为字符串

日期字符串转换函数:to_char()

to_char()函数可以将日期型数值转换为字符串形式

to_char(date) //缺省转换为'dd-mon-yy'格式

to_char(date,‘format_model’) //转换为模式串指定的格式

使用举例:

select empno, ename, sal, to_char(hiredate,'yyyy-mm-dd') from emp;

SELECT TO_CHAR(sysdate,'YYYY-MM-DD HH24:MI:SS AM DY') FROM dual;

SELECT TO_CHAR(sysdate,'YYYY"年"MM"月"DD"日"') FROM dual;

说明

缺省的日期格式是DD-MON-YY

可使用sysdate函数获取当前系统日期和时间

日期字符串转换函数:to_date()

to_date()函数可以将字符串转换为日期类型

格式:

to_date(char) //按缺省格式进行解析

to_date(char,‘format_model’) //按模式串指定的格式进行解析

使用举例

insert into test2 values('Tom', to_date('2008-02-28 ', 'yyyy-mm-dd '));

问题:查询入职时间某个时间点之后的员工信息

--1.使用to_char()

--2.使用to_date()

--3.使用默认的时间格式

2.2.5 通用函数

A.通用函数:NVL()函数

NVL()函数用于将空值null替换为指定的值,适用于字符、数字、日期等类型数据。

语法格式:NVL(exp1, exp2)

说明:如果表达式exp1的值为null,则返回exp2的值,否则返回exp1的值。

用法举例:

select empno, ename, sal, comm, sal + nvl(comm, 0) from
emp;

select empno, ename, hiredate, nvl(hiredate, sysdate)
from emp;

B.通用函数:NVL2()函数

NVL2()函数用于实现条件表达式功能。

语法格式:NVL2(exp1, exp2, exp3)

说明:如果表达式exp1的值不为null,则返回exp2的值,否则返回exp3的值。

用法举例:

select empno, ename, sal, comm, nvl2(comm,
sal+comm, sal)  total from emp;

2.3 多行函数

多行函数:对一组数据进行运算,针对一组数据(多行记录)只返回一个结果,也称分组函数或聚合函数

多行函数示意图如下:

2.3.1 常用多行函数

1. sum() ,avg() :  仅适用数值型,sum()是求和,avg()求平均值

2. count()  
max()   min() :  适用任何类型数据

使用示例:

select avg(sal), max(sal), min(sal), sum(sal) from emp;

select max(hiredate), min(hiredate) from emp;

2.3.2 多行函数与空值

多行函数除了count(*)外,都跳过空值而处理非空值

select count(comm),sum(comm),avg(comm) from
emp;

可使用NVL()函数强制多行函数处理空值

select count(nvl(comm,0)),sum(nvl(comm,0)),avg(nvl(comm,0))
from emp;

2.3.3 count函数说明

count(*)返回组中总记录数目(总行数);

count(exp)返回表达式exp值非空的记录数目;

count(distinct(exp))返回表达式exp值不重复的、非空的记录数目。

select count(*) from emp;

select count(comm) from emp;

select count(distinct(deptno)) from emp;

select count(nvl(comm,0)) from emp;

2.3.4 GROUP BY子句

GROUP BY 子句将表中数据分成若干小组

语法格式:

select column, group_function(column)

from table

[where condition]

[group by
group_by_expression]

[order by column];

说明:1)语法中用中括号括起来的部分是可选的,即可有可无;

2)WHERE一定放在FROM后面

使用举例

select deptno, avg(sal) from emp group by
deptno;

select 
deptno, job, count(*),avg(sal) from emp group by deptno, job;

注意事项

1. 在SELECT列表中的字段,如果没有包含在多行函数中,则该字段必须出现在GROUP
BY子句中。

错误:select deptno,job,sum(sal) from emp group by deptno

2.包含在GROUP BY子句中的字段不必出现在SELECT列表(查询字段)中。

select avg(sal) from
emp group by
job

3.如果没有GROUP BY子句,SELECT列表中不允许出现字段(或单行函数)与多行函数混用的情况

select empno, sal from emp; //合法

select avg(sal) from emp; //合法

select empno, avg(sal) from emp; //非法

4.不能在WHERE 子句中使用分组函数

错误:select deptno, avg(sal)   from emp

where avg(sal) > 2000  group by deptno;

2.3.5 HAVING子句

对分组查询的结果进行过滤,要使用having子句。

having子句过滤分组后的结果,它只能出现在group by子句之后,而where子句要出现在group by子句之前。

where过滤行(在分组前筛选数据),having过滤分组(分组后筛选数据)。having支持所有where操作符。

语法格式

select column, group_function(column)

from table

[where condition]

[group by 
group_by_expression]

[having
group_condition]

[order by column];

执行过程:from--where
-- group  by
– having– select-- order  by

用法举例

1.在emp表中,列出工资最小值小于2000的职位。

错误:select job,min(sal) from emp where
min(sal)<=2000

正确:Select job,min(sal) from emp group by job
having min(sal)<2000

2.列出平均工资大于1200元的部门和职位,并按部门,职位升序排列

select deptno, job, avg(sal)   from emp

group by deptno,job  having avg(sal) > 1200  order by deptno,job;

思考:

1.统计人数小于4的部门的平均工资。

2.统计各部门的最高工资,排除最高工资小于3000的部门。

2.3.6 嵌套多行函数

将一个多行函数嵌套在另一个多行函数中,称为嵌套多行函数。

用法举例

显示各部门平均工资的最大值

select max(avg(sal))   from emp  group by deptno

3.DML

3.1 插入数据

insert语句用于向表中插入数据,方式有两种,一种是记录值的插入,一种是查询结果的插入

3.1.1记录值的插入

语法:INSERT INTO table
[(column [, column...])] VALUES (value [, value...]);

特点:一次插入操作只插入一行数据(1个记录)

插入数据时,可以为所有列提供数据(添加所有列),也可为部分列提供数据

A. 添加所有列(字段)

例如:

insert into emp
(empno,ename,job,mgr,hiredate,sal, comm, deptno)
values(1111,'gao','clerk',7902,sysdate, 10000,3000,30)

此处插入的记录中列的个数、顺序与emp的结构完全一致,因此表名之后的列名可以省略不写,如下所示:

insert into emp
 values(2222,'gaohs','clerk',7902,sysdate,10000,3000,20)

B. 添加部分列

insert into emp(empno,ename)  values
(3333,'xiaozhang')

但要求省略的列必须满足下面的条件:

1).该列定义为允许Null值。

2).在表定义中给出默认值,这表示如果不给出值,将使用默认值。

如果不符合上面两个条件,将会报错。不能成功插入。

注意:字符和日期型数据应包含在单引号中

3.1.2查询结果插入

可以用insert语句把一个select语句的查询结果插入到一个表中,语法如下:

Insert into tablename (column,..)

select column,..  from tablename2

用法举例:

A.先创建一个表

create table temp As select * from
emp where 1 = 2

B.执行插入

insert into temp select * from emp;

3.2 更新数据

Update语句用于修改表中记录的某些列,其语法如下:

UPDATE table

SET column
= value [, column = value] …

[WHERE condition];

其语义是:修改表中满足条件表达式的那些记录的字段值,需修改的字段值在set子句中指出。

UPDATE TEMP  SET
ENAME='张三',SAL=10000  WHERE
empno=7369;

3.3 删除数据

删除数据有两种方式,分别如下:

3.3.1 使用DELETE删除

DELETE语句用于从表中删除数据,语法如下:

DELETE [FROM]  table  
[WHERE condition];

当有where子句时,其语义是从表中删除满足条件表达式的记录

DELETE FROM TEMP WHERE EMPNO=7369;

delete from table,语义是 从表中删除所有记录

3.3.2 使用Truncate删除

使用Truncate语句是删除表中的所有记录,与不带where子句的delete功能相同

语法格式: Truncate
[table]  table_name;

例如:Truncate table temp

注意:当需要删除表中所有的行时,不要使用delete,可使用truncate
table 语句,完成相同的工作,但是速度更快。

Truncate与delete的比较:

1).Delete语句删除时会把删除的每一行记录在日志中,而Truncate不记录删除的每一行,它删除所有记录并释放记录占用的空间,因而速度更快。

2). Delete删除的数据在未提交前可以恢复(执行”回滚”即可),而Truncate删除的数据不能恢复

Oracle总结二的更多相关文章

  1. Oracle GoldenGate 二、配置和使用

    Oracle GoldenGate 二.配置和使用 配置和使用GoldenGate的步骤 1 在源端和目标端配置数据库支持GoldenGate 2 在源端和目标端创建和配置GoldenGate实例 3 ...

  2. 7.26实习培训日志-Oracle SQL(二)

    Oracle SQL(二) 条件表达式 CASE 语句 或者DECODE 函数,两者均可实现 IF-THEN-ELSE 的逻辑,相比较而言,DECODE 更加简洁 SELECT last_name , ...

  3. Oracle笔记二

    一.数据库语言分类  二.DML之数据插入 把一个表中的数据查询出来插入另外一个表中. create table student(id number,name varchar2(20),age num ...

  4. 26、Oracle(二)

    1)掌握多行函数与分组操作 2)掌握多表查询与子查询 3)理解集合查询与掌握Oracle分页语法 4)理解创建.修改和删除表和表约束 --------------------------------- ...

  5. Oracle(二)在 Mysql 的基础上学习 Oracle

    毕竟我是先学的mysql,对数据库的一切认知都会有一个先入为主的思想在里面,如果不搞清楚其中的异同,我感觉Oracle我是学不会 了,甚至会把它们混淆.那么,不会mysql的没必要往下看了. 下边第一 ...

  6. Java基础——Oracle(二)

    一.Oracle 中的几个服务 1.OracleDBConsoleorcl 进程:nmesrvc.exe oem控制台服务进程,dba用.Oracle Enterprise Manager(Oracl ...

  7. Oracle(二)SELECT语句执行顺序

    转载自:小强斋太-Study Notes,原文链接 从join on和where执行顺序认识T-SQL查询处理执行顺序 目录 一.样例 二.SELECT语句的处理过程 1. FROM阶段 2. WHE ...

  8. oracle入门(二)

    ### 一,视图 ```1. 什么是视图    视图是一张虚表, 可以把视图看成表使用(增删改查),视图中没有数据,所有的数据都在基本表中(tables)    封装了一个复杂的DQL    操作视图 ...

  9. Oracle【二维表管理:约束】

    1.简单的表创建和字段类型最简单的方式去创建表(没有添加主键之类的约束条件)[Oracle的字段类型]number:数值类型--整数类型:number(a) 总长度a--小数类型:number(a,b ...

  10. oracle之二表的几种类型

    Oracle中表的几种类型 1.表的功能:存储.管理数据的基本单元(二维表:有行和列组成)2.表的类型: 1)堆表:heap table :数据存储时,行是无序的,对它的访问采用全表扫描. 2)分区表 ...

随机推荐

  1. 提高Linux运维效率的命令行常用快捷键

    提高Linux运维效率的命令行常用快捷键 tab 命令或路径等的补全键,Linux最有用快捷键 Ctrl+a 光标回到命令行首 Ctrl+e 光标回到命令行尾 Ctrl+k 剪切(删除)光标处到行尾的 ...

  2. Java字符串池(String Pool)深度解析

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 在工作中,String类是我们使用频率非常高的一种对象类型.JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存 ...

  3. React.js 三周 -- 入门到搭建团队基础项目

    吐槽 公司自己的产品,由于历史遗留问题,前端一直是和java放到一个项目里写的. 导致了,前端就被死死的绑在了IDEA战车上.想要看页面效果,先起几个java服务.想要调试一个改动,重启个java服务 ...

  4. source insight 添加 python 支持

    从http://www.sourceinsight.com/public/languages/下载Python的配置文件Python.CLF 选择Options > Preferences,单击 ...

  5. Liferay开发人员培训计划

    第1节 1.介绍适合和不适合Liferay的一些应用领域2.安装Liferay开发环境,下载Liferay源码:3.配置Liferay bundle.Liferay SDK,配置数据库:4.Lifer ...

  6. spring boot -thymeleaf-日期转化

    <span th:text="${#dates.format(date)}" ></span><span th:text="${#dates ...

  7. 同时使用 Ant Design of React 中 Mention 和 Form

    使用场景,在一个列表中,点击每一行会弹出一个表单,通过修改表单数据并提交来修改这一行的数据,其中某个数据的填写需要通过Mention实现动态提示及自动补全的功能. 具体效果为: 遇到的问题: 1.希望 ...

  8. 理解 Python 的执行方式,与字节码 bytecode 玩耍 (上)

    这里有个博客讲 Python 内部机制,已经有一些中文翻译. 可能因为我用的Python 3.5,例子跑起来有些不一样. 此外,我又查了其他一些参考资料,总结如下: Python 的执行方式 先看一个 ...

  9. 分布式协调服务ZooKeeper的典型应用

    Zookeeper典型应用 参考官方文档: http://zookeeper.apache.org/doc/current/recipes.html Out of the Box Applicatio ...

  10. 删除.svn 脱离svn版本控制器

    1.for /r . %%a in (.) do @if exist "%%a\.svn" rd /s /q "%%a\.svn" 复制到记事本,将记事本保存为 ...