Day38_数据库、内连、外连

本文深入探讨SQL中常用函数的使用方法,并通过具体实例展示其在数据处理过程中的实际应用,包括字符串处理、数字运算、格式化显示、函数嵌套、多表查询等关键技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2013年11月22日 星期五 10时07分41秒 

    2.测试单行函数
      dual 单行单列的标
      a.字符串处理函数
        upper  变大写
        lower  变小写
        select lower("HELLO") from dual;
        initcap 每个单词的首字母大写
          select initcap('one world one dream') from dual;
        concat(par1,par2)  连接两个字符串,用的很少,因为有||
          select concat('Liu','Jianfan') from dual;
          select 'hello'||'world'||'hello' from dual;
          select concat('hello',concat('word','hello')) from dual;
        length(par1)
          select length('hello') from dual;
        substr(par1,par2,par3)
          par1 要处理的字符串 或者 字段
          par2 是从什么位置开始处理 编号从1开始,也可以是负数,-1 代表最后一个字符
          par3 截取多少个字符
          select substr('hello',1,2) from dual;
          把S_开头的表名的前三个字符
          select table_name,substr(table_name,1,3) from user_tables where table_name like 'S\_%' escape'\';     '
          select table_name,substr(table_name,-3,3) from user_tables where table_name like 'S\_%' escape'\';    '
        b.处理数字的函数
          round 四舍五入
            select round(9.57) from dual;        --10
            select round(9.47) from dual;        --9
            select round(9.57,1) from dual;      --9.6
            select round(9.494,2) from dual;     --9.49
            select round(19.57,-1) from dual;    --20
            select round(12.57,-1) from dual;    --10
            select round(12.57,-2) from dual;    --0
          trunc 截取
            select trunc(12.57,1) from dual;     --12.5
            select trunc(9.494,2) from dual;     --9.49
            select trunc(9.497,2) from dual;     --9.49
        c.数字格式化显示函数
          to_char(par1,par2)
            par1 是要处理的数字或者字段
            par2 是格式  可以省略  代表把一个数字类型数据转换成字符串类型,格式以fm开头
            9    小数点前代表0-9任意数字 小数点后代表1-9的任意数字
            0    0 用在小数点前代表强制显示前导零
                 12345  012,345
                 0 用在小数点后代表0-9的任意数字
            $    美元符号
            L    本地货币符号
            ,    分隔符号
            .    小数点
            
            显示 s_emp 表员工的工资 按照格式 'fm$099,999,99'
            select to_char(salary,'fm$099,999.999') from s_emp;    --$001,200.
            select to_char(salary,'fm$099,999.000') from s_emp;    --$001,200.000
            select to_char(salary,'fmL099,999.000') from s_emp;    --L根据本地语言环境判断
            如何修改本地的语言环境
            1.切换shell
              bash
            2.打开配置文件
              vi .bash_profile
            3.写入配置数据
              export NLS_LANG='SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
              export NLS_LANG='AMERICAN_AMERICA.ZHS16GBK'
            4.保存退出文件
              shift+zz
            5.让环境变量生效
              source .bash_profile
            6.重新进入sqlplus
            
        d.函数嵌套
          把一个函数的返回值 作为另一个函数的参数
          把s_emp 表中 first_name 后三个字符列出来
           select first_name,substr(first_name,-3,3) from s_emp;
           length 结合substr完成
           select first_name,substr(first_name,length(first_name)-2,3) from s_emp;
           
           显示s_emp 表中 id,first_name,manager_id
           select id,first_name,manager_id from s_emp;
           select id,first_name,nvl(to_char(manager_id),'BOSS') from s_emp;

E.多表查询
  1.把每个员工的id,first_name,dept_id
    select if,first_name,dept_id from s_emp;
  2.查询的数据来自于俩张表
          s_dept(部门表)
          SQL> desc s_dept;(笛卡尔乘积)
               select s_emp.id,first_name,dept_id,name from s_emp,s_dept where dept_id=s_dept.id;
       
            NAME
       -------------------------------
          ID             部门编号
          NAME           部门名字
          REGION_ID      地区编号
        SQL>  desc   s_region
           ID             地区编号
           NAME           地区名
     把每个部门的名字 和 对应的地区名字列举出来
         select s_dept.name,s_region.name from s_dept,s_region where s_dept.region_id = s_region.id;
       col xxx for a15-- 调整显示的格式
     4.表的别名
          select d.id,d.name,r.name from s_dept d,s_region r where d.region_id=r.id;
           在from后面给表取名子后,整个语句中必须使用取的别名;不然就不识别;
     5.连接两张表的条件的符号 的都是等号 所以这种连接称之为等值连接;
       连接两张表的条件符号   不是等号,这种连接称之为非等值连接
 Name					   Null?    Type
 ----------------------------------------- -------- ----------------------------
 GRADE						    NUMBER  工资级别
 LOSAL						    NUMBER   同等级的对应的最低工资
 HISAL						    NUMBER   同等级的对应的最高工资
       s_emp 表中  first_name salary 以及工资对应的工资级别
            select s_emp.first_name,s_emp.salary,salgrade.grade from s_emp, salgrade where s_emp.salary between losal and hisal;
 6. 自连接
       领导是员工
       不是领导的员工 也是员工
     找出所有的领导;
         id  manager_id
       select  distinct m.id,m.first_name from s_emp e,s_emp m where e.manager_id=m.id; 
       
----------------------------------------------------------------------------------
连接:
  等值连接
  非等值连接
  自连接
  这三种连接都有一个共同的特点 符合连接条件就选中数据 不符合条件就过滤掉数据

找出所有的普通员工?
  select distinct m.id,m.first_name from s_emp e,s_emp m where m.id=e.manager_id;
外连接:外连接的结果集 等于 内连接的结果集 加上 匹配不上的记录
        一个也不能少
  select distinct m.id,m.first_name from s_emp e,s_emp m where e.manager_id(+)=m.id;
  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;
9.列出所有部门的部门名 和 部门名对应的地区名
  s_dept    部门表
  id
  name
  region_id
  
  s_region  地区表
  id
  name
  select distinct d.id,d.name,r.name from s_dept d,s_region r where d.region_id=r.id;
  新增加了一个没有地区的部门
  insert into s_dept values(999,'T_T',NULL);
  commit;
  --显示所有的部门名 和 对应的地区名
  select distinct d.id,d.name,r.name from s_dept d,s_region r where d.region_id=r.id(+);
  --把没有地区编号的部门显示出来
  select distinct d.id,d.name,r.name from s_dept d,s_region r where d.region_id=r.id(+) and r.id is not null;
10.列出每个员工的first_name salary 和工资对应的工资级别
   salgrade
   s_emp
     select e.first_name,e.salary,g.grade from s_emp e,salgrade g where e.salary between losal and hisal;
   给老板涨工资
   update s_emp set salary=22500 where id=1;
   commit;
   select e.first_name,e.salary,g.grade from s_emp e,salgrade g where e.salary between losal(+) and hisal(+) order by id;
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值