1. 程式人生 > 其它 >【Java 8 新特性】Array, Map和List集合通過reduce()和collect()方法獲取總數

【Java 8 新特性】Array, Map和List集合通過reduce()和collect()方法獲取總數

技術標籤:mysqloracle

這裡寫自定義目錄標題

Oracl

一, 常見函式

1,去重 Distinct

2, 插入資料

	INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
( value1, value2,...valueN );

3,Union

Union 操作符用於連線兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會刪除重複的資料

SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
;

4, 排序 order by

ASC 升序排列

DESC 降序排列

5,分組 GROUP BY

GROUP BY 語句根據一個或多個列對結果集進行分組。

在分組的列上我們可以使用 COUNT, SUM, AVG,等函式。

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

6,連線 inner join / left join / right join

INNER JOIN(內連線,或等值連線)**:獲取兩個表中欄位匹配關係的記錄。

LEFT JOIN(左連線):**獲取左表所有記錄,即使右表沒有對應匹配的記錄。

RIGHT JOIN(右連線):** 與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-BK1EMh7b-1609755302808)(file:///C:/Users/Athena/AppData/Local/Temp/msohtmlclip1/02/clip_image001.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-2DWB22UX-1609755302811)(file:///C:/Users/Athena/AppData/Local/Temp/msohtmlclip1/02/clip_image001.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-GhRSFzoR-1609755302814)(file:///C:/Users/Athena/AppData/Local/Temp/msohtmlclip1/02/clip_image001.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-Oj4ocKaD-1609755302817)(file:///C:/Users/Athena/AppData/Local/Temp/msohtmlclip1/02/clip_image001.png)]

7,中英文轉換

  1. 把中文的括號轉為成英文括號:

    To_single_byte(trim(AKA070)) 這個是把AKA070的值的內容裡面的括號轉化為英文括號

UPDATE TEST_KA20 SET AKA070 = To_single_byte(trim(AKA070)), 
AKA074 = To_single_byte(trim(AKA074)), 
SKD052 = To_single_byte(trim(SKD052))

8, nvl(x,value)

如果 x 為空,返回 value,否則返回 x。

9,nvl2(value1, value2)

如果x非空,返回value1,否則返回value2
(x,value1,value2)
如果 x 非空,返回 value1,否則返回 value2。

10,in與exist , not in與not exist

1, in和exists
in 是把外表和內表作hash 連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。一直以來認為exists比in效率高的說法是不準確的。
如果查詢的兩個表大小相當,那麼用in和exists差別不大。
如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in:
例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
相反的2:select * from B where cc in (select cc from A)
效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A表上cc列的索引。

2,not in 和not exists

如果查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。所以無論那個表大,用not exists都比not in要快。

not in 邏輯上不完全等同於not exists,如果你誤用了not in,小心你的程式存在致命的BUG:

請看下面的例子:

create table t1 (c1 number,c2 number); 
create table t2 (c1 number,c2 number); 

insert into t1 values (1,2);  
insert into t1 values (1,3);  
insert into t2 values (1,2);  
insert into t2 values (1,null);  

select * from t1 where c2 not in (select c2 from t2);  
no rows found  
select * from t1 where not exists (select 1 from t2 where t1.c2=t2.c2); 
正如所看到的,not in 出現了不期望的結果集,存在邏輯錯誤。如果看一下上述兩個select語句的執行計劃,也會不同。後者使用了hash_aj。  因此,請儘量不要使用not in(它會呼叫子查詢),而儘量使用not exists(它會呼叫關聯子查詢)。如果子查詢中返回的任意一條記錄含有空值,則查詢將不返回任何記錄,正如上面例子所示。除非子查詢欄位有非空限制,這時可以使用not in ,並且也可以通過提示讓它使用hasg_aj或merge_aj連線 

10,grant 賦權

在oracle多使用者的情況下,如何能夠讓ansiyb使用者使用ahsicp3下的表,並對其增刪改查;或者是ahsicp3使用者對ahsiyb使用者下的表進行增刪改查,這就得用到了同義詞和賦權;
 在Synonyms下建立同義詞,一般同義詞名與需要使用的表的名稱一致;
 執行 grant all on  ****  to  ahsicp3,如把ahsiyb下的KA51表授權給ahsicp3,執行下面的命令即可完成授權工作: grant all on ka51 to ahsicp3;

二,日期函式

日期函式對日期進行運算。常用的日期函式有:
1, SYSDATE:顯示系統當前日期

select sysdate from dual
select to_char(sysdate, 'yyyyMMdd') xtdate from dual

2,ADD_MONTHS(date,n)
在某一個日期 date 上,加上指定的月數 n,返回計算後的新日期。date 表示日期, n 表示要加的月數。

select add_months(sysdate, 6) six_month_later from dual;

3,LAST_DAY(date)
返回指定日期當月的最後一天。

select last_day(sysdate) from dual;

4,NEXT_DAY(date,char)
返回date日期的下一個周幾,周幾是由char決定的。
select NEXT_DAY(SYSDATE, ‘星期三’) from dual;
5, MONTHS_BETWEEN(DATE1,DATE2)
計算date1和date2兩個日期間的間隔。注意是date1-date2

select months_between(sysdate,17-1-17) from dual;

6,ROUND(d[,fmt])
返回一個以 fmt 為格式的四捨五入日期值, d 是日期, fmt 是格式
模型。預設 fmt 為 DDD,即月中的某一天。
如果 fmt 為“YEAR”則舍入到某年的 1 月 1 日,即前半年捨去,後半年作為下一年。
如果 fmt 為“MONTH”則舍入到某月的 1 日,即前月捨去,後半月作為下一月。

select round(to_date(2009-09-25, ‘yyyy-mm-dd’),MONTH) round_date from dual;
例:select round(to_date(2009-09-25, ‘yyyy-mm-dd’),YEAR) round_date from dual;
例:select round(to_date(2009-09-25, ‘yyyy-mm-dd’)) round_date from dual;
  1. TRUNC(d[,fmt])
    與 ROUND 對應的函式是TRUNC(d[,fmt])對日期的操作, TRUNC 與 ROUND 非常相似,只
    是不對日期進行舍入,直接擷取到對應格式的第一天。
select TRUNC(to_date(2009-09-25, ‘yyyy-mm-dd’),MONTH) trunc_date from dual;
例:select TRUNC (to_date(2009-09-25, ‘yyyy-mm-dd’),YEAR) trunc_date from dual;
例:select TRUNC (to_date(2009-09-25, ‘yyyy-mm-dd’)) trunc_date from dual;

8,Extract(fmt FROM d),提取日期中的特定部分。
fmt 為: YEAR、MONTH、DAY、HOUR、MINUTE、SECOND。其中 YEAR、MONTH、DAY可以為 DATE 型別匹配,也可以與TIMESTAMP 型別匹配;但HOUR、MINUTE、SECOND 必須與 TIMESTAMP 型別匹配。
例:EXTRACT 函式示例

Select sysdate “date,
Extract(year from sysdate)year”
Extract(month from sysdate)month”
Extract(day from sysdate)day”
Extract(hour from systimestamp)hour”
Extract(minute from systimestamp)minute”
Extract(second from systimestamp)secondFrom dual;

9, 計算兩個日期(精確到年月日)的差值
oracle裡面我想取兩個日期之間的差值,但是都是varchar型別的我改如何sql?比如 20170628-20170301 如何讓他的值等於88

select floor( to_date('2017062','yyyymmdd') - to_date('20170301','yyyymmdd')) from dual;
SELECT FLOOR (TO_DATE(AKC194, 'YYYYMMDD') - TO_DATE(AKC192 ,'YYYYMMDD'))FROM KC21_ZY 

10, 查詢表中欄位裡資料是否有重複

1,查單個欄位
SELECT TEST_NAME,COUNT(*) FROM T_TEST GROUP BY TEST_NAME HAVING COUNT(*) > 1
2,查詢表中多餘的重複記錄,重複記錄是根據單個欄位(Id)來判斷
select * fromwhere Id in (select Id fromgroup byId having count(Id) > 1)
3,刪除表中多餘的重複記錄,重複記錄是根據單個欄位(Id)來判斷,只留有rowid最小的記錄
DELETE fromWHERE (id) IN ( SELECT id FROMGROUP BY id HAVING COUNT(id) > 1) AND ROWID NOT IN (SELECT MIN(ROWID) FROMGROUP BY id HAVING COUNT(*) > 1);
4,查詢表中多餘的重複記錄(多個欄位)
select * from 表 a where (a.Id,a.seq) in(select Id,seq fromgroup by Id,seq having count(*) > 1)
5,刪除表中多餘的重複記錄(多個欄位),只留有rowid最小的記錄
delete from 表 a where (a.Id,a.seq) in (select Id,seq fromgroup by Id,seq having count(*) > 1) and rowid not in (select min(rowid) fromgroup by Id,seq having count(*)>1)

三,檢視

1,作用

1)提供各種資料表現形式, 可以使用各種不同的方式將基表的資料展現在使用者面前, 以便符合使用者的使用習慣(主要手段: 使用別名);
2)隱藏資料的邏輯複雜性並簡化查詢語句, 多表查詢語句一般是比較複雜的, 而且使用者需要了解表之間的關係, 否則容易寫錯; 如果基於這樣的查詢語句建立一個檢視, 使用者就可以直接對這個檢視進行"簡單查詢"而獲得結果. 這樣就隱藏了資料的複雜性並簡化了查詢語句.這也是oracle提供各種"資料字典檢視"的原因之一,all_constraints就是一個含有2個子查詢並連線了9個表的檢視(在catalog.sql中定義);
3)執行某些必須使用檢視的查詢. 某些查詢必須藉助檢視的幫助才能完成. 比如, 有些查詢需要連線一個分組統計後的表和另一表, 這時就可以先基於分組統計的結果建立一個檢視, 然後在查詢中連線這個檢視和另一個表就可以了;
4)提供某些安全性保證. 檢視提供了一種可以控制的方式, 即可以讓不同的使用者看見不同的列, 而不允許訪問那些敏感的列, 這樣就可以保證敏感資料不被使用者看見;
5)簡化使用者許可權的管理. 可以將檢視的許可權授予使用者, 而不必將基表中某些列的許可權授予使用者, 這樣就簡化了使用者許可權的定義。

