当前位置: 首页 > article >正文

MySQL SQL基础常见面试题整理

NOSQL和SQL的区别是什么?

SQL数据库是指关系型数据库,主要有:SQL Server,Oracle,MySQL(开源),PostgreSQL(开源)。

关系型数据库用于存储结构化数据,这些数据在逻辑上以行和列的二维表形式存在,每一列代表一个数据属性,每一行则代表一个数据实体。

NoSQL是指非关系型数据库,主要有MongoDB和Redis。NoSQL数据库在逻辑上提供了一种不同于二维表的存储方式,可以是JSON文档、哈希表或其他形式。

什么时候选择NoSQL和SQL?

关系型数据库支持 ACID,即原子性、一致性、隔离性和持久性。相比之下,NoSQL 采用更宽松的模型 BASE,即基本可用、软状态和最终一致性。

从实用的角度来看,我们需要考虑我们的应用场景是否必须要 ACID。比如,银行应用就必须保证 ACID,否则一笔钱可能会被使用两次;而社交软件则不必一定保证 ACID,因为一条状态更新在用户读取时相差几秒并不会影响体验。

对于需要保证 ACID 的应用,我们可以优先考虑 SQL。反之,则可以优先考虑 NoSQL。

数据库三大范式是什么?

第一范式(1NF):要求数据库表的每一列都是不可分割的原子数据项。

第二范式(2NF):在第一范式(1NF)的基础上,非码属性必须完全依赖于候选码(在1NF的基础上消除非主属性对主键的部分函数依赖)。

第二范式要求数据库表中的每一列都要与主键相关,而不能只和主键的一部分相关(主要针对联合主键)。

第三范式(3NF):在第二范式的基础上,任何非主属性都不能依赖于其他非主属性(在第二范式的基础上消除传递依赖)。

第三范式要求确保数据表中的每一列数据都要和主键直接相关,而不能是间接相关的。

MySQL 怎么进行联表查询?

数据库有以下几种联表查询类型:

  • 内连接 (INNER JOIN)
  • 左外连接 (LEFT JOIN)
  • 右外连接 (RIGHT JOIN)
  • 全外连接 (FULL JOIN)

MySQL如何避免重复插入数据?

方式一:使用UNIQUE约束

在表的相关列上添加UNIQUE约束,确保每个值在该列中唯一。

方式二:使用INSERT … ON DUPLICATE KEY UPDATE

这种语句允许在插入记录时处理重复键的情况。如果插入的记录与现有记录冲突,可以选择更新现有记录:

方式三:使用INSERT IGNORE

该语句在插入记录时会忽略因重复键引起的插入错误。

CHAR 和 VARCHAR有什么区别?

CHAR是固定长度的字符串类型,定义时需要指定固定长度,存储时会在末尾补足空格。CHAR适合存储长度固定的数据,如固定长度的代码、状态等,存储空间固定,对于短字符串效率较高。

VARCHAR是可变长度的字符串类型,定义时需要指定最大长度,实际存储时根据实际长度占用存储空间。VARCHAR适合存储长度可变的数据,如用户输入的文本、备注等,节约存储空间。

Text数据类型可以无限大吗?

MySQL 3 种text类型的最大长度如下:

TEXT:65,535 字节 ~64kb

MEDIUMTEXT:16,777,215 字节 ~16Mb

LONGTEXT:4,294,967,295 字节 ~4Gb

说一下外键约束

外键约束的作用是维护表与表之间的关系,确保数据的完整性和一致性。让我们举一个简单的例子:

假设你有两个表,一个是学生表,另一个是课程表,这两个表之间有一个关系,即一个学生可以选修多门课程,而一门课程也可以被多个学生选修。在这种情况下,我们可以在学生表中定义一个指向课程表的外键。

指的是课程表中的id字段。这个外键约束确保了每个学生所选的课程在courses表中都存在,从而维护了数据的完整性和一致性。

如果没有定义外键约束,那么就有可能出现学生选了不存在的课程或者删除了一个课程而忘记从学生表中删除选修该课程的学生的情况,这会破坏数据的完整性和一致性。因此,使用外键约束可以帮助我们避免这些问题。

MySQL的关键字in和exist

在MySQL中,IN 和 EXISTS 都是用来处理子查询的关键词,但它们在功能、性能和使用场景上有各自的特点和区别。

IN关键字

IN 用于检查左边的表达式是否存在于右边的列表或子查询的结果集中。如果存在,则IN 返回TRUE,否则返回FALSE。

语法结构:

SELECT column_name(s)

FROM table_name

WHERE column_name IN (value1, value2, …);

SELECT column_name(s)

FROM table_name

WHERE column_name IN (SELECT column_name FROM another_table WHERE condition);

例子:

SELECT * FROM Customers

WHERE Country IN (‘Germany’, ‘France’);

EXISTS关键字

