顯示具有 SQL 標籤的文章。 顯示所有文章
顯示具有 SQL 標籤的文章。 顯示所有文章

2012年8月23日 星期四

0823 SQL SERVER 實作練習



留言板

會員登入可以留言,沒有登入只能瀏覽
會員可以刪除自己的留言
管理者可以刪除所有的留言

(這個以前寫過類似的,不過少了管理者及會員可以刪除留言的功能,其他的彷彿沒差!!!)

資料表:

帳號
流水號
帳號
密碼
Email

留言
流水號
貼文者
貼文時間
貼文標題
貼文內容

回覆留言
流水號
留言編號
貼文者
貼文時間
貼文標題
貼文內容

公司網站



功能

最新消息
(資料表)最新消息內容
流水號
日期
標題
內容
                貼文者

公司簡介
(資料表)靜態文章
流水號
最後修改日期
標題
內容
                最後修改人

產品介紹 (需分類)
(資料表)產品類別
流水號
類別名稱

(資料表)產品內容
流水號
                產品類別
產品名稱
簡介

與我聯絡
(資料表)聯絡歷史
流水號
姓名
電話
Email
內容

(資料表)管理者帳號
流水號
帳號
密碼
姓名



2012年8月22日 星期三

0823 SQL 語法

建立暫存資料表



新增資料表後,限定他的輸入值,除了sql 語法輸入外,SQL SERVER 可以使用條件約束視窗,設定

例如年紀大於零 AGE >0
        性別 限定為 F or M gender in ('F','M')
使用alter table 修改資料表,各家資料庫的指令有很大的差異,故這是最大的麻煩,所以SQL SERVER 我們用圖形介面

欄位直指有少是幾個時不適合做索引
複合索引 是兩個以上地欄位做索引如果只查詢其中一個欄位,則此複合索引沒有作用

檢視表, 將常用的查詢建立檢視表,可供未來方便多次查詢,但若是檢視包含複雜的彙總及運算,應該改用暫存資料表
建立一個view(檢視)
暫存資料表語法
檢視表語法

交易
Transation 大量的資料刪除 新增或更新,利用交易指令,其視為一個整體指令,會從
begin transation 起開始將指令存於暫存檔,一直到最後commit,一次將所有指令一次執行完,效率也比一筆一筆執行還好,另外,部分資料若沒有依次刪除乾淨,也會造成剩餘的資料會有對應不到的情況,造成錯誤!

動態統計
老師的習題 是將數量動態累計


我將習題更改為 數量為移動2筆訂單數量累計

訂單數量的五筆移動平均 語法請注意 between and 的條件意義跟我上一題做
資料庫 資料排序(不知道幹嘛一定要在資料庫查詢中做排序) 其實應用上也不太複雜,但腦要轉一下
隨機選取 資料

SQL SERVER 就在 ....當中上完了,接下來老師要上的是如何用JSP連接資料庫,

2012年8月20日 星期一

0820 SQL

硬碟備援( RAID 磁碟陣列)

RAID 0 
   兩顆硬碟 一半左邊,一半右邊,目的是未了存取及開機加速!!

RAID 1 
  兩顆硬碟 一份資料每一顆各抄一份,速度比RAID 0 慢一點

RAID 5
  三顆硬碟 兩顆硬碟 一半左邊 一半右邊 運算結果在另一顆,速度比RAID 1 快 比RAID 0慢

若是一顆硬碟壞掉了
 RAID 0 資料無法救援, RAID 1 資料可以救回, RAID 5 可利用另外兩顆硬碟推算回另一顆硬碟資料!!


資料庫的備份及還原從選取資料庫後按右鍵-->工作-->備份或還原 即可見到選項視窗

備份若要選交易紀錄備份必須更改設定

在資料庫的屬性選項請將復原模式改為完整!
資料庫備份時先做完整備分,資料修改後可以做交易紀錄備份!
資料還原時可以依照時間點還原所需的備份還原!!
當資料庫有錯誤產生,愈還原指定時間點時,作法: 確認發生錯誤前有完整備份,錯誤發生後作一個交易備份,然後再做一個完整備份作以防萬一用,再利用先前的完整備份還原資料庫!應該是可以回復正常資料,若不成,請再還原以防萬一用的!!!!備份

