关系型数据库
一、关系型数据库管理
1.数据库概述
(1)数据库概念:
所谓数据库,就是在计算机上集中存放数据的地方。将所需数据和信息保存在计算机数据库中,对数据进行集中控制。
(2)优点:
- 降低存储数据的冗余度——减少数据的重复
- 具有更高的数据一致性——避免出现不一致的数据
- 存储的数据可以共享——可以随时访问不断更新的公用信息
- 可以建立数据库所遵循的标准——建立了一个标准,所有存入的数据的名字,都会以相同的格式表示
- 便于维护数据完整性——保证数据库中数据准确性
- 能够实现数据的安全性
2.数据库中的存储形式
- 层次模型:提供一种相对简单的结构,单个记录以父子关系组织在一起,形成一个倒挂的树状
- 网状模型:网状模型允许记录多个父子关系以增强层次模型
- 关系模型:独立与应用程序,更改数据库设计不会影响应用程序,在表之间可以定义复杂的关系
- 对象模型:将整个物体整体放到数据库中,对访问数据库和使用主流的面向对象编程技术形成了一致独
3.关系型数据库的基本概念——以关系模型来创建的数据库称为关系型数据库,类似的实体被存入到表中
(1)一对一关系
一对一关系是比较少的关系类型
(2)一对多关系
(3)多对多关系
二、数据库和表
1.管理数据库
(1)创建和使用数据库
创建语法:
create database 数据库名;
示例:
create database Instance;
标识符规则:
- 第一个字符:Unicode中定义的字母包括拉丁字母a-z和A-Z,以及来自其他语言的字母字符;下划线_,at符号(@),或者数字符号(#)
- 后续字符:Unicode中定义的字母,十进制数字,下划线_,at符号(@),或者数字符号(#),美元符号$
- 标识符不能使RDBMS的保留字
- 不允许嵌入空格和其他字符
(2)连接到数据库
语法:
use 数据库名;
示例:
use Instance;
(3)删除数据库
语法:
drop database 数据库名;
示例:
drop database Instance;
(4)查看数据库
语法:
show databases;
2.数据类型
(1)整数数据类型,列举常用类型
1)smallint型:范围是-32768-32767之间,每个该类数据占据2个字节的存储空间
2)int型:每个数据占用4个字节的存储空间
(2)浮点型
1)float型:可精确到小数点后15位
2)DECIMAL型和NUMERIC型:二者可以提供小数所需的世纪存储空间,用于货币单位之间
(3)字符串型:
1)char型:定长字符数据,长度最多为8kb,SQL假定的长度为1个字符
2)varchar型:可变长度字符数据,长度不超过8kb
3)TXET类型:长度超过8kb可用TXET类型存储
3.管理表
(1)创建表
语法:
create table 表名字(列名 列的数据类型 列的约束);
示例:
create table student(stu_name varchar(20));
(2)删除表
语法:
drop table 表名字;
示例:
drop table student;
(3)复制表
示例:
select * into My_Student from student;
(4)添加新的列
示例:
alter table student add address varchar(50);
(5)一次添加多个列
示例:
alter table student add address varchar(50),ICQ varchar(30);
(6)删除某一列
示例:
alter table student drop column stu_address;
4.管理索引
(1)创建索引
语法:
create index 索引名 on 表名字 (列名1,列名2...);
(2)删除索引
示例:
drop index student.IDindex;
三、数据完整性
1.概述
- 实体完整性——每一行代表的实体相互区别,不能存在两条一模一样的记录,通过设置主键约束,唯一约束或标识列属性来实现。
- 域完整性——给定列的输入有效性,通过限制类型(通过数据类型)、格式(通过检查约束)或可能值得范围(外键约束,默认值定义,非空约束)。
- 引用完整性——必须在有关联关系的表中,确保一个标的外键值来源于另一个表中的主键值
2.实现
(1)创建非空约束
示例:
create table student(
name varchar(50) not null,
phoneNo varchar(20) not null
);
(2)设置主键约束
primary key:应用于标的列的一个约束,注意,主键列不允许存储null值。
示例:
create table student(
name varchar(50) not null primary key,
phoneNo varchar(20) not null
);
(3)设置唯一约束
unique:给定列的所有值必须是唯一的,该列在每一行的值都必须唯一。
示例:
create table student(
name varchar(50) primary key not null,
phoneNo varchar(20) unique
);
(4)指定默认值
示例:
create table student(
name varchar(50) not null,
phoneNo varchar(20) default '不知道电话号码' not null
);
(5)设置检查约束
检查约束是最灵活的约束类型,允许我们再更改或插入列到数据库时有一个叫宽泛的限制
示例:
create table student(
name varchar(50) not null,
phoneNo varchar(20) default '不知道电话号码' not null,
age int,
constraint checkAge check (age between 10 and 100)
);
(6)引用完整性和外键约束
外键维护两张表之间的数据的关系
- 第一范式(1NF)每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体某个属性不能有多个值或不能有重复的属性,必须是基本数据,不能大量重复某个值——原子性,不可切割
- 第二范式(2NF)数据库中的每个实例或行必须可以被唯一的区分
- 第三范式(3NF)数据库表中不含已在其他表中包含的非主关键字信息
foreign key 约束连接的两个列必须是相同的(或至少是相似的)数据类型
示例:
CREATE TABLE users(
u_id INT PRIMARY KEY,
u_name VARCHAR(20),
u_pwd VARCHAR(20),
u_type SMALLINT
)
CREATE TABLE userinfo(
info_di INT PRIMARY KEY,
info_nickName VARCHAR(20),
info_email VARCHAR(20),
#外键约束
u_id INT,
CONSTRAINT FK_userinfo_uId FOREIGN KEY (u_id) REFERENCES users (u_id)
)
四、使用DML语句更改数据
1.添加新数据
(1)插入单行记录
语法:
insert into 表名字(列名1,列名2列名3...) values(1,2,3...);
示例:
insert into student(name,hireDate)values(John,2004-01-01);
说明:
- into是insert和目标表之间可以使用的关键字
- 表名是插入记录的目标表的名称
- 列名列表指定插入记录的目标表的列名,是一个以逗号分隔的列名列表
(2)插入多行记录——将数据从一个表复制到另一个表上
语法:
insert into 目标表名字(目标列名字) select 源列名字 from 源表名字;
示例:
insert into student1(studentName) select 源列名字 from 源表名字;
(3)表数据的复制
select 列名 into 新表名 from 表名;
示例:
select * into student2 from student;
2.更改已有数据
(1)更新单列数据
示例:
update student set address='shanghai' where stu_name='lisi';
(2)更新多列数据
示例:
update student set address = 'chengdu',phoneNumber =1234 where stu_name='李四';
(3)通过更新删除列的数据
示例:
update set address=null where stu_name='lisi';
3.删除数据
(1)使用delete删除行
语法:
delete from 表名 where 过滤条件;
示例:
delete from student where stu_id = 1;//删除整行,但不能删除表本身
(2)使用truncate语句初始化
语法:
truncate table 表名;
示例:
truncate table student;
truncate table一次性完成删除与表有关的所有数据操作,但结构,列,约束,索引不会被改动,不能用于有外键约束的引用的表
5.简单的数据查询
(1)基本结构
标准select查询由select子句、from子句、where、order by子句组成,select、from、where、order by和distinct都是SQL的关键字。
数据库的基本差需操作分为——投影操作、选择操作、排序操作
(2)投影操作
语法:
select 列名列表 from 表名;
示例:
select stu_id,stu_name,stu_grade from student;
1)表名前缀
示例:
select users.u from users;
2)列别名
语法:
select 列A as A,列B as B,列C as C from 表名 as T;
当使用表的别名时,可以在同一SQL语句中的列名中使用别名,如:
select T.列A as A,T.列B as B,T.列C as C from 表 as T;
示例:
select Name as studentName,studentID as ID from student;
3)计算列
4)排除重复数据
语法:
select distinct 列名 from 表名;
示例:
select distinct grade from student;
(2)选择操作
语法:
select 列名列表 from 表 where 条件;
1)单条件选择操作
语法:
select 列A,列B from 表 where 列C=值;
示例:
select stu_name from student where stu_id;
2)多条件选择操作
语法:
select 列A,列B from 表 where 条件1 and(or)条件2;
示例:
select studentID,mark,comments from studentExam where ExamID = 1 and ifPassed = 1;
3)执行范围测试
语法:
select 列A,列B from 表 where 列C between 下限 and 上限;
示例:
select ExamID,sustainedOn,comments from Exam where sustainedOn between '2003-03-02' and '2003-03-20';
4)定义集合关系
语法:
select 列A,列B from 表 where 列C (not) in (值集合);
示例:
select studentID,examID,mark from studentExam where studentID in (2,7,3);
5)模糊查询
语法:
select 列A,列B from where 列C like 模式;
通配符:
% -----> 包含零个或更多字符的任意字符串
_ -----> 任何单个字符串
示例:
select name from student where name like '%L';
6)处理空值数据
语法:
select 列A,列B from 表 where 列C is not null; ---->测试不为空
select 列A,列B from 表 where 列C is null; ----->测试为空
(4)排序操作
语法:
select 列A,列B,列C from 表 order by 列A,列B,列C...;
1)单序排列
语法:
select 列A,列B,列C from 表 order by 列A;(升序)
select 列A,列B,列C from 表 order by 列A ASC;(字母排序)
select 列A,列B,列C from 表 order by 列A desc;(降序)
示例:
select name,ID,from student order by name desc;
2)多列排序
语法:
select 列A,列B,列C from 表 order by 列A,列B,列C...;
示例:
select course,professor,sustainedOn from exam order by course,professor,sustainedOn;
6.聚合函数与分组
(1)使用聚合函数进行统计汇总
- count:返回结值为集中行的数目
- sum:返回值集中所有值得总和
- avg:返回值集中所有值的平均值
- max:返回值集中所有值的最大值
- min:返回值集中所有值的最小值
1)执行行和列计算
语法:
select count (计数规范) from 表名;
2)返回列合计值
select sum (计数规范)from 表名;
示例:
select sum(all unitPrice)from product;
3)获取平均值
语法:
select avg (平均值规范) from 表名;
示例:
select avg(all age)from student;
4)返回最大值或最小值
语法:
select max(最大值规范)from 表名;
select min(最大值规范)from 表名;
(2)数据分组
1)过滤分组数据
语法:
select 列A,聚合函数(聚合函数规范)from 表名 where 过滤条件 group by 列A;
2)使用having子句
(3)SQL语句的执行顺序
- 首先执行from子句,将from子句中的表作为中间表
- 如果有where子句,则根据其中的过滤条件,从中间表中去掉不满足过滤条件的行
- 根据group by 子句中指定的分组列,对中间表中的数据进行分组
- 为每个组计算select子句聚合函数的值,并为每组生成查询结果中的一行
- 如果有having子句,则根据having子句的过滤条件,分组计算聚合计算的结果再次过滤
- 如果有order by子句,则根据order by子句中的列,对结果进行排序
7.组合查询
(1)使用子查询——嵌套在其他查询中的查询
- 非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询
- 相关子查询的执行依赖于外部查询的数据,外部查询返回一次,子查询就执行一次
1)子查询作为计算列
子查询的一个简单的形式就是内部查询作为外部查询的每行返回一个单值结果,通常作为一个结果插入到计算列
语法:
select columnA,(子查询) As columnB from 表名
2)where字句中的子查询
语法:
select columnA from tableA where columnB = (子查询);
3)返回多个结果的子查询
语法:
select columnA,columnB from table where columnC in (select columnD from table2);
(2)组合查询数据
1)使用union 运算符
语法:
select columnA,columnB from tableA
union
select columnC,columnD from tableB;
2)保留重复行
语法:
select columnA,columnB from tableA
union all
select columnC,columnD from tableB;
总结:
- 嵌套在其他查询中的查询为子查询。所有的子查询可以被分为两个类别:相关子查询、非相关子查询
- 子查询有称为内部查询,包含子查询的查询语句称为外部查询
- 在查询中,我们可以使用表的别名和列的别名。当我们使用多个表时,使用表的别名有显然的优点
- 在有多个子查询的查询,每个组成子查询的查询仅执行一次,每个依此将传递一个值或者一系列值到一个外部查询
- Exist运算允许我们查找满足特定条件的行,Exist后面总是跟一个子查询,只要子查询反悔了行的,Exist的值就为真
- all运算符与子查询和比较运算符(=、>或<)一起使用。如果子查询返回的所有值都满足比较运算,那么比较表达式就为真;如果不是所有值都满足比较运算符或子运算查询都没有给外部语句返回行,则返回假
- any与all的工作方式不同的是:在子查询返回的值中,只要有一行满足比较运算,那么比较表达式就为真,如果所有值都不是真,则返回假
- SQL允许不管集合理论的通常规则,使用union all运算符返回每个数据集的所有成员,而不考虑重复
8.联接
(1)简单联接
1)使用量表简单联接——两个表的行相连接的最常用的方法是通过一个相等联接。相等链接基于每行中的一个列的值。
示例:
select tableA.column1,table1.column2,table2.column3,from table1 join table2 on table1.column1 = table2.column2;
2)使用多表相等联接——相等联接不只是局限于两个表,我们可以在联接中包含更多表。
示例:
select * from table1 join table2 on table1.column1 = table2.column2
join table3
on table1.column3 = table3.column4
3)使用非相等联接
语法:
select * from table1,table2 where table1.column1 < table2.column2
(2)使用联接
1)内联接
内联接是一种典型的联接运算,使用=,<或>之类的比较运算符。包括相等联接,非相等联接和自然联接。内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。
示例:
select table1.column1,table2.column2 from table1 Inner table2 on table1.column1 = table2.column;
2)外联接
- 左外联接(left join或 left outer join):该联接的结果集包括left outer子句中指定的左表的所有行,而不仅仅是联接到所匹配的行。如果左表的某个行在右表中没有匹配,则在相关联的结果集行中右表的所有选择列表均为空值
- 右外连接(right join或right outer join):右向外联接是左向外联接的反向联接,将返回右表的所有行。若果右表的某行在左表中没有匹配的,则将为左表返回空值
- 全外联接(full join或full outer join):全外联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值
a.左外联接
语法:
select * from table1 left outer join table2 on table1.column1 = table2.column2
b.右外联接
语法:
select * from table1 right outer join table2 on table1.column1 = table2.column2
c.全外联接
语法:
select * from table1 full outer join table2 on table1.column1 = table2.column2