那些年我们一起学习的oracle数据库


发现了几年前在某机构的学习记录,特此在博客备份一份,以备不时之需,也给需要的码友提供参考。

---TEST day01

--查看系统时间

SELECT SYSDATE FROM dual

--DDL语句  数据定义语言

CREATE TABLE xiaoming(

    NAME VARCHAR2(21) NOT NULL,

    basec NUMBER(3) DEFAULT 60 ,--在赋值过程中体现

    oop NUMBER(3) ,

    jvavaSE NUMBER(3)

)

---查看表结构 查看表属性,及属性的值得类型

DESC xiaoming

---删除表

DROP TABLE xiaoming

 

INSERT INTO xiaoming(NAME,OOP,jvavaSE)

VALUES('SDF',34,23)

--查看表中内容

SELECT * FROM xiaoming

 

--修改内容

UPDATE xiaoming

SET BASEC=80

WHERE NAME='SDF'

--删除一行

DELETE FROM xiaoming

WHERE BASEC=60

 

******************DAY02********************

VARCHAR2必须指定长度,     char可以不指定字节,默认为1.

4000长度                 2000长度

  long在oracle是字符串,内容长度2GB

  CLOB:存储定长,变长字符串,内容长度4GB

 

************SELECT 语句 查询的意思

  SELECT (字段,多字段用逗号隔开) 表明

  WHERE 条件

  列:

  SELECT JOB,ENAME,SAL FROM EMP_GH --查看表中的 job,ENAME,SAL

    WHERE JOB='CLERK'--满足job = clerk,也可以是大于等于号

 

    SELECT * FROM EMP_GH

     WHERE SAL>2000

 

****************函数

  ***CONCAT(CHAR, CHAR) 函数,用于连接字符串,变成一个字符串

          SELECT CONCAT(ENAME,JOB) FROM EMP_GH

      **可以将字符连接

        SELECT CONCAT(ENAME,'傻逼') FROM EMP_GH

      **CONCAT可以进行嵌套,现将两个字符串连接成为一个字符,在使用concat将下一个进行连接

        SELECT CONCAT(ENAME,CONCAT(':',JOB)) FROM emP_GH

 

  *** || 可以进行字符串连接,与java中的+号一样,更常用!!!

       SELECT ENAME||':'||job from EMP_GH

     

  *** 字符串长度 LENGTH( VARCHAR2 )

      SELECT ENAME,LENGTH(ENAME) FROM EMP_GH

 

  ***UPPER ,  LOWER,  INITCAP

     全大写  , 全小写, 首字母大写

  DUAL 是伪表,是用来测试函数的,能查询出一条记录,查询的东西与任何字段无关的使用伪表

     SELECT

        UPPER('nh') ,

        LOWER('HELLO'),

        INITCAP('hello WORLK'),

        INITCAP('HELLOWORLK'),

        INITCAP('HELLO WORLK')

     FROM DUAL

  

   **实例运用  查找emp_gh表中的scott的人的信息所有信息

      SELECT * FROM EMP_GH

      WHERE ENAME=UPPER('scott')

 

  ***TRIM /        LTRIM /         RTRIM

    去掉字符   去掉左端的字符串    去掉右端的字符串

      **去掉两段相同的字符,只能是单个字符,不能出现字符串,

      SELECT TRIM ( 'l' FROM 'llllldfsfdlllllll' ) FROM DUAL

      **去掉左端的字符,只要在右边参数出现过得字符,都去掉,不分顺序

      SELECT LTRIM('SDDSSDDSDSDSLITE','SD') FROM DUAL

      **去掉右端的字符,只要在右边参数出现过得字符,都去掉,不分顺序

      SELECT RTRIM('LITESDDSSSDDDSDSDD','SD') FROM DUAL

 

  **LPAD, RPAD 补位函数

    SELECT LPAD(SAL,9,'s') FROM emp_gh

     

    SELECT RPAD(SAL,9,'s') from emp_gh

 

    SELECT LPAD(SAL,5,'') FROM EMP_GH

 

  ***SUBSTR 截取字符串,下标开始是1,且第二个函数是个数,取都是从左往右取.

            若第2个参数超过了界限,则就代表将后面全部取完

      **从第十个位置开始取2个,

      SELECT

        SUBSTR('thinking in java',10,2)

      FROM DUAL

      **从倒数第7个开始取2个,

      SELECT

        SUBSTR('thinking in java',-7,2)

      FROM DUAL

    SELECT

        SUBSTR('thinking in java',-7,100)

      FROM DUAL

    

  ****INSTR 查找字符的位置

      查找In在thinking in java 中从第四个位置开始,出现2次后的位置,如果没有则返回0

      SELECT

        INSTR ('THINKING IN JAVA','IN',4,2)

      FROM DUAL

 

  **ROUND 函数,四舍五人

      如果第二个参数是0 ,可以省略.参数为负表示小数点前

    SELECT

        ROUND(55.12545,2),

        ROUND(55.12545,0),

         ROUND(55.12545),

        ROUND(55.12545,-1),

        ROUND(55.12545,-2)

    FROM DUAL

  **TRUNC 函数,数值得截取,不做四舍五人

    SELECT

      TRUNC(45.2552,2),

      TRUNC(45.2552,0),

      TRUNC(45.2552,-1),

      TRUNC(45.2552,-2)

    FROM DUAL

  **MOD(M,N),求余数,m/n的余数

    SELECT

      ENAME,SAL,MOD(SAL,1000)

    FROM EMP_GH

  ***CEIL(N),FLOOR(N),向上取整,向下取整

    SELECT CEIL(45.2) FROM DUAL//46

    SELECT FLOOR(45.2) FROM DUAL//45*

   

  ***时间戳 TIMESTAMP 11个字节

    **SYSDATE:返回一个当前时间date类型

    **SYSTIMESTAMP:返回一个当前时间戳

    SELECT SYSDATE,SYSTIMESTAMP FROM DUAL

 

  ******转换函数

    **TO_DATE()时间转换函数,日期格式字符串中除了字母数值和符号之外,其他的字符串都

    要使用双引号括起来

   

      SELECT

        TO_DATE('2012-12-20 5:45:5','YYYY-MM-DD HH24:MI:SS')

      FROM DUAL

 

      SELECT

        TO_DATE('2012年12月20日 5:45:5','YYYY"年"MM"月"DD"日" HH24:MI:SS')

      FROM DUAL

    ***TO_CHAR()将制定格式的时间变成字符串

        SELECT

          TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS')

        FROM DUAL

    ***DATE可以进行计算,

            对DATE加减一个数值,等同于加减天数,

            两个DATE之间相减,相当于相差的天数

            DATE也可以比较大小,越晚越大

            

            查看明天日期

            SELECT

              SYSDATE+1

            FROM DUAL 

            查看日值时间

            SELECT

              ENAME,TRUNC( SYSDATE-HIREDATE,0)

            FROM EMP_GH

          ** 输入自己生日看活了多少天

            SELECT

             TRUNC(SYSDATE - TO_DATE('1930-02-21','YYYY-MM-DD'))

            FROM DUAL

    ****LAST_DAY(DATE) 查看给定日期的月底是哪天

        SELECT

          LAST_DAY(SYSDATE)

        FROM DUAL

      ***ADD_MONTHS(DATE,I)给定date加i个月,如果i为负就是减去月

      查看员工转正日期,在入职日期上面加上一个3月.

        SELECT

          ENAME,HIREDATE,ADD_MONTHS(HIREDATE,3)

        FROM EMP_GH

       查看员工20周年的纪念日

        SELECT

          ename,ADD_MONTHS(HIREDATE,12*20)

        FROM EMP_GH

    ***MONTHS_BETWEEN(DATE1,DATE2)

        返回date1余date2之间相差多少个月

         *** 查看入职多少个月了

        SELECT

          MONTHS_BETWEEN(SYSDATE,HIREDATE)

        FROM EMP_GH

    **NEXT_DAY(DATE,i)

      查看指定日期之后一天开始的周(i-1),列,5代表周4

      今天周六

      SELECT

        NEXT_DAY(SYSDATE,1)//明天

      FROM DUAL

      SELECT

        NEXT_DAY(SYSDATE,7)//下周六

      FROM DUAL

  *****LEAST/GREATEST函数

      最小值/最大值

      SELECT

        LEAST(SYSDATE,SYSDATE+5)--最小值

      FROM DUAL

     

      SELECT

        GREATEST(SYSDATE,SYSDATE+5)--最大值

      FROM DUAL

  ****EXTRACT() 获取指定时间分量的值

      查看满足1981年入职的员工

      SELECT

        ENAME,HIREDATE

      FROM EMP_GH

      WHERE EXTRACT(YEAR FROM HIREDATE)=1981

