Oracle学习(二)

一、数据排序
1.1 order by   排序标准,永远出现在sql语句最后
按照工资排序(升序 asc 降序 desc) 显示 id first_name salary
select  id,first_name,salary from  s_emp;                
select  id,first_name,salary from  s_emp order by salary;   
select  id,first_name,salary from  s_emp order by salary desc;   
    1.2 排序的语法
order  by 排序标准  排序方式;
排序方式:
升序  asc  默认的顺序
自然顺序   字典顺序
降序  desc             
1.3 多字段排序
select  first_name,salary from s_emp order by  salary;
如果salary的值相同 则启用名字降序排列
select  first_name,salary from s_emp order by  salary,first_name desc; 
    1.4 NULL 值在排序中的处理
     NULL在排序中作为最大值 
     select  id,manager_id from s_emp order by manager_id;
二、单行函数
2.1 针对sql语句影响的每一行  都返回一个结果。sql影响多少行 就返回多少个结果。
select  first_name,upper(first_name) from s_emp;  
select  first_name,upper(first_name) from s_emp  where id=1; 
select  first_name,upper(first_name) from s_emp  where id>1; 
select  first_name,upper(first_name) from s_emp  where id<1;

    2.2 组函数:针对sql语句影响的一组数据做处理,最终返回一个结果。
无论sql影响多少行都返回一个结果。
select count(id) from s_emp where id=1; 
select count(id) from s_emp where id>1; 
select count(id) from s_emp where id<1; 
    2.3 处理字符串的单行函数
upper   字符串变大写
lower   字符串变小写
        select  first_name,lower(first_name) from  s_emp;

测试表   dual
select * from dual; 
select  lower('HELLO') FROM  DUAL;
concat(par1,par2) 连接两个字符串,用的很少  因为有 ||
select  concat('hello ','world') from dual;
select  concat(concat('hello ','world'),' hello') from dual; 
     
length   求字符串长度
select  length('hello')  from dual;
initcap  把每个单词的首字母变大写
select   initcap('one world one dream') from dual; 
substr(par1,par2,par3)
par1要处理的字符串
par2从什么位置开始截取 编号从1开始可以是负数,-1 代表最后一个字符
par3 截取的长度
select  substr('hello',0,2) from dual;
select  substr('hello',1,2) from dual;
select  substr('hello',-1,2) from dual;

列出 s_emp 表中 first_name 以及
first_name的后三个字符
select  first_name,substr(first_name,-3,3)  from  s_emp;
replace  替换
select replace('hello','lo','test') from dual;  
nvl(par1,par2)

2.4 数字处理函数
round  四舍五入函数
select  round(9.57)  from dual;
select  round(9.99)  from dual;

/* 保留小数点后一位 */
select  round(9.57,1)  from dual;
select  round(9.54,1)  from dual;
select  round(9.547,2)  from dual;

/* 对小数点前1位进行四舍五入*/
select  round(12.88,-1) from  dual;
select  round(12.88,-2) from  dual;
trunc  截取  
/* 截掉小数部分 */
select  trunc(9.57)  from dual;
select  trunc(9.99)  from dual;
/* 截取 并保留几位小数 */
select  trunc(9.57,1)  from dual;
select  trunc(9.54,1)  from dual;
select  trunc(9.547,2)  from dual;
/* 截取 对小数前的第几位进行截取 */
select  trunc(12.88,-1) from  dual;
select  trunc(12.88,-2) from  dual;
     
    2.5 格式显示函数
     to_char(par1,par2)
     par1要处理数字数据  
     par2 是格式  可以省略  代表把数字变成
     字符串类型。如果有格式 则按照格式显示
     数字类型的数据。
     格式如下:
     fm   代表格式开头 可以省略
     9    小数点前代表0-9的任意数字
          小数点后1-9的任意数字
     0    小数点前 代表强制显示前导零
          12345  012,345     
          1234   001,234
          小数点后  代表0-9的任意数字 
     $    美元符号
     L    本地货币符号  ¥   RMB
     .    小数点
     ,    分隔符
     select  salary,to_char(salary,
     'fm$099,999.99')  from s_emp; 
     select  salary,to_char(salary,
     'fm$099,999.00')  from s_emp; 
     select  salary,to_char(salary,
     'fmL099,999.00')  from s_emp;
     如何修改数据库的本地语言
     1.远程登录服务器
       telnet   IP
     2.切换shell
       bash
     3.修改配置文件
       vi  .bash_profile
       export  NLS_LANG='SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
       export  NLS_LANG='AMERICAN_AMERICA.ZHS16GBK'
     4.保存退出
       esc
       shift+zz
     5.source  .bash_profile
     6.重新进入sqlplus 
         
     4.4.5  函数的嵌套
     把一个函数的返回值作为另一个函数的参数。
     把s_emp  表中 first_name 和 first_name 
     的后三个字符显示出来
     结合 substr  和  length
     select  first_name,substr(first_name,
       -3,3) from s_emp;
     select  first_name,substr(first_name,
       length(first_name)-2,3) from s_emp;
     列出s_emp 表中 id,first_name,manager_id
     如果manager_id 是NULL 则显示成BOSS
     select  id,first_name,
         nvl(to_char(manager_id),'BOSS') 
         from  s_emp;  
   4.5  多表查询
     4.5.1 为什么?
     需要的数据来自于多张表。
     表的设计决定的。
     4.5.2  表的介绍
     s_emp   员工表
     id       员工编号
     first_name  员工名
     dept_id     部门编号
     s_dept   部门表
     id       部门编号
     name     部门名
     列出每个员工的id  first_name和部门编号
     select  id,first_name,dept_id
         from  s_emp;
     列出每个员工的id  first_name和部门编号
     还要把部门名显示出来。
     字段如果重名则加表名区分
     /* 两张表所有的记录匹配的可能 
        笛卡尔积 */
      select  s_emp.id,first_name,dept_id,
          name
          from  s_emp,s_dept;    
    /* 表达表关系的条件 称之为 表的连接条件
       员工所在的部门编号 是一个部门的编号
       dept_id=s_dept.id */ 
      select  s_emp.id,first_name,dept_id,
          name
          from  s_emp,s_dept
              where dept_id=s_dept.id; 