SQL 的登入權限,必需在伺服器的安全性中,新增登入的帳戶,才能指派其能登入的資料庫的安全性權限

操作 在安全性按右鍵選新增-->登入-->即可建立新使用者
請區分清楚伺服器的安全性及資料庫的安全性選項


利用create table 建立 資料表 並設定主索引鍵

create table DEMED
(
   user_id   int    not NULL,
   user_name varchar(50) not NULL,
   constraint DEMED_pk
   primary key (user_id)
);


如此在建立資料表同時也設定 primary key 是 user_id
利用索引鍵資料夾--> 按右鍵-->新增外部索引--> 建立一個外部索引讓資料搜尋時效率更好

2012年8月17日 星期五

0817 SQL exits

當子查詢存在時 SHOW 出母查詢的相關資料

當子查詢 四月份有訂單時,SHOW出客戶編號及客戶名稱
等價查詢 我用了3個方式查出同樣地答案

兩個查詢組合成一個結果

UNION             聯集 (會刪除重複地項目) UNION 則不會刪除重複項目
INTERSECT     交集
EXCEPT           前一個查詢 扣掉 後一個查詢的結果

(因為現在練習的範本資料表非常少樣本,故執行起來覺得功能不明顯,覺得這些功能用 where 下條件就可以解決之類的)
譬如說

SELECT * FROM 訂單 WHERE DATEPART(M,日期) = 4
UNION
SELECT * FORM 訂單 WHERE DATEPART(M,日期) = 5
意思是說聯集四月及五月的訂單 
那也等價於
SELECT * FORM 訂單 WHERE DATEPART(M,日期)=4 OR DATEPART(M,日期)=5


新增 及 刪除 資料表

drop table DEMO                           (刪除資料表)

CREATE TABLE DEMO               (建立資料表)
(
ID           int     not null,
username nvarchar(20) not null,
phone    nvarchar(10),
);

insert into DEMO                            (新增資料到資料表內)
(ID, username, phone) VALUES (1, 'john', '0933333333')

將某個資料表的欄位資料 新增到另一個資料表
下面練習是將客戶資料表的編號 名稱及電話 新增到 demo資料表內
insert into DEMO
(ID, username, phone)
select 客戶編號, 客戶名稱, 電話 from 客戶


今天的語法
insert
delete
update set
select top 5 * from table order by 

2012年8月15日 星期三

0815 SQL 語法 日期的應用 摘要及分組

DATEPART 從日其中抽出一個日期值

SELECT GETDATE();

SELECT DATEPART(YEAR, GETDATE()) ;
得到的值是 2012 所以DATEPART 是很有用的
請在網路上搜尋DATEPART地說明
這個真的真的真的常用!!!
常用到取得的數值做比較
選取 BOOK資料表中1999年5月的銷售資料


日期時間是用數值表示 整數代表日 小數代表時間
UNIXTIME UNIXDATE (1970 01 01 00:00)代表起始值
第二種                             (1900 01 01 00:00)
第三種                             (0000 01 01 00:00)

日期相加減必須先轉型(不是從資料庫獲得的訊息)

select '2012-9-1'-'2012-8-1' 得到是錯誤訊息 因為是兩個字串相減 (無法計算) 必須轉型
select convert(datetime, 2012-9-1) - convert(datetime, 2012-8-1)
結果是  1900-2-1 因為是datetime 格式 從起始值表示 (1900-01-01) 故答案也是錯誤 必須在轉型

