数据库基础

基本理论知识

数据模型

数据库是长期存储在计算机内有组织的大量的共享的数据集合,数据库系统的核心和基础是数据模型

第一类数据模型:概念模型,信息模型,按照用户的观点来对数据和信息建模,主要用于数据库设计

第二类数据模型:逻辑模型和物理模型。

---逻辑模型包括:层次模型、网状模型、关系模型、面向对象模型、对象关系模型等

---物理模型:对数据最底层的抽象,描述数据在系统内部的表示方法和存取方法,在磁盘或磁带上的存储方式和存取方法,是面向计算机系统的。

数据模型一般由数据结构、数据操作和完整性约束三部分组成。

数据结构

存储在数据库中对象类型的集合,作用是描述数据库组成对象以及对象之间的联系。

数据操作

对数据库中各种对象实例允许执行的操作的集合,包括操作及相关的操作规则。

数据完整性约束条件

在给定的数据模型中,数据及其联系所遵守的一组通用的完整性规则,它能保证数据的正确性和一致性。

关系模型

关系模型是目前最重要的一种数据模型,关系数据库系统用关系模型作为数据的组织方式,关系模型中数据的逻辑结构是一张二维表

(1)关系的数据结构:一张表

(2)关系数据模型的数据操作包括:查询、插入、删除和更新数据

(3)关系模型的数据完整性约束条件包括:实体完整性、参照完整性、用户自定义的完整性

主键与外键

候选码:若关系中的某一属性组的值能唯一标识一个元组,则该属性组为候选码

主键(主关键字):若一个表中有多个候选码,则可选定其中一个为主键

主属性:候选码的诸属性称为主属性,不包含在任何候选码中的属性称为非主属性或非码属性

外键(外关键字):如果关系模式R中的某属性集不是R的主键,而是另一个关系R1的主键,则该属性集是关系模式R的外键。以另一个关系的外键作主键的表被称为主表,具有此外键的表被称为主表的从表。

关系模型的实体完整性规则

若属性A(一个或一组属性)是基本关系R的主属性,则A不能取空值,即主键不能为空

关系模型的参照完整性规则

若属性F(一个或一组属性)是某基本关系R的外键,且它与基本关系R1 的主键相对应,则对于R中,每个F上的值或为空值或等于R1中的主键值

事务

用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位

事务的四个特性(ACID特性):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability)。

索引

对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

索引的作用

(1)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性

(2)可以大大加快数据的检索速度,这是创建索引的最主要原因

(3)可以加速表与表之间的连接,特别是在实现数据的参照完整性方面特别有意义

(4)在使用分组(group by)和排序(order by)字句进行数据检索时,同样可以显著减少查询中分组和排序的时间

(5)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能

为表设置索引的代价

(1)增加了数据库的存储空间

(2)在插入和修改数据时要花费较多的时间(因为索引也要随之变动)

索引建立和删除语句

//在表Student(学生信息表)上按Sno(学号)降序建唯一索引

CREATE UNIQUE INDEX Stusno ON Student(Sno desc);

//删除Student表的Stusno索引

ALTER TABLE Student DROP INDEX Stusno;

视图

从一个或几个基本表(或视图)导出的表,与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍然存放在原来的基本表中。所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了,从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。

视图建立和删除语句

//建立一个计算机系学生的视图(在学生表Student的基础上)

CREATE VIEW CS_Student

AS

SELECT sno, sname

FROM Student

WHERE Sdept='CS';

注:视图一经建立,就可以像基本表一样被查询、删除

//删除视图

DROP view CS_Student;

SQL语句

SQL语句包含:数据定义(create、drop、alter)、数据查询(select)、数据操纵(insert、update、delete)、数据控制(grant、revoke)

数据定义

定义基本表(create)
CREATE TABLE 表名 
(列名 数据类型 列级完整性约束条件,
...... 列名 数据类型 列级完整性约束条件); 

//例子:建立“学生信息表”student

CREATE TABLE Student

(Sno CHAR(9) PRIMARY KEY,

Sname CHAR(20) UNIQUE,

Ssex CHAR(2),

Sage SMALLINT,

Sdept CHAR(20)

);

修改基本表(alter)
ALTER TABLE 表名

[ADD 新列名 数据类型 完整性约束]

[DROP 完整性约束名]

[MODIFY COLUMN 列名 数据类型]

例子:

//向Student表增加“入学时间”列,数据类型为日期型

ALTER TABLE Student ADD S_entrance DATE;

//将年龄的数据类型由字符型改为整数

