2013-03-11 56 views
0

繼教科書「果殼中的SQL」的SQL查詢它要求查詢與國外約束

有電子郵件地址的員工,展示他們的年齡和性別。

在下面的數據庫:

CREATE TABLE EMPLOYEES(
    PID SMALLINT NOT NULL, 
    PRIMARY KEY(PID), 
    CONSTRAINT EMPLOYEES_FK FOREIGN KEY (PID) REFERENCES PERSONS (PID) 
); 

CREATE TABLE PERSONS(
PID SMALLINT NOT NULL, 
NAME VARCHAR(20) NOT NULL, 
GENDER CHAR(1) NOT NULL CHECK (GENDER IN ('M','F')), 
AGE SMALLINT NOT NULL CHECK (AGE BETWEEN 0 AND 120), 
BIRTHDATE DATE NOT NULL, 
PRIMARY KEY(PID) 
); 

CREATE TABLE HASE(
PID SMALLINT NOT NULL, 
EADDR VARCHAR(30) NOT NULL, 
PRIMARY KEY(PID,EADDR), 
CONSTRAINT HASE_FK FOREIGN KEY (PID) REFERENCES PERSONS (PID) 
); 

我很新的SQL查詢,所以我的嘗試是:

SELECT GENDER, AGE 
FROM PERSONS AND EMPLOYEES 
WHERE EXISTS HASE.EADDR 
; 

但我不認爲,即時通訊與國外得到正確的關係鍵。我意識到這是非常基本的,但我認爲一旦我看到查詢的方式,它會幫助我與其他人。

+0

與您的問題沒有關係,但MySQL不強制執行檢查約束。 – 2013-03-11 21:28:07

回答

2

您可以使用EXISTS,讓您的結果

SELECT Gender, Age 
FROM Persons 
    JOIN Employees ON Persons.PID = Employees.PID 
WHERE Exists (SELECT PID 
       FROM Hase 
       WHERE Persons.PID = Hase.PID) 

您也可以使用IN,但EXISTS查詢會更快

SELECT Gender, Age 
FROM Persons 
    JOIN Employees ON Persons.PID = Employees.PID 
WHERE Persons.PID IN (SELECT PID 
         FROM Hase) 
+1

+1,因爲如果員工有*多個*電子郵件地址,這將返回預期結果。 – 2013-03-11 21:27:30

1
SELECT DISTINCT 
    persons.NAME, 
    persons.GENDER, 
    persons.AGE 
FROM 
    persons INNER JOIN employees 
    ON persons.PID = employees.PID 
    INNER JOIN hase 
    ON persons.PID = hase.PID 

請參閱小提琴here

+0

請注意,此查詢將需要額外的開銷,因爲使用DISTINCT並加入其他表。 – 2013-03-11 21:34:33

+0

@MattBusche加入不應該是一個問題(你也可以跳過這兩個連接,並使用兩個IN子句和一個AND)。但確實DISTINCT可能會變慢。 – fthiella 2013-03-11 21:42:18