Oracle笔记查询_01
1. 更新.
select * from dept for update;
2.count(*)
3.
select * from dual;
4.
select * from emp;
1 7369 SMITH CLERK 7902 1980/12/17 800.00 20 2 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30 3 7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30 4 7566 JONES MANAGER 7839 1981/4/2 2975.00 20 5 7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30 6 7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30 7 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 8 7788 SCOTT ANALYST 7566 1987/4/19 3000.00 20 9 7839 KING PRESIDENT 1981/11/17 5000.00 10 10 7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30 11 7876 ADAMS CLERK 7788 1987/5/23 1100.00 20 12 7900 JAMES CLERK 7698 1981/12/3 950.00 30 13 7902 FORD ANALYST 7566 1981/12/3 3000.00 20 14 7934 MILLER CLERK 7782 1982/1/23 1300.00 10
5.
select ename "姓 名", sal 工资 from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 1 7369 SMITH CLERK 7902 1980/12/17 800.00 20 2 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30 3 7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30 4 7566 JONES MANAGER 7839 1981/4/2 2975.00 20 5 7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30 6 7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30 7 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 8 7788 SCOTT ANALYST 7566 1987/4/19 3000.00 20 9 7839 KING PRESIDENT 1981/11/17 5000.00 10 10 7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30 11 7876 ADAMS CLERK 7788 1987/5/23 1100.00 20 12 7900 JAMES CLERK 7698 1981/12/3 950.00 30 13 7902 FORD ANALYST 7566 1981/12/3 3000.00 20 14 7934 MILLER CLERK 7782 1982/1/23 1300.00 10
6. /*去重*/
select distinct ename ,job from emp;
7. --- 查询员工年薪 = 月薪*12
8.
select sal*12 +comm from emp;
9 nvl
select sal*12 + nvl(comm,0) from emp;
10. /* 字符串拼接java: + 号拼接oracle特有的连接符 : || 拼接
在oracle 中,双引号主要是别名的时候使用,单引号是使用的只,是
字符
mysql 用 concat(str1,str2)函数,mysql 和oracle中都有
*/
select '姓名:' || ename 姓名 from emp;
select concat('姓名',ename ) from emp;
11.
/*条件查询:{where 后面的写法}
关系运算符: >>= = < <= != <>
逻辑运算符 and or not
其他运算符 like 模糊查询
in(set)在摸个集合内
between ...and... 在某个区间内
is not null 判断是否为空.
*/
---查询每月能得到奖金的员工信息.
select * from emp where comm is not null;
---查询工资在1500---3000之间的员工信息.
select *from emp where sal between 1500 and 3000;
select *from emp where sal>= 1500 and sal<=3000;
---查询名字在摸个范围的员工信息('jones','scott','ford')in
select * from emp where ename in ('jones','scott','ford')
/* 模糊查询like % 匹配多个字符 _ 匹配单个字符串. */
---查询员工姓名第三个字母是o的员工信息.
select * from emp where ename like '__o%';
---查询员工信息姓名中,包含% 的员工信息.
update emp set ename ='TUR%NER' where ename ='TURNER'; SELECT * FROM EMP WHERE ENAME LIKE '%%%'
---以上语法有问题,需要进行转义.
select * from emp where ename like '%\%%' escape '\';
---escape告诉系统这个是转义字符.
/*
排序 : order by
升序: asc ascend
降序: desc decend
*/
---查询信息,按照奖金由高到底排序
select * from emp order by comm desc ; select * from emp order by comm desc nulls last ;
---排序注意空值问题,nulls last 最后排序
.---查询工资和部门编号,按照部门升序排序,工资降序排序.
select ename ,deptno, sal from emp order by deptno asc,sal desc;
函数
/* 函数: 必须有返回值
单行函数 : 对某一行的某个值进行处理
数值函数
字符函数
日期函数
多行函数: 对某一列的所有行进行处理
max() min count sum avg
*/
---统计员工工资总和
select sum(sal) from emp ;
---统计奖金总和
select sum(comm) from emp;
----统计员工人数
select count(1) from emp;
---统计员工的平均奖金
select avg(comm) from emp;---错误
select sum(comm)/count(1) from emp;
select ceil(sum(comm)/count(1)) from emp;
---数值函数
select ceil(45.323) from dual; --46 向上取正 select floor(45.926) from dual; --45 向下取正 - --四舍五入 select round (45.926,2) from dual; ---45.93 ---求余 select mod(9,3) from dual ; --0 --字符函数substr(str1, 起始索引,长度) select substr('abcdefg',0,3) from dual;--abc ---获取字符串的长度 select length('abcdf') from dual; select trim(' hello ') from dual; ---hello
---日期函数
select sysdate from dual; select add_months(sysdate,3) from dual;---三个月后的今天 select sysdate +3 from dual; --三天后的日期 select sysdate - hiredate from emp; ---入职天数 select ceil(sysdate - hiredate ) from emp; ---入职的周数 select (sysdate - hiredate)/7 from emp; ---入职月份,月数. select months_between( sysdate,hiredate) from emp; ---入职年数 select months_between( sysdate ,hiredate )/12 from emp;
---字符转数值 to number(str)
select 100+'10' from dual;
--数值转字符
select to_char(sal,'$9,999.9') from emp;
--日期转字符 to_char()
select to_char(sysdate, 'yyyy-mm-dd hh:mi:ss') from dual; select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;---24小时制 select to_char(sysdate,'yyyy') from dual;--2020 select to_char(sysdate,'d') from dual; --7 --代表一个星期中的第几天. select to_char(sysdate,'dd') from dual;--03 --代表一个月中的第几天 select to_char(sysdate,'ddd') from dual; --277 代表一年中的第几天 select to_char(sysdate,'day') from dual; ---星期六 ,获取星期. select to_char(sysdate,'dy') from dual; ---星期的简写.
---字符转日期
select to_date('2020-09-30', 'yyyy-mm-dd' ) from dual; --查询1981年 --1985年入职的员工 select * from emp where hiredate between to_date('1981','yyyy') and to_date('1985','yyyy');
--通用函数
/*
通用函数
nvl(参数1,参数2) 如果参数1 =null ,就返回参数2的值.
nvl2(参数1,参数2,参数3) 如果参数1 =null ,就返回参数3,否则返回参数2.
nullif(参数1,参数2) 如果参数1 =参数2,那么返回null,否则返回1
coalesce : 返回第一个不为null的函数
*/
select nvl2(null,5,6) from dual; ---6 select nvl2(1,5,6) from dual;---5 select nullif (5,5) from dual;--null select nullif (5,6) from dual; ---5 select coalesce(null, 3,5,6) from dual; --3
--条件表达式
/* 条件表达式
case 字段:
when 值1 then 值
when 值2 then 值
else
默认值
end
case ..when 通用写法 mysql 和oracle都可以使用.
orcle 特有的写法: decode(字段,if1 ,then1,if2 ,then2,if3,then3 ,else)
*/
--给表中姓名取一个中文名.
select case ename when 'SMITH' then '史密斯' when 'ALLEN' then '艾伦' else '路人甲' end "中文名" from emp;
select decode(ename,'SMITH' ,'史密斯', 'ALLEN' ,'艾伦' ,'路人乙') from emp;
select deptno, avg(sal) from emp group by deptno; select to_char(sysdate, 'yyyy-mm-dd hh:mi:ss') from dual; select sum(comm)/count(1) from emp; select * from tab;