ALTER TABLE Student MODIFY COLUMN Sage INT;

//增加Student表Sname必须取唯一值的约束条件

ALTER TABLE Student ADD UNIQUE(Sname);

删除基本表(drop)
//RESTRICT表示表的删除是有限制条件的,CASCADE表示表的删除没有限制条件
DROP TABLE 表名 [RESTRICT | CASCADE]

//例子:删除Student表

DROP TABLE Student CASCADE;

数据查询(select)

SELECT [ALL | DISTINCT] 目标列表达式
FROM 表明或视图名
[WHERE 条件表达式]
[GROUP BY 列名 [HAVING 条件表达式]]
[ORDER BY 列名 [ASC | DESC]];选择
选择表中的若干列

//在表Student中,查询名为Bill Gates 的学生信息

SELECT * from Student WHERE Sname='Bill Gates';

//在表Student中,查询名字中有Bill的学生信息

SELECT * from Student WHERE Sname like '%Bill%';

//在表Student中查询年龄在20-23岁(包括20与23岁)之间的学生信息

SELECT * from Student WHERE Sage BETWEEN 20 AND 23;

//在表Student中查询计算机系(CS)、信息系(MA)、数学系(IS)学生的姓名与性别

SELECT Sname,Ssex FROM Student WHERE Sdept IN('CS', 'IS', 'MA');

//在表Student中查询没有年龄信息的学生

SELECT * FROM Student WHERE Sage IS NULL;

ORDER BY子句

order by子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,默认是升序

//在表Student中,按学生的年龄值升序检索出全部学生的信息

SELECT * FROM Student ORDER BY Sage;

//在表Student中,先按专业升序,再同一专业按年龄降序,输出全部学生信息

SELECT * FROM Student ORDER BY Sdept, Sage desc;

LIMIT子句

查询之后要显示返回的前几条或中间某几行数据

SELECT * FROM TABLE LIMIT [offset, ] rows | rows OFFSET offset //偏移量从0开始

例子:

SELECT * FROM Student LIMIT 5,10;  //行,偏移; 检索记录行6-15

SELECT * FROM Student LIMIT 5;  //检索前5个记录行

注:LIMIT n等价于LIMIT 0,n

聚集函数

SQL语句中常用的聚集函数有count、sum、avg、max、min。

总数:select count(*) as totalcount from table1;
求和:select sum(field1) as sumvalue from table1;
平均:select avg(field1) as avgvalue from table1;
最大:select max(field1) as maxvalue from table1;
最小:select min(field1) as minvalue from table1;
GROUP BY子句

根据一个或多个属性的值来对元组进行分组,值相等的为一组

//查询Student表中具有相同年龄的每个组的人数

select Sage, count(*) from Student group by Sage;

//HAVING 子句用在GROUP BY子句的SQL语句中,用来选取符合指定条件的分组

select Sage,count(*) from Student group by Sage having count(*) > 1;

连接查询

若一个查询同时涉及两个以上的表,则称之为连接查询

//有表Student(学生信息表)、SC(选课表),要求查询每个学生及其选修课程的情况

SELECT Student.*, SC.*

FROM Student, SC

WHERE Student.Sno=SC.Sno;

//若某个学生没有选课,依然将其保存到结果中,这时需要使用外连接

//下例为左外连接,列出左边表(Student)中所有元组

SELECT Student.*, SC.* 

FROM Student LEFT JOIN SC ON(Student.Sno=SC.Sno);

数据操纵

向表中添加若干行数据、修改表中的数据、删除表中的若干行数据

插入元组(insert)

将新元组插入到制定表中,其中新元组的field1的值为value1,field2的值为value2...; 

INSERT
INTO table1(field1,field2...)
VALUES(value1,value2...)

//例:将新学生元组(学号:201009013;姓名:王明;性别:男;所在系:CS;年龄:23)插入到Student表中

INSERT INTO Student(Sno, Sname, Ssex, Sdept, Sage)

VALUES('201009013', '王明', '男', 'CS', '23' );

修改数据(update)
UPDATE table1
SET field1=value1, field2=value2
WHERE 范围;

//例:将学生201009013的年龄改为22岁

UPDATE Student

SET Sage=22

WHERE Sno='201009013';

删除数据(delete)
DELETE 
FROM table1
WHERE 范围;

//例:删除学号为201009013的学生记录

DELETE 

FROM Student

WHERE Sno='201009013';

参考:

《王道程序员面试宝典》

《程序员面试宝典》

原文地址:https://www.cnblogs.com/meiqin970126/p/15398948.html