面试 SQL整理 必考的SQL面试题:经典20题

1.什么是数据库?

数据库是有组织的数据集合,可以从远程或本地计算机系统以数字方式进行存储和检索。数据库可能庞大而复杂,并且使用固定设计和建模方法来开发此类数据库。

2.什么是DBMS?

DBMS代表数据库管理系统。DBMS是负责创建,检索,更新和管理数据库的系统软件。通过充当数据库与其最终用户或应用程序软件之间的接口,它可以确保我们的数据是一致的,有条理的,并且易于访问。

3.什么是RDBMS?与DBMS有何不同?

RDBMS代表关系数据库管理系统。与DBMS相比,这里的主要区别在于RDBMS以表集合的形式存储数据,并且可以在这些表的公共字段之间定义关系。大多数现代数据库管理系统(例如MySQL,Microsoft SQL Server,Oracle,IBM DB2和Amazon Redshift)都基于RDBMS。

4.什么是SQL?

SQL代表结构化查询语言。它是关系数据库管理系统的标准语言。在处理由实体(变量)组成的组织数据以及数据的不同实体之间的关系时,它特别有用。

5. SQL和MySQL有什么区别?

SQL是用于检索和操作结构化数据库的标准语言。相反,MySQL是用于管理SQL数据库的关系数据库管理系统,例如SQL Server,Oracle或IBM DB2。

6.什么是表格和字段?

表格是以行和列的形式存储的数据的有组织的集合。列可以分类为垂直,行可以分类为水平。表中的列称为字段,而行可称为记录。

7. SQL中的约束是什么?

约束用于指定有关表中数据的规则。在创建表期间或使用ALTER TABLE命令创建表之后,可以将其应用于SQL表中的单个或多个字段。约束是:

  • NOT NULL –限制将NULL值插入列中。
  • 检查–验证字段中的所有值均满足条件。
  • 默认值–如果未为该字段指定值,则自动分配默认值。
  • 唯一–确保将唯一值插入到字段中。
  • INDEX –为字段提供索引,可以更快地检索记录。
  • PRIMARY KEY –唯一标识表中的每个记录。
  • FOREIGN KEY –确保另一个表中记录的引用完整性。

8.什么是主键?

PRIMARY KEY约束唯一地标识表中的每一行。它必须包含UNIQUE值,并且具有隐式NOT NULL约束。

SQL中的表严格限制为只有一个主键,该主键由单个或多个字段(列)组成。

 
CREATE TABLE Students (      /* Create table with a single field as primary key */
    ID INT NOT NULL
    Name VARCHAR(255)
    PRIMARY KEY (ID)
);

CREATE TABLE Students (      /* Create table with multiple fields as primary key */
    ID INT NOT NULL
    LastName VARCHAR(255)
    FirstName VARCHAR(255) NOT NULL,
    CONSTRAINT PK_Student
    PRIMARY KEY (ID, FirstName)
);

ALTER TABLE Students      /* Set a column as primary key */
ADD PRIMARY KEY (ID);

ALTER TABLE Students      /* Set multiple columns as primary key */
ADD CONSTRAINT PK_Student      /*Naming a Primary Key*/
PRIMARY KEY (ID, FirstName);

 

9.什么是UNIQUE约束?

UNIQUE约束确保列中的所有值都不同。这为列提供了唯一性,并有助于唯一地标识每一行。与主键不同,每个表可以定义多个唯一约束。UNIQUE的代码语法与PRIMARY KEY的语法非常相似,可以互换使用。

 
CREATE TABLE Students (      /* Create table with a single field as unique */
    ID INT NOT NULL UNIQUE
    Name VARCHAR(255)
);

CREATE TABLE Students (      /* Create table with multiple fields as unique */
    ID INT NOT NULL
    LastName VARCHAR(255)
    FirstName VARCHAR(255) NOT NULL
    CONSTRAINT PK_Student
    UNIQUE (ID, FirstName)
);

ALTER TABLE Students      /* Set a column as unique */
ADD UNIQUE (ID);

ALTER TABLE Students      /* Set multiple columns as unique */
ADD CONSTRAINT PK_Student      /* Naming a unique constraint */
UNIQUE (ID, FirstName);

 

10.什么是外键?

一个FOREIGN KEY由一个表中的单个或字段集合组成,该表实质上是引用另一个表中的PRIMARY KEY。外键约束确保两个表之间关系的引用完整性。

具有外键约束的表被标记为子表,包含候选键的表被标记为引用表或父表。

 
CREATE TABLE Students (      /* Create table with foreign key - Way 1 */
    ID INT NOT NULL
    Name VARCHAR(255)
    LibraryID INT
    PRIMARY KEY (ID)
    FOREIGN KEY (Library_ID) REFERENCES Library(LibraryID)
);

CREATE TABLE Students (      /* Create table with foreign key - Way 2 */
    ID INT NOT NULL PRIMARY KEY
    Name VARCHAR(255)
    LibraryID INT FOREIGN KEY (Library_ID) REFERENCES Library(LibraryID)
);


ALTER TABLE Students      /* Add a new foreign key */
ADD FOREIGN KEY (LibraryID)
REFERENCES Library (LibraryID);

 

11.什么是加入?列出其不同类型。

