数据库之SQL(一)

news/2024/7/8 2:55:53 标签: 数据库, sql, 面试

目录

一、简述数据库分页

二、简述SQL中的聚合函数

三、简述表与表是如何关联的

四、简述外连接

五、简述数据库的左连接和右连接


一、简述数据库分页

        1、MySQL分页语法:

        在MySQL中,SELECT语句默认返回所有匹配的行,它们可能是指定表中的每个行。为了返回第一行或前几行,可使用LIMIT子句,以实现分页查询。LIMIT子句的语法如下:

sql">-- 在所有的查询结果中,返回前5行记录。
SELECT prod_name FROM products LIMIT 5;
-- 在所有的查询结果中,从第5行开始,返回5行记录。
SELECT prod_name FROM products LIMIT 5,5;

        总之,带一个值的LIMIT总是从第一行开始,给出的数为返回的行数。带两个值的LIMIT可以指定从行号为第一个值的位置开始。

        2、优化LIMIT分页:

        在偏移量非常大的时候,例如 LIMIT 10000,20 这样的查询,这时MySQL需要查询10020条记录然后只返回最后20条,前面的10000条记录都将被抛弃,这样的代价是非常高的。如果所有的页面被访问的频率都相同,那么这样的查询平均需要访问半个表的数据。要优化这种查询,要么是在页面中限制分页的数量,要么是优化大偏移量的性能。

        优化此类分页查询的一个最简单的办法就是尽可能地使用索引覆盖扫描,而不是查询所有的列,然后根据需要做一次关联操作再返回所需的列。对于偏移量很大的时候,这样做的效率会提升非常大。考虑下面的查询:

sql">SELECT film_id,description FROM sakila.film ORDER BY title LIMIT 50,5;

        如果这个表非常大,那么这个查询最好改写成下面的样子:

sql">SELECT film.film_id,film.description
FROM sakila.film
INNER JOIN (
SELECT film_id FROM sakila.film ORDER BY title LIMIT 50,5
) AS lim USING(film_id);

        这里的“延迟关联”将大大提升查询效率,它让MySQL扫描尽可能少的页面,获取需要访问的记录后再根据关联列回原表查询需要的所有列。这个技术也可以用于优化关联查询中的LIMIT子句。有时候也可以将LIMIT查询转换为已知位置的查询,让MySQL通过范围扫描获得对应的结果。例如,如果在一个位置列上有索引,并且预先计算出了边界值,上面的查询就可以改写为:

sql">SELECT film_id,description FROM skila.film
WHERE position BETWEEN 50 AND 54 ORDER BY position;

        对数据进行排名的问题也与此类似,但往往还会同时和GROUP BY混合使用,在这种情况下通常都需要预先计算并存储排名信息。

        LIMIT和OFFSET的问题,其实是OFFSET的问题,它会导致MySQL扫描大量不需要的行然后再抛弃掉。如果可以使用书签记录上次取数的位置,那么下次就可以直接从该书签记录的位置开始扫描,这样就可以避免使用OFFSET。例如,若需要按照租赁记录做翻页,那么可以根据最新一条租赁记录向后追溯,这种做法可行是因为租赁记录的主键是单调增长的。首先使用下面的查询获得第一组结果:

sql">SELECT * FROM sakila.rental ORDER BY rental_id DESC LIMIT 20;

        假设上面的查询返回的是主键16049到16030的租赁记录,那么下一页查询就可以从16030这个点开始:

sql">SELECT * FROM sakila.rental
WHERE rental_id < 16030 ORDER BY rental_id DESC LIMIT 20;

        该技术的好处是无论翻页到多么后面,其性能都会很好。

二、简述SQL中的聚合函数

        常用的聚合函数有COUNT()AVG()SUM()MAX()MIN()。下面以MySQL为例,说明这些函数的作用。

        1、COUNT()函数。统计数据表中包含的记录行的总数,或者根据查询结果返回列中包含的数据行数,它有两种用法:①COUNT(*)计算表中总的行数,不管某列是否有数值或者为空值;②COUNT(字段名)计算指定列下总的行数,计算时将忽略空值的行。COUNT()函数可以与GROUP BY一起使用来计算每个分组的总和。

        2、AVG()函数。通过计算返回的行数和每一行数据的和,求得指定列数据的平均值。AVG()函数可以与GROUP BY一起使用,来计算每个分组的平均值。

        3、SUM()函数。一个求总和的函数,返回指定列值的总和。SUM()可以与GROUP BY一起使用,来计算每个分组的总和。

        4、MAX()函数。返回指定列中的最大值。MAX()也可以和GROUP BY关键字一起使用,求每个分组中的最大值。MAX()函数不仅适用于查找数值类型,也可应用于字符类型。

        5、MIN()函数。返回查询列中的最小值。MIN()也可以和GROUP BY关键字一起使用,求出每个分组中的最小值。MIN()函数与MAX()函数类似,不仅适用于查找数值类型,也可应用于字符类型。

