Oracle学习(一)



一.数据库和数据库管理系统
1.1名词解释
oracle   数据库的一种
DBMS   数据库管理系统  负责对数据的管理
DB     数据库  数据的真正存放
RDBMS   关系型数据库管理系统
RDB     关系型数据库
1.2 基于二维表的数据库
1.3现在主流关系型数据库管理系统
oracle oracle(甲骨文)  
db2       IBM  
sqlserver mic(微软)  
非商业型数据库
mysql    sun-----oracle(操作系统 java)


二.sql学习 (结构化查询语言)
2.1 select语句   查询语句
select
  2.2 ddl语句      数据定义语句
      create   table
      drop     table
      alter   table 
  2.3 dml语句    数据操作语句
      insert 
delete
      update      
2.4 tcl        事务控制语句
      commit; 提交 确认
      rollback; 回滚 撤销
      savepoint  保存点;    
  2.5 dcl     数据控制语句
      grant  授权
      revoke  回收权限    
 三.使用数据库
  3.1登录数据库
  telnet  IP
  telnet  192.168.0.26            
  使用sqlplus  进入数据库
  sqlplus   
  !clear
  exit
3.2 查询数据库中的表结构
  desc  表名;
      desc  s_emp;
desc  s_emp;
 Name                                      Null?    Type
 ----------------------------------------- -------- --------------------
 ID    员工编号                                     NOT NULL NUMBER(7)
 LAST_NAME  姓                               NOT NULL VARCHAR2(25)
 FIRST_NAME 名                                         VARCHAR2(25)
 USERID     用户编号                                      VARCHAR2(8)
 START_DATE 入职日期                                 DATE
 COMMENTS   备注                                        VARCHAR2(255)
 MANAGER_ID 领导的员工编号                     NUMBER(7)
 TITLE      职位                                         VARCHAR2(25)
 DEPT_ID    部门编号                                      NUMBER(7)
 SALARY     月薪                                       NUMBER(11,2)
 COMMISSION_PCT  提成                             NUMBER(4,2) 


