书上的例子以及练习题都是用 Mysql 实现的,操作系统使用的 macOS。在使用 Mysql 遇到问题时,推荐查看官方文档 Mysql Reference Manual。
第一章就是综述整本书要讲的知识点,让读者对数据库系统有个大体的了解。我只记了一些比较重要的知识点,其他很多知识在后面章节会有更详细的讲解。
物理层(pysical level) - 逻辑层(logical level)(程序设计人员)- 视图层(view level)(数据库用户)
物理模式(pysical schema)(物理层)- 逻辑模式(logical schema)(逻辑层)- 子模式(subschema)(视图层)
因为程序员使用逻辑模式来构造数据库应用程序,从其对应用程序的效果来看,逻辑模式是目前最重要的一种模式。
如果应用程序不依赖物理模式,那么它们就被称为是具有物理数据独立性(pysical data independence)。
数据模型(data model)分为四类:关系模型(relational model),实体-联系模型(entity-relationshop model),基于对象的数据模型(object-based data model),半结构化数据模型(semistructured data model)
过程化 DML
声明式 DML(非过程化 DML)
数据库系统所使用的存储结构和访问方式是通过一系列特殊的 DDL 语句来说明的,这种特殊的 DDL 称作数据存储和定义(data storage and definition)。这些语句定义了数据库的模式的实现细节,这些细节对用户来说通常是不可见的。
存放在数据库中的数据值要满足一致性约束(consistency constraint)。
数据库系统实现可以以最小代价测试的完整性约束。
DDL 的输出放在数据字典(data dictionary)中,数据字典中包含了元数据(metadata),元数据是关于数据的数据。可把数据字典看作一种特殊的表,这种表只能由数据库本身(不是常规用户)来访问和修改。在读取和修改实际数据之前,数据库先要参考数据字典。
数据库系统的功能大致分为存储管理器和查询处理部件。
分量,元组中的一个属性值
关系模式,对关系的描述,关系名(属性1,属性2,… ,属性 n),学生(学号,姓名,年龄,性别,系,年级)
关系实例,表示一个关系的特定实例,也就是所包含的一组特定的行
域(Domian),属性的取值范围
由于关系是元组的集合,所以元组在关系中的顺序是无关紧要的。所以关系中的元素无论是排好序的还是无序的,都是无所谓的。两个关系中的元组的顺序即使不同,但这两个关系依然是相同的。
关系的概念对应于程序设计语言中变量的概念,关系模式对应于类型的定义,关系实例对应于变量的值。
前两章节基本都是枯燥的概念,接下来就会结合具体数据库(Mysql)进行学习。
首先是 Mysql 的安装,这里使用的是 macOS 的包管理工具 Homebrew 安装的 Mysql。
安装命令:
brew install mysql
启动命令:
mysql.server start
如果是第一次运行,需要进行初始化:
mysql_secure_installation
连接到本地的服务器:
mysql -u root -p
查看所有数据库:
show databases;
新建数据库 'test':
create database test;
使用数据库 'test':
use test;
查看'test'中所有表:
show tables;
表的创建:
创建表 'department':
create table department
(dept_name varchar(20),
building varchar(15),
budget numeric(12,2),
primary key(dept_name));
创建表 'instructor'
create table instructor
(ID varchar(5),
name varchar(20) not null,
dept_name varchar(20),
salary numeric(8,2),
primary key (ID),
foreign key (dept_name) references department);
create table
命令的通用形式是:
create table r
(A1 D1,
A2 D2,
...,
An Dn,
<完整性约束1>,
...,
<完整性约束k>);
SQL 更多的完整性约束条件会在第四章 完整性约束 一节详细介绍。
插入元组:
insert into department values ('Biology', 'Watson', '90000');
insert into department values ('Comp.Sci.', 'Taylor', '100000');
insert into department values ('Elec.Eng.', 'Taylor', 85000);
insert into department values ('Finance', 'Painter', '120000');
insert into department values ('History', 'Painter', '50000');
insert into department values ('Music', 'Packard', '80000');
insert into department values ('Physics', 'Watson', '70000');
insert into instructor values ('10101', 'Srinivasan', 'Comp.Sci.', '65000');
insert into instructor values ('12121', 'Wu', 'Finance', '90000');
insert into instructor values ('15151', 'Mozart', 'Music', '40000');
insert into instructor values ('22222', 'Einstein', 'Physics', '95000');
insert into instructor values ('32343', 'El Said', 'History', '60000');
insert into instructor values ('33456', 'Gold', 'Physics', '87000');
insert into instructor values ('45565', 'Katz', 'Comp.Sci.', '75000');
insert into instructor values ('58583', 'Califieri', 'History', '62000');
insert into instructor values ('76543', 'Singh', 'Finance', '80000');
insert into instructor values ('76766', 'Crick', 'Biology', '72000');
insert into instructor values ('83821', 'Brandt', 'Comp.Sci.', '92000');
insert into instructor values ('98345', 'Kim', 'Elec.Eng.', '80000');
数字类型的变量可以通过数字和字符串两种方式插入,而字符串类型的变量只能插入字符串。
删除元组: delete from r;
删除表: drop table r;
增加属性: alter table r add A D;
删除属性: alter table r drop A;
有关修改的操作会在本章末的 数据库的修改 一节详细讲解。
SQL 查询的基本结构由三个子句构成:select, from, where
。
大部分语句十分简单,只要将语句自己实现下就可以明白。
select budget from department; <=> select all budget from department;
select distinct budget from department;
select budget +(-,*,/) 1.1 from department;
select * from department;
select building
from department
where dept_name = 'Comp.Sci.' and budget <(<=,>,>=,=,<>) 8;
select name, instructor.dept_name, building
from instructor, department
where instructor.dept_name = department.dept_name;
在这里因为 name 和 building 只分别存在于 instructor 和 department,所以不用加前缀。但是 dept_name 在两个表中均存在,所以需要加一个前缀表示选中的是哪个表中的 dept_name 。
一个典型的 SQL 查询具有如下格式:
select A1,A2, ... ,An
from r1,r2, ... ,rn
where P;
自然连接(natural join)运算作用于两个关系,并产生一个关系作为结果。自然连接只考虑那些在两个关系模式中都出现的属性上取值相同的元组对。
自然连接后列出属性的顺序:先是两个关系模式中公共的属性(公共的属性只出现一次),然后是只出现第一个关系模式中的属性,最后是出现在第二个关系模式中的属性。
select *
from instructor natural join department;
可以和
select *
from department, instructor
where department.dept_name = instructor.dept_name;
还有
select *
from department, instructor;
对比一下。
使用 as
语句进行更名运算,可以作用在 select
中,也可以作用在from
中。
更名的情景有三个:
属性更名:
例如:
select name as instr_name, building
from instructor, department
where instructor.dept_name = department.dept_name;
表更名:
例如:
select distinct T.name
from instructor as T, instructor as S
where T.salary > S.salary and S.dept_name = 'Biology';
持续更新。。。