SQL語句在oracle資料庫中的初級應用(上)

Crazystudent13發表於2018-07-21

前言:

因公司要求,於是花了約莫一週的時間來理解和記憶SQL語言,在基於實用而非徹底理解的情況下,SQL語句其實是很簡單的,現在,我就把自己這段時間的整理能容放出來,供新人摸索,供大佬批判。

因為是新人上路,所以可能有所不足,歡迎指正,我已經儘可能的保證正確的了。


增添資料(插入資料):

指定插入:


insert into 表名 (列名1,列名2,列名3......)  values (內容1,內容2,內容3);

複製程式碼

預設插入:


insert into 表名 values (內容1,內容2,內容3);

複製程式碼

以上兩種是直接向表中插入資料的方式,

第一種是照應前邊的內容進行插入, 第二種方式,是預設的按照表格內容插入資料,

如果兩者資料不足,都會在表格中以NULL的形式插入資料。


刪除資料:

指定行刪除:


delete from table_name where 欄位名=“指定值”;

複製程式碼

(清空資料表內容,不釋放空間,即:下次插入表資料,id依然接著刪除資料的id繼續增加)

資料刪除:

(注:以下刪除都不會清理掉表的形式,只會清理掉表的內容;)


delete * from table_name;

複製程式碼

(直接刪除表格內所有的東西,不可恢復;)


truncate:truncate table 表名1;

複製程式碼

(清空表資料,釋放空間,即:下次插入表資料,id從1重新開始)


表刪除:drop:drop table 表名1;

複製程式碼

(整張表被刪除,要使用該表必須重新建)


修改資料:

指定修改:


update  表名 set 欄位名1=‘新值’,欄位名2=‘新值’ where 欄位名=你想要刪除行的內容;

複製程式碼

全部修改:


update  表名 set 欄位名=‘新值’,欄位名2=‘新值’;

複製程式碼

注:如果不加where子句的話,所有內容都會被改成你指定的值;


查詢資料:

全部查詢:


select * from 表名;

複製程式碼

指定列查詢:


select 指定的列名 from 表名;

複製程式碼

去重查詢:


select distinct * from 表名;

複製程式碼

條件查詢:


select 欄位名 from 表名 where  查詢條件;

複製程式碼

排序查詢:


1,select 欄位名 from 表名 order by 想要排行的欄位名 desc;(倒序)
2,select 欄位名 from 表名 order by 想要排行的欄位名 asc;(正序,asd可以省略)

複製程式碼

求和查詢:


select sum (欄位) from table1 where 條件;

複製程式碼

平均值查詢:


select avg (欄位) from table1 where 條件;

複製程式碼

最大值查詢:


select max (欄位) from table1 where 條件;

複製程式碼

最小值查詢:


select min (欄位) from table1 where 條件;

複製程式碼

表關聯:

(注,這裡我會用column_name代替欄位名這個說法,希望不會影響閱讀)

有關表關聯這方面,雖說就功能而言,這像是在查詢中的內容,但是我還是把它單獨列出來了。畢竟,這當初可是困擾我的難點。

這個關鍵字不難,簡單的來說,就是將兩張表放在一起,通過某一個欄位的關聯,來進行合併查詢。以下為目前已知的關聯區分;

假設要關聯兩張表上的ID欄位進行查詢,那麼,以下為例子(以下語句均在ORACLE資料庫中測試過,可以使用)。

第一張表

左關聯:


select table_name1 as a  left join  table_name2 as b  on a.id =b.id; (這個語句中,as可以省略)

複製程式碼

右關聯:


select * from table_name1 as a  right join  table_name2 as b  on a.id =b.id;  (這個語句中,as可以省略)

複製程式碼

全關聯:


select * from table_name1 as a full join table_name2 as b on a.id=b.id;
select * from table_name1 a join table_name2 as b on a.id=b.id;(這個語句中,full和as都可以省略)

複製程式碼

交叉關聯:


select * from table_name1 as a cross join table_name2 as b on a.id=b.id(這個語句中,as可以省略);

複製程式碼

內關聯:


