SELECT语句

用来查询数据的DQL语句

  1. --SELECT语句 DQL
  2. --SELECT语句 是用来查询数据的DQL语句
  3. --查询emp指定字段的值
  4. SELECT NAME,JOB,DEPTNO FROM EMP
  5. --DQL 必须包含的部分是select子句与FROM子句
  6. --SELECT用来确定查询的字段
  7. --可以使用的字段有表的字段,函数,表达式
  8. --FROM子句用来确定查询的表
  9. --查看每个员工的年
  10. SELECT NAME,SALARY*12 FROM EMP;

CONCAT和”||”

返回两个字符串连接后的结果,两个参数是要连接的两个字符串,
等价操作:连接操作符”||” 多个字符串连接,用 || 更直观

--字符串函数  连接字符串
SELECT CONCAT (NAME , SALARY) FROM EMP;
SELECT CONCAT(CONCAT(NAME, ' : '),SALARY )FROM EMP;
--连接字符串还有一种简单的方式 : "||"
SELECT NAME || ' : ' || SALARY FROM EMP;

LENGTH

作用:返回字符串的长度 如果类型是varchar2,则返回的是实际长度,如果是char类型,长度要包括后补的空格

--LENGTH (ch)函数,获取字符长度
SELECT NAME,LENGTH(NAME) FROM EMP;

UPPER、LOWER、INITCAP

作用:大小写转换函数,

--将字符转换为大写小写
--dual伪表,当前的内容与任何一张表中的数据无关时,可以查询伪表
SELECT UPPER('helloworld') FROM dual;
SELECT LOWER('HELLOWORLD')FROM dual;
--首字母大写
SELECT INITCAP('hELLO WORLD') FROM dual;

TRIM、LTRIM、RTRIM

作用:截去子串
语法形式:TRIM(c2 from c1) 从c1的前后截去c2 常用来去掉字符串前后的空格
LTRIM(c1 [,c2]) 从c1的左边(left)截去c2
RTRIM(c1 [,c2])从c1的右边(right)截去c2 如果没有c2就去除空格

--TRIM(trim_source)/"LTRIM"(ch)/"RTRIM"(ch)
--去除字符串两边的指定字符
SELECT TRIM('e' FROM 'eelteee')FROM dual;
SELECT LTRIM('eeeseserlitsese','se') FROM dual;
SELECT RTRIM('eseserlitsese','se') FROM dual;

LPAD、RPAD

作用:补位函数,用于在字符串char1的左端或右端用char2补足到n位,char2可重复多次
LPAD(char1,n, char2)左补位函数 RPAD(char1,n, char2)右补位函数

--LPAD/RPAD  补位函数
--要求显示指定内容指定位数,若不满足则补充若干指定字符以达到显示的长度
SELECT NAME,RPAD(SALARY, 6, '$')FROM EMP;

SUBSTR

作用:用于获取字符串的子串,返回char中从 m 位开始取 n 个字符
字符串的首位计数从 1 开始

--SUBSTR(ch, pos, length) 截取字符串。
--截取给定字符串,从指定位置n开始截取指定个字符。(截取的字符串包含位置n的字符)
--在数据库中,下标从1开始计算
SELECT SUBSTR('Thinking in java', 4, 4)FROM dual;

INSTR
作用:查找ch2在ch1中的位置,

--"INSTR"(ch1, ch2[n,m])  查找ch2在ch1中的位置,n为从指定位置开始查找
--可以不写,m为第几次出现,可以不写,n,m不写默认值为1
SELECT INSTR('Thinking in java', 'in',4,2) FROM dual;
SELECT NAME,SALARY,DEPTNO FROM EMP WHERE SUBSTR(NAME, 1,1)='l'

ORACLE数值操作

Oracle 语法组合 - 图1

Oracle的数值函数

1.ROUND(n,m) m必须为整数,即保留后几位

--1.ROUND(n, [m])对n四舍五入,保留到小数点后m位
--(m可写可不写), 不写默认为0 保留到整数位    -1位  10位
SELECT ROUND(45.678, 2) FROM dual;
SELECT ROUND(45.678, 0) FROM dual;
SELECT ROUND(45.678, -2) FROM dual;

2.TRUNC:用于截取

--2.TRUNC(n1, n2)函数,与ROUND用法一致,只是不再进行四舍五入,而是
--直接截取
SELECT TRUNC(45.678, 2) FROM dual;
SELECT TRUNC(45.678, -1) FROM dual;
SELECT TRUNC(45.678, 0) FROM dual;