正確是
select convert(integer, (convert(datetime, 2012-9-1)-convert(datetime, 2012-8-1)) = 31
答案是31天

從資料庫擷取到的日期相加減 如下,請注意函數的不同....


日期格式轉換用convert 必須轉為varchar


CONVERT 語法說明


利用case 計算條件數值

利用coalesce 將 null值轉為其他值表現出來 ,在SQLserver 可以用isnull 的功能代替!!
nullif 是將 其他值轉換為null 值 可避免除數是0

分組之後再匯總
使用彙總函數分類篩選資料庫,重點是先分類再彙總

 資料摘要與分組

第一個是取銷售料最大第一筆訂單,重要的是用兩層select
第二個選取客戶總數(不重複)

0813 SQL 語法

建立空白資料庫按右鍵選工作匯入資料庫FROM ACCESS
資料庫匯入匯出 主索引鍵會消失 請自己留意再加入

SELECT *DISTINCT USERNAME AS "使用者名稱"  from username order by username

select * form 書籍  order by 單價 asc(由小到大) desc(由大到小)

SELECT 訂單序號,客戶名稱,書籍名稱,單價,數量,單價*數量 AS 小計 from 書籍訂單

ORDER BY 小計 DESC ,數量 asc


SQL 的 SELECT 語法必須按照順續
SELECT COLUMNS
   FROM table
  [JOIN joins]
  [WHERE search_condition]
  [GROUP BY grouping_columns]
  [HAVING search_condition]
  [ORDER BY sort_columns];

 別名不可馬上使用,必需在from table 之後

標準版安裝可選擇排序的方式,注音方式排序或筆畫順序排序,
一般SQL大小寫可通用,也可在標準版安裝時設定不可通用



SELECT 訂單序號,客戶名稱,書籍名稱,單價,數量,單價*數量 AS 小計 from 書籍訂單

ORDR BY 小計 DESC ,數量 asc




索引
order by 數量 若沒有建立索引 軟體本身會使用快速排序法處理
資料庫觀念 索引

語法錯誤
SQL 語法中的WHERE會先執行,股上述語法錯誤

更正方式有二

至於上述兩個語法誰的效率比較好呢? 我猜是 單價*數量  比雙層語法來得 簡單吧!


NOT 的語法 在 WHERE 的後面 或是在 IS 跟 NULL的中間
SELECT id, username, number FROM username WHERE NOT number IS NULL

運算語法



兩個欄位相加



0809 SQL ACCESS

正規化

以下是微軟對資料庫正規化的說明

正規化說明

正規化是在資料庫中組織資料的程序。其中包括建立資料表,以及在這些資料表之間根據規則建立關聯性,這些規則的設計目的是:透過刪除重複性和不一致的相依性,保護資料並讓資料庫更有彈性。 

重複的資料會浪費磁碟空間,並產生維護方面的問題。如果必須變更現有資料,並且該資料的位置超過一個以上,就必須在所有位置上以完全相同的方式進行變更。如果資料只儲存於 [客戶] 資料表中,而不儲存於資料庫中任何其他位置,變更客戶地址就會更容易執行。

何謂「不一致的相依性」?使用者在 [客戶] 資料表中查找特定客戶的地址,確實是直覺反應,可是在 [客戶] 資料表中查找拜訪該客戶之員工的薪資,就沒有什麼道理了。員工的薪資與該名員工相關,也就是所謂相依,因此應該移到 [員工] 資料表中。不一致的相依性會讓資料難以存取,因為查找資料的路徑可能會遺失或中斷。

資料庫正規化有一些規則。每條規則都稱為「正規形式」。如果遵守第一條規則,資料庫就稱為屬於「第一正規形式」。如果遵守前三條規則,資料庫就被視為屬於「第三正規形式」。雖然可能會有其他層級的正規形式,但第三正規形式被視為大部分應用程式所需的最高階正規形式。

雖然有許多正式規則與規格,但真實情況不一定永遠完全都相同。一般而言,正規化需要其他資料表,有些客戶也會嫌麻煩。如果您決定違反正規化前三個原則中的其中一個原則,請確定您的應用程式能夠掌握所有可能發生的問題,例如重複的資料與不一致的相依性。

下列說明包括範例。

第一正規形式

  • 刪除各個資料表中的重複群組。
  • 為每一組關聯的資料建立不同的資料表。
  • 使用主索引鍵識別每一組關聯的資料。
不要在單一資料表中使用多重欄位儲存類似的資料。例如,要追蹤來自兩個可能來源的存貨項目,存貨記錄會包含 [廠商代碼 1] 與 [廠商代碼 2] 欄位。

當您增加第三個廠商時,會發生什麼狀況?增加欄位並不能解決問題,增加欄位需要修改程式與資料表,而且無法順利納入數目不斷變動的廠商。您應該採取另外一種作法,就是將所有廠商資料另外放置在不同的資料表中 (稱為 [廠商]),然後使用項目編號索引鍵,將存貨連結至廠商;或使用廠商代碼索引鍵將廠商連結至存貨。

第二正規形式

  • 為可套用於多筆記錄的多組值建立不同的資料表。
  • 使用外部索引鍵,讓這些資料表產生關聯。
記錄不應依賴資料表主索引鍵之外的索引鍵,但是必要時可使用複合索引鍵。以會計系統中的客戶地址為例。[客戶] 資料表需要地址,但 [訂單]、[送貨]、[發票]、[應收帳款] 與 [會計] 資料表也都需要地址。不要將客戶地址儲存為這些資料表中的不同項目,而是儲存在一個位置,例如儲存在 [客戶] 資料表或另外一個 [地址] 資料表中。

第三正規形式

  • 刪除不依賴索引鍵的欄位。
記錄中的值如果不是該筆記錄之索引鍵的一部分,就不屬於資料表。一般而言,只要欄位群組的內容可以套用至資料表中一筆以上的記錄時,您就可以考慮將這些欄位放置在不同的資料表中。

例如,在 [員工招募] 資料表中,會包含某位求職者的學院名稱與地址。但是您需要完整的學院清單,以整批寄送郵件。如果學院資訊儲存在 [求職者] 資料表中,就無法列出不含目前求職者的學院清單。因此,您應該要另外建立 [學院] 資料表,然後再使用學院代碼索引鍵連結至 [求職者] 資料表。

例外狀況:既要遵守第三正規形式,又要符合理論,實際上並不是永遠都行得通。如果您有 [客戶] 資料表,並且想要刪除所有可能的欄位間相依性,則必須分別為城市、郵遞區號、銷售人員、客戶類別,以及其他可能會在多筆記錄中重複的因素,建立不同的資料表。理論上,正規化值得追求。但是太多小型資料表可能會降低效能,或超過可開啟的檔案與記憶體容量。 

比較可行的方法是只針對變更頻繁的資料運用第三正規形式。如果保留某些相依的欄位,請將應用程式設計為要求使用者在欄位變更時,驗證所有相關聯的欄位。

其他正規化形式

第四正規形式,也稱為「Boyce Codd 正規形式」(BCNF);而第五正規形式雖然存在,但實際設計時則很少考慮此形式。漠視這些規則的結果可能無法設計出最完美的資料庫,但不會影響資料庫功能。

正規化範例資料表

下列步驟示範將虛構學生資料表正規化的程序。
  1. 未正規化的資料表:

    學號導師導師辦公室課程 1課程 2課程 3
    1022Jones412101-07143-01159-02
    4123Smith216201-01211-02214-01
  2. 第一正規形式:沒有重複的群組

    資料表應該只有兩個維度。因為一個學生會上數種課程,所以課程應該另列資料表。因此,上述資料中的欄位 [課程 1]、[課程 2] 和 [課程 3] 即是設計問題所在。

    試算表經常使用第三維度,但是資料表不應該使用第三維度。另一個解決此問題的方式是使用一對多關聯性,不要將一邊與多邊放在相同的資料表中。而是應該藉由刪除重複的群組 (課程 #),以第一正規形式建立另一個資料表,如下所示:

    學號導師導師辦公室課程 #
    1022Jones412101-07
    1022Jones412143-01
    1022Jones412159-02
    4123Smith216201-01
    4123Smith216211-02
    4123Smith216214-01
  3. 第二正規形式:刪除重複的資料

    請注意上述資料表中,每個 [學號] 值都會配對多個 [課程 #] 值。由於 [課程 #] 在運用時並不會依賴 [學號] (主索引鍵),因此這個關係並非第二正規形式。

    下列兩個資料表將示範第二正規形式:

    學生:

    學號導師導師辦公室
    1022Jones412
    4123Smith216


    註冊課程:

    學號課程 #
    1022101-07
    1022143-01
    1022159-02
    4123201-01
    4123211-02
    4123214-01
  4. 第三正規形式:刪除不依賴索引鍵的資料

    最後一個範例中,[導師辦公室] (導師的辦公室編號) 在運用時會依賴 [導師] 屬性。而解決的方法,就是將該屬性從 [學生] 資料表移至 [教職員] 資料表,如下所示:

    學生:

    學號導師
    1022Jones
    4123Smith


    教職員:

    名稱辦公室部門
    Jones41242
    Smith21642