###### tags: `Database` # SQL 語法 ```sql= /*註解是我*/ SELECT d1.<column1>,d2.<column2> // 選擇顯示欄位 FROM <dataset> <自訂資料庫名(d1)> // 資料來源 dataset JOIN <dataset2> <自訂資料庫名(d2)> // 加入其他資料來源 JOIN <dataset3> <自訂資料庫名(d3)> ON (d1.id = d3.id) // 以 id 資料串連(合併) d1,d3 WHERE <查詢條件> WHERE <查詢條件(子查詢)> GROUP BY d1.<col> // 以 col 分組 HAVING <查詢條件> ORDER BY d1.<col> // 以 col 排序(小到大) ; ``` --- ``` ### HAVING vs WHERE ### - WHERE : 優先使用,通常要放在 GROUP BY 前面 - HAVING : 有 GROUP BY 以及要對 GROUP BY 後計算的函數作條件運算時再使用 會放在 GROUP BY 後面 ex : HAVING AVG(xxx) > 3... ``` --- ```sql= /**/ = IN LIKE UNION /*聯集 : SELECT 的數量要一樣,多可補 0*/ /*TOP-N*/ SELECT <column>, ROWNUM as rn FROM ( SELECT <column> FROM table ORDER BY <排序欄> ) WHERE rn <= 3 ``` ```sql= WHERE <查詢條件(子查詢)> /*相關子查詢*/ SELECT... FROM table1, table2 WHERE col1 > ( SELECT AVG(col1) FROM table1 WHERE col2 = table2.col2 ; ) /*子查詢是否存在滿足條件資料*/ EXISTS WHERE EXISTS (子查詢) ``` ```sql= /* 取出前三高薪水 data */ SELECT salary FROM ( SELECT last_name, salary FROM employees ORDER BY salary DESC ) WHERE ROWNUM <= 3 ``` <br> ## 資料更動 ```sql= /*新增資料*/ INSERT INTO <表格1>(欄位1, 欄位2) VALUES (欄位值) /*建立表格*/ CREATE TABLE <表格1>(欄位1, 欄位2) /*更改資料*/ UPDATE <table> SET <要更改的 column> = <要設定的值> WHERE <篩選條件> UPDATE <table> SET <要更改的 column> = (子查詢) /* 刪除資料*/ DELETE FROM <table> WHERE <篩選條件> /*建立 View*/ CREATE VIEW view_name (子查詢) AS SELECT .... ``` ```sql= /*交易 Transaction*/ /*ACID 特性*/ COMMIT /*完成交易 : 資料確定完成更動後使用*/ ROLLBACK /*還原交易 : 還原資料更動*/ DDL / DCL /*auto commit*/ /*交易結束時機*/ - 關閉資料庫 - 結束更動資料庫程式 - system crash ``` ```sql= /* 將子查詢表格儲存到 xxx 變數 */ WITH xxx AS ( SELECT ooo AS oo /* 自訂子表格欄位名 */ ...子查詢表格... ) ``` ```sql= /* 給權限 */ GRANT select /*updata(col),insert...*/ ON 表格 TO user1, user2 GRANT select /*up*/ ON 表格 TO user1, user2 WITH GRANT OPTION /* user 可再給其他人權限 */ /* 取回權限 */ REVOKE select ON 表格 FROM user ``` --- Attribute : 雙圈圈 : 內有多個值 底線 : 唯一值 key 虛線 : 計算出來的 attribute 菱形雙條線 : weak entity type,弱連結,可能有此關係可能沒有 單連結線 : 一部分的連結,部分參與 ( ex:一部分的 employee 是 Manager ) 雙連接線 : 全部皆有連結,全部參與 ( ex:所有部門皆有 Manager ) --- - 全部課程皆要有管理者 (雙連結線) - 教室、老師、開課班級加上多值(雙圈圈) - 計算出來的值 : 剩餘名額、已選課人數.... - 關係與功能要分開 - 改課程關係 (修課) - 課程加入 : 學期 - 系所資訊 (R:開課) : - 教師資訊 (R:授課) : 姓名、學系... - /### 每個 Entity 都要有 Key attribute --- ### Data Model :::success Relational Model | 理論講法 | 實際用法 | 其他用法 | | -------- | -------- | -------- | | Relation | 資料 Table | | Tuples | 每筆資料列 | | Attributes | Attributes 屬性 | schemas ( 在圖表用法 ) | Degrees | 屬性數量 | | Domain | | | Status | | 資料順序不重要 Relation - 一個屬性只有一個值,如果為多值要另外成立 table - 缺值 NULL 意義 : - 未知值 - 被篩選掉 - 無法定義 - 符號定義 - 大寫 : - Status : - Tuple : - Constrains (規則限制) : 資料變動時要符合 Constrains - Implicit Constrains : ex : - explicit Constrains : - Domain Constrains : 資料型態限制 - Key Constrains : 每個 Tuple 的值都不能相同(重複) - ...... - Key : - Primary Key : 最有代表性的 Key - Foreign Key : 可以連結不同 Table 的屬性 :::