2,建立檢視

1許可權: 要在當前方案中建立檢視, 使用者必須具有create view系統許可權; 要在其他方案中建立檢視, 使用者必須具有create any view系統許可權. 檢視的功能取決於檢視擁有者的許可權.
2 語法: 
create [ or replace ] [ force ] view [schema.]view_name
	                      [ (column1,column2,...) ]
	                      as 
	                      select ...
	                      [ with check option ]                
                          [ constraint constraint_name ]
	                      [ with read only ];
tips:
1 or replace: 如果存在同名的檢視, 則使用新檢視"替代"已有的檢視
 2 force: "強制"建立檢視,不考慮基表是否存在,也不考慮是否具有使用基表的許可權
 3 column1,column2,...:檢視的列名, 列名的個數必須與select查詢中列的個數相同; 如果select查詢包含函式或表示式, 則必須為其定義列名.此時, 既可以用column1, column2指定列名, 也可以在select查詢中指定列名.
 4 with check option: 指定對檢視執行的dml操作必須滿足“檢視子查詢”的條件即,對通過檢視進行的增刪改操作進行"檢查",要求增刪改操作的資料, 必須是select查詢所能查詢到的資料,否則不允許操作並返回錯誤提示. 預設情況下, 在增刪改之前"並不會檢查"這些行是否能被select查詢檢索到. 
 5 with read only:建立的檢視只能用於查詢資料, 而不能用於更改資料.

