zoukankan      html  css  js  c++  java
  • Oracle DB Day03(SQL)

    --day03
    --创建一个包含下面信息的表,并添加一些记录待用
    --EMPLOYEE_ID    NOT NULL NUMBER(6)    
    --FIRST_NAME              VARCHAR2(20) 
    --LAST_NAME      NOT NULL VARCHAR2(25) 
    --EMAIL          NOT NULL VARCHAR2(25) 
    --PHONE_NUMBER            VARCHAR2(20) 
    --HIRE_DATE      NOT NULL DATE         
    --JOB_ID         NOT NULL VARCHAR2(10) 
    --SALARY                  NUMBER(8,2)  
    --COMMISSION_PCT          NUMBER(2,2)  
    --MANAGER_ID              NUMBER(6)    
    --DEPARTMENT_ID           NUMBER(4)    
    
    
    SELECT * FROM employees;
    DESC employees
    --AS 可以改变标题样式,相当于使用别名
    SELECT employee_id as id,CONCAT(first_name,last_name) as name from employees
    
    
    --WHERE 限制查询条件,数字可以不用单引号,字符串和日期等都需要单引号
      --查询条件可以使用若是苏子可以使用四则运算,日期可以叫做加减操作表示加减天数
    select *from employees
    where salary = 9000;
        -- WHERE 条件中可以使用< , > , <=  , >= , = , !=,
            --   AND且 ,OR或,可有多个条件
            --LIKE模糊查询
        SELECT *FROM EMPLOYEES
        WHERE SALARY<9000;
        SELECT *FROM employees 
        WHERE SALARY !=9000;
        SELECT *FROM EMPLOYEES
        WHERE SALARY<9000 AND HIRE_DATE<'1997-06-21';
        --LIKE模糊查询  %:表示0到多个字符;_:表示单个字符
        SELECT *FROM employees
        WHERE first_name LIKE 'Al%y%';
    --IN ,NOT IN
    SELECT *FROM EMPLOYEES
    WHERE SALARY IN(9000,8000) ;--相当于或的作用,不表示范围,选出salary为9000和8000的
    SELECT *FROM EMPLOYEES
    WHERE SALARY NOT IN(9000,8000);
      
    --BETWEEN...AND...筛选符合某个取值范围内的数据
    SELECT *FROM EMPLOYEES
    WHERE SALARY BETWEEN 8000 AND 9000;
    
    --IS NULL, IS NOT NULL
    SELECT *FROM EMPLOYEES
    WHERE COMMISSION_PCT IS NULL AND SALARY BETWEEN 8000 AND 9000;
    
    SELECT *FROM EMPLOYEES
    WHERE COMMISSION_PCT IS NOT NULL AND SALARY BETWEEN 8000 AND 9000;
    
    --ANY,ALL
      -- >ANY大于最小 , <ANY 小于最大
      -- >ALL 大于最大, <ALL 小于最小
      SELECT *FROM EMPLOYEES
      WHERE SALARY >ANY(3500,4000,4500);
      
      SELECT *FROM EMPLOYEES
      WHERE SALARY >ALL(3500,4000,9000);
    
    --DISTINCT 过滤掉重复值
      SELECT DISTINCT SALARY FROM EMPLOYEES
      
      
    --ORDER BY 排序;默认是asc升序;  ASC升序;   DESC降序
      SELECT *FROM EMPLOYEES
      WHERE SALARY >ALL(3500,4000,9000)
      ORDER BY SALARY DESC;
      --多条件排序,若第一列数据形同,再以第二列排序,以此类推,每一列都需要设置排序
      SELECT *FROM EMPLOYEES
      WHERE SALARY >ALL(3500,4000,9000)
      ORDER BY SALARY ASC,first_name ASC;
      
      
    --聚合函数分组函数/多行函数/集合函数  :主要完成一些数据统计等工作,例如算平均值、统计部门人数等
      --统计最大值
        SELECT MAX(SALARY) max_sal,MIN(salary) min_sal FROM employees
      --AVG 用来计算表达式的平均值  ;SUM 用来计算和值
      SELECT AVG(SALARY) avg_sal,SUM(SALARY) sum_sal FROM EMPLOYEES;
      --统计记录条数
      SELECT COUNT(SALARY) TOTAL_NUM FROM EMPLOYEES
      WHERE SALARY >8000
      --聚合函数忽略NULL值,当某一列包含NULL值时,比较下面两条语句
      SELECT AVG(commission_pct) avg_commission_pct FROM employees;   --null值会忽略
      SELECT AVG(NVL(commission_pct,0)) avg_commission_pct FROM employees;  --把null值转换成了0计算
      
    --GROUP BY  把记录划分若干小组
      --HAVING 对分组后的数据进一步限制
      SELECT salary ,MAX(salary) max_sal  FROM employees
      GROUP BY salary 
      HAVING MAX(salary)>8000
      ORDER BY salary;
      
    
    --查询语句的执行顺序,可以提高查询效率
      --FROM:执行顺序为 从后往前,从右往左,数据量较少的表尽量放在后面;
      --WHERE:执行顺序 自下而上,从右往左,最大的过滤条件写在最后面;
      --GROUP BY:执行顺序从左往右分组
      --HAVING :尽量避免使用,having会在检索后才对结果进行过滤,需要排序等操作,消耗资源;尽量把过滤条件放在WHERE中;
      --SELECT: 少用 * ,尽量用字段名称,消耗时间;
      --ORDER BY :执行顺序 从左往右,消耗资源
    
    
    --关联查询  :
      --实际应用中根据需要,一般需要查询两个或两个以上的表或视图,这种查询叫做 连接查询;
      --连接查询一般建立在存在互相关系的的父子表之间;
      
      --笛卡尔积:关联操作的每一个表的每一行都和其他表的每一行组合;
      --例如一个表X条数据,另一个表Y条数据,则两个表的查询结果会返回X*Y条数据;
      
      --等值连接
          
          --创建连个表待用
          CREATE TABLE animal(
            name VARCHAR2(20),
            leg NUMBER(2)
          )
          INSERT INTO animal(name,leg)
          VALUES('CAT',4);
          INSERT INTO animal(name,leg)
          VALUES('MONKEY',4);
          INSERT INTO animal(name,leg)
          VALUES('MEN',2);
          ALTER TABLE animal ADD( id NUMBER(2))
          INSERT INTO animal(name,leg,id)
          VALUES('MEN',2,3);
          DELETE FROM animal WHERE NAME = 'MEN' AND ID IS NULL;
          UPDATE animal SET ID=1 WHERE NAME = 'CAT'
          UPDATE animal SET ID=2 WHERE NAME = 'MONKEY'
          SELECT *FROM animal;
          
          CREATE TABLE local(
            place VARCHAR2(20)
          )
          INSERT INTO local(place)
          VALUES('南京'); 
          INSERT INTO local(place)
          VALUES('四川');
           INSERT INTO local(place)
          VALUES('安徽');
          ALTER TABLE local ADD(ID NUMBER(2))
          UPDATE local SET ID = 1 WHERE place ='南京';
          UPDATE local SET ID = 2 WHERE place ='四川';
          SELECT *FROM local;
         
         --内连接:返回满足连接条件的数据记录,不满足关联条件的记录都是无法在关联查询中查出来的
           --用 join ... on 多张表时条理比较清楚
            SELECT animal.name,local.place FROM animal ,local;    
            --出现笛卡尔集,通常没什么意义,数量大时还容易溢出,大部分需要添加关联条件
            --要避免笛卡尔集,n张表就需要n-1个连接条件
            SELECT ani.name,loc.place FROM animal ani ,local loc;    --给表添加别名可以简化SELECT语句复杂度
            SELECT ani.name,loc.place FROM animal ani ,local loc WHERE ani.id=loc.ID;
            SELECT ani.name,loc.place FROM animal ani JOIN local loc ON (ani.ID =loc.id);
              --左外连接、右外连接一样的效果,那边有+号那边补null
              SELECT ani.name,loc.place FROM animal ani JOIN local loc ON ani.ID(+) =loc.id;
              SELECT ani.name,loc.place FROM animal ani JOIN local loc ON ani.ID =loc.id(+);
        
        --外连接:不仅能返回满足连接条件的记录,还将返回不满足条件的记录;不能两边都有+号
            --左外连接join左侧表示驱动表(所有数据都被查出来),那么当表中的某条记录不满足连接条件时来自右侧表中的字段全部填null
             SELECT ani.name,loc.place FROM animal ani LEFT OUTER  JOIN  local loc ON (ani.ID =loc.id);
            --右外连接join右侧表示驱动表(所有数据都被查出来),那么当表中的某条记录不满足连接条件时来自左侧表中的字段全部填null
             SELECT ani.name,loc.place FROM animal ani RIGHT OUTER JOIN local loc ON (ani.ID =loc.id);
        
        --全外连接:除了返回满足连接条件的记录,还会返回不满足条件的所有其他行,是 左外连接和右外连接 查询结果的综合
            SELECT ani.name,loc.place FROM animal ani FULL OUTER JOIN local loc ON (ani.ID =loc.id);
            
        --自连接是一种特殊的连接查询,数据的来源是一个表,即关联关系来自单表中的多个列;处理同类型数据又存在上下界关系的树状结构
        --自连接简单来说就是把一张表当成两张表看待就可以了
          --自连接是通过将表用别名虚拟成两个表的方式实现,可以是等值或不等值连接
          --例如超市里的商品,只有一个表,可能商品之间有关系,这时候用自连接比较方便
          --再如一张员工信息表,里面可以体现员工上下级关系的表就可以用自连接
  • 相关阅读:
    一个bug案例分析
    《需求工程》阅读随笔-1.做什么和怎么做
    连贯接口(fluent interface)的Java实现及应用。
    代码覆盖率检测工具大全
    腾讯的一个移动端测试小工具GT
    用复制mysql/data 文件夹 下面的数据库的形式来复制数据库出现的问题
    淘客API升级后的解决方案,怎么采集淘宝的商品数据
    方维团购系统,给供货商添加省市地址
    支付宝担保交易收款接口使用
    方维分享系统首页,插入新品,用来做优化
  • 原文地址:https://www.cnblogs.com/kwinwei/p/10584361.html
Copyright © 2011-2022 走看看