# DB Mid (04/17) ###### tags: `DB` --- [TOC] --- <style> .markdown-body { min-width: 1200px; } u.dot { text-decoration-style: dotted; } </style> ## Useful Refs - https://hackmd.io/@hami-duck/rk1YP49g9/%2FiU4PYRx4SPm-L_ZlJ-dh0w - MySQL 標準 - https://www.w3schools.com/sql/default.asp ## 考古 2021 ### 1.a ```graphviz graph PAST_2021_1A { label = "Past 2021 1.a\n\n"; labelloc="t"; fontsize=26; layout=dot; fontname="Sarasa Fixed TC, monospace"; node [fontname="Sarasa Fixed TC, monospace"]; edge [fontname="Sarasa Fixed TC, monospace"]; // // Entities // { node [shape=box, fontsize=16, style=filled, fillcolor=lightgrey, ordering="out"]; AIRPORT; FLIGHT; AIRPLANE; node [peripheries=2]; FLIGHT_LEG; LEG_INSTANCE; FARES; SEAT_RESERVATION; }; // // Relationships // { node [shape=diamond, fontsize=16, style=filled, fillcolor=whitesmoke]; S_DEPARTS; S_ARRIVES; A_DEPARTS; A_ARRIVES; node [peripheries=2]; HAS; INSTANCES; OFFERS; PRICES; USES; } // // Attributes // { node [shape=oval, fontsize=14]; AIRPORT -- { AIRPORT_CODE [label=<<u>AIRPORT_CODE</u>>]; NAME; CITY; STATE; }; FLIGHT -- { FLIGHT_NUMBER [label=<<u>FLIGHT_NUMBER</u>>]; AIRLINE; WEEKDAYS; }; FLIGHT_LEG -- { LEG_NUMBER [label=<<u class="text-decoration-style: dotted;">LEG_NUMBER</u>>]; }; LEG_INSTANCE -- { DATE [label=<<u style="text-decoration-style: dotted;">DATE</u>>]; }; FARES -- { FARE_CODE [label=<<u style="text-decoration-style: dotted;">FARE_CODE</u>>]; AMOUNT; RESTRICTIONS; }; AIRPLANE -- { AIRPLANE_ID [label=<<u>AIRPLANE_ID</u>>]; TOTAL_NUMBER_OF_SEATS; }; SEAT_RESERVATION -- { SEAT_NUMBER [label=<<u style="text-decoration-style: dotted;">SEAT_NUMBER</u>>]; CUSTOMER_NAME; CUSTOMER_PHONE; }; S_DEPARTS -- SCHEDULE_DEPARTURE_TIME; S_ARRIVES -- SCHEDULE_ARRIVAL_TIME; A_DEPARTS -- DEPARTURE_TIME; A_ARRIVES -- ARRIVAL_TIME; }; // // Participations // { edge [len=1.8]; FLIGHT -- HAS [label="1"]; HAS -- FLIGHT_LEG [label="N", color="black:invis:black"]; FLIGHT_LEG -- INSTANCES [label="1"]; INSTANCES -- LEG_INSTANCE [label="N", color="black:invis:black"]; FLIGHT -- PRICES [label="1"]; PRICES -- FARES [label="N", color="black:invis:black"]; FLIGHT_LEG -- S_DEPARTS [label="N", color="black:invis:black"]; S_DEPARTS -- AIRPORT [label="1"]; FLIGHT_LEG -- S_ARRIVES [label="N", color="black:invis:black"]; S_ARRIVES -- AIRPORT [label="1"]; LEG_INSTANCE -- A_DEPARTS [label="N", color="black:invis:black"]; A_DEPARTS -- AIRPORT [label="1"]; LEG_INSTANCE -- A_ARRIVES [label="N", color="black:invis:black"]; A_ARRIVES -- AIRPORT [label="1"]; LEG_INSTANCE -- USES [label="N", color="black:invis:black"]; USES -- AIRPLANE [label="1"]; LEG_INSTANCE -- OFFERS [label="1"]; OFFERS -- SEAT_RESERVATION [label="N", color="black:invis:black"]; } // // Layout // { {rank=same; FLIGHT; PRICES; FARES;} {rank=same; LEG_INSTANCE; INSTANCES; FLIGHT_LEG; USES;} edge [style=invis]; SCHEDULE_DEPARTURE_TIME -- AIRPORT; AIRPLANE_ID -- SEAT_RESERVATION; } } ``` <!-- - Entity: - **`AIRPORT`**: <u>`AIRPORT_CODE`</u>, `NAME`, `CITY`, `STATE` - **`FLIGHT`**: <u>`FLIGHT_NUMBER`</u>, `AIRLINE`, `WEEKDAYS` - **[`FLIGHT_LEG`]**: (<u>`FLIGHT_NUMBER`</u>), <u class="dot">`LEG_NUMBER`</u>, (`DEPARTURE_AIRPORT_CODE`, `ARRIVAL_AIRPORT_CODE`), <`SCHEDULE_DEPARTURE_TIME`, `SCHEDULE_ARRIVAL_TIME`> - **[`LEG_INSTANCE`]**: (<u>`FLIGHT_NUMBER`</u>, <u>`LEG_NUMBER`</u>), <u class="dot">`DATE`</u>, (`AIRPLANE_ID`, `DEPARTURE_AIRPORT_CODE`, `ARRIVAL_AIRPORT_CODE`), <`DEPARTURE_TIME`, `ARRIVAL_TIME`> - **[`FARES`]**: (<u>`FLIGHT_NUMBER`</u>), <u class="dot">`FARE_CODE`</u>, `AMOUNT`, `RESTRCITIONS` - **`AIRPLANE`**: <u>`AIRPLANE_ID`</u>, `TOTAL_NUMBER_OF_SEATS` - **[`SEAT_RESERVATION`]**: (<u>`FLIGHT_NUMBER`</u>, <u>`LEG_NUMBER`</u>, <u>`DATE`</u>), <u class="dot">`SEAT_NUMBER`</u>, `CUSTOMER_NAME`, `CUSTOMER_PHONE` --> ### 1.b https://www.w3schools.com/sql/sql_primarykey.asp - composite foreign key - escape from keywords - null? ```sql= -- TOO FUCKING LONG CREATE TABLE AIRPORT ( AIRPORT_CODE INT NOT NULL, NAME VARCHAR(50) NOT NULL, CITY VARCHAR(50) NOT NULL, STATE VARCHAR(50) NOT NULL, CONSTRAINT PK_AIRPORT PRIMARY KEY (AIRPORT_CODE) ); CREATE TABLE FLIGHT ( FLIGHT_NUMBER INT NOT NULL, AIRLINE VARCHAR(50) NOT NULL, WEEKDAYS CHAR(7) NOT NULL, CONSTRAINT PK_FLIGHT PRIMARY KEY (FLIGHT_NUMBER) ); CREATE TABLE FLIGHT_LEG ( FLIGHT_NUMBER INT NOT NULL, LEG_NUMBER INT NOT NULL, DEPARTURE_AIRPORT_CODE INT NOT NULL, SCHEDULE_DEPARTURE_TIME TIME NOT NULL, ARRIVAL_AIRPORT_CODE INT NOT NULL, SCHEDULE_ARRIVAL_TIME TIME NOT NULL, CONSTRAINT PK_FLIGHT_LEG PRIMARY KEY (FLIGHT_NUMBER, LEG_NUMBER), CONSTRAINT FK_FLIGHT_LEG__FLIGHT FOREIGN KEY (FLIGHT_NUMBER) REFERENCES FLIGHT(FLIGHT_NUMBER), CONSTRAINT FK_FLIGHT_LEG__AIRPORT__DEPART FOREIGN KEY (DEPARTURE_AIRPORT_CODE) REFERENCES AIRPORT(AIRPORT_CODE), CONSTRAINT FK_FLIGHT_LEG__AIRPORT__ARRIVE FOREIGN KEY (ARRIVAL_AIRPORT_CODE) REFERENCES AIRPORT(AIRPORT_CODE) ); CREATE TABLE LEG_INSTANCE ( FLIGHT_NUMBER INT NOT NULL, LEG_NUMBER INT NOT NULL, "DATE" DATE NOT NULL, AIRPLANE_ID INT NOT NULL, DEPARTURE_AIRPORT_CODE INT NOT NULL, DEPARTURE_TIME TIME NOT NULL, ARRIVAL_AIRPORT_CODE INT NOT NULL, ARRIVAL_TIME TIME NOT NULL, CONSTRAINT PK_LEG_INSTANCE PRIMARY KEY (FLIGHT_NUMBER, LEG_NUMBER, "DATE"), CONSTRAINT FK_LEG_INSTANCE__FLIGHT_LEG FOREIGN KEY (FLIGHT_NUMBER, LEG_NUMBER) REFERENCES FLIGHT_LEG(FLIGHT_NUMBER, LEG_NUMBER), CONSTRAINT FK_LEG_INSTANCE__AIRPLANE FOREIGN KEY (AIRPLANE_ID) REFERENCES AIRPLANE(AIRPLANE_ID), CONSTRAINT FK_LEG_INSTANCE__AIRPORT__DEPART FOREIGN KEY (DEPARTURE_AIRPORT_CODE) REFERENCES AIRPORT(AIRPORT_CODE), CONSTRAINT FK_LEG_INSTANCE__AIRPORT__ARRIVE FOREIGN KEY (ARRIVAL_AIRPORT_CODE) REFERENCES AIRPORT(AIRPORT_CODE) ); CREATE TABLE FARES ( FLIGHT_NUMBER INT NOT NULL, FARE_CODE INT NOT NULL, AMOUNT INT NOT NULL, RESTRICTIONS VARCHAR(8000) NOT NULL, CONSTRAINT PK_FARES PRIMARY KEY (FLIGHT_NUMBER, FARE_CODE), CONSTRAINT FK_FARES__FLIGHT FOREIGN KEY (FLIGHT_NUMBER) REFERENCES FLIGHT(FLIGHT_NUMBER), ); CREATE TABLE AIRPLANE ( AIRPLANE_ID INT NOT NULL, TOTAL_NUMBER_OF_SEATS INT NOT NULL, CONSTRAINT PK_AIRPLANE PRIMARY KEY (AIRPLANE_ID) ); CREATE TABLE SEAT_RESERVATION ( FLIGHT_NUMBER INT NOT NULL, LEG_NUMBER INT NOT NULL, "DATE" DATE NOT NULL, SEAT_NUMBER INT NOT NULL, CUSTOMER_NAME VARCHAR(50) NOT NULL, CUSTOMER_PHONE VARCHAR(50) NOT NULL, CONSTRAINT PK_SEAT_RESERVATION PRIMARY KEY (FLIGHT_NUMBER, LEG_NUMBER, "DATE", SEAT_NUMBER), CONSTRAINT FK_SEAT_RESERVATION__LEG_INSTANCE FOREIGN KEY (FLIGHT_NUMBER, LEG_NUMBER, "DATE") REFERENCES LEG_INSTANCE(FLIGHT_NUMBER, LEG_NUMBER, "DATE") ); ``` ### 1.c - =="For each ..." 要不要選出來?== https://www.w3schools.com/sql/trysql.asp?filename=trysql_editor ==https://database.guide/5-ways-to-select-rows-with-the-maximum-value-for-their-group-in-sql/== ==https://stackoverflow.com/a/71548342== ```sql= -- UGLY SELECT FLIGHT_LEG.FLIGHT_NUMBER AS "the flight number", FIRST_LEG.SCHEDULE_DEPARTURE_TIME AS "the departure time", LAST_LEG.SCHEDULE_ARRIVAL_TIME AS "the arrival time" FROM FLIGHT_LEG AS FIRST_LEG JOIN FLIGHT_LEG AS LAST_LEG ON FIRST_LEG.FLIGHT_NUMBER = LAST_LEG.FLIGHT_NUMBER WHERE FIRST_LEG.LEG_NUMBER = (SELECT MIN(LEG_NUMBER) FROM FLIGHT_LEG WHERE FLIGHT_LEG.FLIGHT_NUMBER = FIRST_LEG.FLIGHT_NUMBER) AND LAST_LEG.LEG_NUMBER = (SELECT MAX(LEG_NUMBER) FROM FLIGHT_LEG WHERE FLIGHT_LEG.FLIGHT_NUMBER = LAST_LEG.FLIGHT_NUMBER); ``` <!-- SELECT FirstOrder.OrderID, FirstOrder.ProductID AS FirstProductID, FirstOrder.Quantity AS FirstQuantity, LastOrder.ProductID AS LastProductID, LastOrder.Quantity AS LastQuantity FROM OrderDetails AS FirstOrder JOIN OrderDetails AS LastOrder ON FirstOrder.OrderID = LastOrder.OrderID WHERE FirstOrder.ProductID = (SELECT MIN(ProductID) FROM OrderDetails WHERE OrderDetails.OrderID = FirstOrder.OrderID) AND LastOrder.ProductID = (SELECT MAX(ProductID) FROM OrderDetails WHERE OrderDetails.OrderID = LastOrder.OrderID); --> ### 1.d ```sql= SELECT LEG_NUMBER AS "leg number", SUM(TOTAL_NUMBER_OF_SEATS) - SUM(RESERVED_SEATS) AS "the number of available seats" FROM LEG_INSTANCE NATURAL JOIN AIRPLANE NATURAL JOIN (SELECT FLIGHT_NUMBER, LEG_NUMBER, "DATE", COUNT(SEAT_NUMBER) AS RESERVED_SEATS FROM LEG_INSTANCE NATURAL LEFT JOIN SEAT_RESERVATION GROUP BY FLIGHT_NUMBER, LEG_NUMBER, "DATE") WHERE FLIGHT_NUMBER IN (SELECT FLIGHT_LEG.FLIGHT_NUMBER FROM FLIGHT_LEG GROUP BY FLIGHT_LEG.FLIGHT_NUMBER HAVING COUNT(LEG_NUMBER) >= 2) GROUP BY FLIGHT_NUMBER, LEG_NUMBER; ``` ### 1.e ```sql= -- i do not actually know how to calculate "average fares" SELECT AVG(AMOUNT) / COUNT(DISTINCT LEG_NUMBER) AS "average Fares" COUNT(DISTINCT AIRPLANE_ID) AS "number of different planes used in the flight" FROM LEG_INSTANCE -- NATURAL JOIN AIRPLANE NATURAL JOIN FARES GROUP BY FLIGHT_NUMBER; ``` ### 2.a ==TODO== > - R-A step: Managers and Clerks,這個步驟的主要任務是確認使用者的需求,避免開發出的成果不符合使用者的需求,因此會由負責監督專案的 managers 向使用資料庫的 clerks 詢問、確認 clerks 的需求,以便後續開發。 > - M-D step: Managers, Expert and Local IT,這個步驟如其名,也就是要開始規劃資料模型了,而資料模型的設計取決於用戶的需求與資料的特性,因此雖然 managers 沒有任何電腦科學的背景,但仍要參與此步驟以傳達其他 group 的成員最正確的用戶資訊;Local IT 身為開發與後續維護資料庫的主要 group,必須熟知資料庫的設計,故一定是必須參與設計環節的;最後則是來自諮詢公司的 experts,這邊的 experts 相較於 Local IT 應是資料庫領域的專家,他們參與本步驟的討論能夠即時地指出 local IT 可能構想出的模型設計不良或能再改進之處,良好的設計基礎對於開發與後續維護相當有幫助。 > - D-P step: Managers and Local IT,與上步驟類似,Managers 雖無電腦科學背景,但他們在 R-A step 時通過直面用戶,瞭解了用戶的需求與資料特性,故在此步驟需參與監督,以避免實際動手整理資料的 Local IT 破壞了資料;而 Local IT 如前面所述,是實際動手做事的人,故一定會參與此步驟。 > - T-C step: Managers, Clerks and Local IT,此步驟已是最後的測試與驗證步驟,clerks 身為實際使用資料庫的人,能夠參與本階段能較為有效的檢驗成品是否有問題,而在給予 clerks 測試前,Local IT 和 Managers 應會先進行內部測試。( 可能 Local IT 完成後自己測試一遍,自認沒問題後交由熟悉用戶需求的 Managers 再測試一遍,也沒問題才交付 Clerks 進行最後測試 ) > > [name=Cloudy] ### 2.b ==TODO== > - R-A step, M-D step, D-P step。 > - R-A step 部分,若在此部分 managers 沒有正確理解 clerk 的需求,或是在此階段時 clerk 並沒有規劃好未來長遠的需求,就會使得後續的模型設計、資料前處理都受到嚴重的影響,雖然未來再針對需求更新資料庫理論上是可行的,但難度與成本都相當高,也可能造成後續維護困難,使得 DB 無法 work in the long run,故此步驟是關鍵步驟之一。 > - M-D step、D-P step 部分,類似於上步驟所述,不好或錯誤的模型設計或資料前處理對於未來的影響都相當大,而且此類的影響在未來若想修正,都必須付出相當高的代價,故對於資料庫開發來說,此二步驟也是相當關鍵的。 > > [name=Cloudy] ## 考古 2020 ### 1.a ```graphviz graph PAST_2020_1A { label = "Past 2020 1.a\n\n"; labelloc="t"; fontsize=26; layout=dot; fontname="Sarasa Fixed TC, monospace"; node [fontname="Sarasa Fixed TC, monospace"]; edge [fontname="Sarasa Fixed TC, monospace"]; // // Entities // { node [shape=box, fontsize=16, style=filled, fillcolor=lightgrey, ordering="out"]; Library_branch; Book; Borrower; node [peripheries=2]; Book_copy; Loaning; }; // // Relationships // { node [shape=diamond, fontsize=16, style=filled, fillcolor=whitesmoke]; node [peripheries=2]; HasVersion;Loans; IsLoanedTo; IsLoaned; } // // Attributes // { node [shape=oval, fontsize=14]; Library_branch -- { branch_id [label=<<u>branch_id</u>>]; branch_name; address; }; Book -- { book_id [label=<<u>book_id</u>>]; title; author_name; publisher_name; }; Book_copy -- { No_of_copies [label=<<u style="text-decoration-style: dotted;">No_of_copies</u>>]; }; Borrower -- { card_no [label=<<u>card_no</u>>]; name; b_address [label="address"]; phone_number; }; }; // // Participations // { edge [len=1.8]; Book -- HasVersion [label="1"]; HasVersion -- Book_copy [label="N", color="black:invis:black"]; Library_branch -- Loans [label="1"]; Loans -- Loaning [label="N", color="black:invis:black"]; Book_copy -- IsLoanedTo [label="1"]; IsLoanedTo -- Loaning [label="N", color="black:invis:black"]; Loaning -- IsLoaned [label="N", color="black:invis:black"]; IsLoaned -- Borrower [label="1"]; } // // Layout // { {rank=same; Library_branch; Book_copy;} edge [style=invis]; } } ``` ### 1.b ```graphviz digraph PAST_2020_1b { label="Past 2020 1.b\n\n"; labelloc="t"; fontsize=26; layout=dot; fontname="Sarasa Fixed TC, monospace"; node [fontname="Sarasa Fixed TC, monospace"]; edge [fontname="Sarasa Fixed TC, monospace"]; { node [shape=none]; Library_branch [ xlabel=<<b>Library_branch</b>>, label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="6"><tr> <td port="_head" cellpadding="0" border="0"></td> <td port="branch_id"><u>branch_id </u></td> <td port="branch_name">branch_name</td> <td port="address">address </td> </tr></table>> ]; Book [ xlabel=<<b>Book</b>>, label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="6"><tr> <td port="_head" cellpadding="0" border="0"></td> <td port="book_id"><u>book_id</u></td> <td port="title">title </td> <td port="author_name">author_name</td> <td port="publisher_name">publisher_name </td> </tr></table>> ]; Book_copy [ xlabel=<<b>Book_copy</b>>, label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="6"><tr> <td port="_head" cellpadding="0" border="0"></td> <td port="book_id"><u>book_id</u></td> <td port="No_of_copies"><u>No_of_copies</u></td> </tr></table>> ]; Borrower [ xlabel=<<b>Borrower</b>>, label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="6"><tr> <td port="_head" cellpadding="0" border="0"></td> <td port="card_no"><u>card_no</u></td> <td port="name">name</td> <td port="address">address </td> <td port="phone_number">phone_number</td> </tr></table>> ]; Loaning [ xlabel=<<b>Loaning</b>>, label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="6"><tr> <td port="_head" cellpadding="0" border="0"></td> <td port="branch_id"><u>branch_id</u> </td> <td port="book_id"><u>book_id</u></td> <td port="No_of_copies"><u>No_of_copies</u> </td> <td port="card_no"><u>card_no</u></td> </tr></table>> ]; } { edge [style=invis]; Library_branch:_head -> Book:_head; Book:_head -> Book_copy:_head; Book_copy:_head -> Borrower:_head; Borrower:_head -> Loaning:_head; } graph [splines=polyline]; { edge [constraint=false]; Book_copy:book_id -> Book:book_id; Loaning:branch_id -> Library_branch:branch_id; Loaning:book_id -> Book:book_id; Loaning:No_of_copies -> Book_copy:No_of_copies; Loaning:card_no -> Borrower:card_no; } } ``` ### 2.a ```sql= SELECT Fname, Lname FROM EMPLOYEE WHERE NOT EXISTS (SELECT * FROM WORKS_ON JOIN PROJECT ON WORKS_ON.Pno = PROJECT.Pnumber WHERE WORKS_ON.Essn = EMPLOYEE.Super_ssn AND PROJECT.Dnum = 5); ``` ### 2.b ```sql= SELECT Fname, Lname, SUM(WORKS_ON.HOURS) AS "total hours on all projects" FROM EMPLOYEE JOIN WORKS_ON ON EMPLOYEE.Ssn = WORKS_ON.Essn GROUP BY EMPLOYEE.Dno, EMPLOYEE.Ssn, EMPLOYEE.Fname, EMPLOYEE.Lname HAVING COUNT(WORKS_ON.Pno) >= 3 AND MIN(WORKS_ON.HOURS) >= 2; ``` ### 2.c ```sql= SELECT Lname, Salary, Hours FROM EMPLOYEE AS E1 JOIN WORKS_ON ON E1.Ssn = WORKS_ON.Essn WHERE WORKS_ON.Pno IN (SELECT Pno FROM WORKS_ON GROUP BY Pno HAVING COUNT(Essn) > 5) AND Salary > (SELECT AVG(Salary) FROM EMPLOYEE AS E2 GROUP BY Sex, Dno HAVING E1.Sex = E2.Sex AND E1.Dno = E2.Dno); ``` ### 3.a ==TODO== ### 3.b ==TODO== ## 考古 2019 ### 1.a ```graphviz digraph PAST_2019_1a { label="Past 2019 1.a\n\n"; labelloc="t"; fontsize=26; layout=dot; fontname="Sarasa Fixed TC, monospace"; node [fontname="Sarasa Fixed TC, monospace"]; edge [fontname="Sarasa Fixed TC, monospace"]; { node [shape=none]; SHIP [ xlabel=<<b>SHIP</b>>, label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="6"><tr> <td port="_head" cellpadding="0" border="0"></td> <td port="Sname"><u>Sname</u></td> <td port="Owner">Owner</td> <td port="Type">Type</td> <td port="Home_port_cname">Home_port_cname</td> <td port="Home_port_pname">Home_port_pname</td> </tr></table>> ]; SHIP_MOVEMENT [ xlabel=<<b>SHIP_MOVEMENT</b>>, label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="6"><tr> <td port="_head" cellpadding="0" border="0"></td> <td port="Sname"><u>Sname</u></td> <td port="Date"><u>Date</u></td> <td port="Time"><u>Time</u> </td> <td port="Longitude">Longitude </td> <td port="Latitude">Latitude </td> </tr></table>> ]; SHIP_TYPE [ xlabel=<<b>SHIP_TYPE</b>>, label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="6"><tr> <td port="_head" cellpadding="0" border="0"></td> <td port="Type"><u>Type</u></td> <td port="Tonnage">Tonnage</td> <td port="Hull">Hull</td> </tr></table>> ]; PORT [ xlabel=<<b>PORT</b>>, label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="6"><tr> <td port="_head" cellpadding="0" border="0"></td> <td port="Cname"><u>Cname</u></td> <td port="Pname"><u>Pname</u></td> <td port="Oname">Oname</td> </tr></table>> ]; PORT_VISIT [ xlabel=<<b>PORT_VISIT</b>>, label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="6"><tr> <td port="_head" cellpadding="0" border="0"></td> <td port="Sname"><u>Sname</u></td> <td port="Cname"><u>Cname</u></td> <td port="Pname"><u>Pname</u></td> <td port="Start_date"><u>Start_date</u> </td> <td port="End_date">End_date</td> </tr></table>> ]; STATE_COUNTRY [ xlabel=<<b>STATE_COUNTRY</b>>, label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="6"><tr> <td port="_head" cellpadding="0" border="0"></td> <td port="Cname"><u>Cname</u></td> <td port="Continent">Continent </td> </tr></table>> ]; SEA_OCEAN_LAKE [ xlabel=<<b>SEA_OCEAN_LAKE</b>>, label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="6"><tr> <td port="_head" cellpadding="0" border="0"></td> <td port="Oname"><u>Oname</u></td> </tr></table>> ]; } { edge [style=invis]; SHIP:_head -> SHIP_MOVEMENT:_head; SHIP_MOVEMENT:_head -> SHIP_TYPE:_head; SHIP_TYPE:_head -> PORT:_head; PORT:_head -> PORT_VISIT:_head; PORT_VISIT:_head -> STATE_COUNTRY:_head; STATE_COUNTRY:_head -> SEA_OCEAN_LAKE:_head; } graph [splines=polyline]; { edge [constraint=false]; SHIP:Type -> SHIP_TYPE:Type; SHIP:Home_port_cname -> PORT:Cname; SHIP:Home_port_pname -> PORT:Pname; SHIP_MOVEMENT:Sname -> SHIP:Sname; PORT:Cname -> STATE_COUNTRY:Cname; PORT:Oname -> SEA_OCEAN_LAKE:Oname; PORT_VISIT:Sname -> SHIP:Sname; PORT_VISIT:Cname -> PORT:Cname; PORT_VISIT:Pname -> PORT:Pname; } } ``` ### 1.c ```sql= SELECT Fname, Lname FROM EMPLOYEE JOIN WORKS_ON ON EMPLOYEE.Ssn = Works_ON.Essn JOIN PROJECT ON WORKS_ON.Pno = PROJECT.Pnumber WHERE PROJECT.Dnum IN (3, 4) GROUP BY Ssn, Fname, Lname HAVING COUNT(DISTINCT PROJECT.Dnum) = 2; ``` ### 1.d ```sql= SELECT Fname, Lname FROM EMPLOYEE JOIN WORKS_ON ON EMPLOYEE.Ssn = WOKS_ON.Essn GROUP BY Ssn, Fname, Lname HAVING SUM(Hours) > 10; ``` ### 1.e ```sql= -- SUPER UGLY WITH S (Dno, Sum_salary) AS (SELECT Dno, SUM(Salary) FROM EMPLOYEE AS Super WHERE EXISTS (SELECT * FROM EMPLOYEE WHERE Super.Ssn = EMPLOYEE.Super_ssn) GROUP BY Dno), N (Dno, Sum_salary) AS (SELECT Dno, SUM(Salary) FROM EMPLOYEE WHERE NOT EXISTS (SELECT * FROM S WHERE EMPLOYEE.Ssn = S.Ssn) GROUP BY Dno) SELECT S.Dno, S.Sum_salary AS "the total amount of salary for supervisor employees" N.Sum_salary AS "the total amount of salary for non-supervisor employees" FROM S JOIN N ON S.Dno = N.Dno; ``` ### 2 ==TODO== ### 3 ==TODO== ## 考古 2018 ## Notes ### `SELECT` 組成部分邏輯執行順序 1. `FROM` 2. `WHERE` 3. `GROUP BY` 4. `HAVING` 5. `SELECT` 6. `DISTINCT` 7. `ORDER BY` 8. `TOP/FETCH/OFFSET` ### *"List the various cases where the use of a NULL value would be appropriate."* ### *"Discuss the difficulties for possible DBMSs to enforce key, entity integrity and foreign key constraints, if related tables are located in different sites distributedly."* ### *"Discuss the advantages and disadvantages of different ways of handling View Materialization."*