From 0917c462fbb977d0a876f4cd46c0942b49f9c108 Mon Sep 17 00:00:00 2001 From: xiangwb Date: Fri, 15 Dec 2017 16:53:09 +0800 Subject: [PATCH] sql demo --- .../java/com/xwbing/demo/oracle/day01.sql | 14 +- .../java/com/xwbing/demo/oracle/day02.sql | 60 +++---- .../java/com/xwbing/demo/oracle/day04.sql | 163 +++++++++--------- .../java/com/xwbing/demo/oracle/day05.sql | 116 ++++++------- 4 files changed, 177 insertions(+), 176 deletions(-) diff --git a/boot-service/src/main/java/com/xwbing/demo/oracle/day01.sql b/boot-service/src/main/java/com/xwbing/demo/oracle/day01.sql index d4dde65..32f7d24 100644 --- a/boot-service/src/main/java/com/xwbing/demo/oracle/day01.sql +++ b/boot-service/src/main/java/com/xwbing/demo/oracle/day01.sql @@ -22,7 +22,7 @@ DESC xwbing; RENAME employ_xwbing TO xwbing; DESC xwbing; 修改表的 -向表中添加新的字段,只能在当前表的末尾追加,可以同时追加多个列,只需要使用逗号隔开即可,与创建声明列的时候语法一样 +向表中添加新的字段,只能在当前表的末尾追加,可以同时追加多个列,只需要使用逗号隔开即可,与创建声明列的时候语法一样 ALTER TABLE XWBING ADD( HIREDATE DATE DEFAULT SYSDATE ) @@ -30,14 +30,14 @@ ALTER TABLE XWBING ADD( DML -用于修改表中数据,分为:增 删 改 +用于修改表中数据,分为:增 删 改 插入数据 INSERT INTO XWBING (id,name,job,salary) VALUES(1,'JACK','CLERK',5000) COMMIT -插入日期类型,建议使用TO-DATE函数 +插入日期类型,建议使用TO-DATE函数 可以使用字符串 但是格式必须是'DD-MON-RR' -由于有语言差异,不推荐 +由于有语言差异,不推荐 INSERT INTO XWBING(id,name,job,birth) VALUES(2,'ROSE','CLERK',TO_DATE('1992-08-02','YYYY-MM-DD')) SELECT *FROM XWBING; @@ -45,16 +45,16 @@ SELECT *FROM XWBING; ALTER TABLE XWBING DROP(HIREDATE) 修改表中现有字段 -可以修改字段的类型,长度,默认值,非空 +可以修改字段的类型,长度,默认值,非空 ALTER TABLE XWBING MODIFY( job VARCHAR2(40) DEFAULT 'CLERK' ) 修改表中现有数据 将rose的工资改为5500 -UPDATE XWBING SET SALARY=50000 WHERE name='ROSE' 字符串里区分大小写,用'' +UPDATE XWBING SET SALARY=50000 WHERE name='ROSE' 字符串里区分大小写,用'' -修改表中的数据的时候,通常要使用WHERE下限定条件,这样只会将满足条件的记录进行修改, +修改表中的数据的时候,通常要使用WHERE下限定条件,这样只会将满足条件的记录进行修改, 若不在指定WHERE则是全表所有的数据都修改 删除表中数据 diff --git a/boot-service/src/main/java/com/xwbing/demo/oracle/day02.sql b/boot-service/src/main/java/com/xwbing/demo/oracle/day02.sql index 2aa2ee9..9eb38c1 100644 --- a/boot-service/src/main/java/com/xwbing/demo/oracle/day02.sql +++ b/boot-service/src/main/java/com/xwbing/demo/oracle/day02.sql @@ -10,14 +10,14 @@ SELCET用来确定查询的字段,可以使用的有:表的字段,函数,表达 SELECT中使用表达式 查看每个员工的年薪 -SELECT ename,sal*12 from emp_xwbing; +SELECT ename,sal*12 FROM emp_xwbing; 字符串函数 1:concat(p1,p2) 连接字符串 -select concat(ename,sal) from emp_xwbing; +SELECT concat(ename,sal) FROM emp_xwbing; 2:连接字符串简便方式:||,相当与java里的-+号,拼接作用 -select ename||':'||sal from emp_xwbing; +SELECT ename||':'||sal FROM emp_xwbing; LENGTH(p)函数,获取字符串长度 SELECT ename,LENGTH(ename) FROM emp_xwbing; @@ -38,23 +38,23 @@ SELECT ENAME,rPAD(SAL,5,'$') FROM EMP_XWBING; SUBSTR截取字符串 截取给定字符串,从指定位置开始截取指定个字符,在数据库中,下标都是从1开始的!!! -SELECT SUBSTR('think in java',5,3) from dual; -SELECT SUBSTR('think in java',-4,3) from dual; +SELECT SUBSTR('think in java',5,3) FROM dual; +SELECT SUBSTR('think in java',-4,3) FROM dual; INETR(char1,char2[,n[,m]]) 查找char2在char1中的位置 n为从指定位置开始查找,可以不写, m为第几次出现,可以不写 n,m不写默认都是1 -SELECT INSTR('think in java','in')from dual; -SELECT INSTR('think in java','in',2,2)from dual; +SELECT INSTR('think in java','in')FROM dual; +SELECT INSTR('think in java','in',2,2)FROM dual; SELECT ENAME,SAL,DEPTNO FROM emp_xwbing WHERE LOWER(ENAME)='smith'; -select ename,sal from emp_xwbing where LENGTH(ename)=5; -select ename,sal from emp_xwbing where substr(ename,1,1)='A'; +SELECT ename,sal FROM emp_xwbing WHERE LENGTH(ename)=5; +SELECT ename,sal FROM emp_xwbing WHERE substr(ename,1,1)='A'; 数字函数 @@ -71,11 +71,11 @@ SELECT TRUNC(45.678) FROM DUAL; SELECT TRUNC(45.678,-1) FROM DUAL; MOD(m,n) 取余,返回m除以n后余数,n为0则直接返回m -SELECT ename,sal,mod(sal,1000) from emp_xwbing; +SELECT ename,sal,mod(sal,1000) FROM emp_xwbing; CEIL(N)和 FLOOR(N)向上取整和向下取整 SELECT CEIL(44.5) FROM DUAL; -SELECT FLOOR(44.5)FROM DUAL; +SELECT FLOOR(44.5) FROM DUAL; 日期类型 @@ -85,21 +85,21 @@ TIMESTAMP:时间戳,比DATE多4个字节,可以保存秒以下的精度,前7个 SYSDATE:对应一个内置函数,返回一个表示当前系统时间的DATE类型值 DATE默认只显示'DD-MON-RR' SYSTIMEATAMP:同样的,返回的是表示当前系统时间的时间戳类型的值 -select sysdate from dual; -select systimestamp from dual; +SELECT sysdate FROM dual; +SELECT systimestamp FROM dual; TO_DATE函数 按照给定的日期格式将字符串解析为DATE类型值 -SELECT TO_DATE('1992-9-1 23:22:11','yyyy-mm-dd hh24:mi:ss') from dual; -SELECT TO_DATE('1992年9月1日 23:22:11','yyyy"年"mm"月"dd"日" hh24:mi:ss') from dual; +SELECT TO_DATE('1992-9-1 23:22:11','yyyy-mm-dd hh24:mi:ss') FROM dual; +SELECT TO_DATE('1992年9月1日 23:22:11','yyyy"年"mm"月"dd"日" hh24:mi:ss') FROM dual; DATE是可以比较大小的,越晚的越大 查看82年以后入职的员工? -select ename,hiredate from emp_xwbing where hiredate>to_date('1982-1-1','yyyy-mm-dd'); +SELECT ename,hiredate FROM emp_xwbing WHERE hiredate>to_date('1982-1-1','yyyy-mm-dd'); DATE之间可以做减法,差为相差的天数 -select ename,sysdate-hiredate from emp_xwbing; -select trunc(sysdate-to_date('1990-5-11','yyyy-mm-dd')) from dual; +SELECT ename,sysdate-hiredate FROM emp_xwbing; +SELECT trunc(sysdate-to_date('1990-5-11','yyyy-mm-dd')) FROM dual; DATE可以和一个数字进行加减运算,相当与加减了指定的天数,返回值为对应的日期 7天后是那天? @@ -108,7 +108,7 @@ SELECT SYSDATE+7 FROM DUAL; TO_CHAR 常用于转换日期,可以将日期按照指定的日期格式转换为字符串 SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM DUAL; -SELECT TO_DATE('1992-9-1 23:22:11','RR-mm-dd hh24:mi:ss') from dual; +SELECT TO_DATE('1992-9-1 23:22:11','RR-mm-dd hh24:mi:ss') FROM dual; SELECT TO_CHAR(TO_DATE('99-09-01','RR-MM-DD'),'YYYY-MM-DD') FROM DUAL; LAST_DAY(date) 该函数返回给定日期所在月的最后一天 @@ -131,35 +131,35 @@ SELECT NEXT_DAY(SYSDATE,1) FROM DUAL; LEAST,GREATEST 求最大值和最小值, 这组函数的参数不限数量,两个以上即可 SELECT LEAST(SYSDATE ,TO_DATE('2008-2-2','YYYY-MM-DD')) FROM DUAL; -查看82年以后入职员工的入职日期,若是82年以前的,则显示为:1982-01-01? +查看82年以后入职员工的入职日期,若是82年以前的,则显示为:1982-01-01? SELECT ENAME,GREATEST(HIREDATE,TO_DATE('1982-01-01','YYYY-MM-DD')) FROM EMP_XWBING; -EXTRACT(date from datetime)提取指定日期指定时间分量的值 +EXTRACT(date FROM datetime)提取指定日期指定时间分量的值 SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL; 查看81年入职的员工? SELECT ENAME,HIREDATE FROM EMP_XWBING WHERE EXTRACT(YEAR FROM HIREDATE)=1981; CREATE TABLE STUDENT_XWBING(ID NUMBER(4),NAME CHAR(20),GENDER CHAR(1)); INSERT INTO STUDENT_XWBING VALUES(1000,'李莫愁','f'); -insert into student_xwbing values(1001,'林平之',null); +insert into student_xwbing values(1001,'林平之',NULL); insert into student_xwbing(id,name) values(1002,'张无忌'); -select *from student_xwbing; -update student_xwbing set gender='m' where gender is null; -update student_xwbing set gender=null where gender='m'; +SELECT *FROM student_xwbing; +UPDATE student_xwbing SET gender='m' WHERE gender IS NULL; +UPDATE student_xwbing SET gender=NULL WHERE gender='m'; NULL的运算 -null与字符串连接等于什么都没做 -null与数字运算结果还是null +NULL与字符串连接等于什么都没做 +NULL与数字运算结果还是NULL 查看每个员工的收入? SELECT ENAME,SAL,COMM FROM EMP_XWBING; -NVL(P1,P1) 若p1为null,函数返回p2. 若不为null,函数返回p1自身.所以该函数的作用是将null替代换为非null值 +NVL(P1,P1) 若p1为NULL,函数返回p2. 若不为NULL,函数返回p1自身.所以该函数的作用是将NULL替代换为非NULL值 查看每个员工的收入? SELECT ENAME,SAL,SAL+nvl(BOUNS,0) FROM EMP_XWBING; SELECT ENAME,SAL,IFNULL(BOUNS,0) FROM EMP_XWBING;//MYSQL -NVL2(P1,P2,P3) 若p1不为null值为p2,p1为null值为p3 +NVL2(P1,P2,P3) 若p1不为NULL值为p2,p1为NULL值为p3 查看每个员工的奖金情况? SELECT ENAME,SAL,nvl2(BOUNS,'有奖金','无奖金') FROM EMP_XWBING; -SELECT ENAME,SAL,IF(ISNULL(BOUNS),'无奖金','有奖金') FROM EMP_XWBING;//MYSQL isnull(字段) true返回1 +SELECT ENAME,SAL,IF(ISNULL(BOUNS),'无奖金','有奖金') FROM EMP_XWBING;//MYSQL ISNULL(字段) true返回1 diff --git a/boot-service/src/main/java/com/xwbing/demo/oracle/day04.sql b/boot-service/src/main/java/com/xwbing/demo/oracle/day04.sql index f54d221..b018eb6 100644 --- a/boot-service/src/main/java/com/xwbing/demo/oracle/day04.sql +++ b/boot-service/src/main/java/com/xwbing/demo/oracle/day04.sql @@ -1,113 +1,114 @@ 子查询 -子查询是一条查询语句,其嵌套在其他sql语句中,作用是为外层的sql语句提供数据 +子查询是一条查询语句,其嵌套在其他sql语句中,作用是为外层的sql语句提供数据 -和james相同部门的员工? +和james相同部门的员工? SELECT ename,deptno FROM emp_xwbing WHERE deptno=(SELECT deptno FROM emp_xwbing WHERE ename='JAMES'); -子查询除了常用dql之外,也可以子啊ddl与dml中使用 -在ddl中应用: -使用子查询的结果快速创建一张表,若子查询中查询的内容是函数或表达式,那么该字段必须给别名。 +子查询除了常用dql之外,也可以子啊ddl与dml中使用 +在ddl中应用: +使用子查询的结果快速创建一张表,若子查询中查询的内容是函数或表达式,那么该字段必须给别名. CREATE TABLE myemployee AS -SELECT +SELECT e.empno,e.ename,e.job,e.sal*12 sal, e.deptno,d.dname,d.loc -FROM +FROM emp e,dept d WHERE e.deptno=d.deptno -dml中使用子查询: -删除和james相同部门的所有员工? +dml中使用子查询: +删除和james相同部门的所有员工? DELETE FROM emp_xwbing WHERE deptno=(SELECT deptno FROM emp_xwbing WHERE ename='JAMES'); UPDATE emp_xwbing SET SAL=SAL*1.1 WHERE deptno=(SELECT deptno FROM emp_xwbing WHERE ename='JAMES'); -SELECT *FROM EMP_XWBING; +SELECT * FROM EMP_XWBING; -子查询根据查询结果集不同通常分为: -单行单列:常用在WHERE中(配合=,>,<等) -多行单列:常用在WHERE中(配合IN,ANY,ALL) -多行多列:常用在WHERE中作为表看待 +子查询根据查询结果集不同通常分为: +单行单列:常用在WHERE中(配合 =,>,< 等) +多行单列:常用在WHERE中(配合 IN,ANY,ALL) +多行多列:常用在WHERE中作为表看待 -查看比clerk和salesman部门工资都高的额员工? +查看比clerk和salesman部门工资都高的额员工? SELECT ename,sal FROM emp_xwbing WHERE sal>ALL(SELECT deptno FROM emp_xwbing WHERE job='SALESMAN' OR job='CLERK'); -查看和clerk相同部门的其他职位员工? -SELECT ename FROM emp_xwbing WHERE deptno in (SELECT deptno FROM emp_xwbing WHERE JOB='CLERK'); +查看和clerk相同部门的其他职位员工? +SELECT ename FROM emp_xwbing WHERE deptno in (SELECT deptno FROM emp_xwbing WHERE JOB='CLERK'); EXISTS 关键字 -用在where中,其后要根一个子查询,作用是若子查询至少可以查询出一条记录,那么exisets表达式返回真,NOT EXISTS则起到相反的作用,查不到数据则返回真 -产看有员工的部门? +用在WHERE中,其后要根一个子查询,作用是若子查询至少可以查询出一条记录,那么exisets表达式返回真,NOT EXISTS则起到相反的作用,查不到数据则返回真 +产看有员工的部门? SELECT d.deptno,d.dname,d.loc FROM dept_xwbing d WHERE EXISTS(SELECT *FROM EMP_XWBING e WHERE e.deptno=d.deptno); -没有下属的员工? +没有下属的员工? SELECT n.ENAME FROM EMP_XWBING n WHERE NOT EXISTS(SELECT *FROM EMP_XWBING m WHERE N.EMPNO=M.MGR); -查询列出最低薪水高于部门30的最低薪水的部门的最低薪水? -select min(sal),deptno from emp_xwbing group by deptno having min(sal)>(select min(sal) from emp_xwbing where deptno=30 ); -子查询在from部分: -查看高于自己所在部门平均工资的员工信息? -select e.ename ,e.sal,e.deptno from emp_xwbing e,(select avg(sal) avg_sal,deptno from emp_xwbing group by deptno) t where e.deptno=t.deptno AND E.SAL>T.AVG_SAL; -子查询在select部分:可以认为是外连接的另一种表现 -select e.ename,e.sal,(select d.dname from dept_xwbing d where e.deptno=d.deptno ) dname from emp_xwbing e; +查询列出最低薪水高于部门30的最低薪水的部门的最低薪水? +SELECT min(sal),deptno FROM emp_xwbing GROUP BY deptno having min(sal)>(SELECT min(sal) FROM emp_xwbing WHERE deptno=30 ); + +子查询在FROM部分: +查看高于自己所在部门平均工资的员工信息? +SELECT e.ename ,e.sal,e.deptno FROM emp_xwbing e,(SELECT avg(sal) avg_sal,deptno FROM emp_xwbing GROUP BY deptno) t WHERE e.deptno=t.deptno AND E.SAL>T.AVG_SAL; +子查询在SELECT部分:可以认为是外连接的另一种表现 +SELECT e.ename,e.sal,(SELECT d.dname FROM dept_xwbing d WHERE e.deptno=d.deptno ) dname FROM emp_xwbing e; -分页查询:orcal -通常一个查询语句查询的数据来量过大时,都会使用分页机制。分页就是将数据分批查询出来。一次只查询部分内容,这样的好处可以减少系统响应时间,减少系统资源开销 -分页由于在标准sql语句中没有定义,所以不同的数据库语法不相同(方言) -ORACLE 中使用 ROWNUM 这个伪列来实现分页。 -rownum,该列不存在于数据库任何表中,但是任何表都可以查询该列,该列在结果集中的值是每条记录的行号,行号从1开始。 -编号是在查询的过程中进行的,只要可以从表中查询出一条数据,那么该记录的rownum字段值即为这条记录的行号 -SELECT rownum, ename,job from EMP_XWBING WHERE ROWNUM BETWEEN 2 AND 10 ; -在使用rownum对结果集编号的查询过程中不要使用rownum做>1以上数字的判断,否则查询不到任何数据。先编号再查询。 -select * from(SELECT rownum rn, ename,job from EMP_XWBING) where rn between 6 and 10; +分页查询:oracle +通常一个查询语句查询的数据来量过大时,都会使用分页机制.分页就是将数据分批查询出来.一次只查询部分内容,这样的好处可以减少系统响应时间,减少系统资源开销 +分页由于在标准sql语句中没有定义,所以不同的数据库语法不相同(方言) +ORACLE 中使用 ROWNUM 这个伪列来实现分页. +ROWNUM,该列不存在于数据库任何表中,但是任何表都可以查询该列,该列在结果集中的值是每条记录的行号,行号从1开始. +编号是在查询的过程中进行的,只要可以从表中查询出一条数据,ROWNUM +SELECT rownum, ename,job FROM EMP_XWBING WHERE ROWNUM BETWEEN 2 AND 10 ; +在使用rownum对结果集编号的查询过程中不要使用rownum做>1以上数字的判断,否则查询不到任何数据.先编号再查询. +SELECT * FROM(SELECT rownum rn, ename,job FROM EMP_XWBING) WHERE rn BETWEEN 6 AND 10; -若对查询内容有排序需求时,要先进行排序操作。 -取公司工资排名的6-10? -select * -from(SELECT rownum rn,t.* - from(select ename,sal,job - from emp_xwbing - order by sal desc)t - where rownum<=10) -where rn >5; +若对查询内容有排序需求时,要先进行排序操作. +取公司工资排名的6-10? +SELECT * +FROM(SELECT rownum rn,t.* + FROM(SELECT ename,sal,job + FROM emp_xwbing + ORDER BY sal DESC)t + WHERE rownum<=10) +WHERE rn >5; -换算范围值: -PageSize:每页显示的条数 +换算范围值: +PageSize:每页显示的条数 Page:页数 start=(page-1)*pagesize+1 end=pagesize*page -DECODE(expr,search1,result1,[search2,result2.......][,default]) 无 default 返回 null +DECODE(expr,search1,result1,[search2,result2.......][,default]) 无 default 返回 NULL 可以实现分支效果 SELECT ename,job,sal,DECODE(job,'MANAGER',sal*1.2,'ANALYST',sal*1.1,'SALESMAN',sal*1.05,sal) bonus FROM emp_xwbing; -统计人数,将职位是‘analyst’和‘manager’看作一组,其他职位看作另一组 分别统计两组人数? -select count(*) ,decode(job,'ANALYST','VIP','MANAGER','VIP','HTHER') FROM emp_xwbing GROUP BY decode(job,'ANALYST','VIP','MANAGER','VIP','HTHER'); +统计人数,将职位是'analyst'和'manager'看作一组,其他职位看作另一组 分别统计两组人数? +SELECT count(*) ,decode(job,'ANALYST','VIP','MANAGER','VIP','HTHER') FROM emp_xwbing GROUP BY decode(job,'ANALYST','VIP','MANAGER','VIP','HTHER'); 自定义排序 -select deptno,dname,loc from dept_xwbing order by decode(dname,'OPERATIONS',1,'ACCOUNTING',2,'SALES',3); +SELECT deptno,dname,loc FROM dept_xwbing ORDER BY decode(dname,'OPERATIONS',1,'ACCOUNTING',2,'SALES',3); 排序函数 ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2) -排序函数可以将结果集按照指定的分段分组,然后在组内按照指定的分段排序,并为组内每条记录生成一个编号 +排序函数可以将结果集按照指定的分段分组,然后在组内按照指定的分段排序,并为组内每条记录生成一个编号 ROW_NUMBER:组内连续且唯一的数字 -公司每个部门的工资排名? -select ename,sal,deptno,row_number() over(partition by deptno order by sal desc) rank from emp_xwbing; +公司每个部门的工资排名? +SELECT ename,sal,deptno,row_number() over(partition BY deptno ORDER BY sal DESC) rank FROM emp_xwbing; RANK:组内不连续不唯一数字 RANK() OVER(PARTITION BY col1 ORDER BY col2) -select ename,sal,deptno,rank() over(partition by deptno order by sal desc) rank from emp_xwbing; +SELECT ename,sal,deptno,rank() over(partition BY deptno ORDER BY sal DESC) rank FROM emp_xwbing; DENSE_RANK:组内连续但不唯一数字 -select ename,sal,deptno,dense_rank() over(partition by deptno order by sal desc) rank from emp_xwbing; +SELECT ename,sal,deptno,dense_rank() over(partition BY deptno ORDER BY sal DESC) rank FROM emp_xwbing; -create table sales_xwbing(year_id number not null,month_id number not null,day_id number not null,sales_value number(10,2) not null); +create table sales_xwbing(year_id number NOT NULL,month_id number NOT NULL,day_id number NOT NULL,sales_value number(10,2) NOT NULL); insert into sales_xwbing -select trunc(dbms_random.value(2010,2012))as year_id, - trunc(dbms_random.value(1,13))as month_id, - trunc(dbms_random.value(1,32))as day_id, - round(dbms_random.value(1,100),2)as sales_value -from dual -connect by level <=1000; +SELECT trunc(dbms_rANDom.value(2010,2012))as year_id, + trunc(dbms_rANDom.value(1,13))as month_id, + trunc(dbms_rANDom.value(1,32))as day_id, + round(dbms_rANDom.value(1,100),2)as sales_value +FROM dual +connect BY level <=1000; @@ -115,28 +116,28 @@ connect by level <=1000; union,union all,intersect,minus union:并集 -select ename ,job,sal from emp_xwbing where job='MANAGER' -UNION -select ename,job,sal from emp_xwbing where sal>2500; +SELECT ename ,job,sal FROM emp_xwbing WHERE job='MANAGER' +UNION +SELECT ename,job,sal FROM emp_xwbing WHERE sal>2500; intersect:交集 -select ename ,job,sal from emp_xwbing where job='MANAGER' -intersect -select ename,job,sal from emp_xwbing where sal>2500; +SELECT ename ,job,sal FROM emp_xwbing WHERE job='MANAGER' +intersect +SELECT ename,job,sal FROM emp_xwbing WHERE sal>2500; minus:差集 -select ename ,job,sal from emp_xwbing where job='MANAGER' +SELECT ename ,job,sal FROM emp_xwbing WHERE job='MANAGER' minus -select ename,job,sal from emp_xwbing where sal>2500; +SELECT ename,job,sal FROM emp_xwbing WHERE sal>2500; -查看每天的营业额? -select year_id,month_id,day_id,sum(sales_value) from sales_xwbing group by year_id,month_id,day_id order by year_id,month_id,day_id; +查看每天的营业额? +SELECT year_id,month_id,day_id,sum(sales_value) FROM sales_xwbing GROUP BY year_id,month_id,day_id ORDER BY year_id,month_id,day_id; 高级分组函数 ROLLUP函数 -rollup分组次数有指定的参数据决定,次数为参加个数+1次,而且分组原则是每个参数递减的形式,然后将这些分组的结果并在一个结果集中显示 -group BY ROLLUP(a,b,c...) +rollup分组次数有指定的参数据决定,次数为参加个数+1次,而且分组原则是每个参数递减的形式,然后将这些分组的结果并在一个结果集中显示 +GROUP BY ROLLUP(a,b,c...) GROUP BY ROLLUP(a,b,c) 等同于 @@ -147,16 +148,16 @@ union all GROUP BY a -查看每天,每月,每年,和总营业额? -select year_id,month_id,day_id,sum(sales_value) from sales_xwbing group by rollup(year_id,month_id,day_id); +查看每天,每月,每年,和总营业额? +SELECT year_id,month_id,day_id,sum(sales_value) FROM sales_xwbing GROUP BY rollup(year_id,month_id,day_id); CUBE 函数 -CUBE 分组次数是n个参数的2的n次方,会将每种组合进行一次分组并将所有结果并在一个结果集中显示 -select year_id,month_id,day_id,sum(sales_value) from sales_xwbing group by cube(year_id,month_id,day_id) order by year_id,month_id,day_id; +CUBE 分组次数是n个参数的2的n次方,会将每种组合进行一次分组并将所有结果并在一个结果集中显示 +SELECT year_id,month_id,day_id,sum(sales_value) FROM sales_xwbing GROUP BY cube(year_id,month_id,day_id) ORDER BY year_id,month_id,day_id; GROUPING SETS() -该分组函数允许按照指定的分组方式进行分组,然后将这些分组统计的结果并在一个结果集中显示函数的每一个参数,就是一种分组方式。 -select year_id,month_id,day_id,sum(sales_value) from sales_xwbing group by grouping sets((year_id,month_id,day_id),(year_id,month_id)) order by year_id,month_id,day_id; +该分组函数允许按照指定的分组方式进行分组,然后将这些分组统计的结果并在一个结果集中显示函数的每一个参数,就是一种分组方式. +SELECT year_id,month_id,day_id,sum(sales_value) FROM sales_xwbing GROUP BY GROUPing sets((year_id,month_id,day_id),(year_id,month_id)) ORDER BY year_id,month_id,day_id; diff --git a/boot-service/src/main/java/com/xwbing/demo/oracle/day05.sql b/boot-service/src/main/java/com/xwbing/demo/oracle/day05.sql index d99e619..75a6dcf 100644 --- a/boot-service/src/main/java/com/xwbing/demo/oracle/day05.sql +++ b/boot-service/src/main/java/com/xwbing/demo/oracle/day05.sql @@ -1,76 +1,76 @@ CREATE OR REPLACE VIEW V_EMP_10_XWBING AS SELECT empno id,ename,sal*12 salary ,deptno FROM EMP_XWBING WHERE deptno=10 WITH READ ONLY; CREATE OR REPLACE VIEW V_EMP_10_XWBING AS SELECT empno id,ename,sal*12 salary ,deptno FROM EMP_XWBING WHERE deptno=10 WITH CHECK OPTION; -视图: +视图: 数据库对象之一 -在sql语句中体现的角色与表相同。但视图是虚表,它只是对应一条select语句查询的结果集,使用视图可以重用子查询,简化复杂查询 -创建包含10号部门员工信息的视图? +在sql语句中体现的角色与表相同.但视图是虚表,它只是对应一条SELECT语句查询的结果集,使用视图可以重用子查询,简化复杂查询 +创建包含10号部门员工信息的视图? CREATE VIEW V_EMP_10_XWBING AS SELECT empno,ename,sal,deptno FROM EMP_XWBING WHERE deptno=10; SELECT * FROM V_EMP_10_XWBING; -select *from emp_xwbing; +SELECT * FROM emp_xwbing; -视图对应的子查询字段可以用别名,若字段含有函数或表达式,必须用别名 +视图对应的子查询字段可以用别名,若字段含有函数或表达式,必须用别名 CREATE OR REPLACE VIEW V_EMP_10_XWBING AS SELECT empno ID,ename,sal*12 salary ,deptno FROM EMP_XWBING WHERE deptno=10; 对视图进行DML操作 对视图进行DML操作就是对视图数据来源的基础表进行的 -只能对简单视图进行DML操作,复杂视图不允许使用DML操作 -对简单视图进行DML操作时,也不不能违背基础表的约束条件 +只能对简单视图进行DML操作,复杂视图不允许使用DML操作 +对简单视图进行DML操作时,也不不能违背基础表的约束条件 INSERT INTO V_EMP_10_XWBING(EMPNO,ENAME,SALARY,DEPTNO) VALUES(1001,'jack',5000,10); -当通过视图插入一条视图本身不可见的数据时,就是对基表的污染 -插入和删除都会造成污染,但是删除不会。 +当通过视图插入一条视图本身不可见的数据时,就是对基表的污染 +插入和删除都会造成污染,但是删除不会. INSERT INTO V_EMP_10_XWBING VALUES(1001,'javk',5000,20); -update v_emp_10_xwbing set deptno=20; +UPDATE v_emp_10_xwbing SET deptno=20; 对视图添加检查选项 WITH CHECK OPTION -当视图添加了检查选项后,那么对视图进行插入或修改操作时,视图要求: -插入时:插入的数据视图必须对其可见 -修改时:修改后视图必须对数据可见 +当视图添加了检查选项后,那么对视图进行插入或修改操作时,视图要求: +插入时:插入的数据视图必须对其可见 +修改时:修改后视图必须对数据可见 CREATE OR REPLACE VIEW V_EMP_10_XWBING AS SELECT empno id,ename,sal salary ,deptno FROM EMP_XWBING WHERE deptno=10 WITH CHECK OPTION; 为视图添加只读选项 WITH READ ONLY -当一个视图添加类只读选项后, 该视图不允许进行DML操作 +当一个视图添加类只读选项后, 该视图不允许进行DML操作 CREATE OR REPLACE VIEW V_EMP_10_XWBING AS SELECT empno id,ename,sal salary ,deptno FROM EMP_XWBING WHERE deptno=10 WITH READ ONLY ; -数据字典:user_objects user_views user_tables +数据字典:user_objects user_views user_TABLEs SELECT OBJECT_NAME FROM user_objects; SELECT text FROM user_views; -SELECT table_name FROM user_tables; +SELECT TABLE_name FROM user_TABLEs; 复杂视图 -查询语句含有函数,表达式,分组,去重多表关联查询,复杂视图不能进行DML -创建一个各部门工资情况的视图? -create OR REPLACE view v_emp_deptno_xwbing as select d.deptno,d.dname,min(e.sal) min_sal,max(e.sal) max_sal,avg(e.sal) avg_sal,sum(e.sal) sum_sal from emp_xwbing e,dept_xwbing d where d.deptno=e.deptno group by d.deptno,d.dname; -select *from v_emp_deptno_xwbing; -select e.ename,e.sal,e.deptno from emp_xwbing e,v_emp_deptno_xwbing v where e.deptno=v.deptno and e.sal>v.avg_sal; +查询语句含有函数,表达式,分组,去重多表关联查询,复杂视图不能进行DML +创建一个各部门工资情况的视图? +CREATE OR REPLACE view v_emp_deptno_xwbing AS SELECT d.deptno,d.dname,min(e.sal) min_sal,max(e.sal) max_sal,avg(e.sal) avg_sal,sum(e.sal) sum_sal FROM emp_xwbing e,dept_xwbing d WHERE d.deptno=e.deptno group BY d.deptno,d.dname; +SELECT *FROM v_emp_deptno_xwbing; +SELECT e.ename,e.sal,e.deptno FROM emp_xwbing e,v_emp_deptno_xwbing v WHERE e.deptno=v.deptno AND e.sal>v.avg_sal; 删除视图 -DROP VIEW V_name; -删除视图中的数据会将对应的基表数据删除,但是删除视图本身并不会对基表数据产生任何影响 +DROP VIEW V_name; +删除视图中的数据会将对应的基表数据删除,但是删除视图本身并不会对基表数据产生任何影响 DROP VIEW V_EMP_10_XWBING; 序列 序列也是数据库对象之一 -序列是用来生成一系列数字的,序列通常为表的主键提供值使用 -CREATE SEQUENCE seq_emp_xwbing start with 1 increment by 1; +序列是用来生成一系列数字的,序列通常为表的主键提供值使用 +CREATE SEQUENCE seq_emp_xwbing start WITH 1 increment BY 1; 序列支持两个伪列 -NEXTVAL:使序列生成下一个数字,新创建的序列则返回 START WITH 指定的数字。序列是不能回退的,所以通过NEXTVAL获取了下一个数字后就无法获取之前生成的数字了 -CURRVAL:获取序列生成的最后一个数字,无论调用多少次都不会导致序列生成新的数字,但是新创建的序列至少调用一次NEXTVAL后才可以开始使用CURRVAL -select seq_emp_xwbing.nextval from dual; -select seq_emp_xwbing.currval from dual; +NEXTVAL:使序列生成下一个数字,新创建的序列则返回 START WITH 指定的数字.序列是不能回退的,所以通过NEXTVAL获取了下一个数字后就无法获取之前生成的数字了 +CURRVAL:获取序列生成的最后一个数字,无论调用多少次都不会导致序列生成新的数字,但是新创建的序列至少调用一次NEXTVAL后才可以开始使用CURRVAL +SELECT seq_emp_xwbing.nextval FROM dual; +SELECT seq_emp_xwbing.currval FROM dual; -insert into emp_xwbing(empno,ename,job,sal) values(seq_emp_xwbing.nextval,'jack','clerk',5000); -select *from emp_xwbing; +INSERT INTO emp_xwbing(empno,ename,job,sal) VALUES(seq_emp_xwbing.nextval,'jack','clerk',5000); +SELECT *FROM emp_xwbing; desc emp_xwbing; -create table wwww(id varchar2); -insert into www(id) values(SYS_GUID()); -select *from www; +CREATE TABLE wwww(id varchar2); +INSERT INTO www(id) VALUES(SYS_GUID()); +SELECT * FROM www; UUID -字符串类型的主键值,32位不重复字符串 +字符串类型的主键值,32位不重复字符串 ORACLE提供了一个函数可以生成UUID SELECT SYS_GUID() FROM DUAL; @@ -99,24 +99,24 @@ DROP INDEX IDX_EMP; 约束 CONSTRAINT -约束条件: -非空约束(Not Null),简称NN -唯一性约束(Unique),简称UK -主键约束(Primary Key),简称PK -外键约束(Foreign Key),简称FK -检查约束(Check),简称CK +约束条件: +非空约束(Not Null),简称NN +唯一性约束(Unique),简称UK +主键约束(Primary Key),简称PK +外键约束(Foreign Key),简称FK +检查约束(Check),简称CK -非空约束:not null +非空约束:not null 建表时添加非空约束 -create table employy_xwbing(eid number(6),name varchar2(30) not null, salary number(7,2),hiredate date constraint employy_xwbing_hiredate_nn not null); +CREATE TABLE employy_xwbing(eid number(6),name varchar2(30) not null, salary number(7,2),hiredate date constraint employy_xwbing_hiredate_nn not null); 修改表添加非空约束 -alter table employy_xwbing modify(eid number(6) not null); +alter TABLE employy_xwbing modify(eid number(6) not null); 修改表取消非空约束 -alter table employy_xwbing modify(eid number(6) null); +alter TABLE employy_xwbing modify(eid number(6) null); 唯一性约束: UNIQUE -当某个字段使用了唯一性约束后,该字段的值或者字段的组合在表中是不允许有重复值的,但是null除外 +当某个字段使用了唯一性约束后,该字段的值或者字段的组合在表中是不允许有重复值的,但是null除外 CREATE TABLE xxx_xwbing ( eid NUMBER(6), name VARCHAR2(30), @@ -126,15 +126,15 @@ hiredate DATE, CONSTRAINT empl_xwbing_email_uk UNIQUE(email) ); -insert into empl_xwbing(eid,name,email) values(21,'21','4'); +INSERT INTO empl_xwbing(eid,name,email) VALUES(21,'21','4'); -建表之后添加唯一性约束: -alter table empl_xwbing add constraint empl_xwbing_name_uk unique(name); +建表之后添加唯一性约束: +alter TABLE empl_xwbing add constraint empl_xwbing_name_uk unique(name); 主键约束 Primary Key -主键可以用来在表中唯一的确定一行数据。一个表上只允许建立一个主键. +主键可以用来在表中唯一的确定一行数据.一个表上只允许建立一个主键. CREATE TABLE emploo_xwbing ( @@ -145,21 +145,21 @@ alter table empl_xwbing add constraint empl_xwbing_name_uk unique(name); hiredate DATE ); -insert into emploo_xwbing(eid,name) values(2,'jack'); +INSERT INTO emploo_xwbing(eid,name) VALUES(2,'jack'); -外键约束:一般不用 +外键约束:一般不用 检查约束(Check) -检查(Check)约束条件用来强制在字段上的每个值都要满足Check中定义的条件。当定义了Check约束的列新增或修改数据时,数据必须符合Check约束中定义的条件。 +检查(Check)约束条件用来强制在字段上的每个值都要满足Check中定义的条件.当定义了Check约束的列新增或修改数据时,数据必须符合Check约束中定义的条件. 员工薪水必须大于2000? -alter table emploo_xwbing add constraint emploo_xwbing_slary_ck check(salary>2000); -正常插入数据? -insert into emploo_xwbing(eid,name,salary,email) values(11,'jack',3000,'www'); +alter TABLE emploo_xwbing add constraint emploo_xwbing_slary_ck check(salary>2000); +正常插入数据? +INSERT INTO emploo_xwbing(eid,name,salary,email) VALUES(11,'jack',3000,'www'); 试图插入小于2000的? -insert into emploo_xwbing(eid,name,salary,email) values(13,'jene',1111,'www'); -select *from emploo_xwbing; +INSERT INTO emploo_xwbing(eid,name,salary,email) VALUES(13,'jene',1111,'www'); +SELECT * FROM emploo_xwbing;