*******************null的含义

  **创建表student

  CREATE TABLE STUDENT_GH(

    ID NUMBER(4),

    NAME VARCHAR2(20),

    GENDER CHAR(1)

  )

 

  **查看

    DESC STUDENT_GH

  **插入

    INSERT INTO STUDENT_GH

        VALUES(1000,'李莫愁','F');

    INSERT INTO STUDENT_GH

      VALUES(1001,'林平之',NULL);--显示插入

    INSERT INTO STUDENT_GH(ID,NAME)--隐身插入

        VALUES(1002,'张无忌');

  **查看内容

      SELECT * FROM STUDENT_GH

  **修改性别

       UPDATE  STUDENT_GH

      SET GENDER =NULL

      COMMIT

  **删gender为null的

    判定是否为null是使用 is null 或 is not null 

      DELETE STUDENT_GH

      WHERE GENDER IS NULL

  ***null的计算

      null与字符串a拼接,结果是字符串a

      null与数字运算,结果是null

  **查看emp表中的工资加奖金

     SELECT

      ENAME,SAL,COMM,SAL+COMM

     FROM EMP_GH

  **空值函数

        NVL(A1,A2)

        若A1为null,则返回A2值,该函数作用就是将null值转变成非null值A2

        **查看工资

        SELECT ENAME,SAL,COMM,SAL+NVL(COMM,0) FROM EMP_GH

        **查看每个人的奖金情况,

         有奖金就显示有奖金,没有奖金就显示没有奖金

        NVL2(A1,A2,A3),如果A1不为null 返回 A2 ,为null返回 A3

           SELECT

             ENAME,COMM,

             NVL2(COMM,'有奖金','没有奖金')       

           FROM EMP_GH

***TEST*********************

1:查询emp表中数据,列出一列,内容为名字与职位

  显示格式:ename:JOB

  SELECT

    ename||':'||JOB

  FROM EMP_GH

  SELECT

    CONCAT(ENAME,CONCAT(':',JOB))

  FROM EMP_GH

 

2:查看每个员工职位的字符个数

  SELECT

    JOB,LENGTH(JOB)

  FROM EMP_GH

3:将所有员工的名字以小写形式,与首字母大写形式

   查询出来,第一列为小写形式,第二列为首字母大写

  SELECT

    ename

  FROM EMP_GH

  WHERE LOWER(eNAME)='ward'

  SELECT

    ename

  FROM EMP_GH

  where INITCAP(ENAME)='Scott'

4:将字符串'aaaaaabaaaaa'中左右两边的a去除

  SELECT

    trim('a' FROM 'aaaaaaabbaaaaaa')

  FROM DUAL

5:显示每个员工的名字,要求显示10位,第一列左对齐效果,第二列    右对齐效果

  SELECT

    RPAD(ENAME,10,' ')

  FROM EMP_GH

  SELECT

    LPAD(ENAME,10,' ')

  FROM EMP_GH

6:截取字符串'DOCTOR WHO'中的'WHO'

  SELECT

    SUBSTR('DOCTOR WHO',8,3)

  FROM DUAL

7:查看'DOCTOR WHO'中'WHO'的位置

  SELECT

    INSTR('DOCTOR WHO','WHO',4)

  FROM DUAL

8:分别查看55.789四舍五入保留小数点后2位,整数位,十位后的

   数字,显示成三列。

   SELECT

    ROUND(55.78,2),

    ROUND(55.78),

    ROUND(55.78,-1)

   FROM DUAL

9:分别查看55.789截取后保留小数点后2位,整数位,十位后的

   数字,显示成三列。

   SELECT

    TRUNC(55.789,2),

    TRUNC(55.789),

    TRUNC(55.789,-1)

   FROM DUAL

10:查看每名员工工资百位以下的数字?

    SELECT

     ENAME,SAL,MOD(SAL,100)

    FROM EMP_GH

11:查看每名员工从入职到今天一共多少天,若有小数则向上取整。

    SELECT

      ENAME,HIREDATE,

     CEIL( SYSDATE-HIREDATE)

    FROM EMP_GH

12:查看从2008-08-08号到今天为止一共经历了多少天?

  SELECT

    TRUNC(SYSDATE-TO_DATE('2008-08-08','YYYY-MM-DD'))

  FROM DUAL

13:将每名员工入职时间以例如:

     1981年12月3日

     的形式显示

     SELECT

      ENAME,JOB,

      TO_CHAR(HIREDATE,'YYYY-MM-DD')

     FROM EMP_GH

14:查看每个员工入职所在月的月底是哪天?

    SELECT

      LAST_DAY(HIREDATE)

    FROM EMP_GH

15:查看每名员工转正日期(入职后3个月)

  SELECT

    ADD_MONTHS(HIREDATE,3)

  FROM EMP_GH

16:查看每名员工入职至今共多少个月?

  SELECT

    MONTHS_BETWEEN(SYSDATE,HIREDATE)

  FROM EMP_GH

17:查看从明天开始一周内的周日是哪天?

  SELECT

    NEXT_DAY(SYSDATE,1)

  FROM DUAL

18:查看82年以后入职的员工的入职日期,82年以前的按照

     1982年01月01号显示。格式都是DD-MON-RR(默认格式)

     SELECT

      ENAME,HIREDATE,

      GREATEST(HIREDATE,TO_DATE('1982-01-01','YYYY-MM-DD'))

     FROM EMP_GH

19:查看每名员工的入职年份?

  SELECT

    ENAME,HIREDATE,

   EXTRACT(YEAR FROM HIREDATE)

  FROM EMP_GH

20:显示每个员工的总收入(工资加奖金),奖金为NULL的只看工资

  SELECT

    ENAME,SAL,COMM,

    SAL+NVL(COMM,0)

  FROM EMP_GH

21:使用NVL2实现20题的需求

  SELECT

    ENAME,SAL,COMM,

   NVL2(COMM,SAL+COMM,SAL)

  FROM EMP_GH

 

 

 

 

 

