1. 程式人生 > >資料庫學習(一)

資料庫學習(一)

  工作中是由資料庫研發人員管理資料庫、表、資料等,作為測試,我主要還是在測試中遇到需要核對資料庫表資料時才有用到,所以我把平時用到的一些SQL語句整理了一下,以便學習。我們用到的主要是Oracle資料庫,使用的工具是PL/SQL。  

  PL/SQL Developer是一個整合開發環境,專門開發面向Oracle資料庫的應用。PL/SQL也是一種程式語言,叫做過程化SQL語言(Procedural Language/SQL)。PL/SQL是Oracle資料庫對SQL語句的擴充套件。在普通SQL語句的使用上增加了程式語言的特點,所以PL/SQL把資料操作和查詢語句組織在PL/SQL程式碼的過程性單元中,通過邏輯判斷、迴圈等操作實現複雜的功能或者計算。PL/SQL 只有 Oracle 資料庫有。 MySQL 目前不支援 PL/SQL 的,但支援Navicat Premium。

——百度百科

 

1、簡單的查詢語句

select * from prod_V1.Fetch_Apply ;  --查詢表中的所有資料

select * from prod_V1.Fetch_Apply t where t.applycode='SJTK20181206000023';   --where 表示條件;t表示表的別稱,使用表名時就可以直接簡寫t就行

select * from prod_V1.Fetch_Apply t where t.applycode='SJTK20181206000023' for update;  --for update 執行後表示可以修改表

 

2、複雜一點的查詢語句

select * from order_v1.statement t where t.order_id =(select c.orderid from order_v1.orders c where c.orderno= 17125371417);

--先在orders表中查詢出要求的orderid,然後再查詢出statement 表中相同的orderid的資料,這裡要求orders表中查詢的orderid是一條資料

select * from order_v1.statement t where t.order_id in(select c.orderid from order_v1.orders c where c.orderno= 17125371417);

--先在orders表中查詢出要求的orderid,然後再查詢出statement 表中相同的orderid的資料

in 和 = 的區別,就是前者子查詢可以多條結果,後者子查詢只能一條結果(否則會報錯)

select * from order_v1.statement t where t.order_id not in(select c.orderid from order_v1.orders c where c.orderno= 17125371417);

 --not in 就是和in相反的,不存在的意思

select * from order_v1.statement t where exists(select c.orderid from order_v1.orders c where c.orderno= 17125371417 and c.orderid= t.order_id);

--exists 存在,和in類似,主查詢(表statement )中的結果同時存在子查詢(表orders )的結果中的資料

in和exists的區別:

  in 是先執行子查詢得出結果,然後遍歷主查詢與結果對比,相同的就留下 ;exists 是先執行主查詢,然後根據結果再執行子查詢,得到結果

  執行順序不同會影響效率,子查詢結果集多就用exists,主查詢結果集多就用in

資料參考:https://www.cnblogs.com/liyasong/p/sql_in_exists.html

https://www.cnblogs.com/clarke157/p/7912871.html

 

3、inner join 、 left join 、 right join 、full join的使用

select a.* from order_v1.Settle_Allot_Money a inner join order_v1.statement b on a.statement_id=b.id
where b.order_id = (
select c.orderid from order_v1.orders c where c.orderno=17122214222);

select * from order_v1.statement_notification r inner join (
select * from order_v1.statement a where a.order_id =(
select c.orderid from order_v1.orders c where c.orderno=17124893162 )
) s on r.uniquekey=s.unique_key ;

--寫了三個表有點複雜,不過就是想說明下關聯表裡面可以條件查詢,使用 join 就是不用分多次查不同表

內連線:inner join   表示把AB表的記錄相符都顯示出來,把AB表不符合條件的都排除

外連線分三種,即左連線(LEFT OUTER JOIN)、右連線(RIGHT OUTER JOIN)、全連線(FULL OUTER JOIN):

1.A LEFT OUTER JOIN B表示把A表的記錄都顯示出來,把B表符合條件的結果集顯示出來,不符合條件的用NULL表示

2.A RIGHT OUTER JOIN B表示把B表的記錄都顯示出來,把A表符合條件的結果集顯示出來,不符合條件的用NULL表示

3.A FULL OUTER JOIN B 表示把A表和B表的記錄都顯示出來,不符合條件的用NULL表示

資料參考:https://www.cnblogs.com/Impulse/p/5045872.html

 

4、時間

資料庫表中的時間,會有不同的格式,查詢時間段的資料時可以用 to_date函式編寫時間

select * from settle_v1.platform_estimate_earnings_log t where t.amount > 0 and t.trans_type=4
and
t.log_time < to_date('2018-12-01','yyyy-mm-dd')
and
t.log_time >= to_date('2018-11-01','yyyy-mm-dd'); --查詢的是11月份的資料

select sum(t.invocie_amount) from finc_v1.re_transaction_detail_day t where t.supplierid=1 and t.REFUND_TYPE=2
and
t.REFUND_CREATEDTIME < to_date('2018-8-30','yyyy-mm-dd')
and
t.REFUND_CREATEDTIME > to_date('2018-08-28 23:59:59','yyyy-mm-dd hh24:mi:ss');  --查詢的是8.29號一天的資料

--注意 = 的使用,防止遺漏

 

5、排序

select * from order_v1.orders t order by t.orderid;
select * from order_v1.orders t order by t.orderid desc;

--order by 會自動排序(順序),加上desc會重新排序(倒序)