大数据培训之旅——Oracle-2(基础操作,数据字典,基础SQL)

    我们在上一篇里把Oracle10g安装好了,那么也算是有工具了,下面就得看看如何使用了。

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

    既然登陆了那来看看数据字典,数据字典说白了就是系统表,有三类,user_XXXX,dba_XXXX,all_XXXX,基本上每一个系统表都有这三类分别代表用户,数据库管理员,全部,我们来看看如何使用

——————————————————————————————————————————————————————

    同样也有select username from dba_users;和select username from dba_users;也是查询用户名只是范围不同而已。当然我们也可以用show user来直接查看当前用户,user开头的当前用户可以使用只能查看当前的信息,all开头的可以查看当前用户和已经拥有权限的,而dba开头的只有dba权限才可以看,sys和system用户。

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

    以v$开头的被称作动态视图,视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它不可以对表里面的数据进行修改。他有很多优点:对数据库的访问,因为视图可以有选择性的选取目标表里的一部分;用户通过简单的查询可以从复杂查询中得到结果;维护数据的独立性,视图可从多个表检索数据;对于相同的数据可产生不同的视图。 我们来看个例子:

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

    这个查询正常select * from v_tt就可以。视图中不存放数据,视图就好比对表的一个映射,数据还存放在原表中,视图查出的数据,定位的记录还在原表中,所以视图不能提高查询速度,视图还可以方便查询;安全隐藏原表。比如:

特工信息表(特工编号,特工手机号,特工工资卡号,住址1,住址2,真实姓名,真实住址)
create view tt as select 特工编号,特工工资卡号 from 特工信息表;
select * from tt;

——————————————————————————————————————————————————————

    select count(*) from dict;用来查询一共有多少数据字典,这东西太多我们知道常用的就好。 

    在oracle中commit 提交数据(将数据写到日志里并同步到数据文件)(oracle默认为不提交);rollback 回退就是取消所有操作,大部分操作命令,只要还没有提交就可以用rollback退回。比如下面的例子,顺便加点多表关联查询。这种查询表之间一定要有关联,否则无法查询,比如学生信息表,和班级信息表。

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

    sql也有自己的脚本一般以sql结尾,来看看如何使用。

——————————————————————————————————————————————————————

    数据字典和视图就先说到这,来看看之前说的oracle数据库的多种模式。

nomount 模式(加载实例和spfile(参数文件)):实例这东西说白了就是给Oracle在内存中占地盘的,没有地盘什么都跑不起来。

——————————————————————————————————————————————————————

ecom.__db_cache_size=188743680   【数据缓存大小】
ecom.__java_pool_size=4194304     【JAVA池大小】
ecom.__large_pool_size=4194304     【大池大小】
ecom.__shared_pool_size=83886080    【共享池大小】
ecom.__streams_pool_size=0           【流池大小】
*.audit_file_dest='/oracle/app/admin/ecom/adump'  【审计文件存放路径】
*.background_dump_dest='/oracle/app/admin/ecom/bdump' 【进程捕获文件和alert日志存放路径】
*.compatible='10.2.0.1.0'  【当前库版本号】
*.control_files='/oracle/app/oradata/ecom/control01.ctl','/oracle/app/oradata/ecom/control02.ctl','/oracle/app/oradata/ecom/control03.ctl' 【控制文件路径】
*.core_dump_dest='/oracle/app/admin/ecom/cdump' 【核心的捕获文件存放路径】
*.db_block_size=8192 【块大小】
*.db_domain=''        【域名字】
*.db_file_multiblock_read_count=16 【一次最多可以读多少块】
*.db_name='ecom'  【库名字】
*.db_recovery_file_dest='/oracle/app/flash_recovery_area' 【闪回区域】
*.db_recovery_file_dest_size=2147483648  【闪回区域大小:2147483648/1024/1024/1024=2G】
*.dispatchers='(PROTOCOL=TCP) (SERVICE=ecomXDB)' 【开启的TCP网络协议,和监听有关系】
*.job_queue_processes=10   【工作进程数,后台的计划任务】
*.open_cursors=300 【开启的游标数】
*.pga_aggregate_target=94371840 【PGA大小】
*.processes=150  【开启的最大进程数】
*.remote_login_passwordfile='EXCLUSIVE'  【登录验证的方式】
*.sga_target=285212672  【SGA大小】
*.undo_management='AUTO'   【uodo表空间管理的方式】
*.undo_tablespace='UNDOTBS1' 【当前回滚表空间】
*.user_dump_dest='/oracle/app/admin/ecom/udump' 【用户捕获文件存放路径】

    这些就是代表的意思了,既然是二进制我们该如何修改,我们只能在库打开的状态下,使用命令修改,而不可以直接修改文件。