*************************day03***********查询语句********************************

  字句就是关键字+xx 列 SELECT enama

  SELECT 字段,表达式,函数

  ****别名

      在使用表达式或函数时,字段变长,可以使用除关键字以外的作为别名

      添加方式,1.AS 别名                                      SELECT TO_CHAR(HIREDATE,'YYYY-MM-DD') AS HIERDATE

              2.在表达式后空格加别名,别名不能有空格              SELECT TO_CHAR(HIREDATE,'YYYY-MM-DD') HIERDATE

              3.要求区分大小写,使用双引号,且别名中间可以用空格     SELECT TO_CHAR(HIREDATE,'YYYY-MM-DD') "HIERD ATE"

 

      SELECT ENAME,SAL*12 AS SAL,TO_CHAR(HIREDATE,'YYYY-MM-DD') AS HIREDATE

      FROM EMP_GH

      SELECT ENAME,SAL*12 SAL,TO_CHAR(HIREDATE,'YYYY-MM-DD') HIREDATE

      FROM EMP_GH

      SELECT ENAME,SAL*12 "sal",TO_CHAR(HIREDATE,'YYYY-MM-DD') "HIREDATE"

      FROM EMP_GH

  ***WHERE 条件语句 >, < , >=,<=,<>(不等于),=

      查找10号员工的信息,

      SELECT * FROM EMP_GH

      WHERE DEPTNO=10;

      查找 销售人员的信息

      SELECT ENAME,SAL,JOB FROM EMP_GH

      WHERE JOB='SALESMAN'

      查工资高于2000

      SELECT ENAME,SAL,JOB FROM EMP_GH

      WHERE SAL>2000

      查部门不是10的信息

      SELECT ENAME,SAL,JOB,DEPTNO FROM EMP_GH

      WHERE DEPTNO<>10

      查找入职时间在1982-1-1之后的人员信息

      SELECT ENAME,SAL,JOB FROM EMP_GH

      WHERE HIREDATE<TO_DATE('1982-1-1','YYYY-MM-DD')

  ****AND OR 关键字 ,and的优先级高于or ,及先计算and 在计算or

      满足条件 SAL>1000 或 DEPTNO<>10

      SELECT ENAME,SAL,DEPTNO FROM EMP_GH

      WHERE SAL>1000 OR DEPTNO<>10

      满足条件 SAL>1000 且 DEPTNO<>10

      SELECT ENAME,SAL,DEPTNO FROM EMP_GH

      WHERE SAL>1000 AND DEPTNO<>10

      工资大于1000,job是salesman 和

      SELECT ENAME,SAL,JOB FROM EMP_GH

      WHERE SAL>1000 AND (JOB = 'SALESMAN' OR JOB =  'CLERK')

  ****LIKE 条件

      可以进行模糊匹配字符串,支持两个通用符

      %:0-多个字符串;   _:单一的字符

      查看第二个字符为A的

      SELECT ENAME,SAL,JOB FROM EMP_GH

      WHERE ENAME LIKE '_A%'

  ***IN 和 NOT IN

      IN(LIST),NOT IN(LIST)

      JOB中包含'MANAGER'和'CLERK'的所有员工信息

      SELECT ENAME,JOB,SAL FROM EMP_GH

      WHERE JOB IN ('MANAGER','CLERK')

         JOB中不包含'MANAGER'和'CLERK'的所有员工信息

      SELECT ENAME,JOB,SAL FROM EMP_GH

      WHERE JOB NOT IN('MANAGER','CLERK')

     

  ***BETWEEN AND 在两者之间,小的在前,大的在后(包含上下线的一个范围 [1500,3000],如果

                  大的在前,就会出现无结果)

      SELECT ENAME,SAL,JOB FROM EMP_GH

      WHERE sal BETWEEN 1500 AND 3000--[1500,3000]

  ***IS NULL    IS NOT NULL

 

  ***ANY 和 ALL条件

      ANY(LIST):大于列表其中之一即可

      ALL(LIST):大于列表所有

    不能单独使用,要配合>,<,=等使用,一般在子查询中使用

    SELECT ENAME,SAL FROM EMP_GH

    WHERE SAL>ANY(800,900,1500)--后期再列表中是,表达式,不是直接写结果.

  ***函数,表达式条件

      SELECT ENAME,JOB,SAL FROM EMP_GH

      WHERE SAL*12>50000

      SELECT ENAME,SAL,JOB FROM EMP_GH

      WHERE UPPER(ENAME) = UPPER('SCOTT')

  ***DISTINCT 去除重复

      查看公司中有哪些职位,单字段去重

      SELECT DISTINCT JOB FROM EMP_GH

      多字段去重,保证,多字段的组合没有重复的

      SELECT DISTINCT JOB,DEPTNO FROM EMP_GH

*******排序  ORDER BY 语句

      排序,ASC为升序,默认的,可以省略  DESC降序

      ORDER BY语句只能出现在最后,

      分为单字段排序和多字段排序,

      **多字段排序是先按照第一个字段排序,如果出现相同情况下按照第二个字段进行排序,以此类推

     *** null在排序的时候被认为最大值

      工资按照升序排列

          SELECT ENAME,SAL FROM EMP_GH

          ORDER BY SAL

      工资按照降序排列

          SELECT ENAME,SAL FROM EMP_GH

          ORDER BY SAL DESC

      多字段排序

        SELECT ENAME,DEPTNO,SAL FROM EMP_GH

        ORDER BY DEPTNO DESC,SAL ASC --DEPTNO按照倒序先排,重复的在按SAL正序排列

      NULL在排序中被认为最大

        SELECT ENAME,COMM FROM EMP_GH

        ORDER BY COMM

******聚合函数/多行函数/分组函数   忽略null值

      将结果集按照指定的字段进行统计然后得到一条记录

     *** MAX(),MIN()指定字段的最大值,最小值

        SELECT MAX(SAL),MIN(SAL) FROM EMP_GH

     

     *** AVG() 和 SUM()

        统计指定字段的平均值和总和

      SELECT TRUNC(AVG(SAL),2) SAL,SUM(SAL) FROM EMP_GH

          忽略null值,集合函数忽略null,在进行总体的统计时,需要将null值转化为0

          SELECT AVG(NVL(COMM,0)) FROM EMP_GH

    ***  COUNT()

        统计指定字段不为NULL的记录的总数

        忽略null就只统计不为null值得字段总数

        SELECT COUNT(COMM) FROM EMP_GH

     

      **查看一张表中的记录数常数:count(*)

        SELECT COUNT(*) FROM EMP_GH

***分组函数 GROUP BY

    在集合函数中出现了其他字段,那么其他字段必须出现在GROUP BY 中,表示以该字段分组来进行统计

        查看每个部门的平均工资

        SELECT AVG(SAL),DEPTNO

        FROM EMP_GH

        GROUP BY DEPTNO

       

        SELECT DEPTNO FROM EMP_GH

        GROUP BY DEPTNO

       

        每个职位的工资总和

        SELECT SUM(SAL),JOB FROM EMP_GH

        GROUP BY JOB

    **多字段分组原则 GROUP BY

      将这些字段值得组合相同的看做成成一组,

     

      查看每个部门中每个职位的平均工资

      SELECT AVG(SAL),DEPTNO,JOB

      FROM EMP_GH

      GROUP BY DEPTNO,JOB

     

    ***WHERE 中不允许使用集合函数进行过滤条件

      原因:时机不对

          WHERE 是在查询表中每条数据时就进行过滤的,所以,where决定着那条数据被查询出来

      二分组统计是在表中数据查询出来后基于结果集进行的,所以根据分组统计的结果作为过滤条

          件是不能再where中使用的

   ***HAVING 字句

        HAVING字句不能独立存在,必须跟在group BY 字句之后,HAVING 可以使用集合函数作为过滤

        条件,它是用来根据统计结果决定保留哪些分组的

    查看部门高于仨个人的部门平均工资

    SELECT AVG(SAL),DEPTNO FROM EMP_GH

    GROUP BY DEPTNO

    HAVING COUNT(*)>3

    最低工资高于1000的每种职位的人数,

   

    SELECT COUNT(*) ,JOB FROM EMP_GH

    GROUP BY JOB

    HAVING AVG(SAL)>1000

   查询语句的语句,