3, 格式

create view 檢視名(可以起別名) as

select…from …

【with read only】 --with read only 表示檢視是一個只讀檢視,只能查詢,不能修改。

create or replace view v_emp("編號","姓名‘) as select empno,ename from emp with read only;

四,儲存過程

1, dbms_output的用法

dbms_output.put('a'); --寫入buffer但不輸出
dbms_output.put('b'); --寫入buffer但不輸出
dbms_output.new_line; --回車(換行),輸出                              
dbms_output.put_line('hello world!'); --輸出並換行 
dbms_output.put('d'); --寫入buffer不輸出

2,儲存過程結構

CREATE OR REPLACE PROCEDURE proc1 (       --建立語句
    para1 varchar2,                        ----------引數列表       
    para2 OUT varchar2, 
    para3 IN OUT varchar2
)
AS
    v_name varchar2(20);           ---------------宣告變數
BEGIN
   v_name := 'zhangsf';     --從begin 關鍵字開始為過程的語句塊
  para3 := v_name;
   dbms_output.put_line('para3:' || para3);
END; 

3, for迴圈格式

DECLARE
       ls_sae009  varchar2(100);
       ls_skd004  varchar2(100);
    BEGIN
        FOR I IN (select * from ka20 where aae036 = '20200417215701') loop
            select max(aaz235) +1 into ls_skd004 from ka21_cxqm where aae036 like '202004%';
            INSERT INTO ka21_cxqm (aaz235,AKE001,aae140,AKA078,BKA005 , AAE036) VALUES
            (ls_skd004,
            I.AKE001,
            '390',
            '999',
            '0.3000',
            '20200417215701'
            );
        end loop;
END;

五,sql優化

1,分庫分表

2,索引

第一,  通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。
第二,  可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。
第三,  可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。
第四,  在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。
第五,  通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的效能。

第一,  建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。
第二,  索引需要佔物理空間,除了資料表佔資料空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。
第三,  當對錶中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。

3,合理使用,避免使用全域性檢索

1、在表中建立索引,優先考慮where、group by使用到的欄位。
2、儘量避免使用select *,返回無用的欄位會降低查詢效率。如下:

SELECT * FROM t 

優化方式:使用具體的欄位代替*,只返回使用到的欄位。
3、儘量避免使用in 和not in,會導致資料庫引擎放棄索引進行全表掃描。如下:

SELECT * FROM t WHERE id IN (2,3)
SELECT * FROM t1 WHERE username IN (SELECT username FROM t2)
優化方式:如果是連續數值,可以用between代替。如下:
SELECT * FROM t WHERE id BETWEEN 2 AND 3
如果是子查詢,可以用exists代替。如下:
SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t1.username = t2.username)

