ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Oracle第六课

2021-01-20 12:34:23  阅读:263  来源: 互联网

标签:SYSDATE 第六课 -- clazz dual Oracle id SELECT


Oracle第六课

一、第五课课后作业讲解

  • SQL优化时,对于索引的数据类型是有要求的,比如列的类型是char型,查询条件就必须是char型,如果是数字型,则索引失效

    age列建了索引,它是char型,where age>18,此处18是数字,索引失效

    Java中的age必然是int型,number

  • 表结构不合理

  • 创建班级表

    CREATE TABLE t_clazz(ID NUMBER(10) PRIMARY KEY,
    NAME VARCHAR(20) NOT NULL);
  • 创建学生表

    CREATE TABLE t_student(ID NUMBER(12) PRIMARY KEY,
    NAME VARCHAR(20) NOT NULL,
    sex NUMBER(1) CHECK(sex=1 OR sex = 0) NOT NULL,
    age NUMBER(2) NOT NULL,
    clazz NUMBER(10) REFERENCES t_clazz(ID));
  • 两表连接的方式

    -- 内连接
    SELECT s.*,c.* FROM t_student s INNER JOIN t_clazz c ON s.clazz=c.id;
    SELECT s.id SID,s.name sname,sex,age,clazz,c.name cname FROM t_student s,t_clazz c WHERE s.clazz=c.id;
    -- 左外连接
    SELECT s.id SID,s.name sname,sex,age,clazz,c.name cname FROM t_student s LEFT OUTER JOIN t_clazz c ON s.clazz=c.id;
    -- 右外连接
    SELECT s.id SID,s.name sname,sex,age,clazz,c.name cname FROM t_student s RIGHT OUTER JOIN t_clazz c ON s.clazz=c.id;
    -- 全连接
    SELECT s.id SID,s.name sname,sex,age,clazz,c.name cname FROM t_student s FULL JOIN t_clazz c ON s.clazz=c.id;
  • 在oracle中特有的通俗的写法

    -- 内连接
    select xx from a,b where a.id=b.id;
    -- 右连接,主表是不带加号的表
    -- 右连接
    select xx from a,b where a.id(+)=b.id
    -- 左连接
    select xx from a,b where a.id =b.id(+);

二、函数

  • 虚表:dual,做测试用的表

  • 函数

    • 单行函数

      1. 字符函数:ascii(x)

        SELECT ASCII('a') FROM dual;
      2. 拼接字符串:concat('a','b')

        SELECT CONCAT('a','b'),'a'||'b' FROM dual;
      3. 找字符串中某个字符的位置,位置从1开始

        -- 找字符c的位置
        SELECT INSTR('abcdefg','c') FROM dual;
        -- 从第4个字符开始找
        SELECT INSTR('abcdefgc','c',4) FROM dual;
        -- 从第一个开始找,找第一个出现的c
        SELECT INSTR('abcdefgc','c',1,2) FROM dual;
      4. 返回字符串的长度:length

        SELECT LENGTH('aaaa') FROM dual;
      5. 将字符全转换成小写或大写

        -- 将字符全转换成小写,或大写
        SELECT LENGTH('aaaa'),LOWER('aBcD'),UPPER('aBcD') FROM dual;
      6. 替换:replace

        -- 替换
        SELECT REPLACE('abc123','1','a') FROM dual;
      7. 截取字符串:replace

        -- 截取字符串
        -- 从1开始截取3个
        SELECT SUBSTR('abcdef',1,3) FROM dual;
      8. 去掉左边的字符(默认是空格):LTRIM,去掉右边的RTRIM,去掉两边的TRIM

        SELECT LTRIM('     abc    '),rTRIM('     abc    ')
        ,TRIM('     abc   '),TRIM('1' FROM '1111a1b1c11') FROM dual;
      9. 数字函数

        -- 取绝对值
        SELECT ABS(-1) FROM dual;
        -- 取大于或等于x的最小值
        SELECT CEIL(-1.1),CEIL(1.9) FROM dual;
        -- 取小于或等于x的最大值
        SELECT FLOOR(-1.1),FLOOR(1.2) FROM dual;
        -- 四舍五入,第二个值用来指定保留几位小数
        SELECT ROUND(3.45),ROUND(3.45,1) FROM dual;
        -- 直接截断,没有y的话取整,不会四舍五入
        SELECT TRUNC(7.25),TRUNC(7.25,1) FROM dual;
        -- 取余
        SELECT MOD(5,2) FROM dual;
      10. 日期函数

        -- 当前日期
        SELECT SYSDATE FROM dual;
        -- 增加一月
        SELECT add_months(SYSDATE,1) FROM dual;
        -- 返回data所在月的最后一天的日期
        SELECT last_day(SYSDATE) FROM dual;
        -- 四舍五入日期
        SELECT ROUND(SYSDATE),ROUND(SYSDATE,'month'),ROUND(SYSDATE,'year') FROM dual;
        -- 月份差
        SELECT e.*,months_between(SYSDATE,hiredate),trunc(months_between(SYSDATE,hiredate)) FROM emp e WHERE empno IN(7369,7499);
        -- 当前日期的下个星期一是几号
        SELECT next_day(SYSDATE,'星期一') FROM dual;
        -- 从员工表中提取员工的入职月份
        SELECT EXTRACT(MONTH FROM hiredate) FROM emp;
        -- 截断:trunc
        SELECT TRUNC(SYSDATE,'day') FROM dual;
      11. 应用

        -- 工作年限
        SELECT trunc(months_between(SYSDATE,hiredate)) FROM emp;
        -- 找到工作年限最长的员工
        SELECT t.empno,t.maxs_date FROM (SELECT e.*,TRUNC(months_between(SYSDATE,hiredate)) maxs_date FROM emp e) t WHERE t.maxs_date IS NOT NULL AND ROWNUM = 1;
        -- 给工作年限超过两年的员工sal增加100元
        SELECT t.*,t.sal+100 sal2 FROM (SELECT e.*,trunc(months_between(SYSDATE,hiredate)/12) work_YEAR FROM emp e WHERE hiredate IS NOT NULL) t WHERE t.work_YEAR>2;
        -- sql语句执行:先from,再where,再select
      12. 转换函数

        -- 索引类型如果不一致会失效,age列是number,age=to_number('1')
        -- 日期到字符
        SELECT to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss') FROM dual;
        -- 字符到日期
        SELECT to_date('2021-01-20 12:08:28','yyyy-mm-dd hh24:mi:ss') FROM dual;
        -- 字符到数字
        SELECT to_number('142') FROM dual;
        -- 数字到字符
        SELECT 1,to_char(1) FROM dual;



标签:SYSDATE,第六课,--,clazz,dual,Oracle,id,SELECT
来源: https://www.cnblogs.com/ty0910/p/14302194.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有