一、关系型数据库基础
1、表、行、列的概念
1.1 表(Table)
- 概念: 表是关系型数据库中的基本组织单元,用于存储特定类型的数据。它由行和列组成,每个表都有一个唯一的名称。
- 示例: 一个学生信息表可以包括学生的姓名、年龄、性别等信息。
1.2 行(Row)
- 概念: 行是表中的一个记录,它包含了一组相关的数据,每一行代表一个实体或对象。
- 示例: 学生信息表中的每一行都代表一个具体的学生,包括他们的姓名、年龄、性别等信息。
1.3 列(Column)
- 概念: 列是表中的一个字段,用于存储特定类型的数据,每一列代表一个数据项。
- 示例: 学生信息表中的列可以包括姓名、年龄、性别等,每一列存储特定类型的数据。
1.4 示例与结果
我们有一个简单的学生信息表,包括学生的姓名、年龄和性别。
这个表可以用以下SQL语句创建:
CREATE TABLE Students (
ID INT PRIMARY KEY,
Name VARCHAR(50),
Age INT,
Gender VARCHAR(10)
);
在这个示例中,我们创建了一个名为 “Students” 的表,它包括了四个列:ID、Name、Age和Gender。每一行将代表一个学生的信息,例如:
ID | Name | Age | Gender |
---|---|---|---|
1 | Alice | 20 | Female |
2 | Bob | 22 | Male |
3 | Charlie | 21 | Male |
在这个表中,每一行代表一个学生的信息,每一列存储特定的数据项。
2、主键、外键、索引的作用和使用
2.1 主键(Primary Key)
- 作用: 主键是用来唯一标识表中每一行数据的字段,确保每行数据都有唯一的标识符。主键还可以用来确保数据完整性和提高数据检索效率。
- 使用: 在创建表时,通过指定某个字段为主键,可以保证该字段的数值在整个表中是唯一的,并且不为空。通常使用自增长的整数作为主键,以确保唯一性和简化管理。
示例:
CREATE TABLE Students (
ID INT PRIMARY KEY,
Name VARCHAR(50),
Age INT,
...
);
2.2 外键(Foreign Key)
- 作用: 外键用于建立表与表之间的关联关系,确保数据的一致性和完整性。它指向另一个表中的主键,用于维护表与表之间的关联。
- 使用: 在创建表时,通过指定某个字段为外键,可以建立表与表之间的关联关系,确保引用的数据存在并保持一致。
示例:
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
...
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);
2.3 索引(Index)
- 作用: 索引用于加快数据库查询的速度,通过创建索引可以快速定位到数据,减少数据的扫描和比对时间。
- 使用: 在创建表时,通过指定某个字段或多个字段为索引,可以加速对这些字段的查询操作。
示例:
CREATE INDEX idx_name ON Students (Name);
2.4 示例与解释
示例:
我们有一个学生表和一个课程表,学生表中有学生的ID作为主键,课程表中有学生ID作为外键,我们可以通过以下示例来说明主键、外键和索引的使用:
CREATE TABLE Students (
ID INT PRIMARY KEY,
Name VARCHAR(50),
Age INT,
...
);
CREATE TABLE Courses (
CourseID INT PRIMARY KEY,
CourseName VARCHAR(50),
StudentID INT,
...
FOREIGN KEY (StudentID) REFERENCES Students(ID)
);
CREATE INDEX idx_student_name ON Students (Name);
解释:
在这个示例中,我们创建了学生表和课程表,学生表中的ID字段作为主键,课程表中的StudentID字段作为外键,用于关联学生表。同时,我们还为学生表的Name字段创建了索引,以加快对学生姓名的查询操作。
二、SQL基础
1、SQL语句的结构
SQL(Structured Query Language)是用于管理和操作关系型数据库的语言。
一个标准的SQL语句通常包含以下几个部分:
-
关键字(Keywords): SQL语句始于一个关键字,表示要执行的操作类型。常见的关键字包括
SELECT
、INSERT
、UPDATE
、DELETE
等。 -
表名或列名(Table or Column Names): 关键字后面通常跟着表名或列名,表示操作的对象是哪个表或哪些列。
-
语句结束符(Statement Terminator): SQL语句通常以分号
;
结尾,表示语句的结束。
2、增、删、改、查基本操作
2.1 增加数据(INSERT)
INSERT语句用于向数据库表中添加新的记录。
语法:
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
示例: 向名为 Students
的表中添加一条新的学生记录。
INSERT INTO Students (Name, Age, Gender)
VALUES ('Alice', 25, 'Female');
这个示例将在 Students
表中插入一条姓名为 ‘Alice’、年龄为 25、性别为 ‘Female’ 的新记录。
2.2 删除数据(DELETE)
DELETE语句用于从表中删除记录。
语法:
DELETE FROM table_name
WHERE condition;
示例: 从名为 Students
的表中删除年龄小于 20 的学生记录。
DELETE FROM Students
WHERE Age < 20;
这个示例将会删除 Students
表中所有年龄小于 20 的学生记录。
2.3 修改数据(UPDATE)
UPDATE语句用于更新表中的数据记录。
语法:
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
示例: 更新名为 Students
的表中年龄为 22岁 的学生的姓名。
UPDATE Students
SET Name = 'Bob'
WHERE Age = 22;
这个示例将会把年龄为 22 岁的学生的姓名更新为 ‘Bob’。
2.4 查询数据(SELECT)
SELECT语句用于从数据库中检索数据记录。
语法:
SELECT column1, column2, ...
FROM table_name
WHERE condition;
示例: 从名为 Students
的表中查询姓名和年龄。
SELECT Name, Age
FROM Students;
这个示例将会返回 Students
表中所有学生的姓名和年龄信息。
3、聚合函数和分组查询
3.1 聚合函数
聚合函数用于对一组数据执行计算,并返回一个单一的值。常见的聚合函数包括:
- COUNT(): 计算行的数量。
- SUM(): 计算数值列的和。
- AVG(): 计算数值列的平均值。
- MIN(): 找出数值列的最小值。
- MAX(): 找出数值列的最大值。
3.2 分组查询
分组查询用于将数据分成不同的组,并对每个组执行聚合函数。它常常与GROUP BY子句一起使用。
语法:
SELECT column1, column2, aggregate_function(column3)
FROM table_name
GROUP BY column1, column2;
示例: 我们有一个名为 Orders
的表,其中包含订单信息,包括订单号、客户ID和订单金额。
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
Amount DECIMAL(10, 2),
...
);
3.3 使用聚合函数和分组查询的示例
-
查询每个客户的订单数量:
SELECT CustomerID, COUNT(OrderID) as OrderCount FROM Orders GROUP BY CustomerID;
这个示例将返回每个客户的订单数量。
-
查询每个客户的订单总金额:
SELECT CustomerID, SUM(Amount) as TotalAmount FROM Orders GROUP BY CustomerID;
这个示例将返回每个客户的订单总金额。
-
查询平均订单金额及订单数量:
SELECT CustomerID, AVG(Amount) as AvgAmount, COUNT(OrderID) as OrderCount FROM Orders GROUP BY CustomerID;
这个示例将返回每个客户的平均订单金额和订单数量。
3.4 整体示例与解释
我们有以下数据:
OrderID | CustomerID | Amount |
---|---|---|
1 | 101 | 50.00 |
2 | 102 | 75.00 |
3 | 101 | 30.00 |
4 | 103 | 100.00 |
运行上述示例查询后,结果可能如下:
-
查询每个客户的订单数量:
CustomerID OrderCount 101 2 102 1 103 1 -
查询每个客户的订单总金额:
CustomerID TotalAmount 101 80.00 102 75.00 103 100.00 -
查询平均订单金额及订单数量:
CustomerID AvgAmount OrderCount 101 40.00 2 102 75.00 1 103 100.00 1
三、数据完整性和约束
1、实体完整性和参照完整性
1.1 实体完整性
实体完整性是指确保每个表中的每一行都能够被唯一地标识。这通常通过定义主键来实现,主键是表中的一列或一组列,其值能够唯一标识表中的每一行。
示例: 在学生表中,学生的学号可以作为主键,确保每个学生都能够被唯一地标识。
1.2 参照完整性
参照完整性是指确保表中的外键引用的是另一张表中存在的有效数据。这通常通过定义外键和参照约束来实现,外键是一个表中的列,它包含另一张表的主键值,参照约束用于确保外键引用的值在另一张表中存在。
示例: 在学生表中,如果有一个课程表,学生表中的课程ID可以作为外键,参照课程表中的课程ID,确保学生选修的课程在课程表中存在。
1.3 示例与解释
示例:
我们有以下两张表:
学生表(Students):
学号 | 姓名 | 年龄 | 课程ID |
---|---|---|---|
1 | Alice | 20 | 101 |
2 | Bob | 22 | 102 |
课程表(Courses):
课程ID | 课程名称 |
---|---|
101 | 数学 |
102 | 英语 |
解释:
实体完整性
在学生表中,学号可以作为主键,确保每个学生都能够被唯一地标识。如果有重复的学号,插入或更新操作将会失败。
参照完整性
在学生表中的课程ID列可以作为外键,参照课程表中的课程ID,确保学生选修的课程在课程表中存在。如果学生表中的课程ID引用了课程表中不存在的课程ID,插入或更新操作将会失败。
作用
在数据库中,我们可以通过定义主键、外键和参照约束来实现实体完整性和参照完整性。这些约束可以确保数据的完整性和一致性,防止无效或不一致的数据被插入或更新到数据库中。
2、主键、外键约束
2.1 主键约束
主键约束用于确保表中的每行数据都能够唯一地被标识和区分。主键可以是单个列或多个列的组合,其值必须在表中是唯一的,且不能为空(即非NULL)。
示例: 在学生表中,学号可以作为主键,确保每个学生都能够被唯一地标识。
2.2 外键约束
外键约束用于建立表与表之间的关联关系,确保参照表中的数据必须在被引用的表中存在。外键是一个表中的列,它包含另一张表的主键值,从而建立了表与表之间的关系。
示例: 在学生表中,如果有一个课程表,学生表中的课程ID可以作为外键,参照课程表中的课程ID,确保学生选修的课程在课程表中存在。
2.3 示例与结果
假设我们有以下两张表:
学生表(Students):
学号 | 姓名 | 年龄 | 课程ID |
---|---|---|---|
1 | Alice | 20 | 101 |
2 | Bob | 22 | 102 |
课程表(Courses):
课程ID | 课程名称 |
---|---|
101 | 数学 |
102 | 英语 |
主键约束
在学生表中,学号可以设置为主键,确保每个学生都能够被唯一地标识。如果有重复的学号,插入或更新操作将会失败。
外键约束
在学生表中的课程ID列可以设置为外键,参照课程表中的课程ID,确保学生选修的课程在课程表中存在。如果学生表中的课程ID引用了课程表中不存在的课程ID,插入或更新操作将会失败。
作用
在数据库中,通过定义主键约束和外键约束,可以确保数据的完整性和一致性。主键确保每行数据的唯一性,而外键确保了表与表之间的关联关系和数据一致性。