Oracle数据库之oracle的基本语句
小标 2018-09-10 来源 : 阅读 1018 评论 0

摘要:本文主要向大家介绍了Oracle数据库之oracle的基本语句,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助。

本文主要向大家介绍了Oracle数据库之oracle的基本语句,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助。

oracle的基本语句

sql中的select 语句

spool d:\基本查询.txt 
--spool 录屏所录的为文本文件
--清屏
host clear(linux)
host cls (window)
--当前用户
show user
--当前用户下的表
select * from tab;(tab数据字典,表和视图)
--员工表的结构
desc emp
empno 员工号 ename 员工名字 job 工作 mgr 老板
hiredate 入职日期 sal 月薪 comm 奖金 deptno 部门号
--查询所有的员工信息
select * from emp
--设置行宽
show linesize
set linesize 150
--设置列宽
col ename for a8 (名字列:宽度为8个字符)
col sal for 9999   (薪水列:1列用一个9表示,4列用四个9)
/ (执行上一条语句)
/*sql优化(数据库的优化)
1.尽量使用列名

3.尽量使用where不建议使用having


*/

光标所在的位置代表上一条记录
若sql语句书写错误,修改的方法
--c命令 change
2 (代表修改第二条)
c /form/from (将什么修改成什么)
/ (执行上一条语句)
-- sql 语句是支持算术表达式的
select empno,ename,sal,sal*12,comm,sal*12+comm
from emp
/* sql语句中的空值问题
1.滤空函数nvl(a,b)若a为空,则值为b,若a不空,则值为a
2. null永远!=null

select * from emp where comm=null  (错误)

select * from emp where comm is null (正确)  

表达式当中含有空值,表达式就为空。


3.如果集合当中含有,不能使用not in ;但是可以使用in

4.组函数(多行函数)自动滤空,可以嵌套滤空函数来屏蔽他的滤空功能
*/

--列的别名
select empno,ename,sal,sal*12,comm,sal*12+nvl(comm,0)
from emp
ed 打开默认的编辑器
select empno as "员工号",ename "姓名" ,sal 月薪 ,sal*12 as ,comm as ,sal*12+nvl(comm,0) as
from emp

别名:含有关键字或者含有特殊的符号或者纯数字则要加上""

--distinct 
select distinct deptno,job form emp;(两列看成整体不重复)

--连接符 和--concat的作用相同(连接字符串)
select 'hello'||' world' 字符串 from dual;
select concat('hello',' word') from dual;
当进行操作的时候和任何表都没有关系的时候 
select 3+2 from dual;

--解释dual:伪表
dual 的出现仅仅是为了满足select语句的要求(sql99当中要求select必须和from相互配套)
--查询员工信息:***的薪水是***
select ename||'的薪水是'||sal 信息 from emp;

hadoop的数据仓库hive支持sql92 可以直接写select
--字符串
单引号:表示日期和字符
双引号:表示列的别名

--sql和sqlplus 
sql 增删改查(改变数据)
sqlplus oracle提供的工具(不能修改数据)
两者的区别:
sql 没有进行缩写(insert select update delete)
sqlplus 进行缩写(desc ed c col for)

linux 当中的端口不能改到1024以下(linux系统保留)

oracle服务监听器监听的端口为1521,通过监听1521端口登录到数据库(orcl)的服务上

--任务调度:(oracleJobSchedulerORCL)
到达时间后做什么事情
oracleDBConsoleorcle(oracle的控制台,相当于一个监听1158端口)


进行管理数据库:
192.168.56.101:1158/em/console/logon/logon 
sys
password
sysdba


isqlplus只能在oralce9i 和oracle 10g才有(sqlplus的网页版)
192.168.56.101:5560/isqlplus
scott
password
网页版遵守http协议,明文协议不安全

11g 当中遵守https 加密协议

--spool off

单行函数:
函数:简化操作
函数:
单行函数(nvl)
单行进行变换产生结果
字符;数值;日期;转换;通用;条件表达式

多行函数(max)
多行进行变换产生结果

单行函数:

--lower(a),upper(b),initcap(c)select lower('Hello World') 转小写 ,upper('Hello World') 转大写,initcap('hello') 首字母大写 from dual;--substr(a,b,c),a从第3个开始取到4select substr('Hello World',3,4) 子串 from dual;--instr(a,b),ll的位置select instr('hello','ll') 位置 from dual;--length 字符数,lengthb 字节数(汉字才有区分)select length('Hello world') 字符,lengthb('hello world') from dual;--lpad 左填充    rpad 右填充,填充10个*select lpad('abcd',10,'*') 左,rpad('abcd',10,'*') 右 from dual;--trim去掉前后指定的字符,例如去掉Hselect trim('H' from 'Hello WorldH') from dual;--replace,比如将H,替换为*select replace('Hello World ','H','*') from dual;

数值函数:

--round 四舍五入 所得结果: 45.93       45.9         46         50      0select round(45.926,2) 一,round(45.926,1) 二,round(45.926,0) 三,round(45.926,-1) 四,round(45.926,-2) 五 from dual;

 

trunc(a,b) 截断,截断后的数值

日期:
mysql : date datetime(含有年月日)
oracle: date= 日期+时间(DD-MON-RR)

日期的运算只有加和减没有乘和除(两个日期不能相加(没有意义),但日期可以加上数字)

--系统时间select sysdate from dual;select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;--昨天 今天 明天select (sysdate-1) 昨天,sysdate 今天,(sysdate+1) 明天from dual;--计算员工的工龄: 天  星期  月  年select ename,hiredate,(sysdate-hiredate) 天,(sysdate-hiredate)/7 星期,(sysdate-hiredate)/30 月,(sysdate-hiredate)/365 年from emp;

--两个日期相差的月数: months_between(a,b)select ename,hiredate,months_between(sysdate,hiredate) 任职天数 from emp;--添加a个月:add_months(sysdate,a)select add_months(sysdate,56) from dual;--当前月最后一天:last_day(sysdate)select last_day(sysdate) from dual;--指定日期的下一个日期 next_dayselect next_day(sysdate,'星期一') from dual;--四舍五入select round(sysdate,'month'),round(sysdate,'year') from dual;

转换函数:隐式类型和显式类型

--隐式类型转换select * from emp where hiredate="17-11月-81"

--显示类型转换:to_char;to_number;to_date
--当前时间select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss"今天是"day') from dual;     --查询员工薪水:两位小数,千位符 货币代码(L代表¥,9代表一位数字)select to_char(sal,'L9,999.99') from emp;

通用函数:

--nvl2(a,b,c) 当a = null的时候,返回c;否则返回bselect sal*12+nvl2(comm,comm,0) from emp;--nullif(a,b) 当a=b的时候,返回null;否则返回aselect nullif('abc','abc') 值 from dual;--coalesce 从左到右找到第一个不为的值select comm,sal,coalesce(comm,sal) "第一个不为空的值" from emp;

条件表达式:if-then-else的逻辑时:

--涨工资,报表的形式,并未对数据库进行实际操作select ename,job,sal 涨前,case job when 'president' then sal+1000     when 'manager'    then sal+800else sal+400end 涨后from emp;--使用decode,经过运算后的一列select ename,job,sal 涨前,
decode(job,'president',sal+1000,              'manager',sal+800,
                       sal +400) 涨后from emp;

过滤和排序:

--查询默认的格式:
select * from v$nls_parameters(动态视图)(取得操作系统的语言)
alter session|system set NLS_DATE_FORMAT='yyyy-mm-dd'

--日期和字符串要包含在单引号中

--字符大小写敏感,日期格式敏感(默认 DD-MON-RR)
--日期格式敏感

select *
from emp
where hiredate ='17-11月-81'
where hiredate = '1981-11-17' 错误

比较运算:赋值使用:=符号

between and 1.含边界 2.小值在前,大值在后
集合中含有null,不能使用not in ,但是可以使用in

--不能查询出结果,not in 当中不能有null值select * from empwhere deptno not in(10,20,null);--查询出结果select * from empwhere deptno in(10,20,null);

--like 模糊查询 % 代表所有的字符 _ 代表任意的一个字符

--查询员工当中含有下划线的员工(escape声明转移字符为\)
select * from emp where ename like '%\_%' escape '\'

SQL优化:where 解析顺序:右---->左

排序:

--order by 列名,表达式,别名select empno,ename,sal,sal*12 年薪from emp
--order by sal*12 desc;order by 年薪 desc;--order by 4 desc;

