---
# System prepended metadata

title: DataBase

---

# DataBase

### Q1. 說明SQL敘述的意義
```code
SELECT*FROM 標標公司 WHERE EXISTS
(SELECT*FROM 旗旗公司 WHERE 產品名稱=橡橡公司.產品名稱 AND 價格>495)
```
>ptt 第10章
:::success
"方框為解釋"
SELECT FROM 標標公司 [從標標公司取得資料]
WHERE EXISTS  [測試是否存在符合下述條件的資料]
(SELECT*FROM 旗旗公司 WHERE 產品名稱=標標公司.產品名稱 AND 價格>495) 
[從旗旗公司取得產品名稱和標標公司相同且價格大於495的資料
(這行解釋也是用途)]
:::
```teacher talk

```

---
### Q2. 
:::info
**Q2-1** 建立檢視表CheckOption來列出價格在400與600之間的書籍資料，含檢查條件。
:::
:::info
**Q2-2** 並且說明執行
```UPDATE CheckOption SET 價格=350 WHERE 書籍編號 = 3 ```
資料異動的結果。
:::
>ptt 第11章
:::success
**Q2-1**
CREATE VIEW CheckOption
AS 
SELECT * 
FROM  書籍
WHERE  價格 > 400 AND 價格 < 600
WITH CHECK OPTION
GO
:::
:::success
**Q2-2**
```code
UPDATE CheckOption 
SET 價格=350 
WHERE 書籍編號 = 3 
```
嘗試插入或更新已經失敗，因為目標檢視指定了
WITH CHECK OPTION 或跨越指定了 WITH CHECK OPTION 的檢視，而該作業產生的一個或多個資料列在 CHECK OPTION 條件約束下並不合格。

or 就下去跑的結果下去寫

成功將書籍編號3的價格改為350，或者因為???出現錯誤。
:::
{%youtube z6dg49S-bxc %}

---
### Q3. 建立預存程序MyProc來方便新增一筆標標公司的產品，並且輸出產品總價格
>ptt 第14章

{%youtube hoSt9KgElko%}
{%youtube 2VcXVnWUt7c%}
{%youtube 9GfXqHQbL4s%}

:::success
```javascript
 CREATE PROCEDURE MyProc
 @paraml char(10), @param2 money
 AS
     declare @param3 money
     INSERT 標標公司 (產品名稱, 價格)
     VALUES(@paraml, @param2)
     SELECT@param3 = SUM(價格)
     FROM 標標公司
     PRINT '目前的總價為: ' + CONVERT(varchar, @param3)
GO
//EXEC MyProc 'MATHLAB 手冊2',350 <---推測此行是因為一開始沒價格才多出來的
```
:::

---
### Q4.
:::info
**Q4-1** 先==建立==觸發程序TEST在++更改++訂單資料時會發送通知。
:::
:::info
**Q4-2** 接著==修改==TEST只在++新增或刪除++訂單資料時才會發送通知。
:::
:::info
**Q4-3** 最後刪除TEST。
:::

:::success
**Q4-1**

CREATE TRIGGER Test
ON 訂單
AFTER UPDATE
AS 
PRINT '又有訂單更改了'


:::

:::success
**Q4-2**

ALTER TRIGGER Test
ON 訂單
AFTER INSERT, DELETE
AS
PRINT'又有訂單異動了'
GO

:::

:::success
**Q4-3**

DROP TRIGGER Test

:::
{%youtube MuGF-WDtocM %}

---
### Q5.撰寫==交易陳述式==將財務部的一張辦公桌轉移到業務部
:::success
```code
BEGIN TRAN                     -- 開始交易 
    UPDATE 物品管理 
    SET 數量 = 數量 + 1 
    WHERE 部門 = '業務部' AND 物品 = '辦公桌' 

    IF @@ERROR > 0 OR @@ROWCOUNT <> 1 
        GOTO NeedRollBack 

    UPDATE 物品管理 
    SET 數量 = 數量 - 1
    WHERE 部門 = '財務部' AND 物品 = '辦公桌' 

NeedRollBack: 
IF @@ERROR > 0 OR @@ROWCOUNT <> 1 
    ROLLBACK TRAN       -- 取消並回復交易 
ELSE 
    COMMIT TRAN           -- 確認交易

SELECT * FROM 物品管理 
WHERE 物品 = '辦公桌' 

GO
```
:::
  