oracle学习

Posted CosmosbipinnatusCav

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle学习相关的知识,希望对你有一定的参考价值。

作为一个入门选手,怕忘记,所以所有东西都尽量写下来。(省略oracle11g的安装过程)


一、sqlpuls用sys账户登录

(sqlplus是客户端连上服务器的一个工具)

1.使用cmd控制台登录

sqlplus / as sysdba

2.直接使用sqlplus用户名口令登录

用户名sys口令as sysdba(口令在登录的过程中不会显示)

3.以sys超级用户名,dba角色,超级管理员的身份解锁scott用户,并为Scott用户设置一个密码为123456

解锁用户:alter user scott account unlock;

设置密码:alter user scott identified by 123456;

4.普通用户的登录

sqlplus username/password

注意:在忘记密码的情况下可以选择登录sys来重新修改密码。

5.使用tab表来获取当前用户下的所有对象

显示emp表结构

 查询emp表内容

我们发现这个表格显示有点乱,所以我们可以将每页显示的数据条数和列宽都设置一下

column hiredate format a10;(a10代表10个字母的长度,只可以用a来代表字母)

column empno format 9999;(9代表数字,只可以用9表示)

set pagesize 80;(设置每页的显示条数为80)调整之后的表格如下图所示:


关于select

使用/杠,执行最近一次的SQL语句
/

清屏,属于SQL*PLUS工具中的命令
host cls;

查询emp表的结构
desc emp;

查询emp表的所有内容,*号表示通配符,表示该表中的所有字段,但*号不能和具体字段一起使用
select * from emp;

select empno,ename,sal,deptno from emp;

查询emp表的员工编号,姓名,工资,部门号,列名,大小写不敏感,但提倡大写
select empno "编号",ename "姓名",sal "工资",deptNO "部门号" FROM Emp;

查询emp表的不重复的工作
select distinct job from emp;(distinct只能用于单字段,而不适用多字段)

查询员工的编号,姓名,月薪,年薪(月薪*12)
select empno,ename,sal,sal*12 "年薪" from emp;

查询员工的编号,姓名,入职时间,月薪,年薪,年收入(年薪+奖金)
select empno "编号",ename"姓名",hiredate "入职时间",sal "月薪",sal*12 "年薪",sal*12+comm "年收入" from emp;
注意:如果结果为null,在sqlplus客户端工具中,是不显示null这个值的

解决null的问题,使用NVL()函数,NVL(a,b):如果a是NULL,用b替代;如果a是非NULL,就不用b替代,直接返回a的值\\
select NVL(null,10) from emp;结果有14行记录
select NVL(null,10) from dual;结果有1行记录
select empno "编号",ename"姓名",hiredate "入职时间",sal "月薪",sal*12 "年薪",sal*12+NVL(comm,0) "年收入" from emp; 
注意:null与具体数字运算时,结果为null

使用列别名,查询员工的编号,姓名,月薪,年薪,年收入(年薪+奖金),AS大小写都可且可以省略AS,别名用双引号
select empno AS "编号",ename as "姓名",sal "月薪" from emp;

select empno AS 编号,ename as 姓名,sal 月薪 from emp;
区别
select empno AS "编号",ename as 姓名,sal "月 薪" from emp;

注意:
列名不能使用单引号,因为oracle认为单引号是字符串型或日期型

使用dual哑表或者伪表,使用字符串连接符号||,输出"hello world",在oracle中from是必须写的
select \'hello\' || \' world\' "结果" from dual;

使用sysdate,显示系统当前时间,在默认情况下,oracle只显示日期,而不显示时间,格式:26-4月-15
select sysdate from dual;

使用字符串连接符号||,显示如下格式信息:****的薪水是****美元
select ename || \'的薪水是\' || sal || \'美元\' from emp;

使用spool命令,保存SQL语句到硬盘文件e:/oracle.sql,并创建sql文件
spool e:/oracle.sql;

使用spool off命令,保存SQL语句到硬盘文件e:/oracle.sql,并创建sql文件,结束语句
spool off;

使用@命令,将硬盘文件e:/crm.sql,读到orcl实例中,并执行文件中的sql语句
@ e:/crm.sql;

