02_SQL语句(二)

()、对查询结果排序  (ORDER BY 子句)

语法格式:

SELECT {DINTINCT} *|具体的列 别名 FROM 表名 WHERE条件(S){ORDER BY 排序的字段1 ASC|DESC,排序的字段2  ASC|DESC}

1.       升序排序 (ASC 一般默认的就是升序,即不写排序类型时默认是升序)

例:查询出emp表的内容 并按薪水 升序排列

SELECT * FROM emp ORDER BY sal ;

SELECT * FROM emp ORDER BY sal ASC;

 

2.       降序排列 (在排序字段后加DESC)

例:查询出emp表的内容 并按薪水降序排列

SELECT * FROM emp ORDER BY sal DESC;

 

3.       多个排序排序条件  此时先按第一个条件排序 第一个条件的内容相等 在按第二个条件排序

例:查询出emp表的内容 先按薪水由高到低排序 如果薪水一样 则按雇佣日期 由早到晚排序

SELECT * FROM emp ORDER BY sal DESChiedate ASC;

 

()、单行函数

在数据库系统中,每个数据库之间唯一不同的最大区别就在于函数的支持上,使用函数可以完成一系列的操作

单行函数语法:

Function_name(column | expression,[arg1,arg2…..])

参数说明:

 Function_name:函数名称

 Column:数据库列名

 Expression:字符串或计算表达式

 arg1 arg2 :在函数中使用的参数

 

1、单行函数的分类:

       |--- 字符函数 接受字符输入并返回字符或数值

       |--- 数值函数 接受数值输入并返回数值

       |--- 日期函数 对日期数据进行操作

       |--- 转换函数 从一种数据类型转换为另一种数据类型

       |--- 通用函数 NVL函数 DECODE函数

 

2、字符函数

专门处理字符的函数 字符的大小写变更 求出字符的长度

(1)、将小写变为大写 UPPER(‘’)

SELECT UPPER(‘smith’) FROM DUAL; àSMITH

 

(2)、将大写变小写  LOWER(‘’)

SELECT LOWER(‘SMITH’) FROM DUAL; àsmith

 

(3)、将单词的第一个字符大写 INITCAP(“”) 注:使用词语不论输入的字符是什么样的大小写格式 输出的均是首字符大写 其余小写的形式

SELECT INITCAP(‘SMITH’) FROM DUAL; àSmith

例:将雇员表中的雇员姓名变为首字母大写

SELET INITCAP(ename) FROM emp;

 

(4)、字符串除了可以使用  || 连接外 还可以使用CONCAT( ) 进行连接

SELECT CONCAT(‘Hello’,’World’) FROM DUAL; à使用CONCAT() 进行字符串连接

SELECT ‘HELLO’||’WORLD’ FROM DUAL; à使用 || 进行字符串的连接操作

但是可以看出 CONCAT()并没用 || 好用

 

(5)、字符串的长度LENGTH(‘xxxx’)

SELECT LENGTH(‘Hello’) FROM DUAL;

 

(6)、字符串的替换 REPLACE(‘xxx’,’被替换的内容’,’替换的内容’)

SELECT REPLACE(‘Hello’,’H’,’W’) FROM DUAL;

注:如果被替换的内容不在字符串中 SQL语句可以执行 但不会产生替换效果

SELECT REPLACE(‘Hello’,’a’,’r’);

Hello将不会变化

(7)、截取SUBSTR(‘Hello’,n,m)   表示从第n位开始截取 截取m

:SELECT SUBSTR(‘Hello’,1,3) 截取,LENGTH(‘Hello’) ;     

注:关于SubStr()面试相关的问题

ORACLESUBSTR()的截取点是从0还是 1开始

       |--0 1 开始都是一样的 因为 oracle比较智能

 

     例:查询出所有雇员的姓名及姓名的后三个字符

SELECT ename,SUBSTR(ename,LENGTH(ename)-2) FROM emp;

注:如果从第n为开始截取 不写截取多少位 那么默认从第n位一致截取到最后

 

可以看出因为每个雇员姓名的长度不一样 所以需要求出姓名的长度在减去2,这样比较麻烦

     例:查询出所有雇员的姓名及姓名的倒数第二个字符

SELECT ename,SUBSTR(ename,-2,1) FROM emp;

为了方便的进行字符串的截取 oraclesubstr()函数提供了更加方便的机制 可以采用倒着截取的方式,只有输入的位数是负数 就表示倒着截取

 

 

 

4、日期函数

Oracle提供了很多和日期操作有关的函数,包括加减日期 但日期进行加减结果会有一些规律

       |-- 日期+/-数字 = 日期

       |-- 日期+/-日期 = 数字(天数)

Oracle中当前的日期使用 SYSDATE表示 SELECT SYSDATE FRON DUAL;

例:查询出10部门的雇员进入公司的星期数

SELECT ename,ROUND((SYSDATE-hiredate)/7) FROM emp WHERE deptno=10;

Oracle中提供了以下的日期函数支持

       |-- MONTHS_BETWEEN():求出给定日期范围的月数

       |-- ADD_MONTHS():在指定日期上加上指定月数,求出之后的日期

       |-- NEXT_DAY():下一个的今天是哪一个日期

       |-- LAST_DAY():求出给定日期的最后一天日期

 

