oracle分组,排序,函数,dml,ddl,约束,运算符

/*sql的分类
   1.DDL( Data Definition Language) 数据库定义语言(不可滚回)对表进行操作
         1.创建表   create table 表名()
约束

/*
  1:创建一张表 班级  id name
 */
 /* 1:主键约束  primary key    不能为null  列的值不能重复*/
 drop table t_class;
 create table t_class(
     id number,
     name varchar2(50)     
 );

 alter table t_class
    add constraint t_class_pk primary key(id);

 select * from t_class;
 insert into t_class(id,name)values(1,'zt1702');

/* 2:唯一键 约束 unique */可以为null  ,只能有一个null ,列的值不能重复*/
 drop table t_members;
 create table t_members(
     id number,
     name varchar2(50),
     pass varchar2(50),
     constraint t_members_pk primary key(id),
     constraint t_members_uk unique(name)
 );
  select * from t_members;
  insert into t_members(id,name,pass)
             values(2,'user1','2222222');
             commit;
 /* 3:检查 约束 check */   让列的值在指定的范围内取值
 drop table t_emp;
 create table t_emp(
     empNo number,
     name varchar2(50),
     sex char(2),
     age number 
 )
 alter table t_emp
  add constraint t_emp_pk primary key(empNo);
    /* constraint t_emp_ck_sex check( sex in('男','女'))  */
     alter table t_emp
     add constraint t_emp_ck_sex check( sex='男'or sex='女');
    alter table t_emp
    add constraint t_emp_ck_age check( age>=18 and age<=60) ;

 insert into t_emp(empNo,name,sex,age) 
             values (3,'aa','男',88);

    /*4.默认值约束default   default*/ 让列的值没在赋值就取默认值
    drop table t_ztuser;
    create table t_ztuser(
        id number,
        name varchar2(20),
        sex char(2), /* default '男' ,*/
        constraint t_ztuser_pk primary key(id),

    );
    alter table t_ztuser
        modify sex default '男';

    insert into t_ztuser(id,name)values(2,'aaa');
    select * from t_ztuser;

    /*5.外键约束foreign key */让列的值取另外一张表主键存在的值或者null

    create table t_classes(
          id number,
          name varchar2(50),
          constraint t_classes_pk primary key(id)
     );
     create table t_studentss(
          id number,
          name varchar2(50),
          sex char(2),
          tel varchar2(18),
          classId number,
          constraint t_studentss_pk primary key(id)
     );
     alter table t_studentss
       add constraint t_studentss_fk foreign key(classId)
           references  t_classes(id);

     select * from t_classes;
     select * from t_studentss;
     insert into t_classes(id,name) values(2,'zt1702');

      insert into t_studentss(id,name,sex,tel,classId)
                            values(4,'s4','男','13453',2);

       delete from   t_studentss;              
    
