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学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- Oracle学习线路
出自huyangg的博客,地址是:oracle学习路线图 1.sql.pl/sql(网上有很多的视频,可以做一个简单的入手,然后看几本书,多做实验) 作为oracle的基本功,需要大家对sql和 ...
- Oracle学习指南
Oracle学习指南 你走的那天,我决定不落泪,迎着风撑着眼帘用力不眨眼 创建数据库.创建用户.创建表空间.创建表.插入数据..... 1.用系统用户登录,任选系统用户 代码: >>sql ...
- Oracle学习系列1-7
Oracle学习系列1 两个服务必须启动: OracleOraDb10g*TNListener 和 OracleService*** 使用sqlplusw先进行环境的设置 set linesize 3 ...
- Oracle学习系列7
Oracle学习系列7 ************************************************************************************ 关联表 ...
- Oracle学习系列6
Oracle学习系列6 ************************************************************************************ 删除约 ...
- Oracle学习系列5
Oracle学习系列5 ************************************************************************************ ,掌握 ...
- Oracle学习系列4
Oracle学习系列4 ************************************************************************************ 数据库 ...
- Oracle学习系列3
Oracle学习系列3 ************************************************************************************ 多表查 ...
- oracle学习笔记(一)用户管理
--oracle学习第一天 --连接 @后面连接数据库实例,具体连接到那个数据库 conn scott/tiger@MYORA1; --修改密码 passw; --显示用户 show user; -- ...
随机推荐
- 关于Springmvc中include与Sitemesh装饰器的基本使用
关于Springmvc中include与Sitemesh装饰器的使用 !!!转载请注明出处=>http://www.cnblogs.com/funnyzpc/p/7283443.html 静态包 ...
- Phabricator API Go 创建task/提交文件到Phabricator
Go Phabricator API 代码/程序创建task/提交文件到Phabricator Creat Task or upload file to phabricator with code i ...
- hihoCoder #1038 : 01背包(板子题)
#1038 : 01背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励 ...
- codeforces A. Orchestra B. Island Puzzle
A. Orchestra time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- c++(选择排序)
选择排序是和冒泡排序差不多的一种排序.和冒泡排序交换相连数据不一样的是,选择排序只有在确定了最小的数据之后,才会发生交换.怎么交换呢?我们可以以下面一组数据作为测试: 2, 1, 5, 4, 9 第一 ...
- i++是否原子操作?并解释为什么?
都不是原子操作.理由: 1.i++分为三个阶段: 内存到寄存器寄存器自增写回内存这三个阶段中间都可以被中断分离开. 2.++i首先要看编译器是怎么编译的, 某些编译器比如VC在非优化版本中会编译为以 ...
- Vue中的$set的使用
在我们使用vue进行开发的过程中,可能会遇到一种情况:当生成vue实例后,当再次给数据赋值时,有时候并不会自动更新到视图上去: 当我们去看vue文档的时候,会发现有这么一句话:如果在实例创建之后添加新 ...
- sql server2008数据库复制实现数据同步常见问题
sql server2008数据库复制实现数据同步常见问题 在原作者基础上追加 sql server2008数据库复制实现数据同步常见问题 23.发布 'xx' 的并发快照不可用,因为该快照尚未完全生 ...
- pylint python2.7 安装记录
环境:python 2.7.11 ; 源码安装:configparser 3.5.0; 如果出现以下error,请用源码更新configparser至3.5.0版本 具体error没有抓下来,主要是报 ...
- 一步步部署基于Windows系统的Jenkins持续集成环境
如题:本文将介绍如何在Windows环境下运用Jenkins部署持续集成环境.之所以写本文,是因为在最近工作当中,学习使用Jenkins时,确实遇到了一些问题,而大多数教程文档都是基于Mac或是Lin ...