赞
踩
需要注意的是:
- FROM 才是 SQL 语句执行的第一步,并非 SELECT 。
- SELETC 是在WHERE语句执行之后执行的,所以不能再WHERE语句后使用SELECT中设置的别名
- WHERE是对分组前进行的过滤,HAVING是对分组后进行过滤。
与--and 或--or 非--not 注意的是 :and 优先级高于 or A and B or C and D 最后执行or
select sal*12 as "年薪" from 表名 t ; sa "年薪" 给 列设置别名 , t 是给表设置别名
select * from emp where comm is null (is not null)
%(通配符)表示任意长度的字符 ,_ 表示一个字符。 例如以S开头的 任意结束 (S%)
select 字段名 from 表名 where 字段名 like '%s%' ;
通过性别不同分组查数据:
select sex, avg(age) as 平均年龄 from user group by sex;
注意:
- 使用分组后select 后面只能写分组条件(group by后面的值)或者组函数
- 分组函数 count min max avg sum
- 要筛选结果 可以先使用where 再用group by 或者先用group by 再用having
- group by 执行过程如下:
1)数字函数
- --四舍五入 ROUND(input[,n]) n表示小数位如果n被忽略则无小数位
- SELECT ROUND(12.111) FROM dual;
- SELECT ROUND(12.111,1) FROM dual;
- SELECT ROUND(12.164,1) FROM dual;
- --截取数字 TRUNC (input[,n]) 将数字值截取,n代表截取的小数位,如果n被忽略则默认0
- SELECT TRUNC(12.113) FROM dual;
- SELECT TRUNC(12.113,2) FROM dual;
- --返回m除于n的余数 MOD(m,n)
- SELECT MOD(3,2) FROM dual
2)字符函数
- select * from emp;
- --转换为大写
- SELECT UPPER(e.ename) FROM emp e;
- --转换为小写
- SELECT LOWER(e.ename) FROM emp e;
- --首字母转换为大写
- SELECT INITCAP(ename) FROM emp
- --连接第一个字符到第二个字符等价于“||”
- SELECT CONCAT(ename,empno) EMPINFO FROM emp
- SELECT ename ||' ' || empno EMPINFO FROM emp
- --获取字符串中指定的字符,SUBSTR(input,m,[n]) 从m位置开始,取n个字符长度,如果n被忽略,则取到字符串结尾处
- SELECT SUBSTR(ename,1,3) FROM emp
- SELECT SUBSTR(ename,1) FROM emp
- --返回字符串的字符数
- SELECT ename,LENGTH(ename) as "str_length" FROM emp
- --返回字符值中查找字符串char的数字位置,m作为查找的开始,n代表第n次发现,m,n默认值为1,及默认是从开始位置查找,报告第一个查询到的位置INSTR(input,char[,m][.n])
- SELECT ename,INSTR(ename,'A') as "第一次出现a的位置" FROM (SELECT UPPER(ename) as ename FROM emp )
- --从字符串中查找字符char1,找到则替换为char2
- SELECT REPLACE(ename,'A','哈哈') FROM emp
- --左补全函数
- SELECT LPAD('EMPNO',12,'*') FROM emp
- --右补全函数
- SELECT RPAD('EMPNO',12,'*')FROM emp
3)日期函数
- /*
- ORACLE默认的日期格式是DD-MON-RR 如 17-JUN-13 PL/SQL格式为YYYY/MM/DD 如 2013/6/17
- 1-12月 JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
- 周一到周日 SUNDAY MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY
- */
- --返回俩个日期之间的月数,返回的是数值型
- SELECT MONTHS_BETWEEN('17-JUN-13','21-JAN-11') FROM dual;
- SELECT MONTHS_BETWEEN('17-APR-2013','21-JUN-2011') FROM dual;
- --1.查看当前时间(SQL Server 使用 GETDATE()方法)
- SELECT SYSDATE FROM dual;
- --2.计算在指定日期之后的下一个周char指定天的日期,char可以是一个表示星期的数或字符串
- SELECT NEXT_DAY(SYSDATE,'MONDAY') FROM dual;
- SELECT NEXT_DAY(SYSDATE,2) FROM dual;
- --3.添加n个日历月后的日期
- SELECT ADD_MONTHS('17-JUN-13',3) FROM dual;
- --4.计算包含指定日期所在月的最后一天日期
- SELECT LAST_DAY('17-JUN-13') FROM dual;
- --5.四舍五入日期 日期1日到15日结果在当前月的第一天,16到31为下一月的最后一天 1月到6月为当年,7到12为下一年1月1日
- SELECT ROUND(SYSDATE) FROM dual;
- SELECT ROUND(SYSDATE,'MONTH') FROM dual;
- SELECT ROUND(SYSDATE,'YEAR') FROM dual;
- --6.截取日期
- SELECT TRUNC(SYSDATE) FROM dual;
- SELECT TRUNC(SYSDATE,'MONTH') FROM dual;
- SELECT TRUNC(SYSDATE,'YEAR') FROM dual;
- --7.查看雇员表中 员工编号为7876的员工截止至今工作了多少个周
- SELECT e.empno ||' '||e.ename as "EmployeeInfo", ROUND((sysdate-e.hiredate)/7) as "workWeeks" FROM
- emp e where e.empno='7876';
- --8查询受雇日期在1981年1月1日到1982年1月1日的雇员,要查的信息包括雇员编号,已经雇佣的月数,三个月试用期结束的日期,
- --提交入职资料的日期(雇佣日下一周周一),首月结算薪资日期(受雇月最后一天)
-
- SELECT empno as "员工编号",MONTHS_BETWEEN(SYSDATE,e.hiredate) as 已雇月数,ADD_MONTHS(e.hiredate,3) as 试用期结束,
- NEXT_DAY(e.hiredate,'MONDAY') as 提交入职资料,LAST_DAY(e.hiredate) as 结算薪资 FROM emp e;
4)转换函数
- /*
- 在ORACLE中对于直接赋值,ORACLE能自动将VARCHAR2或CHAR转换为NUMBER或者DATE类型,也能将NUMBER和DATE自动转换为VAARCHAR2类型
- */
- --日期转换为CHAR TO_CHAR(date[,'fmt']) 格式模板必须放在单引号里,并且大小写敏感
- SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD,HH24-MI-SS') FROM dual;
- SELECT TO_CHAR(SYSDATE,'fmYYYY/MM/DD,HH24-MI-SS') FROM dual;--fm删除填补的空或者前导的0
- SELECT TO_CHAR(SYSDATE,'Y,YYY/MM/DD,HH24-MI-SS') FROM dual;
- SELECT TO_CHAR(SYSDATE,'YY/MM/DD,Q,HH24-MI-SS') FROM dual;
- SELECT TO_CHAR(SYSDATE,'YEAR/MM/DD,HH24-MI-SS') FROM dual;
-
- --数字使用TO_CHAR
- SELECT TO_CHAR(1234,'$999999') FROM dual;--前面有两个空格 $1234
- SELECT TO_CHAR(1234,'L999999') FROM dual; --
- SELECT TO_CHAR(1234,'9999.99') FROM dual;-- 1234.00
- SELECT TO_CHAR(1234,'999,999') FROM dual;-- 1,234
- SELECT TO_CHAR(-1234,'999999MI') FROM dual;--负数右边显示负号 1234-
- SELECT TO_CHAR(-1234,'999999PR') FROM dual;--负数加上括号 <1234>
- SELECT TO_CHAR(-1234,'999999EEEE') FROM dual;--科学计数法 -1E+03
-
- --字符串使用TO_NUMBER
- SELECT TO_NUMBER('1234','9999') FROM dual;
- SELECT TO_NUMBER('1234','999') FROM dual; --报错
- SELECT TO_NUMBER(TO_CHAR(SYSDATE,'YYYY'),'9999') FROM dual;
- --字符转换为日期TO_DATE
- SELECT TO_DATE('17-JUN-18') FROM dual;
- SELECT TO_DATE('Jan 03,2016','fxMon DD,YYYY') FROM dual;--fx精确匹配
- SELECT TO_DATE('Jan 3,2016','Mon DD,YYYY') FROM dual;
- SELECT TO_DATE('Jan 03,2016','Mon DD,YYYY ') FROM dual;
- SELECT TO_DATE('Jan 03,2016','Mon DD;YYYY') FROM dual;
- --查询雇佣日期为1980/12/17的雇员,显示雇员名字和雇佣日期
- SELECT ename,e.hiredate FROM emp e where e.hiredate=TO_DATE('17-DEC-1980','DD-MON-YYYY');
- SELECT ename,e.hiredate FROM emp e where e.hiredate=TO_DATE('1980-12-17','YYYY-MM-DD');
- SELECT ename,e.hiredate FROM emp e where TO_CHAR(e.hiredate,'DD-MM-YYYY')='17-12-1980';
5)通用函数:
- -------非空判断
- ---NVL函数 相当于IF语句 NVL(可能为空的列名,value)用一个指定的值value替换一个NULL
- SELECT comm from emp
- SELECT NVL(comm,0) from emp
- ---NVL2函数 相当于IF ELSE语句 nvl(列名,vlaue,value) 检查第一个参数,如果该参数的值不为空,则该函数返回第二个参数的值,否则返回第三个参数的值
- SELECT e.empno,e.ename,NVL2(comm,1,0) FROM emp e--不为空返回1为空返回0
- -------复杂的逻辑判断 case when then
- SELECT (CASE e.comm
- WHEN 300 THEN 8888
- WHEN 500 THEN 6666
- ELSE 0
- END) AS COMM FROM emp e
-
-
6)ROW_NUMBER() OVER
row_number()从1开始,为每一条分组记录返回一个数字;
例1:ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的每条xlh记录返回一个序号。
例2:row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
1)适用场景:查询的结果集中只涉及一个表的列(子查询的结果集只能有一列)
2)单行子查询:(内部查询结果集只有一条记录) 可以用到的符号= 、!=、 > 、 <、<>
select * from emp where deptno=(select from dept)
3)多行子查询:(内部查询结果集有多条记录)可以用到的符号(in,any,all)
select * from emp where salary in (100,200,300)
1)适用场景:查询结果集中涉及到两个表中的列的时候
2内连接:内连接,也被称为自然连接,只有两个表相匹配的行才能在结果集中出现。返回的结果集选取了两个表中所有相匹配的数据,舍弃了不匹配的数据。
等值内连接:等值内连接inner join 返回两个表中主外键匹配的数据(两个表中不为空的数大的记录数)
select * from emp e inner join dept d on e.deptno=d.deptno
select * from emp e,dept d where e.deptno=d.deptno 简化上面的写法
非等值内连接(不是用=进行连接的)
select e.ename ,s.grade from emp e inner join salgrade s on e.sal between s.losal and s. hisal
3)外连接:
外连接不仅包含符合连接条件的行,还包含左表(左连接时)、右表(右连接时)或两个边接表(全外连接)中的所有数据行。
SQL外连接共有三种类型:左外连接(关键字为LEFT OUTER JOIN)、右外连接(关键字为RIGHT OUTER JOIN)和全外连接(关键字为FULL OUTER JOIN)。
外连接的用法和内连接一样,只是将INNER JOIN关键字替换为相应的外连接关键字即可。
左连接(返回内连接的结果,同时返回左表为匹配的行)
select * from emp e left outer join dept d on e.deptno=d.deptno Oracle数据库可以在从表加(+)
右连接(返回内连接的结果,同时返回右表没有匹配的行)
select * from emp e right outer join dept d on e.deptno=d.deptno
全连接(返回所有信息包括内连接和左右连接的值)
select * from emp e full outer join dept d on e.depton=d.depton
1)并集 UNION(合并两个或多个 SELECT 语句的结果集。)
- SELECT column_name(s) FROM table_name1
- UNION
- SELECT column_name(s) FROM table_name2
union all 与 union区别:
union 去除重复的数据 union all 不去除重复的数据
union 会对结果集进行排序,union all不会排序,sql优化时用union all 避免不必要的排序操作
2)交集INTERSECT(默认去除重复的数据)
合并两个SELECT语句,但只从第一个SELECT语句返回完全相同于第二个SELECT语句结果的所有行。这意味着INTERSECT是由两个SELECT语句返回相同的行(唯一)。
3)差集MINUS(默认去除重复的数据)
MINUS 指令是运用在两个 SQL 语句上。它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的结果中。如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现。如果第二个 SQL 语句所产生的结果并没有存在于第一个 SQL 语句所产生的结果内,那这笔资料就被抛弃。
A minus B就意味着将结果集A去除结果集B中所包含的所有记录后的结果,即在A中存在,而在B中不存在的记录。
如有问题,多多指正!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。