對sql作業的總結(不用group by 通過with as,exists實現分類)

来源:https://www.cnblogs.com/northernmashiro/archive/2018/04/16/8857998.html
-Advertisement-
Play Games

一次資料庫作業 題目如下: Consider the following SQL table definitions: 1. Define sensible key constraints for these tables in SQL. Note: An olympic event (such a ...


一次資料庫作業 題目如下:

Consider the following SQL table definitions:

CREATE TABLE OlympicEvent (
Name text,
Year int,
Description text
);
CREATE TABLE Athlete (
Name text,
DateOfBirth date,
Gender char,
Nationality text
);

1. Define sensible key constraints for these tables in SQL. Note: An olympic event (such as 200m sprint) can take place in multiple years. Different athletes may have identical names, but should be distinguishable by date of birth. [1 mark]

2. Define an SQL constraint that restricts Gender to sensible values. [1 mark]

3. Create the SQL definition for a table Competes recording medals won by athletes competing in Olympic events. Define sensible key and foreign key constraints, as well as a constraint which ensures that medals can only be gold, silver or bronze. Note: While it can happen (in the case of ties) that multiple gold or silver medals are handed out for the same event, an athlete cannot gain multiple medals for the same event.[3 marks] 

4. Write an SQL query returning all nations (nationalities of athletes) that won at least 2 gold medals in 2018. Do not use aggregation (GROUP BY). Note: Each nation satisfying the criteria should be listed only once.[3 marks]

5. Express the same query using aggregation. Submit your answers as pdf file via stream. Include your name and student ID.[2 marks] 

 

對於前3問來講,無非就是建表再加限制

CREATE TABLE OlympicEvent (
  Name VARCHAR(20),
  Year int,
  Description text,
  CONSTRAINT pk_OlympicEvent PRIMARY KEY (Name,Year)
);
CREATE TABLE Athlete (
  Name VARCHAR(20),
  DateOfBirth date,
  Gender char(20) CHECK (Gender ='male' OR  Gender = 'female'),
  Nationality text,
  CONSTRAINT pk_Athlete PRIMARY KEY  (Name,DateOfBirth)
);
CREATE TABLE Competes (
  Athlete_name VARCHAR(20),
  DateOfBirth date,
  OlympicEvent_name VARCHAR(20),
  OlympicEvent_year int,
  Medal CHAR(20) CHECK (Medal = 'gold' OR  Medal = 'silver' OR  Medal = 'bronze'),
  CONSTRAINT fk_Athelete FOREIGN KEY (Athlete_name,DateOfBirth) REFERENCES Athlete(Name,DateOfBirth),
  CONSTRAINT fk_OlympicEvent FOREIGN KEY (OlympicEvent_name,OlympicEvent_year) REFERENCES OlympicEvent(Name, Year)
);

然後往裡面加數據

athlete:

 

olympicEvent表:

competes表:

 

第5問的話 聯表後再用group by 也不是很難

SELECT athlete.Nationality ,count(1) as sum_medals FROM athlete,competes WHERE competes.Athlete_name = athlete.Name GROUP BY athlete.Nationality HAVING count(1)>=2;

結果如下

 

第4問 題目中不讓用group by 問了問老師 也不讓用sum count之類的聚集函數 

我寫的代碼如下

WITH medal_nationality AS (
    SELECT athlete_name, athlete.dateofbirth, olympicevent_year, olympicevent_name, nationality FROM athlete, competes
    WHERE athlete.Name = competes.Athlete_name AND athlete.DateOfBirth = competes.DateOfBirth
)

SELECT DISTINCT nationality FROM medal_nationality t1
WHERE EXISTS(
  SELECT * FROM medal_nationality t2
  WHERE t1.nationality = t2.nationality AND
        (t1.athlete_name, t1.dateofbirth, t1.olympicevent_name, t1.olympicevent_year) <>
        (t2.athlete_name, t2.dateofbirth, t2.olympicevent_name, t2.olympicevent_year)
);

 利用with as 將medal_nationality選出來 包含 athlete_name, athlete.dateofbirth, olympicevent_year, olympicevent_name, nationality 5個欄位,後用exists來選出只返回true的值,條件是必須國籍相等,但兩個人不能是同一個人(見問題1),最後結果為:

算是不用group by 最後也把需要的數據篩選出來了吧 總結完畢 _(:з」∠)_

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 背景:最近購買了騰訊雲伺服器,使用了Ubuntu Server 14.04.1 LTS 64位操作系統,騰訊雲主機ubuntu系統預設用戶名為ubuntu,登錄伺服器時每一次都是以預設賬號ubuntu進行登錄。 導致在使用FileZilla連接伺服器時進行上傳文件操作時,只能以Ubuntu做用戶名進 ...
  • 一、概述 以前看到這樣一句話,語言只是工具,演算法才是程式設計的靈魂。的確,演算法在電腦科學中的地位真的很重要,在很多大公司的筆試面試中,演算法掌握程度的考察都占據了很大一部分。不管是為了面試還是自身編程能力的提升,花時間去研究常見的演算法還是很有必要的。下麵是自己對於演算法這部分的學習總結。 演算法簡介 算 ...
  • 為了便於描述,文中涉及到的代碼部分都是用Java語言編寫的,其實Java本身對常見的幾種數據結構,線性表、棧、隊列等都提供了較好的實現,就是我們經常用到的Java集合框架,有需要的可以閱讀這篇文章。Java - 集合框架完全解析 一、線性表 線性表是最常用且最簡單的一種數據結構,它是n個數據元素的有 ...
  • Linux-CentOS5/6啟動流程 ...
  • centos6.8 鏈接:https://pan.baidu.com/s/1TjCYXzijMzfpiZ9Z-D1Qhg 密碼:7mvn 2.1 新建虛擬機 1 1 2.2 選中稍後安裝操作系統(先把虛擬機建好先) 2 2 2.3 設置此虛擬機安裝哪種操作系統 3 3 2.4 設置虛擬機的名稱和位置 ...
  • 本文為mariadb官方手冊:CREATE TRIGGER的譯文。 原文:https://mariadb.com/kb/en/create-trigger/我提交到MariaDB官方手冊的譯文:https://mariadb.com/kb/zh-cn/create-trigger/ 回到Linux系 ...
  • Neo4j資料庫有兩個版本:社區版和商業版,社區版是開源並且免費的,社區版與商業版功能上沒有什麼區別,不同的是,社區版只能單機使用,商業版可以做分散式集群。單機版最大可以存儲10億個位元組。 Neo4j針對不同的操作系統,提供不同的安裝包,下載官網:https://neo4j.com/download ...
  • 空值操作: null表示空的意思。 一、情況: 1:表中的任何欄位預設情況下都可以為null值。 2:not null表示非空,是一種約束 設置為非空約束的欄位,必須有有效值,不能為空。 3:插入數據時 reg:insert into emp(ename,empno) values(2001,'張三 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...