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);
        
    --自连接是一种特殊的连接查询,数据的来源是一个表,即关联关系来自单表中的多个列;处理同类型数据又存在上下界关系的树状结构
    --自连接简单来说就是把一张表当成两张表看待就可以了
      --自连接是通过将表用别名虚拟成两个表的方式实现,可以是等值或不等值连接
      --例如超市里的商品,只有一个表,可能商品之间有关系,这时候用自连接比较方便
      --再如一张员工信息表,里面可以体现员工上下级关系的表就可以用自连接
原文地址:https://www.cnblogs.com/kwinwei/p/10584361.html