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