--查看每个员工至今活了多少天
SELECT NAME ,TRUNC(SYSDATE-BIRTH) FROM EMP;
--89年到现在多少天了
SELECT TRUNC(SYSDATE-TO_DATE('1989-01-01', 'YYYY-MM-DD')) FROM dual;

3.MOD(m,n ):返回m除以n后的余数

--3.MOD(n1, n2)求余函数
SELECT NAME,SALARY,MOD(SALARY, 1000) FROM EMP;

4.CEIL和FLOOR

--4.CEIL(n)向上取整 和 FLOOR(n)向下取整
SELECT CEIL(45.678) FROM dual;
SELECT FLOOR(45.678) FROM dual;

5.Oracle的时间类型

  • Date,oracle中常用的日期类型,用来保存日期和时间。

  • TIMESTAMP,oracle中常用的日期类型,与date的区别是不仅可以保存时间和日期,还能保存小数秒,最高精度可达纳秒。

  • SYSDATE其本质是一个oracle内部函数,返回当前时间,精确到秒。

  • SYSTIMESTAMP内部函数,返回当前系统时间和日期,精确到毫秒。

DATE

--DATE:七个字节  保存世纪、年月日时分秒
--TIMESTAMP: 时间戳  比DATE多四个字节,可以保存秒一下的精度
--SYSDATE: 对应一个内置函数,返回一个表示当前系统时间的DATE类型
--SYSTIMESTAMP: 同样的,返回的是表示当前系统时间的时间戳类型的值
SELECT SYSDATE FROM dual;
SELECT SYSTIMESTAMP FROM dual;

--DATE 是可以比较大小的,越晚的越大
SELECT * from EMP;
--查看1989年以后入职的员工
SELECT NAME,BIRTH FROM EMP WHERE B1IRTH > TO_DATE('1989-01-01', 'YYYY-MM-DD');

--DATE 可以和一个数字进行加减运算,相当于加减了指定的天数
--返回值为对应的日期
--一周后是哪天?
SELECT SYSDATE+7 FROM dual;

TO_DATE

作用:将字符串按照定制格式转换为日期类型

--"TO_DATE"(ch, fmt)  按照给定的日期格式将字符串转换为DATE类型
SELECT TO_DATE('1998-11-01 12:22:11', 'YYYY-MM-DD HH24:MI:SS') FROM dual;

--在日期格式字符串中,凡不是英文,符号和数字的其他字符
--都要用双引号括起来
SELECT TO_DATE('1998年11月01日 23:22:11', 'YYYY"年"MM"月"DD"日" HH24:MI:SS')
FROM dual;

--'03-09-01'
SELECT TO_DATE('03-09-01', 'RR-MM-DD')FROM dual;

TO_CHAR

作用:将其他类型的数据转换为字符串类型
fmt格式字符串中出现汉字或其他非符号字符时需要用双引号

--"TO_CHAR"(x) 常用语转换日期,可以将日期按照指定的日期格式转换为字符串
SELECT TO_CHAR(BIRTH,'YYYY-MM-DD hh24:MI:SS')FROM EMP;


