1.mysql强制执行索引force index(索引名)
select * from salaries force index(idx_emp_no) WHERE emp_no = 10005
2.sqlite为INDEXED BY 索引名
SELECT * FROM salaries INDEXED BY idx_emp_no WHERE emp_no = 10005
3.mysql-type索引类型
system>const>eq_ref>ref>range>index>ALL越往左边,性能越高
3.1.system级别
3.1.1只有一条数据的系统表
只有一条数据的系统表,就是系统里自带一张表,并且这个表就一条数据,这个基本上就达不到,这个是系统自带的表,而且就一条数据,所以基本达不到;
3.1.2或衍生表只能有一条数据的主查询
3.2.const级别
const条件稍微低一点,但是基本上也达不到;
3.2.1仅仅能查出一条的SQL语句并且用于Primary key 或 unique索引
3.3 eq_ref级别-唯一性索引
3.4 ref级别-普通索引
3.5 range级别检索指定范围的行,查找一个范围内的数据,where后面是一个范围查询 (between,in,> < >=,like);
3.6 index级别查询全部索引中的数据
3.7 ALL级别查询全部表数据,全表扫描
4.连接方式
4.1 内连接 join|inner join
4.1.1.等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
4.1.2.不等值连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
4.1.3.自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
4.2.外连接
4.2.1.left join | left outer join 左联接:是以左表为基准,将a.stuid = b.stuid的数据进行连接,然后将左表没有的对应项显示,右表的列为NULL
4.2.2.right join | right outer join 右连接:是以右表为基准,将a.stuid = b.stuid的数据进行连接,然以将右表没有的对应项显示,左表的列为NULL
4.2.3. full join 全连接:完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。 full join
4.3.交叉连接
CROSS join 交叉连接:交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。
4.4.GROUP_CONCAT(X,Y)聚合函数X是要连接的字段,Y是连接时用的符号,可省略,默认为逗号。此函数必须与 GROUP BY 配合使用,分组汇总
select dept_no,GROUP_CONCAT(emp_no)as employees from dept_emp group by dept_no order by dept_no
输出
d001|10001,10002
d002|10006
d003|10005
d004|10003,10004
d005|10007,10008,10010
d006|10009,10010
5.over开窗函数 --mysql8才支持
开窗函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行。
开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化。
over(partition by class order by sroce) 按照sroce排序进行累计,order by是个默认的开窗函数,按照class分区
over(order by sroce range between 5 preceding and 5 following):窗口范围为当前行数据幅度减5加5后的范围内的。
over(order by sroce rows between 5 preceding and 5 following):窗口范围为当前行前后各移动5行。
控制开窗大小:
CURRENT ROW:当前行
n PRECEDING:往前 n 行数据
n FOLLOWING:往后 n 行数据
UNBOUNDED PRECEDING 表示从前面的起点
UNBOUNDED FOLLOWING 表示到后面的终点
OVER(rows between unbounded preceding and current row) --从起点到当前行
ROW_NUMBER() OVER(ORDER BY first_name ASC) – ROW_NUMBER与over结合使用获取行数
select emp_no,salary,sum(salary) OVER(order by emp_no asc) as running_total from salaries where to_date = ‘9999-01-01’ --running_total为当前列的salary之和
6.sql4大排名函数,需结合over开窗函数使用
ROW_NUMBER()函数作用就是将select查询到的数据进行排序,每一条数据加一个序号,他不能用做于学生成绩的排名,一般多用于分页查询–排序结果示例 1,2,3,4
RANK()函数,顾名思义排名函数,可以对某一个字段进行排名,这里为什么和ROW_NUMBER()不一样那,ROW_NUMBER()是排序,当存在相同成绩的学生时,ROW_NUMBER()会依次进行排序,他们序号不相同,而Rank()则不一样出现相同的,他们的排名是一样的
–1,1,3,4
DENSE_RANK()密集的排名他和RANK()区别在于,排名的连续性,DENSE_RANK()排名是连续的,RANK()是跳跃的排名–1,1,2,3,4
NTILE()函数是将有序分区中的行分发到指定数目的组中,各个组有编号,编号从1开始,就像我们说的’分区’一样 ,分为几个区,一个区会有多少个