(1)MONTHS_BETWEEN(日期1,日期2)

       例:查询出雇员被雇佣的月数

       SELECT ename,ROUND(MONTHS_BETWEEN(SYSDATE,hiredate)) FROM emp;

      

(2)ADD_MONTHS(日期,月数) 日期+数字 = 日期

       例:在现在的日期上加上3个月

       SELECT ADD_MONTHS(SYSDATE,3) FROM DUAL; à   2009-12-16 19:37:58

 

(3)NEXT_DAY(日期,给定日期) 求出下一个给定的日期

       例:求出从今天开始下一个星期一的日期

       SELECT NEXT_DAY(SYSDATE星期一’)  FROM DUAL;

       注:星期数不能写成 星期天 否则无效

 

(4)LAST_DAY()求出一个日期的最后一天

       例:求出本月的最后一天

       SELECT LAST_DAY(SYSDATE) FROM DUAL;

 

 

 

 

 

 

 

 

5、转换函数

       |-- TO_CHAR() 转换成字符串

       |-- TO_NUMBER() 转换成数字

       |-- TO_DATE() 转换成日期

 

(1)TO_CHAR()函数   使用在日期和数字上

|||-- TO_CHAR() 函数用在日期上 

||-- TO_CHAR() 可以进行日期的拆分 拆分的时候注意日期的通配符,通配符要加单引号

|-- yyyy   TO_CHAR(hiredate,’yyyy’)

|-- MM   TO_CHAR(hiredate,’MM’)

|-- dd     TO_CHAR(hiredate,’dd’)

                例:查询出emp表雇员的雇佣日期 并将其拆分

        SELECT enameTO_CHAR(hiredate’yy’) yearTO_CHAR(hiredate’MM’)  month

        TO_CHAR(hiredate’dd’)  day  FROM emp;

||-- TO_CHAR()  使用进行日期显示的转换功能

        |-- Oracle的默认格式 19-4 -87

        |-- chinese的习惯格式 1987-04-19

例:查询出emp表雇员雇佣日期 并以 yyyy-MM-dd格式显示

SELECT ename,TO_CHAR(hiredate,’yyyy-MM-dd’) FROM emp;

注:MM表示如果该月不足10月会显示前导0 如果要去掉签到0 需要加fm

SELECT ename,T0_CHAR(hiredate,’fmyyyy-MM-dd’) FROM emp;

 

|||-- TO_CHAR() 用在数字上

||-- TO_CHAR() 可以在数字中加入一些符号,以分割太长的数字 以对数字进行格式化

    |-- 9 表示以为数字

    |-- $:表示美元

    |--       L:表示本地的货币  

        例:查询出雇员的薪水 三位一组 以,隔开

        SELECT enameTO_CHAR(sal’$99999’)  sal  FROM  emp;

 

(2)TO_NUMBER()   将字符串变为数字

        例:SELECT  TO_NUMBER(‘123’) + TO_NUMBER(‘234’)   FROM  DUAL; à357

        上面是将字符串变为数值类型并相加

 

(3)TO_DATE()   将一个字符串变为 DATE类型

        例:将 2009.9.16转换为 date类型

SELECT  TO_DATE(‘2009.9.16’’yyyy-MM-dd’)  FROM  DUAL; à 2009-09-16

 

 

 

6、通用函数

       |-- NVL 函数()   可以指定一个null值为指定内容 如果要进行计算 对于 NULL 必须使用NVL函数

       |-- DECODE 函数()  类似于if()..elseif() 语句

 

       (1)NVL()函数

              例:要求求出部门雇员的年薪

              SELECT ename,(sal+comm*12 income FROM  emp  WHERE deptno=30;

             

ENAME          INCOME     ENAME          INCOME

----------           ----------         ----------               ----------

ALLEN           22800          ALLEN               22800                   

WARD            21000          WARD                21000

MARTIN        31800         MARTIN            31800

BLAKE           34200         BLAKE

TURNER        18000         TURNER            18000

JAMES           11400         JAMES

            

可以看出 一些员工的年薪没有显示出来 那是因为一些雇员的奖金为空的原因 此时要进行计算就要使用NVL函数了

              SELECT  ename sal+NVLcomm0*12  income FROM emp WHERE   deptno=30;       

 

       (2)DECODE()函数 

DECODE的语法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value等于if1时,DECODE函数的结果返回then1,...,如果不等于任何一个if值,则返回else。初看一下,DECODE 只能做等于测试,但刚才也看到了,我们通过一些函数或计算替代value,是可以使DECODE函数具备大于、小于或等于功能。

例:查询出雇员的薪水 如果薪水在2000以下的 加薪20%, 如果薪水在2000元以上的 加薪15%,如果为2000的则 加薪15%

SELECT ename,DECODE(sign(sal-2000)1sal*1.5-1sal*20sal*1.5)  newsal  FROM emp;

注:SIGN(数值) 函数根据里面的值是 0 ,正数 ,负数 分别返回 0 1-1

例:将emp表中的雇员的职位都换成中文

SELECT enameDECODE(job,’CLERK’,’业务员’,’SALSMAN’,’销售人员’,’MANAGER’,’经理’,’ANALYST’,’分析员’,’PRESIDENT’,’总裁’) FROM emp  WHERE deptno=30;

ENAME      DECODE(J

---------- --------

ALLEN      销售人员

WARD       销售人员

MARTIN     销售人员

BLAKE      经理

TURNER     销售人员

JAMES      业务员

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值