SELECT TO_CHAR(TO_DATE('03-
09-01', 'RR-MM-DD'),'YYYY-MM-DD')FROM dual;

--在日期格式字符串中,凡不是英文,符号和数字的其他字符
--都要用双引号括起来
SELECT TO_DATE('1998年11月01日 23:22:11', 'YYYY"年"MM"月"DD"日" HH24:MI:SS')
FROM dual;

LAST_DAY

作用:返回日期date所在月的最后一天

--"LAST_DAY"(date)该函数返回给定日期所在月的最后一天(月底)
SELECT LAST_DAY(SYSDATE) FROM dual;

ADD_MONTHS

作用:返回日期date加上i个月后的日期值

  • 参数i可以是任何数字,大部分时候取正值整数

  • 如果i是小数,将会被截取整数后再参与运算

  • 如果i是负数,则获得的是减去i个月后的日期值

--"ADD_MONTHS"(date, i)
--对给定的日期加上指定的月数,若i为负数则是减去约束
--查看每个员工20岁生日是哪一天
SELECT NAME,ADD_MONTHS(BIRTH, 12*20)FROM EMP;

MONTH_BETWEEN

作用:计算两个日期之间的月,计算方式是使用date1-date2的结果换算的

--"MONTHS_BETWEEN"(date1, date2)计算两个日期之间的月,
--计算方法方式是使用date1-date2的结果换算的
--查看每个员工活了多少个月了?
SELECT NAME,MONTHS_BETWEEN(SYSDATE,BIRTH) FROM EMP;

NEXT_DAY

作用:返回给定日期之后一周内的周几

--"NEXT_DAY"(date, ch)返回给定日期之后一周内的周几
SELECT NEXT_DAY(SYSDATE, 2)FROM dual;

LAST/GREATEST

作用:求最小值与最大值 这组函数的参数限制数量,两个以上即可

--LEAST/GREATEST  求最小值与最大值 这组函数的参数限制数量,两个以上即可
--比较'2008-08-08'与当前的时间,返回小的值
SELECT LEAST(SYSDATE, TO_DATE('2018-08-08', 'YYYY-MM-DD'))FROM DUAL;
SELECT GREATEST(SYSDATE, TO_DATE('2018-08-08', 'YYYY-MM-DD'))FROM DUAL;

--查看82年以后出生的员工,若是82年以前的,则显示为1982-01-01
SELECT NAME,GREATEST(BIRTH,TO_DATE('1982-01-01', 'YYYY-MM-DD')) 
FROM EMP;

EXTRACT

作用:获取指定日期、指定时间分量的值

--"EXTRACT"(time_unit FROM expr) 获取指定日期,指定时间分量的值
SELECT EXTRACT(YEAR FROM SYSDATE)FROM dual;


--查看81年出生的员工的信息
SELECT NAME,BIRTH FROM EMP WHERE EXTRACT(YEAR FROM BIRTH)=1981  ;

空值(NULL)判断

--修改性别不为空的学生信息,将其名字改为;无名氏
--判断一个字段的值是否为空,要使用IS NULL或 IS NOT NULL
update student 
set name='无名氏'
where gender is not NULL; 

--NULL的运算
--NULL与字符串连接等于什么也没有干
--NULL与数字运算结果还是null
--查看每个员工的月收入(薪水+奖金)
select name,salary,COMM,salary+comm from emp;

NVL/NVL2

NVL2可以完全实现NVL的功能,反过来却不可以

--NVL(p1,p2) 若p1为null,函数则返回p2,若p1不为null,函数返回p1本身
--所以该函数的作用是将null值替换为非null
SELECT name,salary,comm, salary+NVL(comm, 0)as WS from EMP;  

--"NVL2"(p1, p2, p3)当p1不为null时,函数返回P2,当p1为null时,函数返回p3
--查看每个员工的奖金情况,若奖金不为空,则显示:“有奖金”,若为空,
--则显示“无奖金”
SELECT name,salary,NVL2(COMM,'有奖金','无奖金')from emp; 
--NVL2可以完全实现nvl的功能,反过来却不行
SELECT name,SALARY,NVL2(comm,salary+comm,salary)as sa FROM EMP;

LIKE 模糊匹配

作用:用于模糊匹配字符串,支持两个通配符,_ 表示单一的一个字符,% 表示任意个字符

--LIKE用于模糊匹配字符串,支持两个通配符,  _ 表示单一的一个字符  %表示任意个字符(0-多个)
--查看员工名字第二个字母是a的员工信息
SELECT * from EMP where name like '_a%';

AND /OR

AND优先级高于OR,可以使用括号来提高优先级

--AND优先级高于OR ,可以通过使用括号来提高优先级
SELECT * from EMP WHERE SALARY>3500 and (job='CLERK' or job='SALE');

IN(LIST)/NOT IN(LIST)

作用:判断是否在列表中或不在列表中 常用在子查询中

--IN(LIST) ,NOT IN(LIST) 判断是否在列表中或不在列表中
--常用在子查询中
--查询职位是CLERK或SALE的员工信息?
SELECT * FROM EMP WHERE JOB IN('CLERK','SALE');

BETWEEN AND

作用:判断在一个范围内

--BETWEEN AND
--判断在一个范围内
--查看员工工资在1500到3000之间的员工信息
SELECT name,salary,job FROM EMP where SALARY BETWEEN 1500 and 3000;

ANY、ALL

作用:结合 > >= < <=列表来使用,
>ALL(LIST):大于列表中最大的(大于所有)
>ANY(LIST):大于其中一个就行

--ANY,ALL
--结合:>  >= < <=列表来使用
-- >ALL(LIST):大于列表中最大的(大于所有)
-- >ANY(LIST):大于其中一个就行
SELECT NAME,SALARY,JOB FROM EMP where SALARY > ANY(3500,4000,5000);

过滤条件中也可以使用函数表达式

SELECT NAME,JOB,SALARY FROM EMP WHERE NAME=LOWER('zhangsan');

SELECT NAME,JOB,SALARY FROM EMP WHERE SALARY * 12 > 90000 ;

SELECT * FROM EMP WHERE BIRTH>TO_DATE('1998-08-08', 'YYYY-MM-DD')
AND SALARY *12 >90000;

DISTINCT

作用:用于去除结果集中指定字段的重复值,只能在SELECT关键字之后,