数据库知识点

数据库

  • 索引

    • 数据库中对数据表的一个或多个字段的值进行排序存储的结构;提高数据查找的速度;

  • 索引失效的情况

    • 使用or查询,前后条件不全带有索引的;

    • 使用like模糊查询时,以%开头;

    • 索引字段为字符串类型时,查询没带引号;

    • 在索引列上做运算或者使用函数

  • 删除大批量数据的优化

    • 删除千万级的数据速度慢的主要原因是数据库需要更新索引;

    • 如果删除的是表的大部分数据,只保留小部分数据,可以把保留的数据保存到一个新表里边,然后drop 旧表,然后再在新表上建立需要的索引、主键。

    • 如果删除的数据是小部分的,可以先把当前的索引备份,然后删除索引,再根据删除条件建立一个临时索引,再开始删除操作,完成后删除临时索引,重建原来的索引;

  • B+树

    • B+树是一个多叉树,通常应用于数据库的索引,B+树中的节点中含有多个关键字,关键字不保存数据,所有的数据保存在叶子节点上;

    • B+树与B树的区别

      • B+树的所有数据都存在叶子节点上,B树的数据存在每个节点上;

      • B树可以在非叶子节点中找到数据后就结束查找,而B+树因为数据存储在叶子节点,每次查找都要从根节点走到叶子节点;

    • B+树比B树更适合做索引的原因:B+树的所有数据存储在叶子节点,且叶子节点使用指针连接,只要遍历叶子节点就可以实现整个数据表的遍历,在数据库中,经常用到范围查询,因此在数据库索引中使用B+树的效率比B树的会高;

  • SQL

    • 查询成绩前三名的记录(包括并列)

      • select * from table as a INNER JOIN (SELECT distinct 成绩 FROM table ORDER BY 成绩 desc LIMIT 3) as b on b.成绩 = a.成绩 order by a.成绩 desc
    • 每科前三的分数(即前三名包括并列)

      • select * from grade as e where (select count(distinct(e1.`score`)) from grade as e1 where  e1.`c_id` = e.`c_id` and e1.`score` > e.`score`) < 3
        
        # 表e中的课程的score 小于 e1中 课程的score 不超过3次,也就是比这个分数大的分数不超过3个,那这个分数就是排在第3;
    • 每门课都大于80

      • select * from grade group by 课程 having min(score) > 80;
    • 超过60分显示pass,低于60显示fail

      • SELECT `c_id`,(CASE WHEN `score` < 60 then 'fail' ELSE 'pass' end ) as mark from grade
    • 删除除了自动编号不同,其他字段都相同的学生冗余信息。

      • delete from stu where 自动编号 not in (select a.id from(select min(自动编号) as id from stu group by 学号,姓名,课程编号,课程名称,分数)as a)
        
        # mysql中不能先select出同一表中的某些值,再update这个表(在同一语句中)。所以将select出的结果再通过中间表select一遍,这样就规避了错误。注意,这个问题只出现于mysql,mssql和oracle不会出现此问题。
    • SQL题目https://www.cnblogs.com/saurik/p/4661789.html

你可能感兴趣的:(数据库)