---------------------------------------                   
   1.下载安装压缩包   解压
   2.找到安装文件位置  安装
     sudo  dpkg -i  gftp*
   3.使用gftp
     gftp    
     code.tarena.com.cn     
--------------------------------------- 






五、笛卡尔积  
    如果两张表 没有任何关联条件则会产生笛卡尔积。
    s_dept  
    id     部门编号
    name   部门名
    region_id   地区编号
    s_region  
    id     地区编号
    name   地区名

    5.1把每个部门的名字和对应的地区名列出
select  s_dept.name,s_region.name 
from  s_dept,s_region
where region_id=s_region.id;

    5.2 使用表的别名
select  d.name,r.name
        from  s_dept d,s_region r
        where region_id=r.id;

    5.3 列出每个员工的first_name 以及部门的名字还有地区的名字。s_emp   s_dept   s_region
select  e.first_name,d.name,r.name
from  s_emp e,s_dept d,s_region r
where  e.dept_id=d.id  and d.region_id=r.id;

    col   字段名  for  a宽度
    col   name    for  a15         
    
    5.4 连接两张表的条件都使用的是等号则这种连接称之为等值连接。
连接两张表的条件使用的是非等号则这种连接称之为非等值连接。
desc  salgrade;
desc  salgrade;
Name
---------------------
GRADE    工资级别
LOSAL    这个级别对应的低工资 
HISAL    这个级别对应的高工资

把每个员工的工资 和 工资对应的工资级别列出来。
select  salary,grade
from  s_emp,salgrade
where  salary between losal and  hisal;

select  salary,grade
        from  s_emp,salgrade
        where  salary>=losal and  salary<=hisal;

    5.5特殊的连接 (自连接)
s_emp   领导    普通员工
        id     fname   manager_id
        2       a      2
        3       c      2
        4       d      2
如果你的id 是另外一个员工的manager_id则你是领导。
select  id,first_name
from  s_emp
        where id=manager_id;

一张表中存储了 两种不同业务含义的数据,找出那些人是领导?
select distinct  m.id,m.first_name 
        from  s_emp  e,s_emp  m
        where e.manager_id=m.id;

25个员工  其中有8个领导 剩下17普通员工

    5.6 等值连接
           非等值连接
           自连接
           都是符合连接条件的数据被选中
           不符合连接条件的被过滤掉。这种连接 统称内连接。           
select distinct  m.id,m.first_name 
        from  s_emp  e,s_emp  m
        where e.manager_id!=m.id;
得到是过滤掉的数据

    外连接: 外连接的结果集等于内连接的结果集加上匹配不上的记录。
    (一个也不能少)   
    

 oracle 使用(+) 来完成外连接,(+) 字段对面的表的数据 全部匹配出来。 
      select distinct  m.id,m.first_name 
      from  s_emp  e,s_emp  m
      where e.manager_id(+)=m.id;
 
     //被找回的数据 是通过NULL 记录匹配的
      select distinct  m.id,m.first_name 
      from  s_emp  e,s_emp  m
      where e.manager_id(+)=m.id
      and e.manager_id is null; 
 
      select distinct  m.id,m.first_name 
      from  s_emp  e,s_emp  m
      where e.manager_id(+)=m.id
      and e.manager_id is not null; 


    7.列出 部门的名字 和 对应的地区名 s_dept    s_region
     select  d.name,r.name
     from  s_dept d,s_region r
     where d.region_id=r.id;
    
6.公司业务扩展 新增了部门
    insert  into  s_dept  values(100,'test',NULL);
    commit;     
    5.列出 每个部门的名字 和 对应的地区名,没有地区的部门名也要显示。
    select d.name,r.name 
from  s_dept d,s_region r
    where d.region_id=r.id(+);    
    
    4.列出每个员工的first_name  和对应的部门名s_emp   s_dept
      select e.first_name,d.name  
      from  s_emp e,s_dept d 
      where dept_id=d.id; 
  
    3.把老板部门号 变成NULL  
    update s_emp  set  dept_id=NULL where  id=1;
    commit; 

    2.列出每个员工的first_name  和对应的部门名,没有部门的员工也要显示 
select e.first_name,d.name  
        from  s_emp e,s_dept d 
        where dept_id=d.id(+);  
  
    1.给老板涨工资 
    update  s_emp  set salary=12500 where id=25;
commit; 
    列出每个员工的id  salary  和工资级别不在工资级别范围内的员工也要显示。 
select  id,salary,grade
        from  s_emp,salgrade 
        where salary  between losal(+)  and  hisal(+)
order  by id;        




















  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值