Oracle 学习(一)入门

一、学习目标

  • Oracle介绍
  • Oracle安装
  • Oracle体系结构
  • Oracle与PL/SQL是什么关系
  • DML、DQL、DCL、DDL
  • 基本查询
  • 条件查询
  • 单行函数
  • 多行函数

二、Oracle介绍

Oracle :关系型的数据库 , 端口号:1521 ,收费(学习是免费的,用于商业要授权)19万左右, 每年交服务费 效率高, 安全

mysql:关系型的数据库 , 表于表的关系:外键 , 端口号:3306

redis:非关系型数据库 ,key - value , 端口号:6379

Oracle与MySQL的SQL语句区别
https://www.cnblogs.com/liyi113115/p/6825370.html

Oracle数据库是Oracle(甲骨文)公司的核心产品,适合于大型项目的开发;银行、电信、电商、金融等各领域都大量使用Oracle数据库。

Oracle数据库是一种对象关系型数据库在关系型数据库的基础上,引入了一些面向对象的特性

Oracle数据库的产品可以免费下载,其服务是收费的,也就是该数据库用于商业目的时,必须取得Oracle的授权。

Oracle出现有30年时间,经历了很多版本,目前最新的版本是12c。11g版本是目前比较稳定,很多企业也在使用,所以我们从此版本入门学习,后面的版本基本也不会有太大区别。

PS:MySQL是Java开发常用的数据库,MySQL的母公司08年被SUN公司收购,而SUN公司09年被Oracle收购,所以MySQL也是Oracle旗下的产品。

oracle客户端与服务端有什么区别:

1、oracle服务端是指装在数据库服务器上的oracle主服务,数据库的核心,用于数据库的管理,数据的与存储、查询、数据库资源的监控、监听等服务。

oracle客户端只是指与服务端交互的工具,要登录使用oracle数据库服务就需要安装客户端(例如PLSQL),利用PLSQL连接到数据库,来执行oralce服务的一些增删改查等操作。

2、服务器端不一定在本地(client一定在本地),所以需要在客户端配置TNSNAMES.ORA文件。在文件中添加服务名和IP。
Oracle 学习(一)入门_第1张图片

3、oracle数据库服务都会有一个全局数据库名例如:orcl,这是在安装数据库时指定的。如果要安装多个数据库,那么这个全局数据库名必须不一样。服务器端的listener文件里配置有监听程序,可以配置多个监听IP。

而oracle客户端连接服务端是就要配置oracle的实例名来确认数据库信息。
4、服务器端的客户工具是通过服务器端tnsnames.ora和listener.ora进行验证并建立连接;

远程客户端是通过客户端的tnsnames.ora和服务器端的listener.ora执行验证和建立连接。

三、Oracle安装

略…

四、Oracle体系结构

数据库:只有一个数据库

实例:后台运行的一个进程

表空间:逻辑存储单位

数据文件:物理存储单位

用户:面向用户管理,都会对应一个表空间,向表空间中添加数据,都是保存到数据文件中

详解:https://blog.csdn.net/angelxf520/article/details/82432193

五、数据库用户

1、 用户:系统默认用户、新建用户。

系统默认用户:

  • sys

级别:Oracle的一个超级用户,最高权限

主要作用:用来维护系统信息和管理实例。

登录角色:只能以SYSDBA或SYSOPER角色登录

登录命令:
username/password @server(服务名) as sysdba
例子:sys/root @orcl as sysdba

切换到sys用户(sys用户要指定sysdba,其他不用)
connect sys/root as sysdba

  • system

级别:Oracle默认的管理员,拥有DBA权限。

主要作用:用来管理Oracle数据库的用户、权限和存储等。

登录角色:只能用normal身份登陆em(页面管理器),除非你对它授予了sysdba的系统权限或者syspoer系统权限。

  • scott

级别:Oracle的一个普通示例用户 。

主要作用:为初学者提供一些简单的应用示例,测试数据。

登录角色:只能以Normal角色登录

注:创建数据库时默认该用户为锁定状态,使用前需解锁。默认密码为tiger。

