经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
oracle多表关联查询和子查询
来源:cnblogs  作者:婷小生  时间:2019/8/26 8:39:52  对本文有异议

oracle多表关联查询和子查询

一、多表关联查询

例子:

  1. SQL> create table student1
  2. (
  3. sid varchar(3),
  4. sname varchar(6),
  5. sage number(3));
  6. Table created.
  7. SQL> create table course1
  8. (
  9. sid varchar(3),
  10. cname varchar(8),
  11. cno number(3));
  12. Table created.

student1表

  1. SQL> select * from student1;
  2. SID SNAME SAGE
  3. --- ------ ----------
  4. 01 李逍遥 21
  5. 02 林月如 20
  6. 03 拜月 100

course1表

  1. SQL> select * from course1;
  2. SID CNAME CNO
  3. --- -------- ----------
  4. 01 历史 12
  5. 02 化学 11
  6. 22 德语 18

 

1、内连接(inner join……on/join on):只连接匹配的行

  1. SQL> select * from student1 inner join course1 on student1.sid=course1.sid;
  2. SID SNAME SAGE SID CNAME CNO
  3. --- ------ ---------- --- -------- ----------
  4. 01 李逍遥 21 01 历史 12
  5. 02 林月如 20 02 化学 11

2、左连接(left join……on):包含左边表的全部行,不管右边表的是否存在与它们匹配的行

  1. SQL> select * from student1 left join course1 on student1.sid=course1.sid;
  2. SID SNAME SAGE SID CNAME CNO
  3. --- ------ ---------- --- -------- ----------
  4. 01 李逍遥 21 01 历史 12
  5. 02 林月如 20 02 化学 11
  6. 03 拜月 100

3、右连接(right join……on):包含右边表的全部行,不管左边表是否存在与它们匹配的行

  1. SQL> select * from student1 right join course1 on student1.sid=course1.sid;
  2. SID SNAME SAGE SID CNAME CNO
  3. --- ------ ---------- --- -------- ----------
  4. 01 李逍遥 21 01 历史 12
  5. 02 林月如 20 02 化学 11
  6. 22 德语 18

4、全外连接(full outer join……on或者full join……on):包含左右两张表的全部行,不管另外一边表中是否存在与它们匹配的行

  1. SQL> select * from student1 full outer join course1 on student1.sid=course1.sid;
  2. SID SNAME SAGE SID CNAME CNO
  3. --- ------ ---------- --- -------- ----------
  4. 01 李逍遥 21 01 历史 12
  5. 02 林月如 20 02 化学 11
  6. 22 德语 18
  7. 03 拜月 100

一般,我们测试中常用的是内连接搭配函数(数值函数、统计函数、聚合函数等等)查询使用

二、oracle中常用函数

1、数值函数

ceil(n)返回大于或者等于数值n的最小整数

  1. SQL> select ceil(10.7) from dual;
  2. CEIL(10.7)
  3. ----------
  4. 11

floor(n)返回小于等于数值n的最大整数

  1. SQL> select floor(12.3) from dual;
  2. FLOOR(12.3)
  3. -----------
  4. 12

mod(m,n)m除以n的余数,若n=0,则返回m,若m=0也返回m

  1. SQL> select mod(7,5) from dual;
  2. MOD(7,5)
  3. ----------
  4. 2
  5. SQL> select mod(6,3) from dual;
  6. MOD(6,3)
  7. ----------
  8. 0
  9. SQL> select mod(3,0) from dual;
  10. MOD(3,0)
  11. ----------
  12. 3
  13. SQL> select mod(0,4) from dual;
  14. MOD(0,4)
  15. ----------
  16. 0

power(n,m)m的n次方

  1. SQL> select power(12,11)from dual;
  2. POWER(12,11)
  3. ------------
  4. 7.4301E+11

round(n,m)将n四舍五入,保留小数点后m位

  1. SQL> select round(3.657879,2) from dual;
  2. ROUND(3.657879,2)
  3. -----------------
  4. 3.66

sign(n)若n=0,则返回0,否则n>0,则返回1,n<0返回-1

  1. SQL> select sign(19) from dual;
  2. SIGN(19)
  3. ----------
  4. 1
  5. SQL> select sign(0) from dual;
  6. SIGN(0)
  7. ----------
  8. 0
  9. SQL> select sign(-23) from dual;
  10. SIGN(-23)
  11. ----------
  12. -1

sqrt(n)n的平方根

  1. SQL> select sqrt(36) from dual;
  2. SQRT(36)
  3. ----------
  4. 6

2、常用字符函数