***************************关联查询

  where中写关联条件

      SELECT EMP_GH.ENAME,DEPT_GH.DNAME

      FROM EMP_GH,DEPT_GH

      WHERE EMP_GH.DEPTNO = DEPT_GH.DEPTNO

     

      表名也可以使用别名

      SELECT E.ENAME,D.DNAME

     

      FROM EMP_GH E,DEPT_GH D

      WHERE E.DEPTNO = D.DEPTNO

  查看sales部门的员工信息,可以将查询条件和关联条件放在一起

 

      SELECT E.ENAME,E.SAL,D.DNAME

      FROM EMP_GH E,DEPT_GH D

      WHERE E.DEPTNO = D.DEPTNO AND D.DNAME = 'SALES'

     

    查看在new yourk工作的都有谁

      SELECT E.ENAME

      FROM EMP_GH E,DEPT_GH D

      WHERE E.DEPTNO = D.DEPTNO AND D.LOC ='NEW YOUK'

  

    查看每个地区工作的人数

      SELECT COUNT(*),D.LOC

      FROM EMP_GH E,DEPT_GH D

      WHERE E.DEPTNO = D.DEPTNO

      GROUP BY D.LOC

   如果不进行关联条件,则进行笛卡尔积,

   在关联查询中,若不指定连接条件,则会产生笛卡尔积,该结果集 会将每张表中的每条记录分别连接一次,

   组成一条记录,开销巨大,通常是一个没有意义的结果集,结果集是表中数据的乘积,

   有N张表就应当有N-1个连接条件

******************内部连接******************************

    ***JOIN内关联的

     

      SELECT E.ENAME,D.DNAME

      FROM EMP_GH E JOIN DEPT_GH D

      ON E.DEPTNO = D.DEPTNO

      WHERE D.DNAME='SALES'

  ***无论关联查询还是内部查询,都忽略不满足连接条件的记录

 

*******************外链接

 

  外链接可以在关联条件不满足的数据进行查询,分为:

    左外连接:LEST OUTER JOIN 以join左侧的表作为驱动表(主要显示数据的表),该表中的数据全部进行查询,当不满足条件

            的数据,在右侧表中都会补充NULL值

    右外链接:RIGHT OUTER JOIN

    全外链接:FULL OUTER JOIN

      

       SELECT E.ENAME,D.DNAME

       FROM EMP_GH E LEFT OUTER JOIN DEPT_GH D

       ON E.DEPTNO = D.DEPTNO

      

       SELECT E.ENAME ,D.DNAME

       FROM EMP_GH E RIGHT OUTER JOIN DEPT_GH D

       ON E.DEPTNO = D.DEPTNO

      

       SELECT E.ENAME,D.DNAME

       FROM EMP_GH E FULL OUTER JOIN DEPT_GH D

       ON E.DEPTNO = D.DEPTNO

  

   ***普通的外链接可以用以下 +号在那边,那边补null

   右外链接,

      SELECT E.ENAME,D.DNAME

      FROM EMP_GH E,DEPT_GH D

      WHERE E.DEPTNO(+) = D.DEPTNO

    做外链接

      SELECT E.ENAME,D.DNAME

      FROM EMP_GH E,DEPT_GH D

      WHERE E.DEPTNO = D.DEPTNO(+)

************自连接

    用于解决相同类型数据,但是又存在上下级关系的树状结构的储存,

    自连接,当前表的记录与当前表的其他记录有对应的关系                                                                                                                                                                                                           

 

    查看员工的名字及领导的名字

      SELECT E.ENAME,M.ENAME

      FROM EMP_GH E,EMP_GH M

      WHERE E.MGR=M.EMPNO(+)

        

    查看每个员工的领导在哪儿工作

      分析,员工,领导,工作地三张表进行关联查询

        SELECT E.ENAME,M.ENAME,D.LOC

        FROM EMP_GH E JOIN EMP_GH M

        ON E.MGR=M.EMPNO0

        JOIN DEPT_GH D

        ON M.DEPTNO = D.DEPTNO

        或

        SELECT E.ENAME,M.ENAME,D.LOC

        FROM EMP_GH E,EMP_GH M,DEPT_GH D

        WHERE E.MGR=M.EMPNO AND M.DEPTNO=D.DEPTNO

 

*****************************TEST*************************

1:查看工资高于2000的员工

  SELECT ENAME FROM EMP_GH

  WHERE SAL>2000

2:查看不是"CLERK"职位的员工

  SELECT ENAME FROM EMP_GH

  WHERE JOB<>'CLERK'

3:查看工资在1000-2500之间的员工

  SELECT ENAME FROM EMP_GH

  WHERE SAL BETWEEN 1000 AND 2500

4:查看名字是以K结尾的员工

  SELECT ENAME FROM EMP_GH

  WHERE ENAME LIKE '%K'

5:查看20,30号部门的员工

  SELECT ENAME,DEPTNO FROM EMP_GH

  WHERE DEPTNO=20 OR DEPTNO=30

6:查看奖金为NULL的员工

  SELECT ENAME,COMM FROM EMP_GH

  WHERE COMM IS NULL--NULL不能用=号,要用is null

7:查看年薪高于20000的员工

  SELECT

    ENAME,SAL*12

  FROM EMP_GH

  WHERE SAL*12>20000

8:查看公司共有多少种职位

  SELECT

    DISTINCT JOB

  FROM EMP_GH

 

9:按部门号从小到大排列查看员工

  SELECT

    ENAME,DEPTNO

  FROM EMP_GH

  ORDER BY DEPTNO

10:查看每个部门的最高,最低,平均工资,和工资总和

  SELECT

    MAX(SAL),MIN(SAL),AVG(SAL),SUM(SAL),DEPTNO

  FROM EMP_GH

  GROUP BY DEPTNO

11:查看平均工资高于2000的部门的最低薪水

  SELECT

    DEPTNO,MIN(SAL)

  FROM EMP_GH

  GROUP BY DEPTNO

  HAVING AVG(SAL)>2000

12:查看在NEWYORK工作的员工

    SELECT

      E.ENAME,D.LOC

    FROM EMP_GH E JOIN DEPT_GH D

    ON E.DEPTNO=D.DEPTNO

    WHERE D.LOC='NEW YOUK'

13:查看所有员工及所在部门信息,若该员工没有部门,则

    部门信息以NULL显示

    SELECT

      E.ENAME,D.JOB

    FROM EMP_GH E LEFT OUTER JOIN EMP_GH D

    ON E.EMPNO = D.EMPNO

14:查看ALLEN的上司是谁

    SELECT

     E.ENAME, M.ENAME

    FROM EMP_GH E JOIN EMP_GH M

    ON E.MGR=M.EMPNO

    WHERE E.ENAME='ALLEN'

TTS-TEST

1、查询职员表中,在20和30号部门工作的员工姓名和部门号。

  SELECT ENAME,DEPTNO FROM EMP_GH

  WHERE DEPTNO=20 OR DEPTNO=30

2、查询职员表中,没有管理者的员工姓名及职位,并按职位排序。

    SELECT ENAME,JOB  FROM EMP_GH

    WHERE MGR IS NULL

    ORDER BY JOB ASC

3、查询职员表中,有绩效的员工姓名、薪资和绩效,并按工资倒序排列。

    SELECT ENAME,SAL,COMM

    FROM EMP_GH

    WHERE COMM IS NOT NULL

    ORDER BY SAL DESC

4、查询职员表中,员工姓名的第三个字母是A的员工姓名。

    SELECT ENAME FROM EMP_GH

    WHERE ENAME LIKE '__A%'

5、查询职员表中的职员名字、职位、薪资,并显示为如图-3所示效果:

    SELECT ENAME || ','||JOB||','||SAL OUT_PUT FROM EMP_GH

提示:列之间用逗号连接,列头显示成OUT_PUT。

6、查询职员表中员工号、姓名、工资,以及工资提高百分之20%后的结果。

    SELECT EMPNO,ENAME,SAL,SAL*1.2 FROM EMP_GH

7、查询员工的姓名和工资,条件限定为:工资必须大于1200,并对查询结果按入职时间进行排列,早入职排在前面,晚入职排在后面。

    SELECT ENAME,SAL ,HIREDATE FROM EMP_GH

    WHERE SAL>1200

    ORDER BY HIREDATE