EXISTS 用于**判断子查询是否至少能返回一行数据。它不关心子查询返回什么数据,只关心是否有结果。**如果子查询有结果,则EXISTS 返回TRUE,否则返回FALSE。

语法结构:

SELECT column_name(s)

FROM table_name

WHERE EXISTS (SELECT column_name FROM another_table WHERE condition);

例子:

SELECT * FROM Customers

WHERE EXISTS (SELECT 1 FROM Orders WHERE Orders.CustomerID = Customers.CustomerID);

区别与选择:

性能差异:在很多情况下,EXISTS 的性能优于 IN,特别是当子查询的表很大时。这是因为EXISTS 一旦找到匹配项就会立即停止查询,而IN可能会扫描整个子查询结果集。

使用场景:如果子查询结果集较小且不频繁变动,IN 可能更直观易懂。而当子查询涉及外部查询的每一行判断,并且子查询的效率较高时,EXISTS 更为合适。

NULL值处理:IN 能够正确处理子查询中包含NULL值的情况,而EXISTS 不受子查询结果中NULL值的影响,因为它关注的是行的存在性,而不是具体值。

mysql中的一些基本函数,你知道哪些?

一、字符串函数

CONCAT(str1, str2, …):连接多个字符串,返回一个合并后的字符串。

SELECT CONCAT(‘Hello’, ’ ', ‘World’) AS Greeting;

LENGTH(str):返回字符串的长度(字符数)。

SELECT LENGTH(‘Hello’) AS StringLength;

SUBSTRING(str, pos, len):从指定位置开始,截取指定长度的子字符串。

SELECT SUBSTRING(‘Hello World’, 1, 5) AS SubStr;

REPLACE(str, from_str, to_str):将字符串中的某部分替换为另一个字符串。

SELECT REPLACE(‘Hello World’, ‘World’, ‘MySQL’) AS ReplacedStr;

二、数值函数

ABS(num):返回数字的绝对值。

SELECT ABS(-10) AS AbsoluteValue;

POWER(num, exponent):返回指定数字的指定幂次方。

SELECT POWER(2, 3) AS PowerValue;

三、日期和时间函数

NOW():返回当前日期和时间。

SELECT NOW() AS CurrentDateTime;

CURDATE():返回当前日期。

SELECT CURDATE() AS CurrentDate;

四、聚合函数

COUNT(column):计算指定列中的非NULL值的个数。

SELECT COUNT(*) AS RowCount FROM my_table;

SUM(column):计算指定列的总和。

SELECT SUM(price) AS TotalPrice FROM orders;

AVG(column):计算指定列的平均值。

SELECT AVG(price) AS AveragePrice FROM orders;

MAX(column):返回指定列的最大值。

SELECT MAX(price) AS MaxPrice FROM orders;

MIN(column):返回指定列的最小值。

SELECT MIN(price) AS MinPrice FROM orders;

SQL查询语句的执行顺序是怎样的?

我们先执行from,join来确定表之间的连接关系,得到初步的数据

where对数据进行普通的初步的筛选

group by 分组

各组分别执行having中的普通筛选或者聚合函数筛选。

然后把再根据我们要的数据进行select

最后合并各组的查询结果,按照order by的条件进行排序


http://www.kler.cn/news/328545.html

相关文章:

  • PHP反序列化3(属性绕过)
  • 《PMI-PBA认证与商业分析实战精析》 第3章 需要评估
  • Typora使用与Markdown语法详细教程
  • 在Windows上安装Git
  • go+redis基于tcp实现聊天室
  • 8--苍穹外卖-SpringBoot项目中套餐管理 详解(二)
  • XR图和XS图中X-bar图的最大不同
  • uniapp 常用高度状态栏,导航栏,tab栏,底部安全高度
  • C++ 游戏开发
  • Docker 安装 Citus 单节点集群:全面指南与详细操作
  • Linux 文件目录结构(详细)
  • 【PostgreSQL】入门篇——如何创建、删除和管理数据库及其用户,包括权限设置和角色管理
  • OSPF路由计算
  • 滑动窗口->dd爱框框
  • Elasticsearch学习笔记(3)
  • Service Mesh
  • Java | Leetcode Java题解之第450题删除二叉搜索树中的节点
  • Arduino UNO R3自学笔记7 之 Arduino使用PWM电机调速
  • 服务器数据恢复—存储映射到服务器上的卷无法挂载的数据恢复案例
  • DC00025【含论文】基于协同过滤推荐算法springboot视频推荐管理系统
  • 使用Yasboot安装YashanDB的疑惑和建议
  • 进阶数据库系列(十三):PostgreSQL 分区分表
  • SolidWorks机器转ROS2 URDF
  • Linux下send函数和recv函数
  • AWS Redshift把老用户权限赋予新用户
  • 201 Created
  • 如何在Windows、Mac和Linux系统上安装和更新Stable Diffusion WebUI
  • Spark SQL分析层优化
  • 中国电信解锁万亿参数大模型:TeleAI的创新与突破
  • Docker镜像命令和容器命令