Oracle学习二

Oracle的学习二

Oracle的基本概念和安装

  • Oracle简介
    ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。比如SilverStream就是基于数据库的一种中间件。ORACLE数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系数据库,它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能。但它的所有知识,只要在一种机型上学习了ORACLE知识,便能在各种类型的机器上使用它。

  • Oracle10g的安装
    我的是安装在win xp系统上
    注意:

    • 输入口令和确认口令,如:orcl,点击下一步,
    • 出现“口令管理”界面,点击“口令管理”,输入密码orcl
    • 将SCOTT的对勾去掉(解锁scott账户),如下图所示,点击“确定”:
      并设置口令比如 tiger
      在这里插入图片描述
  • 在win xp系统上测试连接命令:sqlplus system/

  • 客户端连接oracle

    • 客户端连接数据库的意思:通过真实主机连接虚拟主机上的Oracle
    • 将instantclient_12_1拷贝到你的没有中文路径的位置
    • 进入到instantclient_12_1的路径下运行cmd
    • 输入命令
      sqlplus system/密码@远程IP:1521/orcl
    • 当你无法连接成功时,一定要先检查网络连接。
  • PLSQL Developer客户端工具的安装

    • 安装目录不能有中文和空格,否则连接不上

    • 第一次连接要先配置(打开软件不要登录点击取消)

    • 从虚拟机中的oracle 安装目录中找到tnsnames.ora拷贝至D盘根目录(或其它位置),编辑此文件。

      将红框部分改成自己虚拟主机的IP地址
      在这里插入图片描述

    • PLSQL Developer点取消,Tools->>Preferences
      在这里插入图片描述

    • 设置环境变量
      TNS_ADMIN 为D盘根目录(tnsnames.ora所在目录)
      在这里插入图片描述

    • 关闭软件重新打开(输入密码 Database选择ORCL10)
      在这里插入图片描述

  • PLSQL Developer中文乱码问题解决

    • 1、查看服务器端编码
      select userenv(language)from dual;我实际查到的结果为:AMERICAN_AMERICA.ZHS16GBK
    • 2、执行语句select*from V$NLS_PARAMETERS查看第一行中PARAMETER项中为NLS_LANGUAGE对应的VALUE项中是否和第一步得到的值一样。
      如果不是,需要设置环境变量。
      否则PLSQL客户端使用的编码和服务器端编码不一致,插入中文时就会出现乱码.
    • 3、设置环境变量
      计算机->属性->高级系统设置->环境变量->新建设置变量名:NLS_LANG,变量值:第1步查到的值,我的是AMERICAN_AMERICA.ZHS16GBK
    • 4、重新启动PLSQL,插入数据正常

Oracle的体系结构

  • 数据库:
    database Oracle数据库是数据的物理存储。这就包括(数据文件0RA或者DBF、控制文件、联机日志、参数文件)。其实Oracle数据库的概念和其它数据库不一样,这里的数据库是一个操作系统只有一个库。可以看作是Oracle就只有一个大数据库。

  • 实例:
    一个Oracle实例(Oracle Instance)有一系列的后台进程(Backguound Processes)和内存结构(Memory Structures)组成。一个数据库可以有n个实例。

  • 数据文件(dbf):
    数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的,真正是在某一个或者多个数据文件中。而一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间。一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才行。

  • 表空间:
    表空间是0rac1e对物理数据库上相关数据文件(ORA或者DBF文件)的逻辑映射。一个数据库在逻辑上被划分成一到若干个表空间,每个表空间包含了在逻辑上相关联的一组结构。每个数据库至少有一个表空间(称之为system表空间)。
    每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件(datafile)。一个数据文件只能属于一个表空间。

在这里插入图片描述

  • 用户:
    用户是在实例下建立的。不同实例中可以建相同名字的用户。
    **注意:**表的数据,是有用户放入某一个表空间的,而这个表空间会随机把这些表数据放到一个或者多个数据文件中。
    由于orac1e的数据库不是普通的概念,oracle是有用户和表空间对数据进行管理和存放的。但是表不是有表空间去查询的,而是由用户去查的。因为不同用户可以在同一个表空间建立同一个名字的表!这里区分就是用户了!

  • 表空间示意图