SQL Join子句用于根据SQL数据库中两个或多个表之间的相关列来组合记录(行)。

  • (内部)联接:检索联接所涉及的两个表中具有匹配值的记录。这是查询中广泛使用的联接。
  • SELECT FROM Table_A JOIN Table_B; SELECT FROM Table_A INNER JOIN Table_B;
  • 左(外部)联接:从左侧检索所有记录/行,并从右侧表检索匹配的记录/行。SELECT* FROM Table_A A左联接Table_B B ON A.col = B.col;
  • 右(外)联接:从右表检索所有记录/行,从左表检索匹配的记录/行。SELECT * FROM Table_A A右联接Table_B B ON A.col = B.col;
  • FULL(OUTER)JOIN:检索左表或右表中有匹配项的所有记录。SELECT* FROM Table_A A FULL JOIN Table_B B ON A.col = B.col;

12.什么是自加入?

自我联接是常规联接的一种情况,其中表根据其自身列之间的某种关系而联接至自身。自联接使用INNER JOIN或LEFT JOIN子句,并且表别名用于为查询中的表分配不同的名称。

 
SELECT A.emp_id AS "Emp_ID",A.emp_name AS "Employee",
B.emp_id AS "Sup_ID",B.emp_name AS "Supervisor"
FROM employee A, employee B
WHERE A.emp_sup = B.emp_id;

 

## 13。什么是交叉加入?交叉联接可以定义为联接中包含的两个表的笛卡尔乘积。联接后的表包含的行数与两个表中的行数的叉积相同。如果在交叉联接中使用WHERE子句,则查询将像INNER JOIN一样工作。

 
SELECT stu.name, sub.subject 
FROM students AS stu
CROSS JOIN subjects AS sub;

 

14.什么是索引?解释其不同类型。

数据库索引是一种数据结构,可以快速查找表的一个或多个列中的数据。它以额外的写入和内存维护索引数据结构为代价,提高了从数据库表访问数据的操作速度。

 
CREATE INDEX index_name      /* Create Index */
ON table_name (column_1, column_2);

DROP INDEX index_name;      /* Drop Index */

 

15.聚集索引和非聚集索引有什么区别?

如上所述,差异可以分为三个小因素-

  • 聚集索引修改了基于索引列的记录在数据库中的存储方式。非聚集索引在表内创建了一个引用原始表的单独实体。
  • 聚集索引用于轻松,快速地从数据库中检索数据,而从非聚集索引中获取记录则相对较慢。
  • 在SQL中,表可以具有单个聚集索引,而表可以具有多个非聚集索引。

16.什么是数据完整性?

数据完整性是数据在整个生命周期中准确性和一致性的保证,并且是设计,实现和使用存储,处理或检索数据的任何系统的关键方面。它还定义了完整性约束,以在将数据输入到应用程序或数据库中时对数据执行业务规则。

17.什么是查询?

查询是从数据库表或表组合中获取数据或信息的请求。数据库查询可以是选择查询或动作查询。

SELECT fname, lname          /* select query */
FROM myDb.students
WHERE student_id = 1;

 

 
UPDATE myDB.students          /* action query */
SET fname = 'Captain', lname = 'America'
WHERE student_id = 1;

 

18.什么是子查询?它是什么类型?

子查询是另一个查询内的查询,也称为嵌套查询或内部查询。它用于限制或增强主查询要查询的数据,从而分别限制或增强主查询的输出。例如,在这里,我们获取已注册数学课程的学生的联系信息:

 
SELECT name, email, mob, address
FROM myDb.contacts
WHERE roll_no IN (
     SELECT roll_no
     FROM myDb.students
     WHERE subject = 'Maths');

 

子查询有两种类型-关联和不关联。

  • 相关子查询不能视为独立查询,但可以引用主查询的FROM中列出的表中的列。
  • 可以将不相关的子查询视为独立查询,并将子查询的输出替换为主查询中的子查询。

19.什么是SELECT语句?

SQL中的SELECT运算符用于从数据库中选择数据。返回的数据存储在结果表中,称为结果集。

 
SELECT * FROM myDB.students;

 

20. SQL中的SELECT查询使用哪些常见子句?

与SELECT查询结合使用的一些常见SQL子句如下:

  • SQL中的WHERE子句用于根据特定条件过滤必要的记录。
  • SQL中的ORDER BY子句用于根据某些字段以升序(ASC)或降序(DESC)对记录进行排序。
  • SQL中的GROUP BY子句用于对具有相同数据的记录进行分组,并且可以与某些聚合函数结合使用,以从数据库中生成汇总结果。
  • SQL中的HAVING子句与GROUP BY子句一起用于过滤记录。它与WHERE不同,因为WHERE子句无法过滤聚合记录。
  • 子句中的每个SELECT语句必须具有相同的列数
  • 这些列还必须具有相似的数据类型
  • 每个SELECT语句中的列必须具有相同的顺序
  • 在任何变量声明之后,声明一个游标。游标声明必须始终与SELECT语句关联。
  • 打开游标以初始化结果集。在从结果集中获取行之前,必须先调用OPEN语句。
  • FETCH语句检索并移至结果集中的下一行。
  • 调用CLOSE语句以停用游标。
  • 最后,使用DEALLOCATE语句删除游标定义并释放关联的资源。
  • 一对一–可以定义为两个表之间的关系,其中一个表中的每个记录与另一个表中的一个记录的最大值相关联。
  • 一对多和多对一–这是最常用的关系,其中一个表中的一条记录与另一个表中的多条记录相关联。
  • 多对多–在需要双方都需要多个实例来定义关系的情况下使用。自引用关系–在表需要定义与其自身的关系时使用。

在这里还是要推荐下我自己建的Python学习群:721195303,群里都是学Python的,如果你想学或者正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2021最新的Python进阶资料和零基础教学,欢迎进阶中和对Python感兴趣的小伙伴加入!

  • 1
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值