mount  加载控制文件(记录数据文件和日志文件的位置):控制文件路径在$ORACLE_BASE/oradata/$ORACLE_SID/ 也是使用string查看:strings control01.ctl 

open   加载日志文件和数据文件:所有的数据库都会有日志文件,日志文件记录着你所有的动作,通过日志才能保证你数据库的完整性。数据文件,创建的表以及我们往表里插入的数据,在操作层面全是插入到数据文件中。路径在 $ORACLE_BASE/oradata/$ORACLE_SID/

    来看看如何一步一步的打开启动数据库。先关闭我们的数据库:

    shutdown normal 需要等待所有事务/进程全部结束 才能关数据库(严禁性最好,但是没有人用)

    shutdown transactional   需要等待,但在等待过程中,先把空闲事务进程自动关闭,有操作的进程,我们会等人家操作完毕了,再关闭库。
以上2种关闭方式,会话没有断开,往里面写数据,但是没有提交,那它就关闭不了数据库了,是不是有活动会话没有结束,它等待活动会话结束了,才能闭库,因为我们无法影响用户操作,所以上面2种基本很少使用。

    shutdown immediate  关闭之前同步数据(该同步数据的同步,没有同步的就释放掉,对于你当前的操作,它会告诉你失败了)(生产关闭数据库常用)

    shutdown abort  强制关闭数据库相当于断电(它的速度最快,此动作非常危险,容易失数据)

    下面我们来使用shutdown immediate正常关库。

——————————————————————————————————————————————————————

    接下来使用startup把数据库打开。之后我们来看看alert日志

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

    经过验证确实是三个状态,下面来手动一步一步启动我们的库,当然这里就不再次验证了。

