首页 > 数据库 >MySQL SQL基础常见面试题整理

MySQL SQL基础常见面试题整理

时间:2024-09-25 15:22:20浏览次数:3  
标签:面试题 范式 name EXISTS column SQL 查询 MySQL SELECT

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的条件进行排序

标签:面试题,范式,name,EXISTS,column,SQL,查询,MySQL,SELECT
From: https://blog.csdn.net/2302_79761426/article/details/142522441

相关文章

  • Linux中MySQL配置主主复制操作
    一、GTIDGTID(GlobalTransactionIdentifier)是MySQL的一种用于标识分布式环境中事务的全局唯一标识符。它在MySQL的主从复制场景中尤为重要,尤其是在使用MariaDB或MySQL5.6及更高版本的环境中。GTID由两部分组成:服务器ID(标识执行该事务的服务器)和事务序号(表示在该服务器上执......
  • 最强Java100道核心面试题
    1.讲讲你理解的nio和bio的区别是啥,谈谈reactor模型。IO(BIO)是面向流的,NIO是面向缓冲区的BIO:BlockIO同步阻塞式IO,就是我们平常使用的传统IO,它的特点是模式简单使用方便,并发处理能力低。NIO:NewIO同步非阻塞IO,是传统IO的升级,客户端和服务器端通过Channel(通道)通......
  • 解读MySQL8.0数据字典重构源码
    摘要:本文对社区MySQL5.7到8.0演进过程中数据字典DD的重构(缓存,持久化),AtomicDDL的关键实现进行了分析。本文分享自华为云社区《【华为云MySQL技术专栏】MySQL8数据字典重构源码解读》,作者:GaussDB数据库1.背景介绍在MySQL5.7版本的使用实践过程中,我们很容易遇到DDL崩溃后导致数......
  • 程序员必备Java面试题大总结!
    1、Mysql索引1.1索引的类型可以是String类型吗?聚簇索引----数据和索引放一块,像主键索引,具有唯一性(Innodb就是)数据库第一范式:必须要有id,这个id是自带索引的。一般用自增id,字符串可以做id,但是不好,像uuid做的id是随机的,都没有排序!!!不像自增id维护索引的成本会很低1.2什么是......
  • Windows 11 彻底卸载MySQL和安装
    Windows11彻底卸载MySQL和安装卸载1.关闭MySQL服务快捷键Win+R打开运行窗口输入services.msc打开服务窗口找到MySQL服务,停止此服务2.卸载MySql软件进入控制面板-程序和功能卸载一切和MySQL相关的软件3.删除MySQL相关文件夹如果安装时有指......
  • mysql flaot 不准
    (JDBC-MySql)概述JDBC全称JavaDataBaseConnectivity:java数据库连接在JDBC创建之前java程序员每操作一款关系型数据库就需要学习java连接该数据库代码,由于关系型数据库过多(如:oracle、db2、MySQL......),不可能全部学习,所以java程序员就期望SUN公司能研发出一套可以运行所有关系......
  • Windows安装HeidiSQL教程(图文)
    一、软件简介HeidiSQL是一款开源的数据库管理工具,主要用于管理MySQL、MariaDB、SQLServer、PostgreSQL和SQLite等数据库系统。它提供了直观的用户界面,使用户可以轻松地连接到数据库服务器、执行SQL查询、浏览和编辑数据、管理数据库结构等操作。跨平台支持:HeidiSQL可以在Windows操......
  • SQLServer中,当压缩备份遇到TDE加密的数据库
    压缩备份和TDESQLServer的压缩备份是一个特性,根据实际使用中的观察,压缩比至少在1:5左右,也就是备份时增加了压缩选项后可以至少压缩到数据文件大小的20%甚至更低,可以很大程度上加快备份执行时间,减轻IO压力和节省磁盘存储空间SQLServer的TDE(TransparentDataEncryption)作为数据库......
  • 中年被裁,记录下这段时间的心路历程,内含前端面试题和面经
    前言真正的转变都是痛苦且无声的。大家好啊,好久不见,停更了一个月了,最近确实没时间更新我的公益服游戏,这段时间我经历了工作被裁员,学习复习,面试找工作,到最终找到工作。想把这段时间我的心路历程和面试题面经分享出来,说不定可以帮到你。心路历程坐标天津,从事互联网前端开发工作,......
  • SQL 高级语法 MERGE INTO
    SQL高级语法MERGEINTO 根据与源表相联接的结果,对目标表进行插入、更新、删除等操作。例如,对目标表,如果源表存在的数据则更新,没有的则插入,就可以使用MEREG进行同步。基本语法MERGEINTOtarget_tableUSINGsource_tableONconditionWHENMATCHEDTHENXXXWHENNOT......