第二天20160727
--查询employees表中last_name不包含a的员工的last_name
SELECT LAST_NAME
FROM EMPLOYEES
WHERE LAST_NAME NOT LIKE '%a%';
--排序:ORDER BY子句
SELECT 3
FROM 1
[WHERE] 2
[ORDER BY 列] 4--通常ORDER BY子句会出现在SELECT语句的最后
/*
1.升序:使用ASC关键字。默认为升序排序。
2.降序:使用DESC关键字。
*/
SELECT LAST_NAME,SALARY
FROM EMPLOYEES
ORDER BY SALARY ASC;
SELECT LAST_NAME,SALARY
FROM EMPLOYEES
ORDER BY SALARY DESC;
SELECT LAST_NAME,HIRE_DATE
FROM EMPLOYEES
ORDER BY HIRE_DATE ASC;
SELECT LAST_NAME
FROM EMPLOYEES
ORDER BY LAST_NAME ASC;
/*
1.ORDER BY子句中可以出现列名。
2.ORDER BY子句中可以出现表达式与函数。
3.ORDER BY子句中可以出现列别名(注意大小写)。
4.ORDER BY子句中可以出现结果中列的序号。
*/
--查询employees表中年薪大于100000的员工的last_name,年薪,结果根据年薪降序排序
SELECT LAST_NAME,SALARY*12 AS 年薪
FROM EMPLOYEES
WHERE SALARY*12>100000
ORDER BY 2 DESC;
--WHERE子句中不能使用列的别名。
--先对第一列进行排序,当第一列中有相同数据时,对这些相同的数据进行第二列的排序。
--查询employees表中所有员工的last_name,job_id,department_id,salary,结果根据department_id升序,salary降序排序。
SELECT LAST_NAME,JOB_ID,DEPARTMENT_ID,SALARY
FROM EMPLOYEES
ORDER BY DEPARTMENT_ID ASC NULLS FIRST,SALARY DESC;
--Oracle认为NULL是最大的。
--SQL Server认为NULL是最小的。
--NULLS FIRST/NULLS LAST:在不影响排序规则的前提下,将NULL放在结果的最前/后面。
--单行函数
--字符相关的单行函数
SELECT LAST_NAME,UPPER(LAST_NAME)--大写
FROM EMPLOYEES;
SELECT LAST_NAME,LOWER(LAST_NAME)--小写
FROM EMPLOYEES;
--查询employees表中last_name包含a(不区分大小写)的员工的last_name
SELECT LAST_NAME
FROM EMPLOYEES
WHERE LAST_NAME LIKE '%A%' OR LAST_NAME LIKE '%a%';
SELECT LAST_NAME
FROM EMPLOYEES
WHERE UPPER(LAST_NAME) LIKE '%A%';
--从指定的位置开始截取字符串,直到字符串的最后
SELECT LAST_NAME,SUBSTR(LAST_NAME,3)
FROM EMPLOYEES;
--从指定的位置截取指定长度的字符串
SELECT LAST_NAME,SUBSTR(LAST_NAME,3,2)
FROM EMPLOYEES;
--从倒数第N位开始截取字符串,直到字符串的最后
SELECT LAST_NAME,SUBSTR(LAST_NAME,-3)
FROM EMPLOYEES;
--从倒数第N位截取指定长度的字符串
SELECT LAST_NAME,SUBSTR(LAST_NAME,-3,2)
FROM EMPLOYEES;
SELECT LAST_NAME,LENGTH(LAST_NAME)
FROM EMPLOYEES;
SELECT LENGTH('中国')--返回字符数
FROM DUAL;
SELECT LENGTHB('中国')--返回字节数
FROM DUAL;
LPAD()/RPAD():显示第一个参数的值,使用第二参数设置第一个参数显示的位数。如果第一个参数长度不足,使用第三个参数在第一个参数的左/右面补齐长度。
SELECT LPAD(EMPLOYEE_ID,6,0),LAST_NAME
FROM EMPLOYEES;
--INSTR():在第一个参数中查找第二个参数首次出现的位置,没找到返回0
SELECT LAST_NAME,INSTR(LAST_NAME,'a')
FROM EMPLOYEES;
--查询employees表中last_name包含a的员工的last_name(不允许使用LIKE)
SELECT LAST_NAME
FROM EMPLOYEES
WHERE INSTR(LAST_NAME,'a')!=0;
SELECT REPLACE('www.dhee.com','w','m')--将第一个参数中出现的第二个参数,使用第三个参数替换。
FROM DUAL;
--TRIM():去掉字符串两端的空格
SELECT TRIM(' ABC ABC ') AS A
FROM DUAL;
SELECT TRIM('A' FROM 'AAAABADAAAA')
FROM DUAL;
--与数字相关的单行函数
--四舍五入
SELECT ROUND(256.987),ROUND(256.987,2),ROUND(256.987,0),ROUND(256.987,-1)
FROM DUAL;
--截断数字
SELECT TRUNC(256.987),TRUNC(256.987,2),TRUNC(256.987,0),TRUNC(256.987,-1)
FROM DUAL;
--取余数
SELECT MOD(15,2)
FROM DUAL;
--与日期相关的单行函数
--SYSDATE:获得数据库服务器的当前日期+时间
SELECT SYSDATE
FROM DUAL;
SELECT SYSDATE+1000
FROM DUAL;
SELECT SYSDATE-1000
FROM DUAL;
--查询employees表中所有员工的last_name,hire_date,入职的天数
SELECT LAST_NAME,HIRE_DATE,TRUNC(SYSDATE-HIRE_DATE) AS 入职天数
FROM EMPLOYEES;
/*
1.日期+天数=日期
2.日期-天数=日期
3.日期-日期=天数
4.日期不能加日期
*/
--MONTHS_BETWEEN():返回两个日期相关的月数
SELECT LAST_NAME,HIRE_DATE,TRUNC(MONTHS_BETWEEN(SYSDATE,HIRE_DATE)) AS 入职月数
FROM EMPLOYEES;
--ADD_MONTHS():返回指定日期之后的N个月的日期
SELECT ADD_MONTHS(SYSDATE,-100)
FROM DUAL;
--NEXT_DAY():获得指定日期的下一个星期N的日期
SELECT NEXT_DAY(SYSDATE,2)
FROM DUAL;
SELECT NEXT_DAY(SYSDATE,'星期二')
FROM DUAL;
--与类型转换相关的单行函数
/*
1.字符串可以与日期进行相互的转换
2.字符串可以与数字进行相互的转换
3.Oracle中日期与数字不能相互转换
*/
--TO_CHAR(D,F):根据模板F将日期类型D转换为字符串类型的值。
SELECT LAST_NAME,TO_CHAR(HIRE_DATE,'YYYY-MM-DD')
FROM EMPLOYEES;
SELECT TO_CHAR(SYSDATE,'D DD DDD')
FROM DUAL;
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS')
FROM DUAL;
SELECT LAST_NAME,TO_CHAR(HIRE_DATE,'FMYYYY"年"MM"月"DD"日" DAY')
FROM EMPLOYEES;
--查询employees表中所有星期三入职员工的last_name,hire_date(格式:1999-1-1)
SELECT LAST_NAME,TO_CHAR(HIRE_DATE,'FMYYYY-MM-DD')
FROM EMPLOYEES
WHERE TO_CHAR(HIRE_DATE,'DAY')='星期三';
SELECT LAST_NAME,TO_CHAR(HIRE_DATE,'FMYYYY-MM-DD')
FROM EMPLOYEES
WHERE TO_CHAR(HIRE_DATE,'D')='4';
--查询employees所有员工的last_name,hire_date(格式为:YYYY-MM-DD),入职的星期
SELECT LAST_NAME,TO_CHAR(HIRE_DATE,'YYYY-MM-DD') AS 入职时间,TO_CHAR(HIRE_DATE,'DAY') AS 星期
FROM EMPLOYEES
ORDER BY TO_CHAR(HIRE_DATE-1,'D') ASC;