没错,刚做了面试题,又被sql语句给难住了,我太菜了 呜呜呜
首先要了解sql的执行顺序
总体的执行顺序为:
1、from (数据库表来源)
2、join (用于联结多个表)
3、on (表的联结条件)
4、where (筛选条件)
5、group by (开始使用select中的别名,后面的语句中都可以使用)
6、avg,sum…(就是所有的聚合函数)
7、having (多用于分组后的筛选条件)
8、select (要查询的目标)
9、distinct (去重)
10、order by (排序)
11、limit (对输出的数量进行限制)
样例讲解
那些我做过的题(雾:我踩过的坑)
1、查找最晚入职员工的所有信息:(简单类型)
给定数据表:
初解思路(错误思路):
select * FROM employees
where hire_date = max(hire_date)
这儿的话直接运行这个sql都会出现错误,因为在sql中where 后面接的筛选条件中不能够接聚合函数
改正后的解法:(正确思路)
select * FROM employees
where hire_date = (select max(hire_date) from employees)
将其放入子查询中去这种思路即正确了
2、查找入职员工时间排名倒数第三的员工所有信息(中等类型)
select * from employees
order by hire_date DESC
limit 1 offset 2
考察知识点(limit和offset的用法):
1.数据库数据计算是从0开始的
2.OFFSET X是跳过X个数据,LIMIT Y是选取Y个数据
3.LIMIT X,Y 中X表示跳过X个数据,读取Y个数据
4.当LIMIT和OFFSET组合使用的时候,LIMIT后面只能有一个参数,表示要取的的数量,OFFSET表示要跳过的数量 。
3、查询教师表 teachers 和课程表 courses,查询最年长的老师所开课程的学生数,最后返回学生数均超过这些课程的课程信息
数据表teachers:
数据表courses表:
select *
from courses
where student_count > all (
select student_count from teachers t
join courses c1 on t.id = c1.teacher_id
where t.age = max(t.age)
)
后面的4题和6题所用到的数据表也相同
4、请编写 SQL 语句,连接 courses 与 teachers 表,统计不同国籍教师所开课程的学生总数,对于没有任课的老师,学生总人数计为 0 。最后查询教师国籍是 ‘U’ 开头且学生总数在 2000 到 5000 之间的教师国籍及学生总数 (别名为 student_count ),结果按照学生总数降序排列,如果学生总数相同,则按照教师国籍升序排列。(困难类型)
解题方法
sql语句:
select t.country, sum(student_count) as student_count
from courses c right join teachers t on c.teacher_id = t.id
group by country
having country like 'U%' and sum(student_count) between 2000 and 5000
order by student_count DESC, country
该题考察到了排序,模糊查询,范围查询,表联结, 范围挺多的,整体难度有些大
5、请编写 SQL 语句,查询 teachers 表中,各个国家所有教师的平均年龄大于所有国家教师的平均年龄的教师信息。(中等偏难)
select * from teachers t1
where country in (
select country from teachers t2
group by country
having avg(age) >
(select avg(t3.age) from teachers t3)
)
这道题主要是对题目的理解 笔者在之前没有理解清除 导致花费了很长的时间
(错误思路)
(正确思路)
给定一个题目 要求给各个部门的最低薪资的人 加100薪资(提供两张数据表):