oracle多表關聯查詢和子查詢 一、多表關聯查詢 例子: student1表 course1表 1、內連接(inner join……on/join on):只連接匹配的行 2、左連接(left join……on):包含左邊表的全部行,不管右邊表的是否存在與它們匹配的行 3、右連接(right jo ...
oracle多表關聯查詢和子查詢
一、多表關聯查詢
例子:
SQL> create table student1 ( sid varchar(3), sname varchar(6), sage number(3)); Table created. SQL> create table course1 ( sid varchar(3), cname varchar(8), cno number(3)); Table created.
student1表
SQL> select * from student1; SID SNAME SAGE --- ------ ---------- 01 李逍遙 21 02 林月如 20 03 拜月 100
course1表
SQL> select * from course1; SID CNAME CNO --- -------- ---------- 01 歷史 12 02 化學 11 22 德語 18
1、內連接(inner join……on/join on):只連接匹配的行
SQL> select * from student1 inner join course1 on student1.sid=course1.sid; SID SNAME SAGE SID CNAME CNO --- ------ ---------- --- -------- ---------- 01 李逍遙 21 01 歷史 12 02 林月如 20 02 化學 11
2、左連接(left join……on):包含左邊表的全部行,不管右邊表的是否存在與它們匹配的行
SQL> select * from student1 left join course1 on student1.sid=course1.sid; SID SNAME SAGE SID CNAME CNO --- ------ ---------- --- -------- ---------- 01 李逍遙 21 01 歷史 12 02 林月如 20 02 化學 11 03 拜月 100
3、右連接(right join……on):包含右邊表的全部行,不管左邊表是否存在與它們匹配的行
SQL> select * from student1 right join course1 on student1.sid=course1.sid; SID SNAME SAGE SID CNAME CNO --- ------ ---------- --- -------- ---------- 01 李逍遙 21 01 歷史 12 02 林月如 20 02 化學 11 22 德語 18
4、全外連接(full outer join……on或者full join……on):包含左右兩張表的全部行,不管另外一邊表中是否存在與它們匹配的行
SQL> select * from student1 full outer join course1 on student1.sid=course1.sid; SID SNAME SAGE SID CNAME CNO --- ------ ---------- --- -------- ---------- 01 李逍遙 21 01 歷史 12 02 林月如 20 02 化學 11 22 德語 18 03 拜月 100
一般,我們測試中常用的是內連接搭配函數(數值函數、統計函數、聚合函數等等)查詢使用
二、oracle中常用函數
1、數值函數
ceil(n)返回大於或者等於數值n的最小整數
SQL> select ceil(10.7) from dual; CEIL(10.7) ---------- 11
floor(n)返回小於等於數值n的最大整數
SQL> select floor(12.3) from dual; FLOOR(12.3) ----------- 12
mod(m,n)m除以n的餘數,若n=0,則返回m,若m=0也返回m
SQL> select mod(7,5) from dual; MOD(7,5) ---------- 2 SQL> select mod(6,3) from dual; MOD(6,3) ---------- 0 SQL> select mod(3,0) from dual; MOD(3,0) ---------- 3 SQL> select mod(0,4) from dual; MOD(0,4) ---------- 0
power(n,m)m的n次方
SQL> select power(12,11)from dual; POWER(12,11) ------------ 7.4301E+11
round(n,m)將n四捨五入,保留小數點後m位
SQL> select round(3.657879,2) from dual; ROUND(3.657879,2) ----------------- 3.66
sign(n)若n=0,則返回0,否則n>0,則返回1,n<0返回-1
SQL> select sign(19) from dual; SIGN(19) ---------- 1 SQL> select sign(0) from dual; SIGN(0) ---------- 0 SQL> select sign(-23) from dual; SIGN(-23) ---------- -1
sqrt(n)n的平方根
SQL> select sqrt(36) from dual; SQRT(36) ---------- 6
2、常用字元函數
initcap(char)把每個字元串的第一個字元轉成大寫
SQL> select initcap('xiaosheng') from dual; INITCAP(' --------- Xiaosheng
lower(char)整個字元串小寫
SQL> select lower('SQL') from dual; LOW --- sql
replace(char,str1,str2)字元串中所有str1換成str2
SQL> select replace('xiaosheng','xiao','ting') from dual; REPLACE(' --------- tingsheng
substr(char,m,n)取出從m字元開始的n個字元串的子串
SQL> select substr('xiaosheng',1,5) from dual; SUBST ----- xiaos
length(char)求字元串的長度
SQL> select length('meiyou ,dengwzhuceyige ') from dual; LENGTH('MEIYOU,DENGWZHUCEYIGE') ------------------------------- 23
||並置運算符
SQL> select 'xiao'||'sheng' from dual; 'XIAO'||' --------- xiaosheng
3、日期型函數
sysdate返回當前日期和時間
SQL> select sysdate from dual; SYSDATE ------------ 23-AUG-19
last_day本月的最後一天
SQL> select last_day(sysdate) from dual; LAST_DAY(SYS ------------ 31-AUG-19
add_months(d,n)當前日期d後推n個月
SQL> select add_months(sysdate,2) from dual; ADD_MONTHS(S ------------ 23-OCT-19
months_between(d,n)日期d和n相差月數
SQL> select months_between(sysdate,to_date('20020812','YYYYMMDD')) from dual; MONTHS_BETWEEN(SYSDATE,TO_DATE('20020812','YYYYMMDD')) ------------------------------------------------------ 204.373818
next_day(d,day):表示d後第一周指定day的日期
SQL> select next_day(sysdate,'Monday') from dual; NEXT_DAY(SYS ------------ 26-AUG-19
day格式有:Monday、tuesday、Wednesday、thursday、friday、saturday、Sunday
4、特殊格式的日期型函數
Y或Y或YYY:表示年的最後一位或者兩位、三位
SQL> select to_char(sysdate,'YYYY') from dual; TO_C ---- 2019 SQL> select to_char(sysdate,'Y') from dual;#可以看出是從最後一位開始取值 T - 9
Q:表示季度,1-3個月為一個季度
SQL> select to_char(sysdate,'Q') from dual; T - 3
MM:表示月份數
SQL> select to_char(sysdate,'MM') from dual; TO -- 08
RM:表示將月份轉換成羅馬的日期格式
SQL> select to_char(sysdate,'RM') from dual; TO_C ---- VIII
month:表示用英文字元表示月份(比如august指的是8月)
SQL> select to_char(sysdate,'month') from dual; TO_CHAR(SYSDA ------------- august
ww:表示當年的第幾周
SQL> select to_char(sysdate,'ww') from dual; TO -- 34
w:表示本月的第幾周
SQL> select to_char(sysdate,'w') from dual; T - 4
DDD:表示當年第幾天,一月一日是當年的第一天:001,二月一日是當年的第32天:032
SQL> select to_char(sysdate,'DDD') from dual; TO_ --- 235
DD:表示當月第幾天
SQL> select to_char(sysdate,'DD') from dual; TO -- 23
D:表示周內第幾天
SQL> select to_char(sysdate,'D') from dual; T - 6 ----因為西方是把周日算成一周的第一天
DY:表示周內第幾天縮寫
SQL> select to_char(sysdate,'DY') from dual; TO_CHA ------ FRI ----周五的縮寫
hh12:表示12小時制小時數
hh24:表示24小時制小時數
Mi:表示分鐘數
ss:表示秒數
TO_CHAR( -------- 02:53:13 ---12小時制 SQL> select to_char(sysdate,'hh24:Mi:ss') from dual; TO_CHAR( -------- 14:53:53 ---24小時制
to_number():將字元串數字化
SQL> select to_number('123333') from dual; TO_NUMBER('123333') ------------------- 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)子