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