如何给表加约束
 两种方式添加约束
  1. 在创建表的时候          
    create table c(
          列名 数据类型
          id number,
          .....
          constraint 约束名  约束类型(列名)  

   2. 在创建表后
     alter table t_class
       add constraint t_class pk primary key(id)
          默认值约束 default例外
         modify sex default ‘男’;

注意表设计的范式
     数据库表设计的三大范式
          第一范式:列不可再分
          第二范式:行可以唯一区分,主键约束
          第三范式:表的非主属性不能依赖与其他表的非主属性  外键约束

   2. 删除表   drop table 表名;
    drop table 表名;
      truncate table 表名;
      delete from 表名; 
      之间的区别

       drop table 表 属于ddl语句 不需要事务 没有回滚
                  删除的是表的数据与表结构

        truncate table 表名 删除表的所有数据 保留表结构 不能回滚

        delete from 属于dml语句 可以回滚  需要事务
                    删除的是表的数据 可以单条或者多条或者所有
*/
  drop table t_scottuser;
  /* drop 删除掉之后 不可以回滚的 
       但oracle10g 提供了一个闪回技术 但不能是管理员账号操作   
     */
  flashback table  t_scottuser to before drop;

    */
    truncate table t_scottuser;

    3.修改表结构 alter table
  
alter table  表名
       1:添加列
          alter table 表名
             add(  列名1  数据类型1,
                     .......
                   列名n  数据类型n);                 
       2:修改列的数据类型
             alter table 表名
             modify( 列名1  新的数据类型1,
                     .......
                    列名n  新的数据类型n);                   
       3: 修改列的名称   
             alter table 表名
              rename column 列名 to 新的列名;
       4:删除列     
             alter table 表名
             drop  column  列名;
       5:重命名表
           rename 表名  to 新的表名;   

4.截断表 truncate table 表名;
  truncate table 表名 删除表的所有数据 保留表结构 不能回滚

  /*2. DML语句 仅仅操作缓冲区的数据(可以回滚)对数据进行操作 
            都需要跟 事务(commit rollback)
            配合使用才能影响表的真实数据         
      (Data Manipulation Language) 数据库操作语言

      1: insert into 表名(列名1,........列名n)
                    values(值1,........值n)  ; 

      2: update  表名 set  列名1=值1,....列名n=值n
                 [where  列名x=值x and or 列名x=值x ]

      3:delete from  表名               
                          [where  列名x=值x and or 列名x=值x ]
  */
  select * from t_scottuser;
  insert into t_scottuser(id,name,pass,status,age,birthday)
                   values(3,'王二','sssa','0',20,null);
           commit ; /*rollback;*/

   update t_scottuser set age=30   where status='1';

   update t_scottuser set pass='admin',birthday=sysdate 
                     where status='1';   

   delete from  t_scottuser where status='1';

   /*
  
     4.dcl (数据库事务控制语言)(commit rollback)
     
     5.dql(数据库的查询语言)select
          1:select  * from 表名  代表所有列
  •           代表所有 *
    • 模糊查询 like
    • 通配符 % 代表任意多个字符 可以0个
      • _代表任意一个字符
               oracle 系统函数
               1.字符函数     
                lower(列名) 把这列的值转换成小写
                 upper(列名) 把这列的值转换成大写
                initcap(列名) 把这列首字母转换成大写
               length(列名) 获取列里的长度
                 substr(列名,开始位置,长度) 获取列里的开始位置开始,数量长度的位数.  
                substr(列名,开始位置) 获取列里的开始位置开始 到末尾
               replace(列名,'old','new')
               lpad(列名,位数,‘值n’)在左边给列名的值用值n来补齐n位
             rpad(列名,位数,‘值n’)在右边给列名的值用值n来补齐n位
           字符的拼接
          1.   ||
  1.        concat(string1,string2)
               
     区别:
CONCAT只能连接两个字符串
--||可以连接多个字符串

     eg:

/*
  1:dml 数据库查询语言
*/
select  ename 原名,lower(ename) 小写名 from emp

/*
  :dml 查询名字长度大与5
*/
select * from emp where length(ename)>5;
/*
  dml 查询名字前三位
*/
select ename ,substr(ename,1,3)from emp ;
/*
  dml 查询名字首字母是M的雇员信息
*/
select * from emp where substr(ename,1,1)='M';
select * from emp where ename like 'M%';
/*
  dml 查询名字倒数第二个是T的雇员信息
*/
select * from emp where substr(ename,length(ename)-1,1)='T';
select * from emp where ename like '%T_';
/*
  dml 查询名字中的M替换成*
*/
select ename,replace(ename,'M','*')from emp;
/*
  dml 查询名字保留前两位,其他替换成一个*
     lpad(列名,位数,‘值n’)在左边给列名的值用值n来补齐n位
*/
/*
  dml 查询名字保留前两位,其他都替换成*
*/
select ename,substr(ename,1,2),rpad(substr(ename,1,2),length(ename),'*') from emp;
/*
 sss是做xxx工作的
*/
select ename||'是做' ||job||'工作的' from emp;


        2.数值函数     
     round(列名)四舍五入
      round(列名,n)四舍五入
                                   n>0,对取小数点后n位四舍五入
                                      n<0,对小数点前n位四舍五入
     trunc(列名) 截断舍弃小数位
      trunc(列名,n) 截断舍弃小数点后n位
 
eg:/*
 四舍五入
*/
select sal,round(sal)from emp;
/*
 保留一位小数四舍五入
*/
select sal,round(sal,1)from emp;
select sal,trunc(sal,1)from emp;

/*
   

3.时间函数     
     sysdate 当前时间
     months_between(时间列1,时间列2)     列2-列1经历的月份数
     ADD_MONTHS(date,months)  就可以以得到某一时间之前或之后n个月的时间,
     last_day(时间列1) 返回 时间列所在的月份的最后一天的时间
     next_day(时间列,1-7之间的值)          1-》星期日
                                                               2-》星期一  。。。
                                                               7-》星期天        
                下一个星期 值 后的时间 (往后推,离时间列最近的星期)
eg:
 更新数据的两种方式
*/
select * from emp for update;
select e.*,rowid from emp e;

/*
 虚表 sysdate 当前时间
*/
select sysdate from dual;

/*
 查询雇员入职年限
*/
select ename,trunc(months_between(sysdate,hiredate)/12) from emp;

/*
 查询出是所在月份倒数第二天入职的雇员信息
*/
select * from emp where hiredate =last_day(hiredate)-2;

/*
 查询出是当前时间后一个小时的时间
*/
select sysdate+1/24 from dual;
/*
 下一个星期 值 后的时间 (往后推,离时间列最近的星期)
*/

select next_day(sysdate ,1)from dual;
/*

4.转换函数
     to_number(列名)   转换成number类型
         to_char(列名)   转换成char 类型
          to_date(列名,‘格式’ )     字符串转换成date类型
转换成number类型
*/
select to_number('11')+11 from dual;
/*
转换成char类型
*/
select to_char(11)||'aa' from dual;
eg:to_char(sysdate,'yyyy-MM-dd hh24:mi:ss')

/*
时间格式输入
*/
create table stu(
       name varchar2(20),
       birthday date
);
insert into stu (name,birthday)
       values('b',to_date('1990-10-10','yyyy-MM-dd'));

 select * from stu;

 /*
格式化时间 格式
*/
select to_char(sysdate,'yyyy-MM-dd hh24:mi:ss')from dual;

5.通用函数
     nvl(列名,值) 如果列名为null则返回所设置的值,否则返回原值
   nvl2(列名,值1,值1 ) 如果列名为null则返回所设置的值2,否则返回值1
注:null与任何值做操作都是返回null

     case 列名 when 值1 then 操作1
                    when 值2 then 操作2
                         。。。
                    else
                    默认操作
                    end;

     decode(列名,值1, 返回值1,    
               值2, 返回值2,
               。。。
               值n,返回值n,
               默认值)
eg:
 /*
 nvl(列名,值)
*/
select ename ,sal,comm,sal+nvl(comm,0)应发工资 from emp;
 /*
 第一种方式
 给30部门加1000 。。。其他不变
*/
select ename ,sal,deptno,case deptno
                         when 30 then sal+1000
                         when 20 then sal+500
                         else sal
                         end
                         from emp;
                          /*
 第二种方式
 给30部门加1000 。。。其他不变
*/
select ename ,sal,deptno,decode(deptno,30,sal+1000,
                                       20,sal+500,   
                                       sal )
                         from emp;

去重 distinct(列名)


分组管理
     group by 列名1,列名2。。。
那么select 出来的地方只能是group by 后面的列名
或者是分组函数 max(列名) 求最大      
                         min(列名)  求最小
                          avg(列名) 求平均
                         sum(列名) 求总和
                         count(列名)求记录条数
     分组函数会自动忽略null值的项
     分组函数 对组加条件 having
     count(*) 表的总记录条数
     count(comm)表中comm不为空的记录数
排序管理
      order by 列名  asc(升序排列 默认)
                              desc(降序排列)

sql语句的执行顺序
     from -》where -》select-》group by-》having->order by
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值