在这里插入图片描述

  • 理解1:
    Oracle数据库可以创建多个实例,每个实例可以创建多个表空间,每个表空间下可以创建多个用户(同时用户也属于表空间对应的实例)和数据库文件,用户可以创建多个表(每个表随机存储在一个或多个数据库文件中),如下图:
    在这里插入图片描述

  • 理解2:
    理解1MS有误。

    实例下有和,授权访问,是管理的,经授权在中创建,随机存储到不同的中。如下图所示:
    在这里插入图片描述

  • SCOTT用户

    参考SCOTT表结构

    https://blog.csdn.net/SYJ_1835_NGE/article/details/90738962

基本查询

  • sql简介
    结构化查询语言(Structured Query Language)简称SQL(发音:/'es kju:'el/“S-Q-L”),结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。

  • DML(数据库操作语言):其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。

  • DDL(数据库定义语言):其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE或DROPTABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。

  • DCL(数据库控制语言):它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。

  • 可能会用到的查询语句

    -- 1.查看服务器端编码
    select userenv(languagefrom dual;
    -- 2.解锁scott用户并重新设置密码
    alter user scott account unlock;
    alter user scott identified by tiger;
    
    -- oracle除了起别名使用双引号,其余的全部使用单引号
    
  • 1、查询出所有emp中的信息,并用中文进行字段重命名

    select empno as "员工编号",ename "员工名字",job "职位",mgr "领导编号",hiredate "入职日期",sal "工资",comm "奖金",deptno "部门编号" 
    from emp;
    
  • 2、查询emp表中员工的job信息,并去除重复(distinct)信息

    select distinct(job) from emp;
    
  • 3、查询emp表中员工的全年的工资总和(sal总和)

    select ename "姓名",12*sal as "工资总和" from emp;
    
  • 4、查询emp表中员工的全年收入总和(sal+comm的总和)

    --nvl(comm,0)见到comm为null,替换成后面的值,避免了null值
    select ename "姓名",12*sal+nvl(comm,0) as "收入总和" from emp; 
    
  • 5、查询emp表中员工编号,姓名(考察字符串的拼接)

    -- 输出格式如下:编号:xxx,姓名:xxx
    ---- concat拼接方式
    ---- mysql支持无限打逗号
    select concat(concat('编号:',empno),concat(',姓名:',ename)) from emp;
    
    -- =============等价于======================
    
    ----Oracle的||方式   相当于+号                                 
    select '编号:'||empno||',姓名:'||ename  from emp;
    

条件查询和排序

  • 1、查询工资大于1500的员工

    select * from emp where sal>1500;
    
  • 2、查询工资大于1500并且有奖金的雇员

    select * from emp where sal>1500 and comm is not null;   ---is not null
    
  • 3、查询工资大于1500或者有奖金的雇员

    select * from emp where sal>1500 or comm is not null;
    
  • 4、查询工资大于1500并且没有奖金的雇员

    select * from emp where sal>1500 and comm is null;       ---is null
    
  • 5、查询员工姓名为smith的员工

    select * from emp where ename='SMITH';                   ---oracle对大小写敏感
    
  • 6、查询工资大于1500但小于3000的全部雇员

    ---- >=,<=方式
    select * from emp where sal>=1500 and sal<=3000;
    ----  between and方  左开右闭
    select * from emp where sal between 1500 and 3000;
    
  • 7、查询1981-1-1到1981-12-31号入职的雇员(between and)

    -- to_date将字符串转化为日期
    select * from emp where hiredate between to_date('1981-1-1','yyyy-MM-dd') and to_date('1981-12-31','yyyy-MM-dd');
    
  • 8、查询员工编号是7369,7654,7566的员工

    ---- OR方式
    select * from emp where empno='7369' or empno='7654' or empno='7566';
    ---- IN方式        --IN 操作符允许我们在 WHERE 子句中规定多个值。只要符合一个就可以
    select * from emp where empno in('7369','7654','7566');
    
  • 9、查询雇员姓名是’SMITH’,‘ALLEN’,'WARD’的雇员信息

    ----IN方式
    select * from emp where ename in('SMITH','ALLEN','WARD');
    

    模糊查询like

    % 零或者多个字符

    _ 单一任何字符(下划线)

    \ 特殊字符

    [] 在某一范围内的字符,如[0-9]或者[aeth]

    [^] 不在某范围内的字符,如[0-9]或者[aeth]

    后两种, 需要Oracle 10g以上使用支持like的正则regexp_like

  • 10、查询所有雇员姓名中第二个字符有‘M’的雇员

    select * from emp where ename like '_M%';
    
  • 11、查询名字中带有‘M’的雇员

    select * from emp where ename like '%M%';
    

    排序 order by

    desc 降序

    asc 升序

  • 12、查询雇员的工资进行降序排序

    select ename,sal from emp order by sal desc;                  ---升序
    select ename,sal from emp order by sal asc;                   ---降序
    
  • 13、查询雇员的奖金并做降序排序(关于nulls first/nulls last)

    nulls first

    nulls last

    --- 将null值排到后面【nulls last】
    select ename "姓名",comm "奖金" from emp order by comm   nulls last;
    
  • 14、查询雇员的工资做降序排列并且其中奖金部分是升序排序

    -- 从左往右查询,工资一样排奖金;在select中order by排在最后面
    select  ename "姓名",sal "工资",comm "奖金" from emp order by sal desc,comm asc;
    

单行函数

  • 伪表,虚表:dual 没有任何的实际意义,只是为了补全Oracle查询语法

    字符函数

  • 1、将’smith’转换成大写–关键字:upper

    ---只有去查询不存在的表才能将其转化为指定类型显示
    select upper('smith') from dual;
    
  • 2、将’SMITH’转换成小写–关键字:lower

    select lower('SMITH') from dual;
    
    ---2.1将姓名列全部小写显示
    select lower(ename) from emp;
    
  • 3、将’smith’首字母大写–关键字:initcap

    select initcap('smith') from dual;
    
    ---3.1将姓名列全部首字母大写
    select initcap(ename) from emp;
    
  • 4、将’helloworld’截取字符串成’hello’–关键字substr

    --【左开右闭】
    select substr('helloworld',0,5) from dual;
    
  • 5、获取’hello’的字符串长度–关键字length

    select length('hello') "长度" from dual;
    
  • 6、将’hello’中的l用x进行替换–关键字replace

    select replace('hello','l','x') "替换" from dual;
    

    数值函数

  • 7、将15.66进行四舍五入(从-2到2)–关键字round

    select round(15.66,-2) from dual;    --0  1进位
    select round(15.66,-1) from dual;    --20 5进位
    select round(15.66,0) from dual;     --16
    select round(15.66,1) from dual;     --15.7
    select round(15.66,2) from dual;     --15.66
    
  • 8、将15.66进行截断(从-2到2)–关键字trunc

    select trunc(15.66,-2) from dual;    --0
    select trunc(15.66,-1) from dual;    --10
    select trunc(15.66,0) from dual;     --15
    select trunc(15.66,1) from dual;     --15.6
    select trunc(15.66,2) from dual;     --15.66
    
  • 9、对15/3进行求余数–关键字mod

    select mod(15,3) from dual;
    

    日期函数

  • 10、查询系统时间–关键字sysdate

    select sysdate from dual;
    
  • 11、查询雇员进入公司的周数

    select (sysdate-hiredate)/7 from emp;
    -- 查询员工的姓名首字母大写和入职的时间
    select initcap(ename),hiredate from emp;
    
  • 12、查询雇员进入公司的月数–关键字months_between

    select initcap(ename) "姓名",months_between(sysdate,hiredate)  "入职总月数" from emp;
    
  • 13、求出三个月后的日期–关键字add_months

    select initcap(ename) "姓名",hiredate "入职时间" ,add_months(hiredate,3) "转正时间" from emp;
    

    转换函数

  • 14、将系统日期显示为yyyy-mm-dd hh:mi:ss(去掉补零和24小时显示时间)–关键字to_char

    select to_char(sysdate,'yyyyfm-mm-dd hh24:mi:ss') from dual;
    ----显示成年月日   --2019年05月28日
    select to_char(sysdate,'yyyy')||'年'||to_char(sysdate,'mm')||'月'||to_char(sysdate,'dd')||'日'  from dual;
    
    
  • 15、将字符串’1981-1-1’转换成日期类型–关键字to_date

    select to_date('1981-1-1','yyyy-MM-dd') from dual;
    

    通用函数

  • 16、nvl空值的处理函数

    select nvl(comm,0) from emp;
    
  • 17、nvl2(判断值,空返回值,非空返回值)

    -- 三目运算符 第一个条件为null成立返回第三个参数的值,第一个条件不为null成立返回第二个参数的值
    select nvl2(comm,'1','2') from emp;
    

    条件表达式

  • 18、查询员工的job内容并转成中文显示

    ----decode方式
    -- 依次转化,如果最后没有加上其他的话,就会出现列表为null
    select ename,decode(job,'CLERK','柜员','SALESMAN','销售','MANAGER','经理','其他') from emp; 
    ----case when then end方式
    select ename ,case job when 'CLERK' then '柜员'
                           when 'CLERK' then '柜员'
                           when 'SALESMAN' then '经理'
                           else '其他'
                           end from emp;
    

多行函数

  • 1、查询所有员工记录数–关键字count

    select count(ename) from emp;
    
  • 2、查询佣金的总数–(如何查询某个字段的总数量)

    select count(comm) from emp;
    
  • 3、查询最低工资–关键字min

    select min(sal) from emp ;
    
  • 4、查询最高工资–关键字max

    select max(sal) from emp ;
    
  • 5、查询平均工资–关键字avg

    select avg(sal) from emp ;
    
  • 6、查询20号部门的员工工资总和

    select sum(sal) from emp  where DEPTNO=20 ;
    

    分组函数

  • 7、查询部门编号及人数–分组查询–关键字group by

    select DEPTNO "部门编号", count(ename) "总人数" from emp group by DEPTNO ;
    
  • 8、查询每个部门编号及平均工资

    select DEPTNO "部门编号", avg(sal) "平均工资" from emp group by DEPTNO ;
    
  • 9、查询部门名称,部门编号,平均工资

    --- oracle如果查询的有普通字段,也必须出现在group by中
    select DNAME "部门名称" ,emp.DEPTNO  "部门编号", avg(sal) "平均工资"  from emp,dept where emp.DEPTNO=dept.DEPTNO group by emp.DEPTNO,dept.dname;
    
    -- 起别名
    select DNAME "部门名称" ,e.DEPTNO  "部门编号", avg(sal) "平均工资"  from emp e,dept d where e.DEPTNO=d.DEPTNO group by e.DEPTNO,d.dname;
    
  • 10、查询出部门人数大于5人的部门

    -- where 先group by执行(where, group by, having ,order by)===group by之后要先再过滤就要使用having
    select DEPTNO "部门编号" ,count(ename) "部门总人数" from emp  group by DEPTNO  having count(ename)>5;
    
  • 11、查询部门编号,部门名称,平均工资且平均工资大于2000

    select emp.DEPTNO,dname,avg(sal) from emp,dept  where emp.DEPTNO=dept.DEPTNO
    group by emp.DEPTNO,dname having avg(sal)>2000
     
     -- 起别名
    select e.DEPTNO,d.dname,avg(sal) from emp e,dept d where e.DEPTNO=d.DEPTNO
    group by e.DEPTNO,d.dname having avg(sal)>2000;
    



    全部教程是本人自己在学习过程中的总结和练习,都很基础写下来的目的主要是方便自己和他人的复习理解,也消除了笔记写下找不到的缺点。如有需要什么笔记或者文档可以留言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值