1 强制索引
表结构如下
需求
针对salaries
表emp_no
字段创建索引idx_emp_no
,查询emp_no
为10005
, 使用强制索引
。
SQL语句
select * from salaries force index(idx_emp_no) where emp_no = 10005;
运行截图
2 构造触发器
表结构如下
需求
构造一个触发器audit_log
,在向employees_test
表中插入一条数据的时候,触发插入相关的数据到audit
中。
SQL语句
create trigger audit_log
after insert on employees_test for each row
begin insert into audit values(new.id, new.name);
end;
3 dense_rank()
函数
表结构如下
需求
查询通过的题目的排名,通过题目个数相同的,排名相同,此时按照id升序排列
SQL语句
select id, number, dense_rank() over(order by number desc) as t_rank
from passing_number
order by number desc,id;
与RANK()
函数不同,DENSE_RANK()
函数始终返回连续的排名值。常用PARTITION BY
子句将FROM
子句生成的结果集分区。
运行结果
4 子查询
表结构如下
需求
查找所有员工的last_name
和first_name
以及对应的dept_name
,也包括暂时没有分配部门的员工(null
)。
SQL语句
select e.last_name, e.first_name, t.dept_name
from employees e left join
(select de.emp_no, d.dept_name from dept_emp as de
left join departments as d
on de.dept_no = d.dept_no) as t
on e.emp_no = t.emp_no;
分析:
直接进行连接操作的话是找不到条件的,所以要使用子查询建立一个新的表
。括号中的语句
select de.emp_no, d.dept_name from dept_emp as de
left join departments as d
on de.dept_no = d.dept_no
相当于新建了一个表
然后将这个表与employees
表通过emp_no
条件连接,实现最终的查询。
运行结果
5 创建外键约束
表结构如下
需求
在audit
表上创建外键约束,其emp_no
对应employees_test
表的主键id
。
SQL语句
alter table audit
add foreign key(emp_no)
references employees_test(ID);