SQL刷题笔记day1

1题目

我的代码:

select * from employees
order by hire_date desc
limit 2,1

标准代码:

select * from employees
where hire_date=
(select distinct hire_date 
from employees 
order by hire_date desc 
limit 2,1)

复盘:因为按照入职日期排列,都不一定只有一个,所以要用distinct按照hire_date进行去重分组,这样才能保证取到的是倒数第三个日期,而不仅仅是倒数第三个记录。

2 题目

我的代码:

select *,dept_no
from salaries join dept_manager
on salaries.emp_no=dept_manager.emp_no
order by salaries.emp_no asc

正确答案:

select s.*,d.dept_no
from salaries s join dept_manager d
on s.emp_no=d.emp_no
order by s.emp_no asc

复盘:涉及到表链接问题,select时要表明是哪个表的,不然会报错。s.和d.,也可以不用重命名,反正要让SQL知道是读出哪个表里面的。

3 题目

我的通过代码:

select e.last_name,e.first_name,d.dept_no
from employees e right join dept_emp d
on e.emp_no =d.emp_no

复盘:这里inner join 和right join(employees当主表在前时)都可以

复习一下 表链接:把表连接在一起(3种方式)

(1)内连接:只两个表保留相同的

那么在dept_emp表中没有的emp_no就不会保存,即employees表中能够保存下来的都是在dept_emp表出现过的表,实现了部门存在才可以分配。

(2)左连接:合并后左边的表所有行都保留,若左边的表有空值则删除(即删除右边没有匹配上的)

(3)右连接:与左相反,合并后右边的表所有行都保留,若右边的表中有空值则删除,但是左边表行中有空值不删(即删除左边没有匹配上的)

相当于也是dept_emp表中出现的有部门的员工才都保存,没有部门的,合并后dept_no 肯定是空值,也会被删除。所以employees当主表的右连接和两个表直接内连接效果相同。

4 题目

我的通过代码:

select e.last_name,e.first_name,d.dept_no
from employees e left join dept_emp d
on e.emp_no=d.emp_no

复盘:考点是左连接,合并后,employees本来存在的行都要保留,即使行中出现空值也要保留。

5 题目

我的通过代码:

select emp_no,count(emp_no) from salaries
group by emp_no
having count(emp_no)>15

复盘:复习了一下之前的笔记才知道,(1)count要先进行聚合,group by字段名:规定依据哪个字段分组聚合,使用该子句是为了依据相同字段值分组后进行聚合运算,常和聚合函数联用。(2)但是在group by之后,就不能用where了,要用having!

————————————————今天就这样吧,明天继续maybe——————

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值