使用--符号,设置单行注释
--select * from emp;

使用/* */符号,设置多行注释
/*
select
*
from
emp;
*/

注意:

1.列名不能使用单引号,在oracle中单引号是字符串类型或者日期型;

2.SQLPLUS命令是SQLPLUS工具


 关于where语句

查询emp表中20号部门的员工信息
select * from emp where deptno = 20;

查询姓名是SMITH的员工,字符串使用\'\',内容大小写敏感
select * from emp where ename = \'SMITH\';

查询1980年12月17日入职的员工,注意oracle默认日期格式(DD-MON-RR表示2位的年份)
select * from emp where hiredate = \'17-12月-80\';

查询工资大于1500的员工
select * from emp where sal > 1500;

查询工资不等于1500的员工【!=或<>】
select * from emp where sal <> 1500;

查询薪水在1300到1600之间的员工,包括1300和1600
select * from emp where (sal>=1300) and (sal<=1600);

select * from emp where sal between 1300 and 1600;

查询薪水不在1300到1600之间的员工,不包括1300和1600
select * from emp where sal NOT between 1300 and 1600;

查询入职时间在"1981-2月-20"到"1982-1月-23"之间的员工
select * from emp where hiredate between \'20-2月-81\' and \'23-1月-82\';

查询20号或30号部门的员工,例如:根据ID号,选中的员工,批量删除
select * from emp where (deptno=20) or (deptno=30);

select * from emp where deptno in (30,20);

查询不是20号或30号部门的员工
select * from emp where deptno NOT in (30,20);

查询姓名以大写字母S开头的员工,使用%表示0个,1个或多个字符
select * from emp where ename like \'S%\';

注意:
凡是精确查询用=符号
凡是不精确查询用like符号,我们通常叫模糊查询  

select * from emp where ename like \'S\';
等价
select * from emp where ename = \'S\';

查询姓名以大写字母N结束的员工
select * from emp where ename like \'%N\';

查询姓名第一个字母是T,最后一个字母是R的员工
select * from emp where ename like \'T%R\';

查询姓名是4个字符的员工,且第二个字符是I,使用_只能表示1个字符,不能表示0个或多个字符
select * from emp where ename like \'_I__\';