8、查询ACCOUNT部门以外的其他部门的编号、名称以及所在地。

  SELECT D.DEPTNO,D.DNAME,D.LOC

  FROM EMP_GH E JOIN DEPT_GH D

  ON E.DEPTNO=D.DEPTNO

  WHERE D.DNAME<>'ACCOUNT'

1、查询每个部门中每个职位的最高薪水。

  SELECT MAX(SAL),DEPTNO,JOB FROM EMP_GH

  GROUP BY JOB , DEPTNO

 

 

SELECT A.ename, A.sal, A.deptno, b.maxsal   

FROM emp  a,(SELECT deptno, max(sal) maxsal FROM emp GROUP BY deptno)  b

WHERE A.deptno = b.deptno

AND a. sal < b.maxsal;

 

3、假设员工表中,员工和管理者中间只有一个层级,也就是说,每个员工最多只有一个上级,作为管理者的员工不再有上级管理者,并且,上级管理者相同的员工,他们属于同一个部门。找出EMP 中那些工资高于他们所在部门的管理者工资的员工。

  SELECT E.ENAME

  FROM EMP_GH E JOIN EMP_GH M

  ON E.MGR = M.EMPNO

  WHERE E.SAL>M.SAL

4、找出EMP 中那些工资高于他们所在部门普通员工平均工资的员工。

  SELECT E.ENAME

  FROM EMP_GH E JOIN

  (SELECT DEPTNO,AVG(SAL) A  FROM EMP_GH

  GROUP BY DEPTNO

  ) M

  ON E.DEPTNO=M.DEPTNO

  WHERE E.SAL>M.A

 

    SELECT classid,AVG(MONTHS_BETWEEN(SYSDATE,entertime))

    FROM student

    WHERE AVG( MONTHS_BETWEEN (SYSDATE, entertime))>12

    GROUP BYclassid

    ORDER BY AVG(MONTHS_BETWEEN (SYSDATE, entertime));

 

有职员表emp,若需列出所有薪水高于平均薪水值的员工信息,则有 SQL语句如下:

 

 SELECT ENAME ,E.SAL,M.A

 FROM EMP_GH E ,(

 SELECT AVG(SAL) A FROM EMP_GH

 ) M

 

 WHERE E.SAL>M.A

编写一条SQL 语句,查询出每门课都大于80 分的学生姓名。

  SELECT ENAME FROM

  WHERE KECHEGN A>80 AND KECHENG B>80

 

9.select LPAD('TARDIS', 3, '*') from dual;

 

 

***********************************day04****************************************

  ***子查询

    WHERE 之后

      子查询是嵌套在查询语句之中的作用是为了外层SQL语句提供数据,子查询常用dql,但是也可以用于DML和DDL之中

      子查询的结果不同可以进行分类:

      **单行单列子查询:使用< ,>, <> ,等比较

     ** 多行单列子查询:使用 ALL,ANY,IN,NOT IN 进行比较

     ** 多行多列子查询: 被看做一张表使用

    ** 其中单行单列与多列单列常用语where 和 HAVING 中作为过滤条件使用

      而多行多列(包括单行多列)常常当做一张表使用

     

       

        谁的工资比CLARK高

        SELECT ENAME,SAL FROM EMP_GH

        WHERE SAL>(SELECT SAL FROM emp_gh WHERE ENAME = 'CLARK')

        或

          SELECT ENAME ,SAL

          FROM EMP_GH E , (SELECT SAL A FROM EMP_GH WHERE ENAME = 'CLARK') B

          WHERE E.SAL>B.A

 

      ***  和Jones同部门的

        SELECT ENAME,DEPTNO

        FROM EMP_GH

        WHERE DEPTNO=(SELECT DEPTNO FROM EMP_GH WHERE ENAME='JONES')

       

        SELECT ENAME,DEPTNO

        FROM EMP_GH E,(SELECT DEPTNO D FROM EMP_GH WHERE ENAME='JONES') B

        WHERE E.DEPTNO=B.D

       

    ***  谁高于公司平均工资

        SELECT ENAME ,SAL

        FROM EMP_GH

        WHERE SAL>(SELECT AVG(SAL) FROM EMP_GH)

       

        SELECT E.ENAME,E.SAL,S.A

        FROM EMP_GH E ,(SELECT AVG(SAL) A FROM EMP_GH) S

        WHERE E.SAL>S.A

       

     *** 查看部门的平均工资,前提是该部门的平均工资高于30号部门的平均工资

          SELECT DEPTNO,AVG(SAL)

          FROM EMP_GH E

          GROUP BY DEPTNO

          HAVING AVG(SAL)>(

          SELECT AVG(SAL) FROM EMP_GH

          GROUP BY DEPTNO

          HAVING DEPTNO =30)

   

      *** 查看和cleark职位同部门的员工

        SELECT ENAME ,DEPTNO

        FROM EMP_GH

        WHERE DEPTNO IN(SELECT DEPTNO FROM EMP_GH WHERE JOB ='CLERK')

        AND JOB<>'CLERK'

     

     ** 比20号部门所有人工资都高的人

          SELECT ENAME ,SAL

          FROM EMP_GH

          WHERE SAL>ALL(SELECT SAL FROM EMP_GH WHERE DEPTNO=20)

     

     

******EXISTS 语句

    ***EXISTS后面跟子查询,进行过滤,可放在where后

          如果子查询有结果则返回 TRUE

          没有结果 返回         false

         

        查看有员工的部门信息

          SELECT DEPTNO ,DNAME

          FROM DEPT_GH D

          WHERE EXISTS (

          SELECT ENAME FROM EMP_GH E

          WHERE E.DEPTNO=D.DEPTNO)

*****子查询 FROM 之后

   ***当子查询是多行多列时,就可以当成一张表进行关联

      查看比自己部门平均工资高的员工

        SELECT E.ENAME,E.SAL

        FROM EMP_GH E,(SELECT AVG(SAL) A ,DEPTNO FROM EMP_GH GROUP BY DEPTNO) D

        WHERE E.DEPTNO=D.DEPTNO

        AND E.SAL>D.A

 

      每个部门最低工资s是谁

        SELECT E.ENAME,E.SAL,E.DEPTNO

        FROM EMP_GH E,(SELECT MIN(SAL) A,DEPTNO FROM EMP_GH GROUP BY DEPTNO ) D

        WHERE E.DEPTNO= D.DEPTNO

        AND E.SAL=d.A

********子查询 在 SELECT 之后

    ****作为一个字段值在外层查询中集中显示

        SELECT E.ENAME,E.SAL,

                              (SELECT D.DNAME FROM DEPT_GH D

                                WHERE D.DEPTNO=E.DEPTNO) DNAME

        FROM EMP_GH E

   

*******分页查询   

    当一个结果集数据过多时采用分页查询:

        原理:将数据分批查询出来,

          好处:1.提高客服端到服务端的相应速度

              2.减少网络间的传输,降低资源消耗

     

        缺陷:分页由于在SQL中没有定义,所以不同的数据库分页语句不一样

       

        ROWNUM:是一个伪列

        rownum不存在任何一张表中,但是每张表都可以查询该字段,该字段的值为结果集中每条

        记录的行号,ROWNUM字段的值是在查询过程中动态生成的,只要从列表中查数据,rownum就会

        从1开始进行记录行号

       

          SELECT ROWNUM,ENAME,JOB,SAL FROM EMP_GH

          WHERE ROWNUM>=1 AND ROWNUM<=10

        在使用rownum中对结果集进行编号过程中,不能通过rownum大于1及以上数字判断,否则

        查不出任何结果

 

     

      SELECT *

      FROM(SELECT ROWNUM RN,ENAME,SAL FROM EMP_GH)

      WHERE RN between 5 and 10

     

     ** 工资排名第六到第10位 嵌套2层子查询

        SELECT *--有行号的浏览表

        FROM

            (SELECT ROWNUM R,SAL--对表加行号

             FROM

                  (SELECT SAL FROM EMP_GH ORDER BY SAL DESC))--排序

       WHERE R BETWEEN 6 AND 10  --增加浏览过滤条件

       

      若在分页中有序排列需求,那么先应该排序,因为排序优先级最低

     

