Java Learn(二十)

OraclSQL 中 where、like 以及一些常用函数

WHERE

where 字句用于条件查询,比如:查询工资超过1000的员工信息(编号/姓名/工资)

select empno,ename,sal from emp where sal > 1000;

select empno,ename,sal from emp where ename = 'KING';

where 后面的运算符:

< >= <= != =

between a and b 在a和b之间,包括a和b(双闭区别)

in(a,b,c) a或者b或者c not in(a,b,c) 不是a b c

like '' 模糊查询

is null is not null 与空值比较 不能用 = 或者 !=

逻辑运算符

and - 并且关系

or - 或者关系

not - 取反

查询工资在1000到1500之间的员工信息

select empno,ename,sal from emp where sal between 1000 and 1500;

select empno,ename,sal from emp where sal >= 1000 and sal <=1500;

经验:尽可能把出现频率高的数据放在in的前面

LIKE

模糊查询就是条件不完整的情况下,对数据进行查询,一般针对字符串

查询名字中包括ar的员工信息

字段 like ‘格式’

其中,格式中包括 模糊的数据,

  %代表0-n个任意字符

  _ 代表1个任意字符

like '%AR%' 名字中包含AR的员工

select empno,ename,sal from emp where ename like '%AR%';

不具备普及性,使用函数

select empno,ename,sal from emp where '%'||ename like '\%AR%' escape '\';

如果被模糊查询的数据中包括%或_ 需要使用escape指定转义字符

select empno,ename,sal from emp where comm is null;

select empno,ename,sal from emp where comm is not null;

and 和 or的优先级不同,and先算,因此如果多条件时,用括号提升优先级

select empno,ename,sal from emp where sal>1000 and deptno=30 or deptno =20;

select empno,ename,sal from emp where deptno=20 or deptno=30 and sal>1000;

select empno,ename,sal from emp where (deptno=20 or deptno=30) and sal>1000;

order by

排序语句 order by

默认升序,如果需要降序,在后面加上desc

order by 字句放在SQL语句的最后面,允许多个字段同时排序,次序就是第一个字段相等,按第二个排

空值默认为最大

select empno,ename,sal from emp order by sal;

select empno,ename,sal from emp order by sal desc;

select empno,ename,sal from emp order by comm;  带空值排序

select empno,ename,sal from emp order by 3;

select empno,ename,sal from emp order by sal,ename desc; 只降序名字?

Oracle函数

函数分为单行函数和多行函数(分组函数),单行函数就是一行进,一行出。

多行函数就是多行进,一行出。

单行函数包括:

   字符函数 ---处理字符串的函数

   数值函数 ---处理数值类型的函数

   日期函数 ---处理日期类型的函数

   转换函数 ---文本类型和数值类型的转换/文本类型和日期类型的转换

   其他函数 ---其他的函数,比如:nv1()

字符函数:

upper() ---所有字母全大写

lower() ---所有字母全小写

initcap()---所有单词首字母大写

length() ---文本的长度

substr() ---截取子串

测试表
dual 表是一个虚表,里面只有一个字段,但字段类型没有限制。

select 1+1 from dual;

    select sysdate from dual; --系统的当前时间,是日期函数

    select upper('hello SQL')from dual; 

    select lower('hello SQL')from dual;

    select initcap('hello SQL')from dual;

    select length('hello SQL')from dual;

    select substr('hello SQL',2,3)from dual; 2是从起始位置(从1开始)

数值函数:

round() --- 四舍五入

trunc() --- 舍弃后面的数

select round(1234.567,2)from dual; 2134.57

   select round(1234.567,0)from dual; 1235

   select round(1234.567,-2)from dual; 1200

   

   select trunc(1234.567,2)from dual; 1234.56

   select trunc(1234.567,0)from dual; 1234

   select trunc(1234.567,-2)from dual; 1200  ----添0是为了保持权重;

日期函数:

sysdate --系统时间,就是现在的时间

select sysdate-1 from dual; -- 昨天,日期支持加法和减法

日期在Oracle中包括:世纪/年/月/日/时/分/秒,如果两个日期相等,需要7个部分相等

转换函数:

to_number() --文本转数字,不重要

to_char() --数字转文本,不重要

to_date() --文本转日期,重要 插入数据时使用较多

to_char() --日期转文本,重要 查询数据时使用较多

数字和文本的转换,第一个参数是需要转换的数据,第二个参数是格式,包括:

 9  代表任意一个数字,在小数点前面没有强制性,在后面要补0

 0  代表任意一个数字,有强制性,要补0

 $  代表美元符号

 , 代表千分位
select to_char(1234.567,'$00000.0000')from dual;

     select to_char(1234.567,'$99999.9999')from dual;

     select to_char(1234.567,'$99,999.9999')from dual; 
     -- 文本转数字

日期和文本的转换

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')from dual;

-- 小写可以

select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')from dual;

-- 大写也实现了。使用上不区分大小写,是因为实现了两次

练习:查询入职时间是今天的所有员工信息(编号/姓名/工资/入资时间)不包括年

select empno,ename,hiredate from emp 
where to_char(sysdate,'mm-dd') =  to_char(hiredate,'mm-dd');

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

to_date() -文本转日期

select to_date('2013-05-08','yyyy-mm-dd')from dual;

单行函数可以无限次的嵌套。

查询每个名字的后3个字母

select ename,substr(ename,length(ename)-2,3)from emp;

重要的单行函数: upper/lower/length/substr/to_char/to_date/nvl/sysdate

多表连接

select empno,ename,sal,deptno from emp;

如果查询的数据来自于两张或者多张表,需要使用多张表连接进行查询。

默认情况下,多表连接查询时,会把两个表的数据拼起来,叫笛卡尔积。可以用where条件

从笛卡尔积中筛选出有效数据.

select empno,ename,dname,emp.deptno,dept.deptno from emp,dept
where emp.deptno = dept.deptno;

使用别名可以简化表名:

select e.empno,e.name,d.dname,e.deptno,d.deptno from emp e,dept d
where e.deptno = d.deptno;

笛卡尔积效率比较低,因此多表连接时,表的数量不宜过多,一般4-5张最多

语法:

select 表名1.字段1,.....表名2.字段1,....from 表名1 别名1,表名2 别名2
where 连接的条件;

其中,表名也可以使用别名。