4、儘量避免使用or,會導致資料庫引擎放棄索引進行全表掃描。

SELECT * FROM t WHERE id = 1 OR id = 3
優化方式:可以用union代替or。如下:
SELECT * FROM t WHERE id = 1
UNION
SELECT * FROM t WHERE id = 3
(PS:如果or兩邊的欄位是同一個,如例子中這樣。貌似兩種方式效率差不多,即使union掃描的是索引,or掃描的是全表)

5、儘量避免在欄位開頭模糊查詢,會導致資料庫引擎放棄索引進行全表掃描。

SELECT * FROM t WHERE username LIKE '%li%'
優化方式:儘量在欄位後面使用模糊查詢。如下:
SELECT * FROM t WHERE username LIKE 'li%'

6、儘量避免進行null值的判斷,會導致資料庫引擎放棄索引進行全表掃描。如下:

SELECT * FROM t WHERE score IS NULL
優化方式:可以給欄位新增預設值0,對0值進行判斷。如下:
SELECT * FROM t WHERE score = 0

7、儘量避免在where條件中等號的左側進行表示式、函式操作,會導致資料庫引擎放棄索引進行全表掃描。如下:

SELECT * FROM t2 WHERE score/10 = 9
SELECT * FROM t2 WHERE SUBSTR(username,1,2) = 'li'
優化方式:可以將表示式、函式操作移動到等號右側。如下:
SELECT * FROM t2 WHERE score = 10*9
SELECT * FROM t2 WHERE username LIKE 'li%'

8、當資料量大時,避免使用where 1=1的條件。通常為了方便拼裝查詢條件,我們會預設使用該條件,資料庫引擎會放棄索引進行全表掃描。如下:

SELECT * FROM t WHERE 1=1

優化方式:用程式碼拼裝sql時進行判斷,沒where加where,有where加and。
9. 儘量使用列名(Oracle9i之後, *和列名一樣)
在業務密集的SQL當中儘量不採用IN操作符,用EXISTS 方案代替。

歡迎使用Markdown編輯器

你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。

新的改變