***分页经典   

      优化

        SELECT *

        FROM (SELECT ROWNUM RN,T.*

             FROM ( SELECT ENAME,SAL,DEPTNO FROM EMP_GH ORDER BY SAL DESC) T

             WHERE ROWNUM<=10)

        WHERE RN>=6

    ***pageSize:每页显示的条目数

       page:第几页

       根据上述两个参数,计算结果的集范围:

       START:(page-1)*pageSize+1

       END:pageSize*page

 

****DECODE函数,处理分支业务

    给不同职位的人员涨工资:

    MANAGER:20%

    ANALYST:10%

    SALESMAN:5%

     DECODE(JOB, 'MANAGER',SAL*1.2)当第一个参数等于第二个参数,则返回第三个参数

                          

        SELECT ENAME,JOB,SAL,

                DECODE(JOB, 'MANAGER',SAL*1.2,

                        'ANALYST',SAL*1.1,

                         'SALESMAN' ,SAL*1.05,

                         SAL ) BOUNS

        FROM EMP_GH

  CASE 语句

      SELECT ENAME,SAL,

        CASE JOB WHEN 'MANAGER' THEN SAL*1.2

                  WHEN 'ANALYST' THEN SAL*1.1

                  WHEN 'SALESMAN' THEN SAL*1.05

                  ELSE SAL END BOUNDS

      FROM EMP_GH

******查看MANAGER,ANALYST部门的总人数和其他部门的总人数

      SELECT count(*),DECODE(JOB,'MANAGER','VIP',

                                  'ANALYST','VIP',

                                  'OTHER') BB

      FROM EMP_GH

      GROUP BY DECODE(JOB,'MANAGER','VIP',

                                  'ANALYST','VIP',

                                  'OTHER')

                                 

    **排序                              

      SELECT DEPTNO ,DNAME,LOC

      FROM DEPT_GH

      ORDER BY DECODE(DNAME,'OPERATIONS',1,'ACCOUNTING',2,'SALES',3)

   

*****排序函数:

        可以根据结果集,按照指定的字段分组,在组内进行排序,生成组内编号

   ****ROW_NUMBER:**************连续,唯一的

        ROW_NUMBER() OVER(

          PARTITION BY DEPTNO--按照部门号分组

          ORDER BY SAL DESC--按照工资进行排名

        )

       

      查看每个部门工资的排名

      SELECT ENAME,SAL,ROW_NUMBER() OVER(

                        PARTITION BY DEPTNO

                        ORDER BY SAL DESC) BB

      FROM EMP_GH

  *****RANK() OVER(---生成不连续,不唯一的数,会出现并列排名情况

       PARTITION BY deptno ORDER BY sal DESC )       

       

        SELECT ENAME,SAL,RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC)

        FROM EMP_GH

                                 

  ******DENSE_RANK() OVER()--组内生成连续的不唯一的编号,就是出现并列后,不跳序号

        SELECT ENAME,SAL,DENSE_RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) BB

        FROM EMP_GH                       

  ******                                

 

 

 

 

 

      CREATE TABLE SALES_GH(

        YEAR_ID NUMBER NOT NULL,

        MONTH_ID NUMBER NOT NULL,

        DAY_ID NUMBER NOT NULL,

        SALES_VALUE NUMBER(10,2) NOT NULL   

      ); 

      INSERT INTO SALES_GH

      SELECT TRUNC(DBMS_RANDOM.VALUE(2010,2012)) AS YEAR_ID,

              TRUNC(DBMS_RANDOM.VALUE(1,13)) AS MONTH_ID,

              TRUNC(DBMS_RANDOM.VALUE(1,32)) AS DAY_ID,

              ROUND(DBMS_RANDOM.VALUE(1,100),2) AS SALES_VALUE

      FROM DUAL

      CONNECT BY LEVEL<=1000;

     

      DESC SALES_GH

      SELECT * FROM SALES_GH

   

******集合操作

        集合操作的字段顺序,结果必须一样

******并集,UNION ,全并UNION ALL

      SELECT ENAME,SAL,JOB

      FROM EMP_GH

      WHERE JOB='MANAGER'

      UNION

      SELECT ENAME,SAL,JOB

      FROM EMP_GH

      WHERE SAL>2000

     

      SELECT ENAME,SAL,JOB

      FROM EMP_GH

      WHERE JOB='MANAGER'

      UNION ALL

      SELECT ENAME,SAL,JOB

      FROM EMP_GH

      WHERE SAL>2000

     

 *********交集

      INTERSECT:共有的

        SELECT ENAME,SAL,JOB

        FROM EMP_GH

        WHERE JOB='MANAGER'

        INTERSECT

        SELECT ENAME,SAL,JOB

        FROM EMP_GH

        WHERE SAL>2000

 *******差集

      MINUS 一边有,其他没有的,

                就是第一个查询语句减去第二个查询语句中的

        SELECT ENAME,SAL,JOB

      FROM EMP_GH

      WHERE SAL>3000

         MINUS

      SELECT ENAME,SAL,JOB

      FROM emp_gh

      WHERE JOB='MANAGER'

  

**************高级分组函数

 *****ROLLUP(A,B,C...n) 参数在逐个递减可以使用rollup进行合并,实现了n+1次分组

      SELECT YEAR_ID,MONTH_ID,DAY_ID,SUM(SALES_value)

      FROM sales_gh

      GROUP BY ROLLUP(YEAR_ID,MONTH_ID,DAY_ID)

      ORDER BY YEAR_ID,MONTH_ID,DAY_ID

  **** CUBE (A,B,C,...N) 每个参数都进行匹配,2^n个组合

      SELECT YEAR_ID,MONTH_ID,DAY_ID,SUM(SALES_VALUE)

      FROM SALES_GH

      GROUP BY CUBE(YEAR_ID,MONTH_ID,DAY_ID)

      ORDER BY YEAR_ID,MONTH_ID,DAY_ID

 ***GROUPING SETS(A,B,C,..)按照指定的分组方法进行分组

      SELECT YEAR_ID,MONTH_ID,DAY_ID,SUM(SALES_VALUE)

      FROM SALES_GH

      GROUP BY GROUPING SETS((YEAR_ID,MONTH_ID,DAY_ID),(YEAR_ID,MONTH_ID))

      ORDER BY YEAR_ID,MONTH_ID,DAY_ID

 ***********test****************************

 1:查看与CLARK相同职位的员工

  SELECT ENAME

  FROM EMP_GH

  WHERE JOB=(SELECT JOB FROM EMP_GH WHERE ENAME='CLARK')

2:查看低于公司平均工资的员工

  SELECT ENAME,SAL

  FROM EMP_GH

  WHERE SAL<(SELECT AVG(SAL) FROM EMP_GH )

3:查看与ALLEN同部门的员工

  SELECT ENAME,DEPTNO

  FROM EMP_GH

  WHERE DEPTNO=(SELECT DEPTNO FROM EMP_GH WHERE ENAME='ALLEN')

4:查看平均工资低于20号部门平均工资的部门平均工资

  SELECT DEPTNO,AVG(SAL)

  FROM EMP_GH

  GROUP BY DEPTNO

  HAVING AVG(SAL)<(SELECT AVG(SAL) FROM EMP_gh GROUP BY DEPTNO HAVING DEPTNO=20)

