数据库必知必会
关系型数据库
关系型数据库的发展历程,大致经历了理论奠基、SQL标准化、商用成型与多元化发展四个阶段:
- 理论奠基:数学家E.F.Codd发表了数学论文《用于大型共享数据库的关系数据模型》提出了关系模型及关系运算,为数据库理论奠定了基础。
- SQL标准:Codd的同事Don Chamberlin将理论转化为SQL语言,这一语言后来成为关系型数据库的标准语言。
- 商用成型:Larry Ellison及其团队看到了商业潜力,开发了首个商用关系型数据库Oracle。
- 多元化发展:IBM推出DB2数据库;Michael Stonebraker开发了Postgres并放在BSD版权下,后来演变为Postgres SQL;87年微软与Sybase合作开发了MS SQL;其他主流数据库如MySQL、Ingres和Informix等,也与Michael Stonebraker有关。
《用于大型共享数据库的关系数据模型》中对关系这一词做了具体的解释:
A relation, informally, is a table of values. Formally, a relation is a set of n-tuples. Each n-tuple is an ordered list of n values. All n-tuples in a relation have the same number of values. Each value is taken from some set or domain D1, D2, …, Dn. The values in an n-tuple are called the components of the n-tuple. The values in a component are atomic. That is, no relation value is a set, list, or table.
关系在非正式情况下是一张值的表格。正式地说,一个关系是一组n-元组。每个n-元组是n个值的有序列表。在一个关系中,所有的n-元组都有相同数量的值。每个值都取自一些集合或域D1、D2、…、Dn。n-元组中的值被称为n-元组的组成部分。n-元组中的值是原子的。也就是说,关系值不是一个集合、列表或表格。
在这篇论文中,Codd提出了以下关系的基本特征:
关系是一个二维表:关系被组织成行和列的形式,每一行代表一个记录,每一列代表一个属性。
元组(Tuple):关系中的每一行被称为一个元组,包含了一组属性值。
属性(Attribute):关系中的每一列被称为一个属性,描述了元组的某一方面。
域(Domain):属性的取值范围被称为域,确保属性值的合法性。
键(Key):关系中的某个属性或属性组合可以唯一标识一个元组,称为关系的键。
关系型数据库SQL命令
表级别操作
- 建表:
CREATE TABLE Stutend(
column1 datatype,
column2 datatype,
...
);
- 删除
DROP TABLE table_name ; -- 直接删除表,不检查是否存在
或
DROP TABLE [IF EXISTS] table_name;`
- 添加列
#在 employees 表中添加了一个名为 birth_date 的日期列:
ALTER TABLE employees ADD COLUMN birth_date DATE;
- 修改列的数据类型
# 将 employees 表中的 salary 列的数据类型修改为 DECIMAL(10,2):
ALTER TABLE employees MODIFY COLUMN salary DECIMAL(10,2);
- 修改列名
# 将 employees 表中的某个列的名字由 old_column_name 修改为 new_column_name
ALTER TABLE employees CHANGE COLUMN old_column_name new_column_name VARCHAR(255);
- 删除列
# 将 employees 表中的 birth_date 列删除:
ALTER TABLE employees DROP COLUMN birth_date;
- 修改表名
# 将表名由 employees 修改为 staff:
ALTER TABLE employees RENAME TO staff;
数据级别操作:
- 增
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
- 删
DELETE FROM table_name
WHERE condition;
- 改
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
- 查
SELECT column1, column2, ...
FROM table_name
[WHERE condition]
[ORDER BY column_name [ASC | DESC]]
[LIMIT number];
- 表连接
NNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
SELECT column1, column2, ...
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
SELECT column1, column2, ...
FROM table1
LEFT JOIN table2 ON table1.column_name = table2.column_name;
RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
SELECT column1, column2, ...
FROM table1
RIGHT JOIN table2 ON table1.column_name = table2.column_name;