– 解锁用户

alter user 用户名 account unlock;

alter user scott account unlock

– 重置密码

alter user 用户名 identified by 密码;

alter user scott identified by tiger;
  • sysman

级别:是Oracle数据库中用于EM管理的用户,管理员级别。

主要作用:用来操作企业管理器

注:如果不用EM可以删除该用户。

  • dbsnmp

级别:是Oracle数据库中用于智能代理的用户。

主要作用:用来监控和管理数据库相关性能,收集系统运行状态相关的数据。

注:如果停止该用户,则无法提取相关的数据信息。

2 、权限:

SYSDBA:数据库管理员权限(打开数据库服务器、关闭数据库服务器、管理功能、备份数据库、恢复数据库、日志归档、会话限制。)

SYSOPER:数据库操作员权限(打开数据库服务器、关闭数据库服务器、备份数据库、恢复数据库、日志归档、会话限制。)

NORMAL:普通用户权限。

注:sysdba拥有最高系统权限,sysoper主要用来启动、关闭数据库。

六、Oracle与PL/SQL是什么关系

  • ORACLE是数据库,有客户端和服务器;
  • PLSQL Developer只是第三方工具,服务于ORACLE,类似的工具还有Toad,sqlplus,sql developer等等;
  • 安装PLSQL Developer对于安装oracle没啥关系,但是如果没有oracle客户端,你装了PLSQL Developer也没啥意思。
  • SQL*Plus 是Oracle自带的数据库管理客户端,可以在这里编辑SQL语句执行,是命令行模式的。
  • PL/SQL 有两种。 一种是工具 PL/SQL Developer 和SQL* Plus一样是数据库管理客户端,是一种可视化界面,也可以使用命令行编辑SQL。另外一种是PL/SQL语言,是oracle中的块结构语言,类似存储过程,是一种过程话的语言。把SQL语言和编程高级语言想融合,和Java近似。既可以在SQL*Plus上开发PL/SQL语言,也可以在PL/SQL Developer上开发PL/SQL语言。

七、DML、DQL、DCL、DDL

DML Data Manage Language 数据操纵语言,insert delete update 没有select!!!!
DQL DQL Data Query Languate 数据查询语言 就是 select from
DCL Data Controller Languate 数据控制语言 就是授权 ROLLBACK GRANT COMMIT
DDL Data Define Language 定义语言,就是创建,如create 创建表/存储过程/索引/触发器


八、基本查询

   -- dual :是一张虚表, 为了完善查询的语法结构,只有一行一列
   -- 别名:如果是数字开头或者纯数字必须加双引号
   -- 字符串使用单引号,别名使用双引号
   select 
   length('abc') "长度",
   length('abc') as "长度",
   length('abc') as 长度, 
   length('abc') as '123'   from dual;

   -- 消除重复的记录
   select distinct job from emp;
   
   -- 四则运算:+ - *  /      -- 连接符号:||
   select concat('a' , 'b') from dual;
   select concat(concat('a' , 'b'),'c') from dual;
   select 'a' || 'b'|| 'c' from dual;
   select '1' + 1 from dual;
   
   -- 查询员工的年薪: nvl(comm,0)
   select sal * 12 + nvl(comm,0),nvl(comm,0) from emp;