select * from table_name1 as a inner join table_name2 as b on a.id=b.id;(這個語句中,as可以省略);

複製程式碼

有關表關聯這裡,我在第一遍看的時候,很鬧不明白,也許是我悟性太差,後來查了好幾人的部落格,才弄清楚這裡是怎麼一回事,那麼,在這裡稍微說一下個人的見解吧。

(這裡提前放一下大佬的連結:www.cnblogs.com/thomasguan/…如果有興趣,可以直接看,下邊的個人見解可以跳過了。)

關聯,就是以你確定的欄位名,進行連線,然後對應的開始查詢,一般關聯的欄位名是有一定的相關性的。

通過關聯欄位名,你就可以做到一種對比顯示,而要做到對比顯示,就會有以下幾種可能性:

1,左關聯:以左表為主顯示,而右表不顯示左表中沒有的欄位;

2,右關聯:以右表為主顯示,不顯示左表中沒有的欄位;

3,全關聯:兩個表全部對比,一一對應,無論兩個表中是否有此行,都顯示;

4,內關聯:仍舊是一一對應,但是和上邊正好相反,兩個都沒有的,他就都不顯示;

5,交叉關聯:拿其中的一個表的一行,去對應另一個表中的所有行,然後將以上對應執行到這個表的最後一個。

以上就是關聯查詢的幾個常見形式了,當然,用文字看可能對初學者來說有點繞,這裡我圖省事,就沒有放圖,實際上,要是看結果圖,會非常輕鬆的明白關聯這一塊。

由於剛開始的時候,踩了不少坑,所以我對這裡其實有點打怵。不過過來之後,發現其實也就是那麼一回事,太簡單了,簡直是傻子都能懂的東西(等等,這樣會不會說我自己是傻子了?emmmm。。。。)

分組:

group by

(這個關鍵字用起來很簡單,就是通過欄位名來將表的內容進行分類)


select column_name1, column_name2 from table_name group by column_name3;

複製程式碼

例子:


select XB 性別 ,count(1) 總數 from CET_01 group by XB;

複製程式碼

以上,我通過group by 分組統計了男女生人數,通過欄位的內容進行分組查詢;

having

同where用法,having與group by連用。where是篩選單個記錄,having是篩選分組記錄(先分組,後篩選);


select XB 性別 ,count(1) 總數 from CET_01  group by XB having count(1)>300;

複製程式碼

還是接著上一個例子,這裡我們想讓知道男生和女生中哪個大於300人,我們只需要用having子句,篩選出來就可以了。

注意,這裡有個坑,有的新手不熟悉,會以為這裡可以用where進行篩選,但是實際上,這裡因為group by的分組,where是沒有法使用的,於是便有了having子句。

結語:

說一個悲哀的事實,我本以為自己把SQL的基礎語句看的如此紮實了,應該也沒什麼大事了,就算有問題,憑藉我現在的能力,至少能夠看懂吧?

但是兩天之後,我才有些鬧心的發現,真正的遇到問題的時候,自己的這點水準依舊只是個打雜的,有很多地方的查詢,不是難在語句上,而是難在想法和對錶的熟悉程度上。

真正在用到的時候,更多的是對錶關聯查詢的使用,還有有別名用法,和關聯符的使用。

這個過程中,真正用到最多的,是SQL中自帶的函式,比如DECODE(),sum(),avg(),nvl()一類的函式。

有很多地方,我寫的很重複的SQL語句,之後在大佬檢查了之後,多數會被翻新重寫,我就發現我寫的SQL很沒有靈性。。 至少,他們的SQL寫得很簡單,有種邏輯在裡邊,而不是我這種重複的基礎SQL。

不得不說,路還很長,我還是太嫩,我還需要繼續努力。

最後,如果有能噴的地方,請輕噴。。。或者,能戳到痛點上,給點用處的重噴也行。。。

本來打算過兩天放出自己對函式部分的理解,但是這兩天在公司看了大佬的SQL語句後,瑟瑟發抖。。。神仙寫法,很多時候都有種完全沒想到的感覺。

等後續能夠完全適應了SQL中的函式部分,我會放出自己對SQL的理解的,謝謝。

相關文章