「QALog」校招测试八股—数据库(一)
哈喽大家好,我是Chowley,QALog创始人,测试开发工程师,我又来开坑了~
本篇是《「QALog」校招测试八股—数据库》系列的第一篇,春招高峰期,给大家带来一些数据库的高频考点!
下面是本期目录:
Q1:关系型数据库是啥意思?除了MySQL还有哪些?
关系型数据库是一种以表格(关系)的形式来组织和存储数据的数据库系统。在关系型数据库中,数据以行和列的形式存储在表中,每一行表示一个记录,每一列表示一个字段。表之间可以通过关系(键)进行关联,从而建立起复杂的数据模型。
关系型数据库具有以下特点:
-
结构化数据存储:数据以表格形式存储,每个表具有固定的结构,包含预定义的列和数据类型。
-
数据完整性:关系型数据库支持主键、外键等约束,保证数据的完整性和一致性。
-
事务支持:支持事务管理,保证数据操作的原子性、一致性、隔离性和持久性(ACID 属性)。
-
SQL 查询:通过结构化查询语言(SQL)进行数据查询和操作,具有强大的查询能力。
-
可扩展性:支持水平和垂直扩展,能够处理大规模数据存储和访问。
关系型数据库的代表产品包括 MySQL、Oracle Database、Microsoft SQL Server、PostgreSQL 等,用于存储和管理结构化数据。
Q2:说一下MySQL的CRUD关键字
在 MySQL 中,CRUD 是指数据库操作的四种基本操作,包括创建(Create)、读取(Read)、更新(Update)和删除(Delete)。在 SQL 中,这些操作对应着以下关键字:
-
CREATE:用于创建数据库或表。
创建数据库:
CREATE DATABASE database_name;
创建表:CREATE TABLE table_name (column1 datatype, column2 datatype, ...);
-
READ(SELECT):用于从数据库中检索数据。
查询所有数据:
SELECT * FROM table_name;
查询特定数据:SELECT column1, column2 FROM table_name WHERE condition;
-
UPDATE:用于更新数据库中的数据。
更新数据:
UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition;
-
DELETE:用于从数据库中删除数据。
删除数据:
DELETE FROM table_name WHERE condition;
这些关键字是 MySQL 中进行数据操作时经常使用的关键字,能够实现对数据的增删改查等基本操作。
Q3:MySQL有哪些字段?
MySQL 支持多种数据类型,常见的字段类型包括以下几种:
-
整数类型:
-
TINYINT:1 字节,范围 -128 到 127(有符号)或 0 到 255(无符号)。 -
SMALLINT:2 字节,范围 -32768 到 32767(有符号)或 0 到 65535(无符号)。 -
INT:4 字节,范围 -2147483648 到 2147483647(有符号)或 0 到 4294967295(无符号)。
-
-
浮点数类型:
-
FLOAT:4 字节,单精度浮点数。 -
DOUBLE:8 字节,双精度浮点数。
-
-
定点数类型:
DECIMAL:取决于精度,用于存储精确的小数。
-
字符串类型:
-
CHAR:固定长度字符串,最多 255 字节。 -
VARCHAR:可变长度字符串,最多 65535 字节。 -
TEXT:可变长度文本,最多 65535 字节。
-
-
日期和时间类型:
-
DATE:日期,格式为 'YYYY-MM-DD'。 -
TIME:时间,格式为 'HH:MM:SS'。 -
DATETIME:日期和时间,格式为 'YYYY-MM-DD HH:MM:SS'。 -
TIMESTAMP:时间戳,存储从 1970 年 1 月 1 日至今的秒数。
-
这些是 MySQL 中常用的字段类型,每种类型都有其特定的用途和存储特性。在设计数据库表时,根据实际需求选择合适的字段类型能够提高数据存储的效率和准确性。
Q4:CHAR和VARCHAR有什么区别?
CHAR 和 VARCHAR 是 MySQL 中常用的字符串类型,它们之间的主要区别在于存储方式和存储空间的利用效率:
-
存储方式:
-
CHAR:固定长度字符串,如果存储的字符串长度不足,会使用空格进行填充,占用固定的存储空间。 -
VARCHAR:可变长度字符串,只占用实际存储的字符串长度加上一两个字节的存储空间来记录字符串的长度。
-
-
存储空间利用效率:
-
CHAR:由于是固定长度,如果存储的字符串长度较短,则会造成存储空间的浪费。 -
VARCHAR:由于是可变长度,可以根据实际存储的字符串长度灵活分配存储空间,节省存储空间。
-
-
适用场景:
-
CHAR 适合存储长度固定的字符串,如固定长度的代码、状态等。 -
VARCHAR 适合存储长度不固定的字符串,如姓名、地址等。
-
-
索引效率:
-
CHAR 类型的字段在进行索引时,由于固定长度的特性,比较起来更快。 -
VARCHAR 类型的字段在进行索引时,需要额外的存储空间来记录长度,可能会影响索引效率。
-
综上所述,CHAR 和 VARCHAR 在存储方式和存储空间利用效率上有所区别,根据实际需求选择合适的类型能够更好地利用存储空间并提高存储效率。
Q5:count(*)和count(1)呢?
在 SQL 查询中,COUNT(*)
和 COUNT(1)
都是用来统计表中行数(记录数)的函数,但它们的实现方式略有不同:
-
COUNT(*) :
COUNT(*)
会统计表中所有行的数量,包括 NULL 值。 -
COUNT(1) :
COUNT(1)
实际上并不会对表中的数据进行计算,而是对每一行返回一个固定值(1),然后统计这些固定值的数量,因此COUNT(1)
的性能可能会略优于COUNT(*)
。
在实际使用中,推荐使用 COUNT(1)
,因为它在某些数据库中的优化效果更好。
插播一条广告:
我们正在组建测试开发方向的求职交流社区,如果您对软件质量管理、团队效率提高内容感兴趣,可以在「QALog公众号-菜单栏-社区内推-交流群」,加入了解。
广告结束,拷打继续!
Q6:联合查询学过吗?介绍几个联合关键字
联合查询(Union Query)是指将多个查询的结果合并成一个结果集的操作。它的原理是将多个查询的结果按照相同的列结构进行合并,生成一个包含所有查询结果的新结果集。
联合查询的特点包括:
-
列数和列类型必须一致:多个查询的结果集必须具有相同的列数和相同或兼容的列类型。
-
结果集中不包含重复的行:联合查询会自动去除重复的行,如果需要包含重复的行,可以使用 UNION ALL 操作符。
-
按顺序合并结果:多个查询的结果按照出现的顺序依次合并到最终的结果集中。
-
结果集中的列名由第一个查询决定:联合查询的结果集中的列名由第一个查询的列名决定,后续查询的列名会被忽略。
联合查询可以帮助我们将多个查询的结果整合在一起,方便进行数据分析和比较。
常见的联合查询包括以下几种类型:
-
INNER JOIN(内连接、交集):返回两个表中满足连接条件的行。
SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column;
-
LEFT JOIN(左连接):返回左表中所有行,以及右表中满足连接条件的行。
SELECT * FROM table1 LEFT JOIN table2 ON table1.column = table2.column;
-
RIGHT JOIN(右连接):返回右表中所有行,以及左表中满足连接条件的行。
SELECT * FROM table1 RIGHT JOIN table2 ON table1.column = table2.column;
-
FULL JOIN(全连接):返回左表和右表中所有行,如果某行在其中一个表中没有匹配行,则另一个表中对应的列为 NULL。
SELECT * FROM table1 FULL JOIN table2 ON table1.column = table2.column;
-
CROSS JOIN(交叉连接):返回两个表的笛卡尔积,即两个表中所有可能的组合。
SELECT * FROM table1 CROSS JOIN table2;
通过联合查询,可以根据不同的需求组合多个表中的数据,实现灵活的数据查询和分析。
Q7:inner join和left join有啥区别?
INNER JOIN
和 LEFT JOIN
是 SQL 中常用的两种连接(Join)操作,它们之间的区别在于连接的方式和结果集中包含的数据:
-
INNER JOIN:
-
INNER JOIN
是一种内连接操作,它会返回两个表中符合连接条件的行,即只返回两个表中共有的数据。 -
如果左表(A表)中的某行在右表(B表)中找不到匹配的行,则这些行不会出现在结果中。
-
-
LEFT JOIN:
LEFT JOIN
是一种左连接操作,它会返回左表(A表)中的所有行,以及右表(B表)中与左表匹配的行。如果右表中没有匹配的行,则会在结果中以 NULL 值显示。
在选择使用 INNER JOIN
还是 LEFT JOIN
时,需要根据实际需求来确定:
-
如果希望只获取两个表中共有的数据,则使用 INNER JOIN
。 -
如果希望获取左表中的所有数据,并且与右表匹配的数据(如果有)则使用 LEFT JOIN
。
Q8:where和having呢?
WHERE
和 HAVING
是 SQL 中用于过滤数据的两个关键字,它们之间有以下区别:
-
作用对象:
-
WHERE
:用于过滤行数据,作用在SELECT
、UPDATE
、DELETE
语句中,用于筛选符合条件的行。 -
HAVING
:用于过滤分组后的结果,作用在SELECT
语句中的GROUP BY
子句之后,用于筛选分组后的结果。
-
-
使用条件:
-
WHERE
:通常用于过滤行数据,可以使用各种条件进行过滤,如等于、大于、小于、逻辑与或非等。 -
HAVING
:通常用于对分组后的结果进行过滤,可以使用聚合函数进行条件过滤,如求和、平均值、最大值等。
-
-
使用场景:
-
WHERE
适用于对行级数据进行筛选,如筛选出工资大于 5000 的员工信息。 -
HAVING
适用于对分组后的结果进行筛选,如筛选出平均工资大于 5000 的部门。
-
-- 使用 WHERE 进行行级筛选
SELECT *
FROM employees
WHERE salary > 5000;
-- 使用 HAVING 对分组后的结果进行筛选
SELECT department_id, AVG(salary) as avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 5000;
Q9: 多对多的关系中,怎么做数据库结构设计
在多对多的关系中,通常需要使用一个中间表(关联表)来表示两个实体之间的关系。例如,假设有学生和课程两个实体,一个学生可以选择多门课程,一门课程也可以被多个学生选择,这种关系就是多对多关系。
在数据库结构设计中,可以使用以下步骤来设计多对多关系的结构:
-
确定实体:首先确定需要建模的实体,例如学生和课程。
-
创建实体表:为每个实体创建一个表,表中包含实体的属性。例如,创建学生表(students)和课程表(courses)。
-
创建中间表:创建一个中间表来表示两个实体之间的多对多关系。该表通常包含两个外键,分别指向两个实体表的主键。例如,创建一个选课表(enrollments),包含学生ID和课程ID作为外键。
-
建立外键约束:在中间表中,将学生ID和课程ID设置为外键,分别关联到学生表和课程表的主键。
-
插入数据:向实体表和中间表中插入数据,表示学生、课程以及学生选修的课程关系。
-
查询数据:通过联合查询实体表和中间表,可以获取学生选修的课程以及课程被哪些学生选修的信息。
例如,在一个简化的多对多关系中,可以按照以下方式设计表结构:
CREATE TABLE students (
student_id INT PRIMARY KEY,
student_name VARCHAR(50)
);
CREATE TABLE courses (
course_id INT PRIMARY KEY,
course_name VARCHAR(50)
);
CREATE TABLE enrollments (
student_id INT,
course_id INT,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(student_id),
FOREIGN KEY (course_id) REFERENCES courses(course_id)
);
在这个设计中,students
表存储学生信息,courses
表存储课程信息,enrollments
表存储学生选修课程的关系。
Q10:MySQL能存储文件吗?怎么存储?
MySQL 可以存储文件,通常使用 BLOB
(Binary Large Object)类型来存储二进制文件数据。BLOB
类型可以存储大容量的二进制数据,包括图像、音频、视频、文档等。
在 MySQL 中,常用的 BLOB
类型包括以下几种:
-
TINYBLOB:最大长度为 255 个字节。 -
BLOB:最大长度为 65,535 个字节。 -
MEDIUMBLOB:最大长度为 16,777,215 个字节。 -
LONGBLOB:最大长度为 4,294,967,295 个字节。
要在 MySQL 中存储文件,可以创建一个表,其中包含一个 BLOB
类型的列,用于存储文件的二进制数据。例如,创建一个存储图片的表:
CREATE TABLE images
( id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255), data LONGBLOB );
然后,可以使用 INSERT 语句将文件的二进制数据插入到表中:
INSERT INTO images (name, data)
VALUES ('example.jpg', LOAD_FILE('/path/to/example.jpg'));
其中,LOAD_FILE
函数用于将文件加载到数据库中。要注意的是,为了安全起见,应该对插入文件的操作进行适当的权限控制和数据验证。
总结
本篇内容中,我串联了关系型数据的MySQL的重点内容,包括字段类型、关键字功能、联合方法的区别等知识点,掌握本篇内容有助于您在面试、笔试中大纱四方(doge)
如果您觉得写得还不错,欢迎关注《QALog校招测试八股—数据库》系列,后面会持续更新!
以上就是本文的全部内容,如有问题可留言讨论或分享给您的朋友一起学习!
我们正在组建测试开发方向的求职交流社区,如果您对软件质量管理、团队效率提高内容感兴趣,可以在「QALog公众号-菜单栏-社区内推-交流群」,加入了解。
欢迎点赞、评论、收藏,it's important for me.
Searching for QALog
本文由 mdnice 多平台发布
原文地址:https://blog.csdn.net/weixin_53415043/article/details/136395245
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!