九、条件查询

   -- 查询有奖金的员工
   select * from emp where comm > 0;
   select * from emp where comm is not null and comm != 0;
   
   -- 查询没有奖金的员工
   select * from emp where comm is null or comm = 0;
   -- not 取反
   select * from emp where not(comm is not null and comm != 0);

   -- 查询1981年入职的员工
   select * from emp where to_char(hiredate,'yyyy') = '1981';
   select * from emp where hiredate >= to_date('1981-01-01','yyyy-mm-dd')
                       and hiredate <= to_date('1981-12-31','yyyy-mm-dd');
   select * from emp where hiredate between  to_date('1981-01-01','yyyy-mm-dd')  
                                         and to_date('1981-12-31','yyyy-mm-dd') ; 
 
    -- 函数:to_char  to_date
    -- to_char (p1,p2):将日期转换为字符串
                 -- p1:要转换的日期
                 -- p2:转换的格式
      select sysdate,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss day') from dual;

    -- to_date(p1,p2):将字符串转换为日期
                 -- p1:要转换的字符串
                 -- p2:转换的格式        
     select '2018-07-06 11:11:11' , 
     to_date('2018-07-06 11:11:11' ,'yyyy-mm-dd hh24:mi:ss') from dual;
     
     -- upper: 转换为大写 lower :转换为小写
     select * from emp where upper(ename) like upper('%M%');
     
   -- 排序
   -- 查询所有员工按照工资升序
   select * from emp order by sal asc;
   -- 查询所有员工按照工资降序
   select * from emp order by sal desc;
   -- 查询所有员工按照奖金升序排序(null值放到前面)
   select * from emp order by nvl(comm,0) asc;
   select * from emp order by comm asc nulls first; 
   -- 查询所有员工按照奖金降序排序(null值放到后面) 
   select * from emp order by comm desc nulls last; 

十、单行函数

   --单行函数
   select length(ename) from emp;
   
   --字符串函数
      -- concat
      -- length
      -- substr(str, p1 ,p2): str:截取的字符串 ,p1:开始的索引 ,p2:截取的长度
         -- 起始索引用0和1是一样的
      select substr('abcjavadef' , 4, 4 ) from dual;
      select substr('abcjavadef' , 1, 3 ) from dual;
      select substr('abcjavadef' , 0, 3 ) from dual;
      -- replace(str ,p1,p2) : 替换  str:要替换的字符串 p1:被替换的 p2:替换成的
      select replace('abcdefa' , 'a' ,'z') from dual;
      -- trim() 去除两侧的空白
      select trim('   abc    '),ltrim('   abc    '),rtrim('   abc    ') from dual;
      -- upper lower

   --日期函数
      -- 两个日期相减 == 天数
      select sysdate - hiredate from emp;
      -- 周数
      select (sysdate - hiredate) / 7 from emp;
      -- 月数:months_between
      select months_between(sysdate , hiredate) from emp;
      -- 修改月份: add_months
      select add_months(sysdate ,-12) from dual;
   
   --数值函数
      -- round () 四舍五入
      select round(2.666) from dual;
      -- trunc() 截取
      select trunc(2.666,1) from dual;
      -- mod() 模运算符(求余)
      select mod(3,10) from dual;
  
   --转换函数
      -- to_char to_date
      -- to_char to_number
      select 1 ,to_char(1),'1',to_number('1') from dual;
      select 1 + '1' from dual;
   
   --通用函数
      -- nvl

十一、多行函数

   -- 多行函数(聚合函数,分组函数)(count, avg, max ,min ,sum)
   
   -- 分组后能显示的列:分组函数和在group by语句中出现的列
   select 
      count(1),deptno, avg(sal),max(sal) ,min(sal) ,sum(sal)
   from emp group by deptno;

   -- 查询大于4个人的部门
   -- 在where中不能加分组函数,where 必须放到group by前面
   -- having 在分组的基础上进一步的筛选
   select count(1),deptno from emp  group by deptno having count(1) > 4;

练习

  1. 查询和smith相同部门的员工姓名和雇用日期

    select ename,hiredate from emp where deptno=(select deptno from emp where ename=upper(‘smith’))

  2. 查询工资比公司平均工资高的员工的员工号,姓名和工资。
    select empno,ename,sal from emp where sal> (select avg(sal) from emp)

  3. 查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资
    select empno,ename,sal,deptno from emp where sal>(select avg(sal) from emp where deptno=20)and deptno!=20

  4. 查询和姓名中包含字母U的员工在相同部门的员工的员工号和姓名
    select empno,ename from emp where deptno=(select deptno from emp where ename like ‘%U%’)

  5. 查询领导是King的员工姓名和工资
    select ename,sal from emp where mgr= (select empno from emp where ename=‘KING’)

你可能感兴趣的:(Oracle)