1.select ename as "aa",sal from emp; //用as关键字,别名用双引
2.select distinct sal from emp; //distinct 去掉重复的行
3.select ename,sal,deptno from emp order by 3 desc,2 desc ; //对数据按照第三列和第二列 从小到大排序
4.select ename,sal from emp where sal between 1000 and 3000; //between and 查询某个区间
5.select ename,sal from emp where sal in (1000,2000,3000); //当条件有多个的时候,用in
6.select ename,deptno from emp where ename like 'J%'; //like 运算,%可以匹配零个或多个字符。
7.select ename,deptno from emp where ename like '_A%'; //这里的_的意思是 第一个字母必须有 是什么无所谓
8.select ename from emp where ename like '%s_%' escape 's'; //这里的escape 意思是将s 定义为转义字符。我们通常是将 / 作为转义字符
9.select ename,comm from emp where comm is null; //用is null 来查询null值的列
10. not 、and 、 or //优先级顺序
-------------------------------------------------------------------------------------------------
字符操作函数
大小写操作函数
lower //将字符串转换成小写
upper //将字符串转换成大写
initcap //将字符串转换成首字母大写
字符串操作函数
concat //将两个字符串连接到一起
length //求字符串字符的长度(个数)
lengthb //求字符串字节的长度
lengthc //求字符串unicode的长度
substr //截取字符串字符的长度
substrb //截取字符串字节的长度
select substr('abcd',m,n) //m为正数的时候表示从头开始截取,为负数的时候表示从尾部开始截取。n表示截取多少位,不写表示截取到尾部
instr //查找字符在字符串中的位置
select instr('abcad','a',1,2); //表示从第一个字符开始查找,第二个字符a在字符串中的位置。0表示没有在父串中找到该子串
trim //将子串从父串中删除,一般用来删除空格
select trim(leading 'a' from 'aabbccaa') from dual;
leading //表示从头开始删
trailing //表示从尾部开始删
both //表示两头都删
replace //将子串在父串中替换
lpad //左对齐
rpad //右对齐
操作数字的函数
round(44.98,m) //四舍五入
trunc(44.98,m) //截断,全部舍弃
以小数点为核心,m为正数,是取小数点后边的数,m为负数,是取小数点前面的数,0表示小数点位
ceil(44.98) //直接进位取整
abs(-44.98) //取绝对值
mod(44.98,m) //对其取余
日期函数
元素 | 结果 |
YYYY | 用数字表示的完整年份 |
YEAR | 拼写出的年份(用英文表示) |
RR | 显示年份,不显示世纪 |
MM | 月份的两位数值 |
MONTH | 月份的完整名称 |
MON | 月份的三个字母缩写 |
DY | 一周中某日的三个字母缩写 |
DAY | 一周中某日的完整名称 |
DD | 用数字表示的月份中某 |
mi | 分 |
ss | 秒 |
select * from nls_session_parameters where parameter='NLS_DATE_FORMAT'; //查看当前日期的显示格式
alter session set nls_date_format='yyyy/mm/dd:hh24:mi:ss';
日期之间可以直接相加减
select months_between(sysdate,hiredate) from dual; //计算两个日期的月间隔
select add_months(hiredate,6) from emp; //给日期加上6个月,只对月有效,年份不可以。
select next_day(hiredate,'friday') from emp; //从指定日期算起,下一个Friday是什么时候。
select last_day(hiredate) from emp; //计算当月最后一天的日期
日期的进位和截取
select round(hiredate,'mm') from emp; //以月份进位
select trunc(hiredate,'mm') from emp; //以月份截取
数据类型的显式转换
日期转化为字符串
select ename,to_char(hiredate,'fmyyyy/mm/dd') from emp; //fm消除前置的零和空格。
数字转换为字符串
元素 | 结果 |
9 | 代表一位数字 |
0 | 强制显示零,但不会改变结果 |
$ | 放置一个浮动的美元符号 |
L | 使用浮动的本地货币符号 |
. | 显示小数点 |
, | 显示作为千位指示符的逗号 |
G | 是千分符 |
D | 是小数点 |
注意:G只能和D一起用 ,只能和.一起使用
select ename,to_char(sal,'L199,999D000') salary from emp;
操作数据为null的函数
nvl(expr1,expr2) //如果 1 为非空就返回1,如果为空就返回2
nvl2(expr1,expr2,expr3) //如果 1为非空,就返回2,如果 1 为空,返回3
nullif(expr1,expr2) //如果1 和 2 相同 就返回空,否则返回 1
coalesce(expr1,expr2) //返回括号内第一个非空的值
case 分支函数
select ename,job,sal,case //标准case语句
job when 'SALESMAN' then 1.1 * sal //这里的when后边不能写大于小于判断条件
when 'MANAGER' then 1.2 * sal
else sal end aa
from emp;
scott@TEST>select ename,job,sal,case //不标准格式的case语句
2 when job='SALESMAN' then sal*1.1
3 when job='CLERK' then sal*10
4 when job='MANAGER' then sal*10 //如果条件出现两次 则只执行第一条命令
5 else sal end aa
6 from emp;
decode 函数改写标准的case语句
scott@TEST>select ename,job,sal,decode
2 (job,'CLERK',1.1*sal
3 ,'SALESMAN',1.2*sal
4 , sal)
5 from emp;
select sum(decode(to_char(hiredate,'yyyy'),'1980',1,0)) "1980"
sum(decode(to_char(hiredate,'yyyy'),'1981',1,0)) "1981"
sum(decode(to_char(hiredate,'yyyy'),'1982',1,0)) "1982"
sum(decode(to_char(hiredate,'yyyy'),'1983',1,0)) "1983" from emp;
分组函数
avg、sum、max、min、count
除了count(*)以外,都忽略null值
如果计算某个列的所有函数,可以这样count(nvl(comm,0))
group by 分组函数
如果两个列有相同的条件,可以放在一起分组。比如说 同一个部门,同一个年龄段的,这样就可以放在一起分组
having 是对条件再次筛选,出现在group by后边
如果有order by 排序,得放在 group by 子句后边
表的连接查询
等值连接:就是两个表有相同的列,当有多个相同的列的时候 要指明连接的列名
非等值连接:两个表没有相同的列,但是一张表和另一张表的某列有关系,比如工资和工资等级判断。
外部连接:比如说 有一个部门编号是40,但是雇员表中40号没有雇员,这个时候 40部门就显示不出来,这个时候需要在 雇员表这边加上 + 来显示,在不含信息的一边加上+。注意,包含一个外部连接的条件 不能使用in运算符,或通过or运算符连接另一个条件
自连接:就是 加个别名访问同一张表
交叉连接
自然连接
使用子句
完全或双向外部连接
外部连接的任意连接条件
子查询
from子句中的子查询
查询工资大于本部门平均工资的员工
select ename,e.deptno,sal from emp e,(select deptno,avg(sal) a from emp group by deptno) b where e.deptno=b.deptno and sal > a;
相互关联的子查询
select ename,sal,deptno from emp e where sal > (select deptno,avg(sal) from emp a where a.deptno=e.deptno) ;
exists 操作
select ename,empno,mgr from emp e where exists(select 1 from emp where mgr=e.empno);
all any
sal > all(select avg(sal) from emp group by deptno)