多列进行排序:desc 作用于离它最近的一列

--按照降序排列,空值放在最后面select * from  emporder by comm descnulls last
--原因null 值最大

组函数:(多行函数;对多行数据进行操作)

avg     count     max    min       sum 

--nvl滤空函数  14    14select count(*),count(nvl(comm,0)) from emp;--count(*)代表所有,count(comm)代表不为空    14   4select count(*),count(comm) from emp;

--deptno 不重复 3select count(distinct deptno)  from emp;  

group by:

  单个列进行分组:

--求每个部门的平均工资select deptno,avg(sal) from emp group by deptno;--在select 语句当中所有没有包含在组函数的列,必须都写在group by 语句的后面,例如:group by 必须要同时包含 a,b,c ,如果group by
只写a,b,就是错的,包含a,b,c,如a,b,c,f 则是对的;select a,b,c 组函数(x)from tablegroup by a,b,c

     多个列进行分组:(必须按照颜色进行分组,分组的条件只能多不能少)

select deptno ,job,sum(sal)from empgroup by deptno ,joborder by 1;

--过滤

 where 和having的区别:where 后面不能使用多行函数

--查询10号部门的平均工资select deptno,avg(sal)from empgroup by deptnohaving deptno=10;select deptno,avg(sal)from empwhere deptno=10group by deptno;

SQL 优化:尽量使用where,先进行过滤,然后进行分组

--group by 语句的增强

 

group by rollup(a,b)==

 

   group by a,b

 

   group by a

 

   group by null

 

select deptno,job,sum(sal) from emp group by deptno ,job;

+

select deptno,sum(sal) from emp group by deptno;

+

select  sum(sal) from emp;

===

select deptno,job,sum(sal) from emp group by rollup(deptno,job) 

语句执行结果:

DEPTNO   JOB    SUM(SAL)
------- --------- ----------
10   CLERK     1300
10   MANAGER    2450
10   PRESIDENT    5000
10              8750
20   CLERK     1900
20   ANALYST     6000
20   MANAGER    2975
20            10875
30   CLERK       950
30   MANAGER    2850
30   SALESMAN   5600

DEPTNO   JOB    SUM(SAL)
------- --------- ----------
30           9400
            29025

sqlplus 报表将结果集美化:

-- 相同的deptno只显示一次,不同的部门号之间跳过两行

break on deptno skip 2

-- 将格式取消

break on null 

 

---多表查询

连接条件至少为n-1个

等值连接,不等值连接,外连接,自连接

--按部门统计员工:部门号  部门名称   人数

select d.deptno  部门号 ,d.dname 部门名称,count(e.empno)  人数from emp e, dept dwhere  e.deptno(+) =d.deptnogroup by d.deptno,d.dname;

希望:对于某些不成立的记录,仍然包括到最后的结果中

左外连接: 当where e.deptno =d.deptno  不成立的时候,等号左边的表仍然被包含

      写法 where e.deptno =d.deptno(+)   等号的右边添加一个+

右外连接:当where e.deptno =d.deptno  不成立的时候,等号右边的表仍然被包含

      写法 where e.deptno(+) =d.deptno  等号的左边添加一个+

--自连接(通过表的别名,将同一张表视为多张表)

--查询员工信息: 员工姓名,老板姓名select e.ename 员工姓名,b.ename 老板姓名from emp e,emp bwhere e.mgr = b.empno

SQL优化:自连接不适合操作大表(笛卡尔积(至少是平方的关系))

 

--层次查询(因为只有在一张表的时候才不会产生笛卡尔积)

查询的结果为一棵树(树的深度level: 伪列)

伪列特点:得到这一列的值必须在这条查询语句当中写出来。

from emp  connect by  上一层的员工号=老板号 start with 起始条件

--查询每个员工的老板select  level ,empno,ename,mgrfrom emp
connect by prior empno=mgr
start with mgr is nullorder by 1;

自连接和层次查询对比:

自连接查询出来的结果明显,但是当操作大表时,由于笛卡尔积故效率不高,等值连接:单表查询,但是得到的结果不明显。


本文由职坐标整理并发布,希望对同学们学习Oracle有所帮助,更多内容请关注职坐标数据库Oracle数据库频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程