Oracle第六课
作者:互联网
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,做测试用的表
-
函数
-
单行函数
-
字符函数:ascii(x)
SELECT ASCII('a') FROM dual;
-
拼接字符串:concat('a','b')
SELECT CONCAT('a','b'),'a'||'b' FROM dual;
-
找字符串中某个字符的位置,位置从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; -
返回字符串的长度:length
SELECT LENGTH('aaaa') FROM dual;
-
将字符全转换成小写或大写
-- 将字符全转换成小写,或大写
SELECT LENGTH('aaaa'),LOWER('aBcD'),UPPER('aBcD') FROM dual; -
替换:replace
-- 替换
SELECT REPLACE('abc123','1','a') FROM dual; -
截取字符串:replace
-- 截取字符串
-- 从1开始截取3个
SELECT SUBSTR('abcdef',1,3) FROM dual; -
去掉左边的字符(默认是空格):LTRIM,去掉右边的RTRIM,去掉两边的TRIM
SELECT LTRIM(' abc '),rTRIM(' abc ')
,TRIM(' abc '),TRIM('1' FROM '1111a1b1c11') FROM dual; -
数字函数
-- 取绝对值
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; -
日期函数
-- 当前日期
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; -
应用
-- 工作年限
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 -
转换函数
-- 索引类型如果不一致会失效,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