几个常见的SQL面试题

1、表一test1 id fgid source,表二test2 id fgid cuid,test1的fgid和source是一一对应的,求每个source的cuid的个数。

思路:第一遍读这个题有点晕,不知所云。然后反复读了几遍,终于有所顿悟,不就是求表一的fgid对应表二的fgid行数数吗。

考察点: right join
数据实例

test1                                                                                     test2

91F9D9DC-2D1F-4F10-AD57-F2DA7C209C4EC93345AA-EDC7-42ED-A0B2-57A6CD983D47

 

 

 

 

 

 

答案

select source, count(*) from (select source from t1 right join t2 on t1.ftid=t2.ftid) a group by source;

结果
4567F59B-B03C-4A04-9071-6612ADE9DF44

 

 

 

 

 

2、学生表student id name class score,找出每门功课都大于80分的同学名字。

数据实例:

E13B1570-5048-448B-AE9F-E346702A3DCF

 

 

 

 

 

 

 

 

 

思路:这个题需要用排除法,排除所有小于80分的同学。

考察点:not in

答案:

select distinct name from student where name not in(select name from student where score < 80);

结果集:
5BF140FB-9728-411F-BF98-916DC550304A

 

 

 

3、还是student 表,删除所有除id不同别的列都相同的冗余数据。

数据实例

B8C9EF81-7136-4A08-BFD6-3F50FE5676F9

 

 

 

 

 

思路:先找出所有存在冗余的数据,然后根据id删除。

答案

delete from student where id not in(select * from( select min(id) from student group by name,class,score) a);
JackSun

JackSun

I'm a coder.

No Responses

  1. fuhuamosi says:

    第一个有问题吧,source里没有6。我觉得应该是
    SELECT
    a.source ,
    sum(
    CASE
    WHEN a.cuid IS NULL THEN
    0
    ELSE
    1
    END
    )
    FROM
    (
    SELECT
    test1.source ,
    test2.cuid
    FROM
    test1
    LEFT JOIN test2 ON test1.ftid = test2.ftid
    ) a
    GROUP BY
    a.source;

  2. 苏治武 says:

    a group by source; 这个 a是 什么作用? sql小白 求教

  3. 苏治武 says:

    真心求教 a group by source; 这个 a是 什么作用? sql小白 求教

  4. Anonymous says:

    我懂了。。。啦啦啦

Leave a Reply

Your email address will not be published.