5:查看低于自己所在部门平均工资的员工

  SELECT ENAME

  FROM EMP_GH E,(SELECT AVG(SAL) S,DEPTNO FROM EMP_GH GROUP BY DEPTNO) D

  WHERE E.DEPTNO=D.DEPTNO

  AND E.SAL<D.S

6:查看公司工资排名的第1-5名

      SELECT *  

        FROM  (SELECT ROWNUM,T.*

           FROM  ( SELECT ENAME,SAL

              FROM EMP_GH

              ORDER BY SAL DESC) T)

        WHERE ROWNUM BETWEEN 1 AND 5

7:查看CLERK职位的人数和其他职位的总人数各多少?

  SELECT COUNT(*),DECODE(JOB,'CLERK','CLERK',

                      'OTHER') M

  FROM EMP_GH

  GROUP BY DECODE(JOB,'CLERK','CLERK',

                      'OTHER')

 

8:查看每个职位的工资排名--在组内排序

  SELECT ENAME,SAL,JOB,ROW_NUMBER() OVER(PARTITION BY JOB ORDER BY SAL DESC) MM

  FROM EMP_GH

 

9:查看每个职位的工资排名,若工资一致,排名一致

    SELECT ENAME,SAL,JOB,RANK() OVER(PARTITION BY JOB ORDER BY SAL DESC) MM

    FROM EMP_GH

10:查看每个职位的工资排名,若工资一致,排名一致,不跳名次。

   SELECT ENAME,SAL,JOB ,DENSE_RANK() OVER(PARTITION BY JOB ORDER BY SAL DESC) MM

   FROM EMP_GH

11:分别查看:同部门同职位,同职位,以及所有员工的工资总和

    SELECT DEPTNO,JOB,SUM(SAL)

    FROM EMP_GH

    GROUP BY ROLLUP(DEPTNO,JOB)

12:分别查看:同部门同职位,同职位,同部门以及所有员工的工资总和

  SELECT DEPTNO,JOB,SUM(SAL)

  FROM EMP_GH

  GROUP BY CUBE(DEPTNO,JOB)

13:分别查看同部门同职位和同职位的员工的工资总和

  SELECT DEPTNO,JOB,SUM(SAL)

  FROM EMP_GH

  GROUP BY GROUPING SETS((DEPTNO,JOB),JOB)

     

**********************************DAY05**************************************

****视图(VIEW)

         ***创建视图,视图名字规则,V_EMP_GH_DEPTNO_10

         *** 以v开头_表名字_视图内容信息,在数据库中,不能出现相同的名字

         视图不是正在存在的一张表,而是通过SQL语句查询后的到的 虚表

    CREATE VIEW V_EMP_GH_DEPTNO_10

    AS (SELECT ENAME,SAL,EMPNO,DEPTNO FROM EMP_GH WHERE DEPTNO=10)

   

    SELECT * FROM V_EMP_GH_DEPTNO_10

     *** 工作原理:先看from后面是表还是视图,如果是视图,就会找到相关的select语句,并执行,在执行

    ****  原来的SELECT 语句,进行查询.

   

    查结构 b

    DESC V_EMP_GH_DEPTNO_10

     

*******视图分为简单视图,复杂视图

      简单视图:该视图对应的SELECT语句不含有加工的操作,比如,avg,分组等

              **可以进行DML操作,但实际上对视图的DML操作,就是对该视图数据来源的基础表

              进行操作

      复杂视图:除简单视图之外的视图都是复杂视图

              **不能进行DML操作                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      

     

      ***对视图进行修改

        OR REPLACE,如果没有相关视图则创建一个新视图,如果有则在该视图上修改

           

          CREATE OR REPLACE  VIEW V_EMP_GH_DEPTNO_10

          AS

          SELECT EMPNO ID,ENAME NAME,SAL SALARY,DEPTNO

          FROM EMP_GH

          WHERE DEPTNO=10

*******简单视图

********插入 INSERT INTO

      **再插入过程中,字段使用别名,如果 使用基础表中的要出现错误     

          INSERT INTO V_EMP_GH_DEPTNO_10(ID,NAME,SALARY,DEPTNO)

          VALUES(1021,'SB',9000,10)

         

          SELECT * FROM EMP_GH

     

*******修改

      ***UPDATE

          修改过程中,将修改基础表,

        UPDATE V_EMP_GH_DEPTNO_10

        SET SALARY=6000

        WHERE NAME='SB'

     ***dml操作可能会对基础表进行数据污染,

        **通过视图表插入,但是,在视图内不可见

       

        INSERT INTO V_EMP_GH_DEPTNO_10

        VALUES(1021,'SB',2500,20)

       

        或

       

       UPDATE  V_EMP_GH_DEPTNO_10

      SET DEPTNO=20

        上视图在插入中,deptno =20,不在该视图可是范围(deptno=10),造成数据污染

        SELECT * FROM V_EMP_GH_DEPTNO_10

******删除

      在进行视图删除是,就是对基础表进行删除

      DELETE FROM

        DELETE FROM  V_EMP_GH_DEPTNO_10

     

      DELETE FROM V_EMP_GH_DEPTNO_10

      WHERE DEPTNO=20

     

********对视图添加检查选项后,可以避免视图对基础表污染,    

      在创建视图最下面加 WITH CHECK OPTION

          CREATE OR REPLACE  VIEW V_EMP_GH_DEPTNO_10

          AS

          SELECT EMPNO ID,ENAME NAME,SAL SALARY,DEPTNO

          FROM EMP_GH

          WHERE DEPTNO=10

          WITH CHECK OPTION

     

      **修改

          修改失败,视图是10部门的

          UPDATE  V_EMP_GH_DEPTNO_10

          SET DEPTNO=20

      **插入

        插入失败,视图是10部门的,视图不可见

        INSERT INTO  V_EMP_GH_DEPTNO_10

        VALUES(1020,'SB',1245,20)

***只读选项语句

    WITH READ ONLY,只读

      加入该句后,就可以让视图只能进行查询,不能进行DML操作,

     

       CREATE OR REPLACE  VIEW V_EMP_GH_DEPTNO_10

          AS

          SELECT EMPNO ID,ENAME NAME,SAL SALARY,DEPTNO

          FROM EMP_GH

          WHERE DEPTNO=10

          WITH READ ONLY

*****数据字典    

     -user_objects

     -user_views

     -user_tables

      **查看数据库中视图名

          SELECT OBJECT_NAME FROM USER_OBJECTS

          WHERE OBJECT_TYPE='VIEW'

      **查看视图中的试图名

          SELECT VIEW_NAME FROM USER_VIEWS

      **查看表里面有哪些表明

          SELECT TABLE_NAME FROM USER_TABLES

      ***查看视图中的创建视图的select语句

          SELECT TEXT FROM USER_VIEWS

 

*********复杂视图     

   ** 创建复杂视图,每个部门的部门编号,名字,及该部门员工的工资最大值,最小值,平均值及工资总和

        CREATE VIEW V_DEPT_GH

        AS

        SELECT D.DEPTNO,D.DNAME,

                MAX(E.SAL) MAN_SAL,

                MIN(E.SAL) MIN_SAL,

                AVG(E.SAL) SUM_SAL

        FROM EMP_GH E,DEPT_GH D

        WHERE E.DEPTNO=D.DEPTNO

        GROUP BY D.DEPTNO,D.DNAME

  

        SELECT ENAME,SAL

        FROM EMP_GH E ,V_DEPT_GH V

        WHERE E.DEPTNO = V.DEPTNO

        AND E.SAL<v.man_sal

   

    ***删除视图

        DROP VIEW V_EMP_10

 