——————————————————————————————————————————————————————

    startup 直接打此命令默认选项为open直接打开数据库
    startup nomount 只启动实例(装载实例和打开参数文件)

    startup mount  挂载数据库(装载实例和打开控制文件,激活某些功能,用户不能存取数据库可以进行实例或数据的恢复处理)

    alter database mount 改变数据库从nomount状态到mount状态
    alter database open 打开数据库(此时才可以正常对数据库进行读写)
    alter database open read only 将数据库打开到只读状态(用得特别少)

    startup force  重启数据库 (先shutdown abort ,然后startup ,生产中不会用,特别危险)

    接下来说说,简单的sql,这里就不演示了,因为太多……不过都会有详细的说明,结合之前说的mysql,理论上能看懂,这里有一点要注意的就是dual表,这个表是一个没有数据的表,在我们没有表的情况下,还需要使用一些系统函数的时候使用。

        (1)as给列以别名显示:select username as 用户名 from t_user;(这里的as关键字可以省略)

        (2)distinct去掉重复的行:select distinct username from t_user;

        (3)【临时显示的效果,数据本身没有变化】使用运算符:select age+10 from t_user;(给每个人的年龄都加10岁)

        (4)in匹配集合中的任意值:select * from t_user where username in('马文涛','宝宝');

        (5)like模糊查询:%匹配0个或多个任意字符,_匹配1个任意字符。

            select * from t_user where username like '%涛%';
            
            ***涛  涛***  *涛*  涛
            
            select * from t_user where username like '张_';  

        (6)null判断某列为空:select * from t_user where sex is null;
            (这里用is,不能用=,如果要返回不为null的记录就可以用is not null)
            
        (7)order by排序:ASC: 升序排列(可以省略),DESC: 降序排列
            升序:select u.userid,u.username from t_user u order by u.userid;
            降序:select u.userid,u.username from t_user u order by u.userid desc;


        (8)聚集函数(对一组数据进行处理,返回一个值):
            AVG–求平均值,COUNT–统计记录数,MAX–最大值,MIN–最小值,SUM–求和
            <1>返回最小和最大的工资: select min(sal),max(sal) from emp;
            <2>返回总记录数: select count(*) from emp;
            <3>返回某个字段不为空的记录数: select count(comm) from emp;
            <4>返回不为空且不重复的记录数: select count(distinct job) from emp;


        (9)group by分组(分组了就不能直接返回*,经常和聚合函数count(age)一起使用):
             <1>单字段,按部门号分组,并统计每部门人数:select deptno,count(*) from emp group by deptno;
             <2>多字段,按性别和年龄分组: select sex,age,count(*) from t_user group by sex,age;
             
        group by有一个原则,就是 select 后面的所有列中,排除聚合函数的列,必须出现在 group by 后面。
         select 列1,聚集函数 from table group by 列1;
         select 列1,列2,聚集函数 from table group by 列1,列2;         

        (10)having  where分组前的条件过滤             having分组后的过滤
        select username from t_user group by username having count(*) >=2;

        (11)伪列 【不用你创建,只要创建完表,自己就会存在的】
        rowid【用来寻址用的,我想找到表中的某一行,通过rowid定位】
        rownum【代表行号,来标记一行,唯一的号码的】

        select owner from t where rownum <=10; 伪列  rowid

        delete from t where rownum<=10000;(删除t表10000行)

        (12)between 某范围之间

        select * from emp where sal between 1000 and 5000; 【等价下面的】

        select * from emp where sal >= 1000 and sal<=5000;
            
        (13)字符串连接

        System.out.println("abc"+12);
        select 'abc'||12 from dual;

        SQL> select id,xingming from t1;
        SQL> select '员工编号:     '||empno as "员工编号",'  员工姓名:      '||ename as "员工姓名" from emp;

        (14)length

        select length('##123##') len from dual;

        (15)LTRIM,RTRIM,TRIM【多用于处理空格】

        LTRIM:左删除----left
        RTRIM:右删除----right
        TRIM:删除串两边的字符,不包含中间的

        select length('123') len1, length(ltrim('  123   ')) lentrim from dual;

        select length('123') len1, length(rtrim('  123   ')) lentrim from dual;

        select length('123') len1, length(trim('  123   ')) lentrim from dual;


        (16)TO_CHAR 是把日期或数字转换为字符串

        SQL> select sysdate from dual;

        SQL> 
        select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
        select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;


        SQL> select to_char(123,'9999.00') from dual; 

        SQL> select to_char(12333,'$99,999.99') from dual;

        SQL> select to_char(123334444,'$99,999.99') from dual;


        (17)substr  截取函数

        SQL> select substr('12345',2,3) from dual;
        (截取从第二个字符开始的3个字符)

        select substr('1234523232323',2) from dual;
        (截取从第二个字符开始,一直到字符串结束)


        SQL> select substr('123456789',-5) from dual;
        (截取后5位)


        (18)字符是否包含   instr(string,substring,position,occurrence)
        string:代表源字符串
        substring:代表想从源字符串中查找的子串
        position:代表查找开始的位置,默认为1
        occurrence:代表查找值第几次出现,结果为字符串的位置,默认为1

        没有找到,instr函数返回0.


        SELECT instr('syranmo','s') FROM dual; -- 返回 1

        SELECT instr('syranmo','ra') FROM dual;  -- 返回 3

        SELECT instr('syran mo','a',1,2) FROM dual;  -- 返回 0
        (根据条件,由于a只出现一次,第四个参数2,就是说第2次出现a的位置,显然第2次是没有再出现了,所以结果返回0。注意空格也算一个字符!)

        SELECT instr('syranmo','an',-1,1) FROM dual;  -- 返回 4

  (就算是由右到左数,索引的位置还是要看‘an’的左边第一个字母的位置,所以这里返回4)

         SELECT instr('syranmoan','an',-1,1) FROM dual; -- 返回 8

        SELECT instr('abc','d') FROM dual;  -- 返回 0

  注:也可利用此函数来检查 'abc' 中是否包含  'd',如果返回0表示不包含,否则表示包含。


        (19)abs 绝对值 

        SQL> select abs(-5) from dual; (返回值为5)
        SQL> select abs(5.5)  from dual;(返回值为5.5)

        (20)Round 函数 (四舍五入)

        SQL> select round(123.123) from dual;
        SQL> select round(123.789) from dual;
        SQL> select round(123.123,2) from dual;
        SQL> select round(123.789,2) from dual;


        (21)取整(ceil向上取整   floor向下取整)

        SQL>  select 3/2 from dual;
        SQL>  select trunc(-3/2),ceil(-3/2),floor(-3/2),-3/2 from dual;
        SQL>  select trunc(3/2),ceil(3/2),floor(3/2),3/2 from dual;


        (22)to_date 把字符串转换成日期


        SQL> create table tt2(id int,time date);

        SQL> insert into tt2 values (1,to_date('2011-11-11 11:11:11','YYYY-MM-DD HH24:MI:SS'));


        select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual;   --日期转化为字符串   
        select to_char(sysdate,'yyyy') as nowYear   from dual;   --获取时间的年   
        select to_char(sysdate,'mm')    as nowMonth from dual;   --获取时间的月   
        select to_char(sysdate,'dd')    as nowDay    from dual;  --获取时间的日   
        select to_char(sysdate,'hh24') as nowHour   from dual;   --获取时间的时   
        select to_char(sysdate,'mi')    as nowMinute from dual;   --获取时间的分   
        select to_char(sysdate,'ss')    as nowSecond from dual;   --获取时间的秒

        求某天是星期几      
        select to_char(to_date('2017-12-28','yyyy-mm-dd'),'day') from dual; 


        两个日期间的天数差  
        select sysdate - to_date('20150903','yyyymmdd') from dual;     
        select floor(sysdate - to_date('20150903','yyyymmdd')) from dual;      
        select trunc(sysdate - to_date('20150903','yyyymmdd')) from dual;   
  
        月份差 
   select months_between(to_date('03-31-2015','MM-DD-YYYY'),to_date('01-31-2015','MM-DD-YYYY')) "MONTHS" FROM DUAL;     
 
   select months_between(to_date('03-31-2015','MM-DD-YYYY'),to_date('01-15-2015','MM-DD-YYYY')) "MONTHS" FROM DUAL;     
  
  
         一年的第几天 
 
       select TO_CHAR(to_date('2015-01-01','yyyy-mm-dd'),'DDD'),sysdate from dual;      
       select TO_CHAR(to_date('2015-01-31','yyyy-mm-dd'),'DDD'),sysdate from dual; 

   
   
        (23)Replace替换函数

       select replace('abc','b','######') from dual;   
   
   
        (24)lpad [左添充] rpad [右填充](用于控制输出格式)

        select lpad('func',7,'=') s1, rpad('func',7,'-') s2 from dual;

当然sql还有很多东西,这里就不一一介绍了,我把这些存到网盘里,大家可以去下载还有一些练习,这些练习有的是scott用户的,scott用户自带一些表。链接: https://pan.baidu.com/s/1tnkAzrdkA6duZjOlfqXXcA 密码: wp2s

    这些结束之后,下一篇就得说说监听以及配置文件了

猜你喜欢

转载自blog.csdn.net/g982508295a/article/details/81271074