四.select语句
4.1 from 子句
    select  salary  from s_emp;
    select  first_name,salary from s_emp;
    select  * from  s_emp;
    4.2表中字段数据的数学运算+ - *  /
    把每个员工的工资加100显示出来
    select  salary,salary+100 from s_emp;
    计算每个员工的月薪 和 年薪
    select  salary,salary*12  from s_emp;
  select  salary,100+salary*12  from s_emp;
    select  salary,(100+salary)*12  from s_emp;
    sql中的除法不取整
    select  salary,salary/22 from s_emp;
  4.3数据库中的别名
    字段或者表达式的后面 加一个名字
    select  salary sal,(100+salary)*12 yearsal from s_emp; 
    字段或者表达式的别名只能有一个
    select  salary sal,(100+salary)*12 yearsal from s_emp;  
    要处理别名的原样显示 "别名"
    select  salary sal,(100+salary)*12 "year Sal" from s_emp; 
    4.4sql 中字符串的表达
    使用单引号 引起一串字符
    ''   ' '   'a'   'hello world'   '_'
    显示s_emp 表中first_name  last_name
    select first_name,last_name  from s_emp;
    字符串的拼接   ||(字符串拼接符)
    select  first_name||last_name from s_emp;
  @  _
    select  first_name||'@'||last_name from s_emp;
  first_name  和 last_name 之间拼接一个 '
    this  is   this's 
    %d  %lf %%
    select  first_name||''''||last_name from s_emp;
    first_name  和 last_name 之间拼接两个 '
    select  first_name||''''''||last_name from s_emp;
    select  first_name||''''||''''||last_name from s_emp;


4.5 null值的处理
    null 值和任何值做运算 结果都是null
    换一种年薪的计算方式
    12*salary+12*salary*(commission_pct/100)
12*salary*(1+commission_pct/100)
    列出每个员工的年薪 和 新的计算方式的年薪
    select  salary*12 yearsal,salary*12*(1+commission_pct/100) newys from  s_emp;
       
    4.6null值的处理  null值处理函数
null 值要尽早处理
    nvl(par1,par2)  par1,par2可以是任意类型,但要求类型保持一致。
    当par1为null 则返回par2的值
    当par1不为null 就返回值par1的值
select  salary*12 yearsal,nvl(salary*12*(1+commission_pct/100),0) newys from  s_emp;
select  salary*12 yearsal,salary*12*(1+nvl(commission_pct,100)/100) newys from  s_emp;  
  显示每个员工的 first_name  manager_id salary  如果manager_id 为null 则显示成-1
  select  first_name,nvl(manager_id,-1),salary from s_emp;


    4.7 数据的排重显示   distinct
sql语句只关心做什么 不管怎么做
select  salary from s_emp;
select  distinct salary from s_emp;

如何初始化sql编程环境
1.上传初始化脚本
2.运行脚本
SQL>@路径名/脚本名


显示 s_emp 表中 title  和 salary
select  title ,salary from s_emp;   
联合排重
select distinct title,salary from  s_emp;

/* error */ 
-- 这是单行注释
select title,distinct salary from s_emp;   
select distinct id,title,salary from s_emp;      
4.8 where子句
     限制表中的数据返回,符合where条件数据就被选中,不符合where条件数据就被过滤掉。
4.8.1两个极限条件
where  1=1;  /* 恒等 */
where  1=2;  /* 永假 */
select id,first_name from s_emp;
select id,first_name from s_emp where 1=1;
select id,first_name from s_empwhere 1=2;  //no rows  selected    
4.8.2 number 类型条件的书写
找出工资大于1400的员工,列出id  first_name  salary
select id,first_name,salary from s_emp where salary>1400; 
select id,first_name,salary from s_emp where salary<1400; 
select id,first_name,salary from s_emp where salary=1400;
select id,first_name,salary from s_emp where salary!=1400; 

4.8.3 字符串类型条件的书写
找出first_name 叫Carmen的 员工的id,first_name,salary
select  id,first_name,salary from s_emp where first_name='Carmen';
字符串类型 要注意单引号
字符串类型的值要严格区分大小写
sql语句不区分大小写        
SELECT  ID,FirSt_Name,salary from s_emp where first_name='Carmen';          
4.9 常见条件运算符
>   <   >=  <=  =  !=


4.9.1表达区间   [a,b]
where   字段  between a  and b;                     
s_emp 表中 salary在[1400,2500] 的员工的id ,salary 
select  id,salary from s_emp where salary  between 1400 and  2500;                 
4.9.1表达一个字段在一个范围内取值
where 字段 in (a,b,c,d)                 
部门编号是 31  或者 32  或者是50 的员工的信息。列出id,first_name,dept_id                   
select id,first_name,dept_id from s_emp where dept_id in(31,32,50); 
select id,first_name,dept_id from s_emp where dept_id in(32,31,50);
最终数据没有差别  但执行效率 可能受到极大的影响。出现概率高的放前面。
      
把s_emp表中id是1或者是10或者是25的员工查询出来 列出id  first_name
select id,first_name from s_emp where  id  in(1,10,25);
         
    5.0 模糊查询   like 
李嘉诚   李小龙  李刚   李成龙  史泰龙  龙龙   小龙女
ls  *.txt
ls  *.c 老
ls  *.*
5.1sql 中的统配符
%    0-n个任意字符
_    1个任意字符
     
找出姓李的人
where   name  like '李%';
name 中带龙的
where   name  like '%龙%';
倒数第二个是龙
where   name  like '%龙_';
找出s_emp  表中first_name 中带a的
select first_name from s_emp where first_name like '%a%';
找出s_emp  表中first_name 中第二个字符是a的。
select first_name from s_emp where first_name like '_a%';  
     
desc  user_tables;
select  table_name from user_tables;
s_emp   员工表
s_dept  部门表
从user_tables 表中 找出table_name 符合S_ 开头的表名.
     
select table_name from user_tables where table_name like 'S_%';
处理_ 或者 %的转义问题
select table_name from user_tables where table_name like 'S\_%' escape  '\'; 
从user_tables 表中 找出table_name 符合S__ 开头的表名. 
select table_name from user_tables where  table_name like 'S\_\_%' escape  '\';
    6.0 NULL 值的判断
     where  字段  is  null;
     如果字段的值 是NULL 就选中数据,如果不是NULL 就不选中。
     找出提成是10的员工的id first_name commission_pct 
     select  id,first_name,commission_pct from s_emp where commission_pct=10;
     select  id,first_name,commission_pct from s_emp where commission_pct!=10;     
     select  id,first_name,commission_pct from s_emp where commission_pct is null;
    7.0 逻辑条件 连接符号
     and 
        [a,b]
        where  字段名>=a and 字段名<=b;
        [1400,2500]
        select  id,first_name,salary
            from s_emp
                where salary>=1400 and 
                salary<=2500;        
     or
       员工的编号 是1 或者是10 或者是15
       的。列出id first_name salary
       select  id,first_name,salary
           from s_emp 
           where id=1 or id=10 or id=25;
     not 
     =      !=  ^=  <>
     >      <=   
     <      >=
     between a and  b  not  between a and b
     in     not in (注意NULL)
     like   not like 
     is null   is not null 
   4.3 数据排序
     4.3.1 order by   排序标准;
           永远出现在sql语句最后
     4.3.2 按照工资排序(升序 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;   
    4.3.3 排序的语法
     order  by 排序标准  排序方式;
     排序方式:
     升序  asc  默认的顺序
         自然顺序   字典顺序
     降序  desc             
    4.3.4 多字段排序
     select  first_name,salary from s_emp
         order by  salary;
     如果salary的值相同 则启用名字降序排列
     select  first_name,salary from s_emp
         order by  salary,first_name desc; 
    4.3.5 NULL 值在排序中的处理
     NULL在排序中作为最大值 
     select  id,manager_id from s_emp
         order by manager_id;
  4.4  单行函数
     4.4.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;
     组函数:针对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; 
     4.4.2  处理字符串的单行函数
     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)
     4.4.3  数字处理函数
     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;
     
     4.4.4  格式显示函数
     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;      
       
       
                                                                                                                 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值