--DQL查询语句
--SELECT语句用来查询表中数据,一条SQL语句是由多个子句组成,一个子句有一个关键字加一系列内容组成。
--SELECT语句中必须包含的是两个子句,SELECT子句和FROM子句。
--SELECT子句用于指定要查询的内容(字段、函数、表达式),from子句用来指定数据来源*/
--查询所有数据
SELECT * FROM emp;
--分别查询,限制条件deptno=30
SELECT ename,job,sal,deptno FROM emp WHERE deptno=30;
--查询工资大于2000的员工信息
SELECT * FROM emp WHERE sal>2000;
--查询所有员工的年薪
SELECT ename,sal,sal*12 FROM emp;
--CONCAT函数:连接字符串,
--要求->查询时两个字段名并在一起
SELECT CONCAT(ename,sal) FROM emp;
--要求并在一起的格式 -->ename:sal
SELECT CONCAT(CONCAT(ename,':'),sal) FROM emp;
--连接字符串常用"||" -->ename:sal
SELECT ename||':'||sal FROM emp;
--LENGTH函数:字符串长度
SELECT ename, LENGTH(ename) FROM emp;
--名字4个字母的员工
SELECT ename,length(ename) FROM emp WHERE LENGTH(ename)=4;
--UPPER(大写),LOWER(小写),INITCAP(首字母大写)
--dual:伪表,当查询的内容不是任何表中数据,可以用伪表代替
SELECT UPPER('hello world'),lower('HELLO WORLD'),INITCAP('hello world')FROM dual;
--查询SCOTT员工的信息
SELECT ename,sal,deptno FROM emp WHERE ename=UPPER('scott');
--TRIM(去除字符串两侧指定字符),LTRIM,RTRIM
SELECT TRIM('e' FROM 'eeeelisteee') FROM dual; --liat
--LTRIM(去掉左边指定字符,'ets'包含一个都去掉)
SELECT LTRIM('ssttestesteseettslistees','ets') FROM dual --listees
--RTRIM
SELECT RTRIM('setlistssetteessetst','ets') FROM dual --setli
--LPAD,RPAD 补位函数
--LPAD(左补位)效果->右对齐
SELECT ename,sal,LPAD(sal,6,' ') FROM emp
--RPAD(右补位)效果->左对齐
SELECT ename,sal,RPAD(sal,6,' ') FROM emp
--LPAD,RPAD超位都截取左边
SELECT ename,sal,RPAD(sal,3,'$') FROM emp
--SUBSTR函数:截取字符串
--SUBSTR(str,m,n) 截取str字符串从m开始连续截取n个字符,数据库中下标都是从1开始!
SELECT SUBSTR('thinking in java',10,2) FROM dual --in
--省略截取数量,或者截取数量超过实际内容都是截取到末尾
SELECT SUBSTR('thinking in java',10,100) FROM dual--in java
--若位置m是负数,表示倒数位置开始截取,个数n不能为负数
SELECT SUBSTR('thinking in java',-7,2) FROM DUAL --in
--INSTR:查看字符串的位置
--INSTR(str1,str2,m,n)查找str2在str1中的位置,m,n是可选项,分别表示
--m:从第几个字符开始查找
--n:第几次出现的位置
SELECT INSTR('thinking in java','in',4) FROM DUAL --6
SELECT INSTR('thinking in java','in',2,3) FROM DUAL --10
--数值函数
--ROUND(m,n):四舍五入,保留m到小数点后n位,n为0或者不指定这是保留整数
--n为负数这是保留到小数点前的位数
SELECT ROUND(45.678,2) FROM DUAL --45.68
SELECT ROUND(45.678,0) FROM DUAL --46
SELECT ROUND(45.678,-1) FROM DUAL --50
SELECT ROUND(45.678,-2) FROM DUAL --0
SELECT ROUND(55.678,-2) FROM DUAL --100
--TRUNC(m,n) 截取数字,参数作用与ROUND一致
SELECT TRUNC(45.678,2) FROM DUAL --45.67
SELECT TRUNC(45.678,0) FROM DUAL --45
SELECT TRUNC(45.678,-1) FROM DUAL --40
SELECT TRUNC(45.678,-2) FROM DUAL --0
--MOD(m,n)求余
SELECT ename,sal,MOD(sal,1000) FROM emp;
--CEIL(n):向上取整,大于它的最小整数
SELECT CEIL(45.678) FROM DUAL --46
--FLOOR(n):向下取整,小于它的最大整数
SELECT FLOOR(45.678) FROM DUAL --45
--日期相关操作
--关键字SYSDATE:对应数据库一个内置函数,返回一个DATE类型的值,该值表示当前系统时间
--SYSTIMESTAMP:返回当前系统时间戳类型的值
SELECT SYSDATE FROM dual
SELECT SYSTIMESTAMP FROM dual
--日期转换函数
--TO_DATE()可以将一个字符串按照给定的日期格式解释为一个DATE类型的值
SELECT TO_DATE('2008-08-08 20:08:06','YYYY-MM-DD HH24:MI:SS')FROM dual
--日期格式字符串中凡不是英文、符号、数字之外的其他字符都要使用双引号括起来
SELECT TO_DATE('2008年08月08日 20:08:06','YYYY"年"MM"月"DD"日" HH24:MI:SS')FROM dual
--TO_CHAR():将日期按照指定的格式转换为字符串
SELECT TO_CHAR(SYSDATE,'YYYY"年"MM"月"DD"日" HH24:MI:SS') FROM dual
--日期类型可以比较大小,越晚的越大;日期类型之间可以进行减法,差为相差的天数;
--日期可以进行减加数字,等同于加减天数
--查看每个员工入职至今的天数
SELECT ename,SYSDATE-hiredate FROM emp
--出生到现在活了多少天
SELECT SYSDATE-TO_DATE('1996-09-13','YYYY-MM-DD') FROM dual
--'RR-MM-DD'和'YYYY-MM-DD'求完整的年份
SELECT TO_CHAR(TO_DATE('30-01-01','RR-MM-DD'),'YYYY-MM-DD') FROM dual
--LAST_DAY(date) 查看给定日期所在月的月底
SELECT LAST_DAY(SYSDATE) FROM dual
--add_months(date,i) 对给定日期加上指定的月,若i为负数,则减去
SELECT ename,ADD_MONTHS(hiredate,20*12) FROM emp
--MONTHS_BETWEEN(date1,date2) 计算两个日期之间相差的月,计算是用date1-date2换算得到的
SELECT ename,MONTHS_BETWEEN(SYSDATE,hiredate) FROM emp
--NEXT_DAY(date,i) 返回给定日期第二天开始一周内的周几的日期。i表示周几:1为周日,2为周一,以此类推
SELECT NEXT_DAY(SYSDATE,6) FROM dual --这周五
--LEAST,GREATEST 求最小值与最大值,参数至少一个
SELECT LEAST(SYSDATE,TO_DATE('2008-10-10','YYYY-MM-DD')) FROM dual
SELECT GREATEST(SYSDATE,TO_DATE('2008-10-10','YYYY-MM-DD')) FROM dual
--EXTRACT函数:提取指定日期中指定时间分量的值,date可以提取年月日,时间戳还可以提取时分秒
SELECT EXTRACT(YEAR FROM SYSDATE) FROM dual
SELECT ename,sal,hiredate FROM emp WHERE EXTRACT(YEAR FROM hiredate)>=1982
--创建表student
CREATE TABLE student(
ID NUMBER(4),
NAME VARCHAR2(20),
gender varchar2(5)
)
--插入表数据
INSERT INTO student VALUES(1000,'李莫愁','girl')
INSERT INTO student VALUES(1001,'林平之',NULL)
INSERT INTO student(id,NAME) VALUES(1002,'张无忌')
--查询表数据
SELECT * FROM student
--修改id=1002 的gender为boy
UPDATE student SET gender='boy' WHERE ID=1002
--在判断某个字段的值是否为空时,要使用IS NULL和IS NOT NULL判断,不能用‘=’判断为空
UPDATE student SET gender='boy' WHERE gender IS NULL
--NULL的操作,NULL与字符串连接,等于什么都没做,NULL与数字计算,结果还是NULL
SELECT ename,sal,comm,sal+comm FROM emp
--空值函数
--NVL(a1,a2)若a1为NULL则函数返回a2,否则返回a1自身,所以该函数的作用将NULL值替换为非NULL值
SELECT ename,sal,comm,sal+NVL(comm,0) FROM emp
--若该员工有奖金,则显示为‘有奖金’,奖金为NULL,则显示‘没有奖金’
--NVL2(a1,a2,a3),当a1不为NULL时,函数返回a2,a1为NULL时,返回a3
SELECT ename,sal,comm,NVL2(comm,'有奖金','无奖金') FROM emp
SELECT ename,sal,comm,NVL2(comm,sal+comm,sal) FROM emp