我們對Markdown編輯器進行了一些功能拓展與語法支援,除了標準的Markdown編輯器功能,我們增加了如下幾點新功能,幫助你用它寫部落格:

  1. 全新的介面設計 ,將會帶來全新的寫作體驗;
  2. 在創作中心設定你喜愛的程式碼高亮樣式,Markdown 將程式碼片顯示選擇的高亮樣式 進行展示;
  3. 增加了 圖片拖拽 功能,你可以將本地的圖片直接拖拽到編輯區域直接展示;
  4. 全新的 KaTeX數學公式 語法;
  5. 增加了支援甘特圖的mermaid語法1 功能;
  6. 增加了 多螢幕編輯 Markdown文章功能;
  7. 增加了 焦點寫作模式、預覽模式、簡潔寫作模式、左右區域同步滾輪設定 等功能,功能按鈕位於編輯區域與預覽區域中間;
  8. 增加了 檢查列表 功能。

功能快捷鍵

撤銷:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜體:Ctrl/Command + I
標題:Ctrl/Command + Shift + H
無序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
檢查列表:Ctrl/Command + Shift + C
插入程式碼:Ctrl/Command + Shift + K
插入連結:Ctrl/Command + Shift + L
插入圖片:Ctrl/Command + Shift + G
查詢:Ctrl/Command + F
替換:Ctrl/Command + G

合理的建立標題,有助於目錄的生成

直接輸入1次#,並按下space後,將生成1級標題。
輸入2次#,並按下space後,將生成2級標題。
以此類推,我們支援6級標題。有助於使用TOC語法後生成一個完美的目錄。

如何改變文字的樣式

強調文字 強調文字

加粗文字 加粗文字

標記文字

刪除文字

引用文字

H2O is是液體。

210 運算結果是 1024.

插入連結與圖片

連結: link.

圖片: Alt

帶尺寸的圖片: Alt

居中的圖片: Alt

居中並且帶尺寸的圖片: Alt

當然,我們為了讓使用者更加便捷,我們增加了圖片拖拽功能。

如何插入一段漂亮的程式碼片

部落格設定頁面,選擇一款你喜歡的程式碼片高亮樣式,下面展示同樣高亮的 程式碼片.

// An highlighted block
var foo = 'bar';

生成一個適合你的列表

  • 專案
    • 專案
      • 專案
  1. 專案1
  2. 專案2
  3. 專案3
  • 計劃任務
  • 完成任務

建立一個表格

一個簡單的表格是這麼建立的:

專案Value
電腦$1600
手機$12
導管$1

設定內容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文字居中第二列文字居右第三列文字居左

SmartyPants

SmartyPants將ASCII標點字元轉換為“智慧”印刷標點HTML實體。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

建立一個自定義列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何建立一個註腳

一個具有註腳的文字。2

註釋也是必不可少的

Markdown將文字轉換為 HTML

KaTeX數學公式

您可以使用渲染LaTeX數學表示式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通過尤拉積分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多關於的資訊 LaTeX 數學表示式here.

新的甘特圖功能,豐富你的文章

Mon 06 Mon 13 Mon 20 已完成 進行中 計劃一 計劃二 現有任務 Adding GANTT diagram functionality to mermaid
  • 關於 甘特圖 語法,參考 這兒,

UML 圖表

可以使用UML圖表進行渲染。 Mermaid. 例如下面產生的一個序列圖:

張三 李四 王五 你好!李四, 最近怎麼樣? 你最近怎麼樣,王五? 我很好,謝謝! 我很好,謝謝! 李四想了很長時間, 文字太長了 不適合放在一行. 打量著王五... 很好... 王五, 你怎麼樣? 張三 李四 王五

這將產生一個流程圖。:

連結 長方形 圓角長方形 菱形
  • 關於 Mermaid 語法,參考 這兒,

FLowchart流程圖

我們依舊會支援flowchart的流程圖:

Created with Raphaël 2.2.0 開始 我的操作 確認? 結束 yes no
  • 關於 Flowchart流程圖 語法,參考 這兒.

匯出與匯入

匯出

如果你想嘗試使用此編輯器, 你可以在此篇文章任意編輯。當你完成了一篇文章的寫作, 在上方工具欄找到 文章匯出 ,生成一個.md檔案或者.html檔案進行本地儲存。

匯入

如果你想載入一篇你寫過的.md檔案,在上方工具欄可以選擇匯入功能進行對應副檔名的檔案匯入,
繼續你的創作。


  1. mermaid語法說明 ↩︎

  2. 註腳的解釋 ↩︎