oracle 学习 笔记 随笔

◇◆丶佛笑我妖孽 提交于 2019-12-04 22:13:17

1、配置数据名称的时候 有个SID 这个是ServiceID,服务ID,网络连接使用的。建议数据名称与SID一致。
   安装oracle时候字符集选择utf-8,示例方案打钩。
   为所有账户使用相同口令。设置口可能不符合要求没关系。//OracleServiceORCL和OracleOraDb11g_home1TNSListener 设置为手动,每次都需要启动的服务。
2、SYS:超级管理员  system:普通管理员 scott:普通用户  sh:
3、sqlplus命令,作为oracle客户端使用。sqlplus命令是有很多的。
4、select *from emp;发现命令行输出很难看,标题出现换行的情况。可以设置每行显示的数据长度:SET LINESIZE,设置分页 set pagesize 100 (这个就属于格式化操作,这个格式化没什么意义。) ,以上两个页面是整体页面的格式化操作,也可以对某一列设置操作(col job for a8)。
5、使用ed命令:ed hello  如果hello不带后缀则默认打开 hello.sql,如果没有则会创建(创建的位置在c盘用户目录下)。执行使用@hello

6、显示当前用户 show user;不用用户的切换:conn scott[/密码], 如果是切换到sys超级管理员 需要使用as sysdba,conn sys/密码 as sysdba,在sys下访问emp表提示没有试图或表错误,因为emp是scott的表,可以使用select *from scott.emp;
7、sqlplus 也可以无用户访问 使用 sqlplus /nolog,使用这个后 show user 显示为空。
8、cmd 复制文件 使用copy 文件路径 被复制的文件路径。如果要在sqlplus里使用copy 必须要加上host :host copy 文件路径 被复制的文件路径。//


数据表结构:
    sql:结构化的查询语言。
    DML:数据操作语言  :数据更新查询操作 (select,from,insert。。。。等),开发中主要以DML为主
    DDL:数据定义语言  :数据表,约束,索引,等。//数据库设计的时候使用。
    DCL:数据库控制语言:数据库权限操作。
在scott用户下使用select *from tab 
    BONUS                                                        TABLE//工资表,此表现在没有任何数据,下面表都有数据。
    DEPT                                                         TABLE//部门表
    EMP                                                          TABLE//雇员表
    SALGRADE                                                     TABLE//工资等级表
9、select *from //这里的顺序是 先from 在select。
    select sla*12 from emp//支持表达式
    select empno||1 from emp// ||字符连接
        select empno||emname from emp 和 select empno||'hello' from emp;//程序中双引号,数据库中字符串全部使用单引号
10、distinct:如果后面接了多个行这是对多个列的组合删选。
11、select * from where (from先执行,where第二,select最后执行),不等于符号 != 和 <>
    使用<* and >* 使用between and 区别:前者使用了关系和逻辑运算符,后者只是用了逻辑运算符,所以后者性能更高。
    between and 取日期区间的时候 日期使用的是字符串 例如:where between '01-1月 -81' and '01-1月 -91'
    where ename=null //关系数据库中 null不是空也不是0,没法判断,要使用 is null 关系表示。null不是0,null是特殊的运算符,必须用 is null判断。
    IN操作符:根据一个指定的范用围查询,in操作符 可以用or or 来实现,但是性能in更高,因为in是执行一次操作而or or 是有几个or就执行几次判断。in中的条件可以有空,不影响返回值,但是not in里如果有空则无数据返回。
    like;“_”:任意一位    “%”:任意多位 ,like不分数据类,任何数据类型都支持like,例如: int like '%1%'  date like'%2%'
    :'_A%'  表示第二位是A字符后面任意。
12、order by:order by是在select后面执行,所以可以使用select 列定义的别名,这也是where后面不可以使用的原因,因为where在select之前执行
13、oracle有一个虚拟表为了做函数测试的,dual表 select lower('Hello') from dual;//upper();大写
14、select *from emp where empID=‘&inputName’//这里输入变量值
    select *from emp where eName=upper('&inputname')
15、单行函数:lower,upper,initcap,length,replace(对象,被替换对象,替换的值),substr(),函数可以嵌套使用,因为各个函数返回也是字符串,注意substr下标是从1开始,。
    负数索引设计:只有oracle中才有,例如像截取name的后三位字符,substr(name,-3),也可以写成 substr(name,length(name)-2).
    数值函数:针对数字进行处理,round(),trunc(),mod()。
        round(数值)//返回四舍五入值
        round(数值,2)//返回四舍五入值
        round(数值,-2)//返回四舍五入值
        trunc()与round差不多参数,直接去掉小数点后面的。如果数据后还有参数,小数后在取位数,如果这个参数是负数,则跟round差不多意思。
    日期函数(oracle自己特色):伪列,不在表的列中确能使用查询语句的列值获取。有sysdate,systimestramp。
    日期+数字:若干天之后
    日期-数字:若干天之前
    日期-日期:两个时间的天数  //没有日期+日期:因为太大。。。
    因为使用日期减去日期返回的数值没有什么意义,所以才有日期函数的出现。
    计算两个日期间所经历的月数的总和:months_between(),add_months(日期,月数),last_day(日期)//日期本月的最后一天日期,next_day(sysdate,'星期二')//    