三、简述表与表是如何关联的

        表与表之间常用的关联方式有两种:内连接外连接,下面以MySQL为例来说明这两种连接方式。

        1、内连接: 通过INNER JOIN来实现,它将返回两张表中满足连接条件的数据,不满足条件的数据不会查询出来。

        2、外连接:通过OUTER JOIN来实现,它会返回两张表中满足连接条件的数据,同时返回不满足连接条件的数据。

        除此之外,还有一种常见的连接方式:等值连接。这种连接是通过WHERE子句中的条件,将两张表连接在一起,它的实际效果等同于内连接。出于语义清晰的考虑,一般更建议使用内连接,而不是等值连接。

        以上是从语法上来说明表与表之间关联的实现方式,而从表的关系上来说,比较常见的关联关系有:一对多关联多对多关联自关联

        1、一对多关联:这种关联形式最为常见,一般是两张表具有主从关系,并且以主表的主键关联从表的外键来实现这种关联关系。另外,以从表的角度来看,它们是具有多对一关系的,所以不再赘述多对一关联了。

        2、多对多关联:这种关联关系比较复杂,如果两张表具有多对多的关系,那么它们之间需要有一张中间表来作为衔接,以实现这种关联关系。这个中间表要设计两列,分别存储那两张表的主键。因此,这两张表中的任何一方,都与中间表形成了一对多关系,从而在这个中间表上建立起了多对多关系。

        3、自关联:自关联就是一张表自己与自己相关联,为了避免表名的冲突,需要在关联时通过别名将它们当做两张表来看待。一般在表中数据具有层级(树状)时,可以采用自关联一次性查询出多层级的数据。

四、简述外连接

        外连接通过OUTER JOIN来实现,它会返回两张表中满足连接条件的数据,同时返回不满足连接条件的数据。常见的外连接有两种形式:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)。

        实际上,外连接还有一种形式:完全外连接(FULL OUTER JOIN),但MySQL不支持这种形式。

五、简述数据库的左连接和右连接

        常见的外连接有两种形式:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)。

        左外连接:可以简称为左连接(LEFT JOIN),它会返回左表中的所有记录和右表中满足连接条件的记录。

        右外连接:可以简称为右连接(RIGHT JOIN),它会返回右表中的所有记录和左表中满足连接条件的记录。


http://www.niftyadmin.cn/n/5536116.html

相关文章

ARM架构服务器/虚拟机编译部署Tendis(国产化替换Redis)

文章目录 一、概述 二、安装相关组件 三、下载最新的Tendis源码 四、编译源码 五、启动Tendis 六、使用Docker镜像部署Tendis 七、常见报错 八、参考链接 一、概述 国产化项目要求尽可能使用国产组件,尤其是已存在的项目,需要替换已有组件,比如使用Tendis替换Redis。…

【LeetCode】十三、分治法:多数元素 + 最大子序列和

文章目录 1、分治法2、leetcode169&#xff1a;多数元素3、leetcode53&#xff1a;最大子序和 1、分治法 分治一般都搭配递归使用&#xff1a; 用分治法的一个应用——归并排序&#xff1a;将一组数不停的一分为二&#xff0c;直到分到每组只有一个数的时候 分到每组只有一个数…

LLama-Factory大模型训练框架,基于自己数据集微调qwen7B模型实战

一&#xff0c;项目简介 LLama-Factory&#xff0c;大模型训练框架&#xff0c;支持多种模型&#xff0c;多种训练方式&#xff0c; 项目github地址&#xff1a;link 项目特色 多种模型&#xff1a;LLaMA、LLaVA、Mistral、Mixtral-MoE、Qwen、Yi、Gemma、Baichuan、ChatGL…

《自动驾驶中的SLAM技术》第2章: 基础数学知识回顾 习题

自动驾驶中的SLAM技术 第2章: 基础数学知识回顾 习题 1 分别使用左右扰动模型&#xff0c;计算 ∂ R − 1 p ∂ R \frac{\partial \mathbf{R}^{-1}\mathbf{p}}{\partial \mathbf{R}} ∂R∂R−1p​。 左扰动模型 ∂ R − 1 p ∂ R lim ⁡ δ ϕ → 0 ( E x p ( δ ϕ ) R…

数据结构(3.8)——栈的应用

栈在括号匹配中的应用 流程图 代码 #include <stdio.h> #include <stdlib.h> #define MaxSize 10typedef struct {char data[MaxSize];int top; } SqStack;// 初始化栈 void InitStack(SqStack* S) {S->top -1; // 初始化栈顶指针 }// 判空 bool StackEmpty(…

JavaScript 原型链那些事

在讲原型之前我们先来了解一下函数。 在JS中&#xff0c;函数的本质就是对象&#xff0c;它与其他对象不同的是&#xff0c;创建它的构造函数与创建其他对象的构造函数不一样。那产生函数对象的构造函数是什么呢&#xff1f;是一个叫做Function的特殊函数&#xff0c;通过newFu…

nginx部署多个项目;vue打包项目部署设置子路径访问;一个根域名(端口)配置多个子项目

本文解决&#xff1a; vue打包项目部署设置子路径访问&#xff1b;nginx部署多个子项目&#xff1b;一个ip/域名 端口 配置多个子项目&#xff1b;配置后&#xff0c;项目能访问&#xff0c;但是刷新页面就丢失的问题 注&#xff1a;本文需要nginx配置基础。基础不牢的可见文…