************序列

          ***序列创建后,就可以用nextval进行数据填充,

 

 

   ** 序列也是数据库对象之一,作用是可以按照指定的方式生成一系列数字,最常用于为表的主键提供的数据

      **创建

          CREATE SEQUENCE SEQ_EMP_GH_ID

          START WITH 1--从1开始

          INCREMENT BY 1--步进为1

         

      序列支持两个伪列,以获取该序列的数字:

          NEXTVAL:使序列生成下一个数字,若刚创建的序列,就将start WITH 指定的数字返回,以后就是

                  根据步长计算下一个数字后返回.序列不可以发生回退

          CURRVAL:获取当前序列,最后生成的数字,不会发生步进效果

      **在调用nextval过后才能调用currval,否则会出现错误

          SELECT SEQ_EMP_GH_ID.CURRVAL

          FROM DUAL

         

       INSERT INTO EMP_GH(EMPNO,ENAME,SAL,DEPTNO)

       VALUES(SEQ_EMP_GH_ID.NEXTVAL,'NB',5200,10)

      

          SELECT * FROM EMP_GH

         

          DELETE FROM EMP_GH

          WHERE ENAME='NB'

     

    ****删除序列

      DROP SEQUENCE SEQ_EMP_GH_ID

 

    **可以缓存,但是可能发生不连续的数字

   

****UUID

    gUID是一个32位不重复字符串

    SELECT SYS_gUID()

    FROM DUAL

   

*****索引

    加快查询效率,数据库自动调用

      CREATE INDEX IDX_EMP_GH_ENAME ON EMP_GH(ENAME)--在emp_gh上的ename加索引

   

    创建多列索引

      CREATE INDEX IDX_EMP_GH_JOB_SAL ON EMP(JOB,SAL)

      SELECT EMPNO,ENAME,SAL,JOB FROM EMP

      ORDER BY JOB,SAL

      select * FROM EMP_GH               

   

    **创建索引函数

        CREATE INDEX EMP_GH_ENAME_UPPER_INDEX

        ON EMP_GH(UPPER(ENAME))

      当做下面的查询时,会自动用于刚刚建立的索引:

        SELECT * FROM EMP

        WHERE UPPER(ENAME)='KING'

  ****修改索引

        从新整理索引

      ALTER INDEX IDX_EMP_ENAME REBUILD

  ***删除索引

      DROP INDEX  EMP_GH_ENAME_UPPER_INDEX

                                 

                                  

*********************约束

    *****NOT NULL非空约束 NN

        CONSTRAINT + 名 + NOT NULL 全写

        属于列级约束,就是要修改该列同时进行

     CREATE TABLE EMPLYEE_GH(

      ID NUMBER(6),

      NAME VARCHAR2(30) NOT NULL,--简写,系统分配名字

      SALARY NUMBER(7,2),

      HIREDATE DATE CONSTRAINT EMPLYEE_HIREDATE_GH NOT NULL--全写,自己定义名字

     )  

     DESC EMPLYEE_GH

  ****添加非空约束,必须在修改该列的情况下添加

      ALTER TABLE EMPLYEE_GH

      MODIFY (ID NUMBER(6) NOT NULL)

     

  ****唯一性约束  uk null除外

      可以进行列级约束或表及约束(就是写完所有列,最后增加),

      CREATE TABLE EMPLYEE11(

        EID NUMBER (6) UNIQUE,

        NAME VARCHAR2(30),

        EMAIL VARCHAR2(50),

        SALARY NUMBER(7,2),

        HIREDATE DATE,

        CONSTRAINT EMPLY1_EMAIL_UK UNIQUE(EMAIL)

      )

     

      DESC EMPLYEE11

      INSERT INTO EMPLYEE11(EID,NAME,EMAIL)

      VALUES(1,'SB','SB.QOM')

      插入失败,因为id,email具有唯一性,null除外

      INSERT INTO EMPLYEE1(EID,NAME,EMAIL)

      VALUES(1,'SB','SB.QOM')

      INSERT INTO EMPLYEE11(EID,NAME,EMAIL)

      VALUES(NULL,'SB',NULL)

     

      SELECT * FROM EMPLYEE11

  ***添加非空约束(表及约束),如果表上有相同的值,就不能添加唯一性约束

      ALTER TABLE EMPLYEE11

      ADD CONSTRAINT EMPLYEE11_NAME_UK UNIQUE(NAME)

     

*****主键约束 PRIMARY KEY

    **用于唯一标示用的一列,一个表中只有一个主键,

    ** 就是唯一约束,非空约束的结合

        CREATE TABLE EMPLYEE22(

        EID NUMBER(6) PRIMARY KEY,

        NAME VARCHAR2(30),

        EMAIL VARCHAR2(50),

        salary NUMBER(7,2),

        HIREDATE DATE

        )

        DESC EMPLYEE22

    ***每一次插入数据,主键必须添加  

        INSERT INTO EMPLYEE22(NAME)

        VALUES('SB')

 ****一个表的外键,就是关联表的另一张的主键    

      ALTER TABLE EMPLYEE22

      ADD CONSTRAINT EMPLYEE22_SAL_CHECK CHECK(SALARY>2000)

     

      INSERT INTO EMPLYEE22(EID,NAME,SALARY)

      VALUES(1500,'SB',1000)

     

      INSERT INTO EMPLYEE22(EID,NAME,SALARY)

      VALUES(1500,'SB',NULL)--不得行

      SELECT * FROM EMPLYEE22

*************test

1:创建一个视图,包含20号部门的员工信息,字段:empno,ename,sal,JOB,deptno

    CREATE VIEW V_EMP_GH_20

    AS

    SELECT EMPNO,SAL,JOB,DEPTNO

    FROM EMP_GH

    WHERE DEPTNO=20

    DROP VIEW V_EMP_GH_20

2:创建一个序列seq_emp_no,从10开始,步进为10

    CREATE SEQUENCE SEQ_EMP_NO_GH

    START WITH 10

    INCREMENT BY 10

    SELECT SEQ_EMP_NO_GH.NEXTVAL FROM DUAL

    SELECT SEQ_EMP_NO_GH.CURRVAL FROM DUAL

    DROP SEQUENCE SEQ_EMP_NO_GH

3:编写SQL语句查看seq_emp_no序列的下一个数字

 

4:编写SQL语句查看seq_emp_no序列的当前数字

5:为emp表的ename字段添加索引:idx_emp_ename

    CREATE INDEX IDX_EMP_ENAME ON EMP(ENAME)

6:为emp表的LOWER(ename)字段添加索引:idx_emp_lower_ename

  CREATE INDEX IDFNHSI ON EMP(UPPER(ENAME))

  DROP INDEX IDX_EMP_ENAME

7:为emp表的sal,comm添加多列索引

  CREATE INDEX IDX_EMP_SAL_COMM ON EMP_GH(SAL,COMM)

8:创建myemployee表,字段:

  id NUMBER(4) ,

  nameVARCHAR2(20),

  birthday DATE,

  telephone VARCHAR2(11)

  scoreNUMBER(9,2)

  其中id作为主键,name要求不能为空,telephone需要唯一,score值必须>=0

    CREATE TABLE MYEMPLYEE_GH(

      ID NUMBER(4) PRIMARY KEY,

      NAME VARCHAR2(20) not null,

      birthday DATE,

      telephone VARCHAR2(11) UNIQUE,

      scroe number(9,2) check(scroe>=0)

    )

    DESC myemplyee_gh 

   

    SELECT * FROM MYEMPLYEE_GH

   

    INSERT INTO myemplyee_gh

    VALUES(1,'sb',to_date('2015-1-5','YYYY-MM-DD'),'12025143925',53)

   

    INSERT INTO myemplyee_gh(ID,NAME)

    VALUES(12,'SB')

   

      INSERT INTO myemplyee_gh(ID,NAME,TELEPHONE,SCROE)

       VALUES(132,'NB','12025163925',-2)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值