1.
很基礎的一道多表查詢題,因爲題目要求:無論person是否有地址信息,都需要基於上述兩表提供person,那很明顯就是保留表1全部+加上表12公共部分,所有使用left join ...on...的結構
select a.FirstName, a.LastName, b.City, b.State from Person as a left join Address as b on a.PersonId = b.PersonId;
2.
排序肯定是使用order by 關鍵字,默認是低到高排序,這裏需要高到低,所以需要desc關鍵字。這裏要第二高的薪水,就需要limit 和offset組合使用,limit是規定返回幾個元素而offset是從索引幾開始返回。這裏還要求如果不足2個時,返回null,所以就要使用ifnull關鍵字,將剛纔的查詢作爲子表。
select
ifnull(
(select distinct Salary from Employee order by Salary desc limit 1 offset 1),null) as SecondHighestSalary;
3.
同樣和上題一樣,ifnull就是判別該值爲Null時,給它什麼值。
select ifnull (unique_id,null) as unique_id,name from Employees left join EmployeeUNI on Employees.id = EmployeeUNI.id;
4.
兩種解法:第一種使用not in 關鍵字,查詢student表中department_id不在Departmengt表中的id的條目,這裏not in要跟一個子表,不能直接寫Departments.id。
第二種解法則是使用聯結,left join,條件則是id = department_id,如果匹配不上,會默認成Null。
select id, name from Students where department_id not in (select id from Departments);
select s.id, s.name from Students s left join Departments d on(d.id = s.department_id) where d.id is Null;
5.
還是聯結的考點。
select P.product_name, S.year, S.price from Product P right join Sales S on P.product_id = S.product_id;
6.
解法:使用子表。結果要求employee_id和team_size兩個參數,前者在原表中有,後者是要求我們使用count來計算出個數,這裏馬上能聯想到group by關鍵字來通過team_id分組,然後計算出個數,來作爲team_size的值。
select e.employee_id,c.team_size from Employee as e,(select team_id,count(team_id) as team_size from Employee group by team_id) as c where e.team_id = c.team_id;
7.
解法:分組加子表,和上題一樣
select p.product_id,c.total_quantity from Product as p,(select product_id,sum(quantity) as total_quantity from Sales s group by product_id) as c where p.product_id = c.product_id;
8.
SELECT
p1.x, p2.x, ABS(p1.x - p2.x) AS distance
FROM
point p1
JOIN
point p2 ON p1.x != p2.x
;
SELECT
MIN(ABS(p1.x - p2.x)) AS shortest
FROM
point p1
JOIN
point p2 ON p1.x != p2.x
;
9.
group by 和having是配合使用的,having的用法與where類似,都是後面添加條件的,但不同的是,where實在聚合函數作用前,而having實在聚合函數作用之後。
select Email from Person group by Email having count(Email) > 1;