編寫SQL注意事項 一天一句(一)

2021-06-08 04:08:15 字數 1771 閱讀 5576

2012-07-31:

每次寫完儲存過程或一些sql語句,老同事一眼就能看出問題所在,還是咱不認真造成的。今日記下以防後面範同樣的錯誤。

1. 定義新的資料列,確定其資料型別,以免程式中計算錯誤。

建立總金額字段,cast(sum(a.iqty*isnull(a.dprice,0)) as decimal(18,2)) amt  ,之前未設定amt的小數點字段。在個別db設計者有時會將數量或單價設定為real 型別。在sqlserver中 real型別的資料通過公式計算,小數點位數是不定長的。

2.在 from 子句中指定外聯接時,可以由下列幾組關鍵字中的一組指定:

left join 或 left outer join。 左向外聯接的結果集包括 left outer 子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值。

right join 或 right outer join。

右向外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。

full join 或 full outer join。 完整外部聯接返回左表和右表中的所有行。當某行在另乙個表中沒有匹配行時,則另乙個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的資料值。

交叉聯接。

交叉聯接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉聯接也稱作笛卡爾積。

eg1: join

select * from t_tab a  join t_tabs b on a.ibid=b.id

顯示內容為:a表與b表中符合a.ibid=b.id的資料資訊,若無資訊,則為整個資料集為空

eg2:left join  or lefter outer join

select * from t_tab a left  joint_tabs bon a.ibid=b.id

顯示內容為:a表所有的資料資訊+符合a.ibid=b.id的資料資訊。若沒有a.ibid=b.id的資料,則顯示出a表資料+b表(null)的資料資訊。

3.inner join 運算

組合兩個或多個表中的記錄,只要在公共字段之中有相符的值。

多表聯接建立記錄集是十分有用的,因為某些情況下,我們需要把數字資料型別顯示為相應的文字名稱,這就碰到了多表聯接建立記錄集的問題。

注重事項:

●在輸入字母過程中,一定要用英文半形標點符號,單詞之間留一半角空格;

●在建立資料表時,假如乙個表與多個表聯接,那麼這乙個表中的字段必須是「數字」資料型別,而多個表中的相同字段必須是主鍵,而且是「自動編號」資料型別。否則,很難聯接成功。

●**巢狀快速方法:如,想連線五個表,則只要在連線四個表的**上加乙個前後括號(前括號加在from的後面,後括號加在**的末尾即可),然後在後括號後面繼續新增「innerjoin表名xon表1.欄位號=表x.欄位號」**即可,這樣就可以無限聯接資料表了:)

語法格式:

其實innerjoin……on的語法格式可以概括為:

from((( 表1 inner join  表2  on表1.欄位號=表2.欄位號)  inner  join  表3  on  表1.欄位號=表3.欄位號)   inner  join表4 on   member.欄位號=表4.欄位號)  inner   join表x   on   member.欄位號=表x.欄位號

編寫SQL注意事項 一天一句(二)

2012 08 01 case when end 在平時工作中,遇到客戶需要的資料資訊為兩個欄位的組合資訊,比如在表t red 中,有兩個欄位即 spec 規格 specunit 規格單位 但是規格有時候是空值,規格單位是有值的。這樣的情況,客戶要求的需求為,spec specunit 為乙個字段顯...

編寫SQL注意事項 一天一句(四)

union 和 union all 用法 union 操作符用於合併兩個或多個 select 語句的結果集。請注意,union 內部的 select 語句必須擁有相同數量的列。列也必須擁有相似的資料型別。同時,每條 select 語句中的列的順序必須相同。select c1,c2,c3 from t...

一天一句SQL 行列轉換

向前輩學習,view code 1 ifobject id tb is notnull 2drop table tb 3go4 5create tabletb6 7 姓名 varchar 20 8 課程 varchar 20 9 成績 int10 1112 insert into tb values...