From 39a94340ee858b7f34657ed8248cb2cf7b324742 Mon Sep 17 00:00:00 2001 From: xiangwb Date: Fri, 15 Dec 2017 18:12:41 +0800 Subject: [PATCH] sql demo --- .../java/com/xwbing/demo/oracle/day02.sql | 11 ++-- .../java/com/xwbing/demo/oracle/day03.sql | 58 +++++++++---------- .../java/com/xwbing/demo/oracle/day04.sql | 6 +- .../java/com/xwbing/demo/oracle/day05.sql | 2 +- 4 files changed, 38 insertions(+), 39 deletions(-) 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 9eb38c1..7e38294 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 @@ -36,7 +36,7 @@ LPAD,RPAD补位函数,若补位小于原长度,一律从左往右截 要求显示指定内容指定位数,若不足则补充若干指定字符以达到要显示的长度 SELECT ENAME,rPAD(SAL,5,'$') FROM EMP_XWBING; -SUBSTR截取字符串 +SUBSTR 截取字符串 截取给定字符串,从指定位置开始截取指定个字符,在数据库中,下标都是从1开始的!!! SELECT SUBSTR('think in java',5,3) FROM dual; SELECT SUBSTR('think in java',-4,3) FROM dual; @@ -54,7 +54,7 @@ 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 SUBSTR(ename,1,1)='A'; 数字函数 @@ -143,7 +143,7 @@ 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(id,name) values(1002,'张无忌'); -SELECT *FROM student_xwbing; +SELECT * FROM student_xwbing; UPDATE student_xwbing SET gender='m' WHERE gender IS NULL; UPDATE student_xwbing SET gender=NULL WHERE gender='m'; @@ -157,9 +157,10 @@ SELECT ENAME,SAL,COMM FROM EMP_XWBING; 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 +SELECT ENAME,SAL,SAL+IFNULL(BOUNS,0) FROM EMP_XWBING;//MYSQL NVL2(P1,P2,P3) 若p1不为NULL值为p2,p1为NULL值为p3 查看每个员工的奖金情况? -SELECT ENAME,SAL,nvl2(BOUNS,'有奖金','无奖金') FROM EMP_XWBING; +SELECT ENAME,SAL,NVL2(BOUNS,'有奖金','无奖金') FROM EMP_XWBING; +IF(ISNULL(p1),p2,p3) 若p1为null 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/day03.sql b/boot-service/src/main/java/com/xwbing/demo/oracle/day03.sql index 23a3ca2..df1cb24 100644 --- a/boot-service/src/main/java/com/xwbing/demo/oracle/day03.sql +++ b/boot-service/src/main/java/com/xwbing/demo/oracle/day03.sql @@ -1,6 +1,6 @@ SELECT 子句中 可以对字段加别名,别名前加空格或as,若希望别名区分大小写或者包含空格,可以使用双引号将别名括起来 -SELECT ENAME,SAL*12 SAL FROM EMP_XWBING; -SELECT ename,sal*12 AS "s al" FROM emp_xwbing; +SELECT ENAME,SAL*12 SAL FROM EMP_XWBING; +SELECT ename,sal*12 AS "S al" FROM emp_xwbing; 查询条件: <>不等于 @@ -8,7 +8,7 @@ SELECT ename,sal FROM emp_xwbing WHERE sal<2000; SELECT * FROM emp_xwbing WHERE deptno<>10; SELECT * FROM emp_xwbing WHERE hiredate1000 AND job='CLERK'; SELECT * FROM emp_xwbing WHERE sal>1000 OR job='CLERK'; SELECT * FROM emp_xwbing WHERE sal>1000 AND (job='CLERK' OR JOB='SALESMAN'); @@ -24,16 +24,16 @@ IN(list), NOT IN(list) 判断是否在列表中,常用在子查询中 SELECT * FROM EMP_XWBING WHERE JOB IN('CLERK','SALESMAN'); -BETWEEN...AND...之间 +BETWEEN AND 之间 SELECT sal FROM emp_xwbing WHERE sal BETWEEN 1500 AND 3000; -IS NULL ,IS NOT NULL - -ANY,ALL 需要配合> >= < <= 一个列表使用,常用于判断子查询的结果 -SELECT * FROM emp_xwbing WHERE sal>all(2800,3000,1800); - +IS NULL,IS NOT NULL SELECT * FROM emp_xwbing WHERE comm IS NOT NULL AND sal>1300; -SELECT * FROM emp_xwbing WHERE hiredate>to_date('1981-1-1','yyyy-mm-dd') AND sal*12>30000; + +ANY,ALL 需要配合> >= < <= 一个列表使用,常用于判断子查询的结果 +SELECT * FROM emp_xwbing WHERE sal>ALL(2800,3000,1800); + + DISTINCT 过滤重复,必须跟在SELECT后面.可以对多列去重,去重原则是这些列的组合没有重复 SELECT DISTINCT job FROM emp_xwbing; @@ -51,49 +51,47 @@ DESC:降序 SELECT ename ,sal FROM emp_xwbing ORDER BY sal; SELECT ename ,sal,deptno FROM emp_xwbing ORDER BY deptno,sal DESC; SELECT ename FROM emp_xwbing ORDER BY ename; -ORDER BY field(字段,'','');//mysql +SELECT * FROM emp_xwbing ORDER BY field(字段,'','');//mysql 聚合函数又称多行函数:用来统计结果的 -max,min 统计最大值,最小值 +MAX,MIN 统计最大值,最小值 查看最高工资? -SELECT max(sal),min(sal) FROM emp_xwbing; +SELECT MAX(sal),MIN(sal) FROM emp_xwbing; -avg,sum 统计平均值与总和 +AVG,SUM 统计平均值与总和 查看平均工资和工资总和 -SELECT trunc(avg(sal)) avg,sum(sal) sum FROM emp_xwbing; +SELECT trunc(AVG(sal)) avg,SUM(sal) sum FROM emp_xwbing; -count 统计的是记录条数,而不关注具体该字段的取值, +COUNT 统计的是记录条数,而不关注具体该字段的取值, +统计表中记录数,常使用 COUNT(*) 查看公司员工人数? -SELECT count(ename) FROM emp_xwbing; -统计表中记录数,常使用couont (*) -SELECT count(*) FROM emp_xwbing; +SELECT COUNT (*) FROM emp_xwbing; 所有聚合函数忽略NULL值 -SELECT avg(nvl(comm,0)),sum(comm) FROM emp_xwbing; +SELECT AVG(nvl(comm,0)),SUM(comm) FROM emp_xwbing; 分组: GROUP BY 子句 -GROUP BY 子句允许将结果集按照给定的字段值相同的额记录看作一组,然后配合聚合函数对每组记录进行统计 +GROUP BY 子句允许将结果集按照给定的字段值相同的记录看作一组,然后配合聚合函数对每组记录进行统计 查看每个部门的最高工资? -SELECT deptno FROM emp_xwbing GROUP BY deptno; -当SELECT中含有聚合函数时,凡不在聚合函数中的单独字段都必须出现在GROUP BY子句中 +SELECT MAX (sal),deptno FROM emp_xwbing GROUP BY deptno; +当SELECT中含有聚合函数时,凡不在聚合函数中的单独字段都必须出现在 GROUP BY 子句中 查看每个职位的平均工资和工资总和? -SELECT avg(sal), sum(sal) FROM emp_xwbing GROUP BY job; +SELECT AVG(sal), SUM(sal) FROM emp_xwbing GROUP BY job; 查看每个部门各有多少人? -SELECT count(ename),deptno FROM emp_xwbing GROUP BY deptno; +SELECT COUNT(*),deptno FROM emp_xwbing GROUP BY deptno; 查看每个部门的平均工资,前提是该部门平均工资高于2000? -SELECT avg(sal),deptno FROM emp_xwbing WHERE avg(sal)>2000 GROUP BY deptno; WHERE中不允许使用聚合函数作为过滤条件,原因在于过滤时机不同.WHERE的过滤时机是在第一次从表中检索数据是添加过滤条件,用来确定那些数据可以被查出来,以确定结果集 -HAVING子句:having必须跟在 GROUP BY 子句之后,可以使用聚合函数作为过滤条件.使之可以对分组进行过滤,将满足条件的分组保留,不满足的去掉 -SELECT avg(sal),deptno FROM emp_xwbing GROUP BY deptno having avg(sal)>2000; +HAVING子句:HAVING必须跟在 GROUP BY 子句之后,可以使用聚合函数作为过滤条件.使之可以对分组进行过滤,将满足条件的分组保留,不满足的去掉 +SELECT AVG(sal),deptno FROM emp_xwbing GROUP BY deptno HAVING AVG(sal)>2000; @@ -114,7 +112,7 @@ SELECT e.ename,e.deptno,d.dname FROM emp_xwbing e,dept_xwbing d WHERE e.deptno=d SELECT e.ename,d.dname FROM emp_xwbing e,dept_xwbing d WHERE e.deptno=d.deptno AND d.loc='NEW YORK'; 查看平均工资高于2000的部门所在地? -SELECT avg(e.sal), d.loc ,d.dname FROM emp_xwbing e,dept_xwbing d WHERE e.deptno=d.deptno GROUP BY d.dname,d.loc having avg(e.sal)>2000; +SELECT AVG(e.sal), d.loc ,d.dname FROM emp_xwbing e,dept_xwbing d WHERE e.deptno=d.deptno GROUP BY d.dname,d.loc HAVING AVG(e.sal)>2000; 内连接:关联查询的另一种写法 查看sales部门员工信息? @@ -136,7 +134,7 @@ SELECT E.ENAME ,M.ENAME BOSS FROM EMP_XWBING E,EMP_XWBING M WHERE E.MGR=M.EMPN JONES的手下? SELECT E.ENAME FROM EMP_XWBING E,EMP_XWBING M WHERE E.MGR=M.EMPNO(+) AND m.ename='JONES'; 查看每个领导有几个手下? -SELECT count(e.mgr),m.ename FROM EMP_XWBING E,EMP_XWBING M WHERE E.MGR=M.EMPNO GROUP BY m.ename; +SELECT COUNT(e.mgr),m.ename FROM EMP_XWBING E,EMP_XWBING M WHERE E.MGR=M.EMPNO GROUP BY m.ename; 查看JONES的上司在哪个城市? SELECT d.loc FROM EMP_XWBING E,EMP_XWBING M , dept_xwbing d WHERE E.MGR=M.EMPNO AND m.deptno=d.deptno AND e.ename='JONES' ; 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 b018eb6..e348288 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 @@ -29,20 +29,20 @@ SELECT * FROM EMP_XWBING; 多行单列:常用在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'); 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 ); +SELECT min(sal),deptno FROM emp_xwbing GROUP BY deptno having min(sal)>(SELECT min(sal) FROM emp_xwbing WHERE deptno=30); 子查询在FROM部分: 查看高于自己所在部门平均工资的员工信息? 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 75a6dcf..1dc0874 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,4 +1,4 @@ - 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 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; 视图: 数据库对象之一