16、转换函数 to_char(),可以将日期类型进行格式化输出,to_char(sysdate,'yyyy-mm-dd')//oracle中这个格式化不区分大小写。其实这个是没什么用的,只是在输出的时候可以格式化所以可以通过这个函数获得日期的单独年,月,日(to_char(sysdate,'yyyy'))。to_char(372787874837483,'9999,999,99,99')//对数字的转换,9是代表数字不是意义上的9数字to_char(372787874837483,'L9999,999,99,99')//这里返回本地货币格式。
to_date('1999-01-18','yyyy-mm-dd')//字符串转日期函数,基本用不到
to_number(字符串)//字符串转化为数字  select to_number('1')+to_number('2') from dual 等价于: select ‘1’+‘2’from dual//oracle有一个在可行的范围内自动转换的功能。
17、通用函数(oracle自己特色)
    Oracle里提供有两个简单的数据处理函数 :nvl():nvl(comm,0), decode()
    1、处理Null:select ename,(sale+comm)*12 from emp//当sale或者comm里面有一个null的值时候 (sale+comm)这个返回0,使用nvl(comm,0),表示comm为空的时候使用默认值0,这是oracle的特色函数其他数据库没,谨慎使用。
    2、decode()//  decode(列名,'匹配内容1','显示内容1','匹配内容2','显示内容2','默认值使用')//使用性别的显示时候,0替换成女,1替换男场景使用。

18、多表查询:
    如果后面没有条件,量表查询出现的结果是量表的数量积(笛卡尔积),事实上笛卡尔积是一直是存在的,即使使用关联关系消除了一些笛卡尔积,但是还是存在,它对珍格格程序的影响是巨大的。
    oracle中有一个sh用户,这个用户下的数据表都是大数据的。
    
19、消除笛尔积的方式有 内联 和 外联,where属于内联,外联分为左外 右外 全外连接(量表之和的数据显示出来)。
20、数据集合操作:
    union, union all,intersect,minus。
    union:集合合并在一起取消重复元素。select *from emp union select *from emp where deptNo=10
    union all:取并集,与上面相反。
    intersect:交集
    minus:减集  //如果前表的数据小于后表则没有数据返回,因为集合中不存在负数。
    在集合操作之中有一件非常重要注意的事项,由于集合表要求这若干个查询结果所返回的数据结构必须相同,意思就是或者相同的表,而且查询的列必须一致。

21、统计函数的使用:常用的:count(),sun(),min(),avg(),max()。
    当表中没有数据的时候 只有count会返回数据即0,其他几个统计函数都没有返回值。
    count(*),count(列) count(distinct 列)
22、分组统计:group by后select后面要么使用分组函数和group by的列,如果一条sql语句中没有使用group by则select后面只能出现分组函数。如果出现嵌套的分组函数则该select后面不能出现任何列,原理一样,因为group by后返回的是行列的集合也就是一个表,此时该表查询是没有使用group by语句的而嵌套后说明select后面使用统计函数,如果使用统计函数则不可使用其他列。
23、oracle中的2个伪列:rownum,rowid
    rownum:select *from emp where rownum=1 // rownum只能获取第一个 他不能获取一个范围的值,例如想获取6-10行 不可以用 rownum between 6 and 10,但是可以使用rownum<6
如果要获取6-10行,则这个是典型的一个分页案例,可以使用子查询的方式,select *from (select rownum from emp rownum<currentPage*linePage) temp where temp.rownum>(currentPage-1)*linePage //linePage是一页显示的数据数量。
    rowid:rowId是oracle为每个数据分配的一个物理路径标识,类似一个索引,格式都是每个区域的地址标识。oracle里可以有重复且一模一样的数据,但是该数据的rowid肯定是不同的,所以如果要删除重复几条数据,只保留一条最先插入的数据(理论上物流地址的插入都是自增的,因为永远不知道有多少数据插入,自然不可能是自减的方法) 则可如下实现:delete from emp where rowid not in(select min(rowid) from emp e where e.id=xx group by e.id)    
24、having:使用having的地方一定是有group by,因为having就是配合group by 使用的,having后面出现的是统计函数,因为where后面是没法使用统计函数的,这个跟sql的执行顺序有关。where是在select后面的列之前执行,所以where后面无法使用group by,但是having是在select后面的列之后的所以可以使用 统计函数,并且在使用后select后面还可以使用其他列。
25、数据数据类型:
    number:一般存储数据类型,如果不想区分数据就使用这个,但是oracle充分考虑程序员的习惯还推出一个int,这个就是保存整数的数据,number(m,n)//n:小数位的长度,m-n为整数位的长度
    varchar2:oracle是这个一般代表字符串,一般小于200的长度都用这个,其他数据库一般就叫varchar
    clob:大型文字信息 最大4G
    blob:保存图片,音乐,电影等 最大4G
    date:日期类型,一般数据库可能date只是日期,而datetime才是日期时间。
26、创建表oracle案例:
    create table member(
    m_id number,
    m_name varchar2(20) default '无名氏',
    m_date date default sysdate
    )
    注意:设置默认值,如果在默认值上插入null,则以插入时候的数据为准,创建表的最后一个不用逗号。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!