SQL复习一

 查看一张表的表结构:
 desc     表名;
 desc     s_emp;
 SQL> 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 语句
  A.  from 子句
        1.从数据库表中查询一个字段的值出来
           select  字段名 from  表名;
   select   salary     from    s_emp; 
        2.查询多个字段出来
          select  字段名1,字段名2   from  表名;
          select    first_name,salary  from s_emp;
        3. * 号可以代表所有的字段名
          select  *  from  s_emp;
        4.数学运算 
          + -  *  /
          select    salary/30 , salary*12   from  s_emp;
          select    salary*12+100  from s_emp;
          select   (salary+100)*12  from s_emp;
        5. 给字段或者表达式起别名 
          select    first_name   name    from s_emp; 
          select     (salary+100)*12   yearsal   from s_emp;  
          对一个字段或者表达式 别名 只能 有一个 
          如果想原样显示  则需要使用 ""
          select     (salary+100)*12   "year  sal"   from s_emp; 
         6.sql中如何表达字符串
            必须使用单引号  引起来
            'a'  ''   '  '  'hello world'    '_'    'test'
            select  first_name from s_emp;   
            字符串的拼接   
            把姓名连接之后显示
            select  first_name,last_name from s_emp;
            ||   字符串拼接符号
            select  first_name||last_name  from s_emp;
            select  first_name||'_'||last_name  from s_emp;
            拼接一个单引号 
            select  first_name||'''||last_name  from s_emp;  
            转义 -------%%(c)   ''''
            select  first_name||''''||last_name  from s_emp; 
         7.数据的排重
            select    salary  from  s_emp;
            重复的数据只显示一次  ------distinct
            select   distinct   salary  from  s_emp;   
            多字段联合排重   
            select   title ,salary  from s_emp;    
            select   distinct title ,salary  from s_emp; 
            select   distinct title ,distinct salary  from s_emp; //error
                          20                  18
            select   distinct id,title ,salary  from s_emp;  
         8.NULL 值的处理
            #define   NULL  (void*)0
            数据库中的NULL代表没有值 或者未知值
            把s_emp  表中的提成查询出来    
            select  commission_pct   from s_emp;  
            10000$*(1+commission_pct/100)
            考虑提成计算月薪
            select first_name, salary,salary*(1+commission_pct/100)  from s_emp;    
             为了处理null  值 引入了一个函数 
             nvl(par1,par2);
             要求两个参数的类型 必须一致
             当par1是NULL 则返回par2的值   如果par1不为null
              则返回par1本身的值
             select  commission_pct ,nvl(commission_pct,1) from  s_emp;    


             select first_name, salary, nvl(salary*(1+commission_pct/100),0)  sal from s_emp; 
             NULL 值要尽早处理   因为null值和任何值做运算都是NULL
             select first_name, salary, salary*(1+nvl(commission_pct,0)/100)  sal from s_emp;
             
                                        
  B.  where  子句
        限制表中数据的返回    where子句  条件子句   
        符合条件的就会被选中  不符合条件的就被过滤掉 
        1.查询 工资大于1400 的 人的 first_name,salary
         select  first_name,salary from s_emp;  
         select  first_name,salary from s_emp where 1=1;   
         select  first_name,salary from s_emp where 1=2;    
         select  first_name,salary from s_emp  where salary>1400; 
        2.找出部门号是50的 first_name,dept_id,salary
          select  first_name,dept_id,salary  from s_emp where dept_id=50;   
        3.找出first_name 叫 Carmen 的 first_name,salary
           select  first_name,salary   from s_emp where first_name='Carmen';     
           select  first_name,salary   from s_emp where first_name='carmen';    //logic error
           sql语句不区分大小写  但字符串的值要区分大小写
           SElecT  first_name,salary   from s_emp  where first_name='Carmen';    
        a.数学运算符  
          >  <  = >= <=   不等于 != ( 等同于 <> 与 ^= )            
        b.sql提供的运算符号
           表达一个闭区间   [a,b]    
           where  字段   between  a   and  b
           查询工资在 [1000,1400]  中的first_name,salary
           select   first_name,salary  from s_emp  where salary  between  1000  and  1400;    
           表达一个字段在一组值范围内
           查询 部门号 是  30,32,50  的 first_name,dept_id,salary
           字段  in (值列表);
           值列表 是用逗号隔开的一组值
            select  first_name,dept_id,salary from s_emp where dept_id in (30,32,50);         
            select  first_name,dept_id,salary from s_emp where dept_id in (50,32,30); 
            注意:我们应该把出现概率高的数据放前面
           
           判断NULL
           where   字段   is   null     判断字段的值是不是null
           找出manager_id  是null  的 员工的first_name 和salary  
           select   first_name,salary,manager_id   from  s_emp  where  manager_id is null;         
          模糊查询 
          通配符      ls   *.txt
          %              0-n 个任意字符
          _              一个任意字符
        
         东方不败      什么东东      东西南北
          
         找出 first_name 带a的  
         像  -------where  字段 like  '%a%';    
         select   first_name from s_emp where first_name like  '%a%';                                        
         找出first_name 第二个字符是a的 
         select   first_name from s_emp  where first_name like  '_a%';     
         desc    user_tables;
         table_name   
         s_emp 
         找出表名是s_ 开头的表 
         select table_name from   user_tables where  table_name like 'S_%'; 
         要对_ 进行转义
         select table_name from   user_tables where  table_name like 'S\_%' escape '\'; 
            
        between  a  and  b
        in (列表)
        is   null 
        like %  _
        
        逻辑条件连接符号 
        and   
        or 
        not   
        where   salary>=1000  and  salary<=1400;
        (1000,1400)
        where   salary>1000  and  salary<1400;    
        找出工资大于1000  并且部门号 大于30 的 
        first_name ,salary,dept_id
        select   first_name,salary,dept_id  from s_emp  where salary>1000  and  dept_id>30;   
        查询 部门号 是  30,32,50  的 first_name,dept_id,salary
         select   first_name,dept_id,salary from s_emp  where dept_id=30  or  dept_id=32 or  dept_id=50;
         not
         >                 <=
         <                 >=
          =                !=    <>   ^=
         between a and b    not  between a  and b
         in ()              not  in()   注意NULL  
         like               not  like    
         is  null           is   not   null 
         
         select     first_name  from  s_emp where first_name not  like   '%a%';
         找出提成不是null的员工的 first_name,commission_pct
         select     first_name,commission_pct    from s_emp
                where   commission_pct   is  not  null;               
          SQL>edit      
          进入标准的vi操作 
          SQL> /
         改变逻辑运算的顺序         
          where    dept_id=41   or  dept_id=42   and  salary>1000;
          where    (dept_id=41   or  dept_id=42)  and  salary>1000;


  C.  order   by   子句
       数据的排序
       select   first_name,salary  from s_emp;  
       order    by    排序标准;
       select   first_name,salary  from s_emp where  salary>1000 order  by  salary;    
       默认的排序标准 是升序     升序的关键字   asc 
       select   first_name,salary  from s_emp where  salary>1000 order  by  salary asc;  
       降序的关键字 
       select   first_name,salary  from s_emp where  salary>1000 order  by  salary desc; 
       升序      自然顺序      字典顺序 
       NULL在排序中的处理,默认为最大
       select  first_name, manager_id   from s_emp  order by  manager_id;              
       select  first_name, manager_id   from s_emp  order by  manager_id  desc; 
        
       select  first_name,salary  from s_emp  where salary>1000  order  by  salary asc;  
        如果工资相同   则希望再通过first_name 降序排
        主排序   从排序字段

        多字段排序
        select   first_name,salary  from s_emp
              where   salary>1000  
                     order  by  salary asc,first_name desc;    
       order by    排序标准   排序类型;
       排序标准  日期   面积   数量 ....; 
       可以有多个字段的排序。 
       排序类型   升序 asc   降序 desc;
  
       null  值在排序中作为最大值处理         
       按照入职日期排序   如果入职日期相同 则按照工资降序排
       列出 first_name   start_date    salary
       select   first_name,start_date ,salary  
            from  s_emp  where 1=1  order by  start_date,salary desc; 
        select id,to_char(start_date,'yyyy-mm-dd')  from s_emp;   
  D.  单行函数
        单行函数:对sql语句影响的每一行都返回一个结果
                       sql语句影响多少行就返回多少个结果
        upper(字段)
        select  first_name,upper(first_name) from s_emp;
        select  first_name,upper(first_name) from s_emp where id=-1;
        组函数 :  对sql语句影响一组数据做处理  最终返回一个结果
        count(字段)
        select  count(first_name) from s_emp;        
        select  count(first_name) from s_emp where id=-1;   


       为了测试单行函数的功能      
       dual  单行单列的表
       desc  dual; 
       select * from dual;
       处理字符串的单行函数
  upper(字段/字符串) 让字符串变大写   
       select upper('hello world')   from dual;
       create table testdual  as select  id from s_emp where  id=1;
       select upper('hello world')   from testdual;
  
       lower(字段/字符串) 让字符串变小写
       select   lower('TEST')   from dual;  
  
       initcap(字段/字符串) 把每个单词的首字母变大写 
       select  initcap('one  world one dream')  from dual; 
  
       concat(par1,par2) 字符串连接
       select   concat('hello ','world')   from dual;
       因为有 ||  所有这个函数很少使用
       select  'hello'||'world'||'hello'  from  dual;  
       select   concat(concat('hello ','world'),'hello')   from dual;  
  
       length(字符串)
       select length('hello')  from dual; 
  
       substr(par1,par2,par3)
       par1 要处理的字符串 或者字段 
       par2 要从哪个位置开始截取 从1开始编号  可以是负数
       par3 截取多长
       select   substr('hello',0,3)  from dual;  
       select   substr('hello',1,3)  from dual;   
       select   substr('hello',-2,3) from dual;   
       显示first_name 的 后三个字符

       select   first_name,substr(first_name,-3,3) from s_emp; 


       结合length  和  substr   upper 显示 first_name 的 后三个字符
       并且大写显示
  select  first_name,substr(first_name,length(first_name)-2,3)   from s_emp;
       select  first_name,upper(substr(first_name,length(first_name)-2,3))   from s_emp;

你可能感兴趣的:(SQL基础)