数据库sql基本语句刷题

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;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章