插入一条姓名为\'T_IM\'的员工,薪水1200
insert into emp(empno,ename) values(1111,\'T_IM\');

查询员工姓名中含有\'_\'的员工,使用\\转义符,让其后的字符回归本来意思【like \'%\\_%\' escape \'\\\'】
select * from emp where ename like \'%\\_%\' escape \'\\\';

插入一个姓名叫\'的员工
insert into emp(empno,ename) values(2222,\'\'\'\');

插入一个姓名叫\'\'的员工
insert into emp(empno,ename) values(2222,\'\'\'\'\'\');

查询所有员工信息,使用%或%%
select * from emp;
select * from emp where ename like \'%\';
select * from emp where ename like \'%_%\';

查询佣金为null的员工
select * from emp where comm is null;
注意:null不能参数=运算
null能参数number/date/varchar2类型运算

查询佣金为非null的员工
select * from emp where comm is not null;

查询无佣金且工资大于1500的员工
select *
from emp
where (comm is null) and (sal>1500);

查询工资是1500或3000或5000的员工
select *
from emp
where sal in (4000,10000,1500,3,300,3000,5000);

查询职位是"MANAGER"或职位不是"ANALYST"的员工(方式一,使用!=或<>)
select *
from emp
where (job=\'MANAGER\') or (job<>\'ANALYST\');

查询职位是"MANAGER"或职位不是"ANALYST"的员工(方式二,使用not)
select *
from emp
where (job=\'MANAGER\') or (not(job=\'ANALYST\'));


关于order by

查询员工信息(编号,姓名,月薪,年薪),按月薪升序排序,默认升序,如果月薪相同,按oracle内置的校验规则排序
select empno,ename,sal,sal*12
from emp
order by sal asc;

查询员工信息(编号,姓名,月薪,年薪),按月薪降序排序
select empno,ename,sal,sal*12
from emp
order by sal desc;

查询员工信息,按入职日期降序排序,使用列名
select empno,ename,sal,hiredate,sal*12 "年薪"
from emp
order by hiredate desc;

order by后面可以跟列名、别名、表达式、列号(从1开始,在select子句中的列号)
列名:
select empno,ename,sal,hiredate,sal*12 "年薪"
from emp
order by hiredate desc;

别名:
select empno,ename,sal,hiredate,sal*12 "年薪"
from emp
order by "年薪" desc;

表达式:
select empno,ename,sal,hiredate,sal*12 "年薪"
from emp
order by sal*12 desc;

列号,从1开始:
select empno,ename,sal,hiredate,sal*12 "年薪"
from emp
order by 5 desc;(5的意思是第五列也就是年薪列)

查询员工信息,按佣金升序或降序排列,null值看成最大值
select * from emp order by comm desc;

查询员工信息,对有佣金的员工,按佣金降序排列,当order by 和 where 同时出现时,order by 在最后
select *
from emp
where comm is not null
order by comm desc;

查询员工信息,按工资降序排列,相同工资的员工再按入职时间降序排列
select *
from emp
order by sal desc,hiredate desc;

select *
from emp
order by sal desc,hiredate asc;
注意:只有当sal相同的情况下,hiredate排序才有作用

查询20号部门,且工资大于1500,按入职时间降序排列
select *
from emp
where (deptno=20) and (sal>1500)
order by hiredate desc;

select * from emp where deptno in (10,20,30,50,\'a\');

注意:in后面的类型应该是和该字段的类型一样,如果是数字类型,那括号里都应该是数字类型或者是能转换成数字类型的


 单行函数

单行函数:只有一个参数输入,只有一个结果输出
多行函数或分组函数:可有多个参数输入,只有一个结果输出

测试lower/upper/initcap(首字母大写)函数,使用dual哑表
select lower(\'www.BAIdu.COM\') from dual;
select upper(\'www.BAIdu.COM\') from dual;
select initcap(\'www.BAIdu.COM\') from dual;

测试concat/substr函数,从1开始,表示字符,不论中英文
select concat(\'hello\',\'你好\') from dual;正确
select concat(\'hello\',\'你好\',\'世界\') from dual;错误
select \'hello\' || \'你好\' || \'世界\' from dual;正确
select concat(\'hello\',concat(\'你好\',\'世界\')) from dual;正确
select substr(\'hello你好\',5,3) from dual;
5表示从第几个字符开始算,第一个字符为1,中英文统一处理
3表示连续取几个字符

测试length/lengthb函数,编码方式为UTF8/GBK(赵君),一个中文占3/2个字节长度,一个英文一个字节
select length(\'hello你好\') from dual;
select lengthb(\'hello你好\') from dual;

测试instr/lpad/rpad函数,从左向右找第一次出现的位置,从1开始
select instr(\'helloworld\',\'o\') from dual;
注意:找不到返回0
大小写敏感

hello不足10位在左边写#补齐10位,假如第二位为3,截取多余的(L代表在左边补齐,R代表在右边补齐)
select LPAD(\'hello\',10,\'#\') from dual;
select RPAD(\'hello\',10,\'#\') from dual;

测试trim/replace函数
trim第一个参数是需要被去掉的字符,第二个参数是需要被去掉字符的字符串
replace:在hello字符串中凡是出现l的地方全部用L替代(如果没有找到的话就不替换)
select trim(\' \' from \' he ll \') from dual;
select replace(\'hello\',\'l\',\'L\') from dual;

测试round/trunc/mod函数作用于数值型
select round(3.1415,3) from dual;
select trunc(3.1415,3) from dual;
select mod(10,3) from dual;

当前日期:sysdate = 28-10月-17

测试round作用于日期型(month)
select round(sysdate,\'month\') from dual;

测试round作用于日期型(year)
select round(sysdate,\'year\') from dual;

测试trunc作用于日期型(month)
select trunc(sysdate,\'month\') from dual;

测试trunc作用于日期型(year)
select trunc(sysdate,\'year\') from dual;

显示昨天,今天,明天的日期,日期类型 +- 数值 = 日期类型
select sysdate-1 "昨天",sysdate "今天",sysdate+1 "明天" from dual;

以年和月形式显示员工近似工龄,日期-日期=数值,假设:一年以365天计算,一月以30天计算
select ename "姓名",round(sysdate-hiredate,0)/365 "天数" from emp;

使用months_between函数,精确计算到年底还有多少个月
select months_between(\'31-12月-15\',sysdate) from dual;

使用months_between函数,以精确月形式显示员工工龄
select ename "姓名",months_between(sysdate,hiredate) "精确月工龄" from emp;

测试add_months函数,下个月今天是多少号
select add_months(sysdate,1) from dual;

测试add_months函数,上个月今天是多少号
select add_months(sysdate,-1) from dual;

测试next_day函数,从今天开始算,下一个星期三是多少号【中文平台】
select next_day(sysdate,\'星期三\') from dual;

测试next_day函数,从今天开始算,下下一个星期三是多少号【中文平台】
select next_day(next_day(sysdate,\'星期三\'),\'星期三\') from dual;

测试next_day函数,从今天开始算,下一个星期三的下一个星期日是多少号【中文平台】
select next_day(next_day(sysdate,\'星期三\'),\'星期日\') from dual;

测试last_day函数,本月最后一天是多少号
select last_day(sysdate) from dual;

测试last_day函数,本月倒数第二天是多少号
select last_day(sysdate)-1 from dual;

测试last_day函数,下一个月最后一天是多少号
select last_day(add_months(sysdate,1)) from dual;

测试last_day函数,上一个月最后一天是多少号
select last_day(add_months(sysdate,-1)) from dual;


 

oracle中三大类型与隐式数据类型转换

(1)varchar2变长/char定长-->number,例如:\'123\'->123
(2)varchar2/char-->date,例如:\'25-4月-15\'->\'25-4月-15\'
(3)number---->varchar2/char,例如:123->\'123\'
(4)date------>varchar2/char,例如:\'25-4月-15\'->\'25-4月-15\'

oracle如何隐式转换:
1)=号二边的类型是否相同
2)如果=号二边的类型不同,尝试的去做转换
3)在转换时,要确保合法合理,否则转换会失败,例如:12月不会有32天,一年中不会有13月

查询1980年12月17日入职的员工(方式一:日期隐示式转换)
select * from emp where hiredate = \'17-12月-80\';

使用to_char(日期,\'格"常量"式\')函数将日期转成字符串,显示如下格式:2017 年 11 月4 日 星期六
select to_char(sysdate,\'yyyy" 年 "mm" 月 "dd" 日 "day\') from dual;

使用to_char(日期,\'格式\')函数将日期转成字符串,显示如格式:2017-11-4今天是星期六 15:15:15
select to_char(sysdate,\'yyyy-mm-dd"今天是"day hh24:mi:ss\') from dual;

select to_char(sysdate,\'yyyy-mm-dd"今天是"day HH12:MI:SS AM\') from dual;

使用to_char(数值,\'格式\')函数将数值转成字符串,显示如下格式:$1,234
select to_char(1234,\'$9,999\') from dual;

使用to_char(数值,\'格式\')函数将数值转成字符串,显示如下格式:¥1,234select to_char(1234,\'$9,999\') from dual;
select to_char(1234,\'L9,999\') from dual;

使用to_date(\'字符串\',\'格式\')函数,查询1980年12月17日入职的员工(方式二:日期显式转换)
select * from emp where hiredate = to_date(\'1980年12月17日\',\'yyyy"年"mm"月"dd"日"\');

select * from emp where hiredate = to_date(\'1980#12#17\',\'yyyy"#"mm"#"dd\');

select * from emp where hiredate = to_date(\'1980-12-17\',\'yyyy-mm-dd\');

使用to_number(\'字符串\')函数将字符串‘123’转成数字123
select to_number(\'123\') from dual;


注意:
select \'123\' + 123 from dual;246
select \'123\' || 123 from dual;123123

 

以上是关于oracle学习的主要内容,如果未能解决你的问题,请参考以下文章

Oracle曾经的Oracle学习笔记(8-15)

Oracle学习-Power Designervisio 2003Oracle sql developerOEMexpdp

oracle学习笔记系列------oracle操作例子的专用表

Oracle学习笔记

Python学习--和 Oracle 交互

Oracle 存储过程学习