initcap(char)把每个字符串的第一个字符转成大写

  1. SQL> select initcap('xiaosheng') from dual;
  2. INITCAP('
  3. ---------
  4. Xiaosheng

lower(char)整个字符串小写

  1. SQL> select lower('SQL') from dual;
  2. LOW
  3. ---
  4. sql

replace(char,str1,str2)字符串中所有str1换成str2

  1. SQL> select replace('xiaosheng','xiao','ting') from dual;
  2. REPLACE('
  3. ---------
  4. tingsheng

substr(char,m,n)取出从m字符开始的n个字符串的子串

  1. SQL> select substr('xiaosheng',1,5) from dual;
  2. SUBST
  3. -----
  4. xiaos

length(char)求字符串的长度

  1. SQL> select length('meiyou ,dengwzhuceyige ') from dual;
  2. LENGTH('MEIYOU,DENGWZHUCEYIGE')
  3. -------------------------------
  4. 23

||并置运算符

  1. SQL> select 'xiao'||'sheng' from dual;
  2. 'XIAO'||'
  3. ---------
  4. xiaosheng

3、日期型函数

sysdate返回当前日期和时间

  1. SQL> select sysdate from dual;
  2. SYSDATE
  3. ------------
  4. 23-AUG-19

last_day本月的最后一天

  1. SQL> select last_day(sysdate) from dual;
  2. LAST_DAY(SYS
  3. ------------
  4. 31-AUG-19

add_months(d,n)当前日期d后推n个月

  1. SQL> select add_months(sysdate,2) from dual;
  2. ADD_MONTHS(S
  3. ------------
  4. 23-OCT-19

months_between(d,n)日期d和n相差月数

  1. SQL> select months_between(sysdate,to_date('20020812','YYYYMMDD')) from dual;
  2. MONTHS_BETWEEN(SYSDATE,TO_DATE('20020812','YYYYMMDD'))
  3. ------------------------------------------------------
  4. 204.373818

next_day(d,day):表示d后第一周指定day的日期

  1. SQL> select next_day(sysdate,'Monday') from dual;
  2. NEXT_DAY(SYS
  3. ------------
  4. 26-AUG-19

day格式有:Monday、tuesday、Wednesday、thursday、friday、saturday、Sunday

4、特殊格式的日期型函数

Y或Y或YYY:表示年的最后一位或者两位、三位

  1. SQL> select to_char(sysdate,'YYYY') from dual;
  2. TO_C
  3. ----
  4. 2019
  5. SQL> select to_char(sysdate,'Y') from dual;#可以看出是从最后一位开始取值
  6. T
  7. -
  8. 9

Q:表示季度,1-3个月为一个季度

  1. SQL> select to_char(sysdate,'Q') from dual;
  2. T
  3. -
  4. 3

MM:表示月份数

  1. SQL> select to_char(sysdate,'MM') from dual;
  2. TO
  3. --
  4. 08

RM:表示将月份转换成罗马的日期格式

  1. SQL> select to_char(sysdate,'RM') from dual;
  2. TO_C
  3. ----
  4. VIII

month:表示用英文字符表示月份(比如august指的是8月)

  1. SQL> select to_char(sysdate,'month') from dual;
  2. TO_CHAR(SYSDA
  3. -------------
  4. august

ww:表示当年的第几周

  1. SQL> select to_char(sysdate,'ww') from dual;
  2. TO
  3. --
  4. 34

w:表示本月的第几周

  1. SQL> select to_char(sysdate,'w') from dual;
  2. T
  3. -
  4. 4

DDD:表示当年第几天,一月一日是当年的第一天:001,二月一日是当年的第32天:032

  1. SQL> select to_char(sysdate,'DDD') from dual;
  2. TO_
  3. ---
  4. 235

DD:表示当月第几天

  1. SQL> select to_char(sysdate,'DD') from dual;
  2. TO
  3. --
  4. 23

D:表示周内第几天

  1. SQL> select to_char(sysdate,'D') from dual;
  2. T
  3. -
  4. 6 ----因为西方是把周日算成一周的第一天

DY:表示周内第几天缩写

  1. SQL> select to_char(sysdate,'DY') from dual;
  2. TO_CHA
  3. ------
  4. FRI ----周五的缩写

hh12:表示12小时制小时数

hh24:表示24小时制小时数

Mi:表示分钟数

ss:表示秒数

  1. TO_CHAR(
  2. --------
  3. 02:53:13 ---12小时制
  4. SQL> select to_char(sysdate,'hh24:Mi:ss') from dual;
  5. TO_CHAR(
  6. --------
  7. 14:53:53 ---24小时制

to_number():将字符串数字化

  1. SQL> select to_number('123333') from dual;
  2. TO_NUMBER('123333')
  3. -------------------
  4. 123333

to_char():表示将数字转换为字符串

5、聚合函数

avg(x):返回x的平均值

sum(x):返回x的和

count(x):统计x个数

MAX\MIN(x):返回x最大值或x最小值

median(x):返回x的中间值

stddev(x):返回x的标准差

【注意:使用聚合函数的注意事项】

(1)可以使用distinct去除重复数据,一般放在from前面

(2)如果查询中包含了聚合函数,选择的列不在聚合函数中,那么这些列就必须在group by 字句中,否则就会报错

(3)having字句可以用来过滤行组,可以放在group by 子句之后

三、子查询

子查询:指查询中嵌套查询,常放在列、表、条件上

语法:

select (子查询) from(子查询) where(子查询)group by(子查询)having(子查询)order by (asc/desc)子

 

原文链接:http://www.cnblogs.com/xswt/p/11400359.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号