Oracle笛卡爾積,分組,多表連線
阿新 • • 發佈:2019-01-22
一 oracle的單行函式
轉換函式
to_date(日期字串,日期格式) 字串的格式必須由第二個引數來判斷
日期格式 :
年 yyyy,月mm,日dd,小時(hh12小時制,hh24 24小時制) 分鐘 mi 秒 ss
舉例 :select to_date('2015/03/09','yyyy/mm/dd') from dual
to_char(數字) 將數字轉換成char型別
to_char(日期,日期格式) 將日期轉換成char型別 日期格式 可以任意 輸出的內容 根據日期的格式而定
舉例 select to_char(sysdate,'hh24') 輸出24小時制的當前時間的hour
to_number(字串數字) 將字串的數字轉換成number型別
舉例 to_number('123')輸出數字 123
聚合函式
組函式會忽略空值。
組函式可以用於任何有效的表示式。
如:可以對數字、字串和日期使用COUNT、MAX、MIN。
組函式會忽略空值。
避免使用 COUNT(*) ,而使用 COUNT(ROWID)
count(*|1|列名|rowid) 統計總行數
sum(列名) 求總和
max(列名) 求最大值
avg(列名) 求平均值
min(列名) 求最小值
分組(group by)
語法:
SELECT [DISTINCT] *|[列名 別名,…]
FROM 表名
[WHERE 條件]
[GROUP BY 分組條件]
[ORDER BY 列名 [ASC]|[DESC], ...];
注意:
如果查詢中包含一個聚合函式,而所選擇的列不在聚合函式中,那麼這些列就必須出現在GROUP BY子句中。
聚合函式不能出現在WHERE子句中。
舉例
id,name,dept,sal
1 test 10 100
2 test1 10 200
3 test2 20 300
4 test3 30 1000
如果按照部門分組 相同的值被分為一組 分組的結果為三組:10,20,30
分組的組的數量 也就是最終輸出的結果的數量 最終的結果
dept max(sal) 其他的列 如果需要使用 必須使用聚合函式 聚合為一條記錄
10 200 分組聚合 也就是找出組中 最大或者最小或者平均值 輸出 最終聚合的結果只有一條記錄
20 300
30 1000
select deptno,count(*) from emp group by deptno having count(*)>3;
將分組後的結果 在進行條件過濾 having中的條件必須是在列中能夠出現
where 是在分組之前對資料進行過濾輸出後 在分組 輸出
having條件 是在分組之後 對分組的結果進行過濾輸出
表關聯
笛卡爾方式的連線
select e.ename,d.dname
from emp e,dept d
where e.deptno=d.deptno and ename='SMITH' order by ename;
內連線
語法:
SELECT [DISTINCT] *|[列名 別名,…]
FROM 主表名 別名
[INNER] JOIN 從表名 別名 ON 連線條件
[WHERE 條件];
列出所有連線表中與連線條件相匹配的資料行。
使用表別名,可以簡化語句。
內連線分類
等值連線:在連線條件中使用等號(=)運算子來比較被連線列的列值
連線條件的列名相同時,可以使用USING (列名)來簡化。
非等值連線:在連線條件中使用除等號運算子以外的其它比較運算子來比較被連線的列的列值。
!=、>、>=、<、<=、LIKE、BETWEEN AND、
內連線 是主表和從表的資料都匹配之後 輸出 不匹配拋棄
A B
id name deptno deptno name
1 test 1 1 研發部
2 jiaozi 2 2 測試部
3 cherry 2
4 qian 3
select * from A a inner join B b on a.deptno=b.deptno
輸出結果為
1 test 1 研發部
2 jiaozi 2 測試部
3 cherry 2測試部
4的記錄因為在從表B中找不到所以被拋棄
select * from A a left join B b on a.deptno=b.deptno
1 test 1 研發部
2 jiaozi 2 測試部
3 cherry 2測試部
4 qian 3 (空)
4 的記錄因為在從表B中找不到 所以只有主表的記錄被輸出
轉換函式
to_date(日期字串,日期格式) 字串的格式必須由第二個引數來判斷
日期格式 :
年 yyyy,月mm,日dd,小時(hh12小時制,hh24 24小時制) 分鐘 mi 秒 ss
舉例 :select to_date('2015/03/09','yyyy/mm/dd') from dual
to_char(數字) 將數字轉換成char型別
to_char(日期,日期格式) 將日期轉換成char型別 日期格式 可以任意 輸出的內容 根據日期的格式而定
舉例 select to_char(sysdate,'hh24') 輸出24小時制的當前時間的hour
to_number(字串數字) 將字串的數字轉換成number型別
舉例 to_number('123')輸出數字 123
聚合函式
組函式會忽略空值。
組函式可以用於任何有效的表示式。
如:可以對數字、字串和日期使用COUNT、MAX、MIN。
組函式會忽略空值。
避免使用 COUNT(*) ,而使用 COUNT(ROWID)
count(*|1|列名|rowid) 統計總行數
sum(列名) 求總和
max(列名) 求最大值
avg(列名) 求平均值
min(列名) 求最小值
分組(group by)
語法:
SELECT [DISTINCT] *|[列名 別名,…]
FROM 表名
[WHERE 條件]
[GROUP BY 分組條件]
[ORDER BY 列名 [ASC]|[DESC], ...];
注意:
如果查詢中包含一個聚合函式,而所選擇的列不在聚合函式中,那麼這些列就必須出現在GROUP BY子句中。
聚合函式不能出現在WHERE子句中。
舉例
id,name,dept,sal
1 test 10 100
2 test1 10 200
3 test2 20 300
4 test3 30 1000
如果按照部門分組 相同的值被分為一組 分組的結果為三組:10,20,30
分組的組的數量 也就是最終輸出的結果的數量 最終的結果
dept max(sal) 其他的列 如果需要使用 必須使用聚合函式 聚合為一條記錄
10 200 分組聚合 也就是找出組中 最大或者最小或者平均值 輸出 最終聚合的結果只有一條記錄
20 300
30 1000
select deptno,count(*) from emp group by deptno having count(*)>3;
將分組後的結果 在進行條件過濾 having中的條件必須是在列中能夠出現
where 是在分組之前對資料進行過濾輸出後 在分組 輸出
having條件 是在分組之後 對分組的結果進行過濾輸出
表關聯
笛卡爾方式的連線
select e.ename,d.dname
from emp e,dept d
where e.deptno=d.deptno and ename='SMITH' order by ename;
內連線
語法:
SELECT [DISTINCT] *|[列名 別名,…]
FROM 主表名 別名
[INNER] JOIN 從表名 別名 ON 連線條件
[WHERE 條件];
列出所有連線表中與連線條件相匹配的資料行。
使用表別名,可以簡化語句。
內連線分類
等值連線:在連線條件中使用等號(=)運算子來比較被連線列的列值
連線條件的列名相同時,可以使用USING (列名)來簡化。
非等值連線:在連線條件中使用除等號運算子以外的其它比較運算子來比較被連線的列的列值。
!=、>、>=、<、<=、LIKE、BETWEEN AND、
內連線 是主表和從表的資料都匹配之後 輸出 不匹配拋棄
A B
id name deptno deptno name
1 test 1 1 研發部
2 jiaozi 2 2 測試部
3 cherry 2
4 qian 3
select * from A a inner join B b on a.deptno=b.deptno
輸出結果為
1 test 1 研發部
2 jiaozi 2 測試部
3 cherry 2測試部
4的記錄因為在從表B中找不到所以被拋棄
select * from A a left join B b on a.deptno=b.deptno
1 test 1 研發部
2 jiaozi 2 測試部
3 cherry 2測試部
4 qian 3 (空)
4 的記錄因為在從表B中找不到 所以只有主表的記錄被輸出