第一章      关系型数据库管理系统简介

1.1为什么使用数据库

所谓数据库,就是在计算机上集中存放数据的地方。通过将我们所需的数据和信息都保存在计算机数据库中,可以提供对数据的集中控制。数据库的集中控制有如下优点:

@降低存储数据的冗余度

@更高的数据一致性

@存储的数据可以共享

@可以建立数据库所遵循的标准

@便于维护数据完整性

@能够实现数据的安全性

1.2数据在数据库中的此次形式

1:层次模型:单个记录以父子关系组织在一起,形成一个倒挂的树。

2:网状模型:多个父子关系,以增强层次模型

3:关系模型:访问层次状数据库的应用程序基于该数据库已定义好的实现,数据库结构必须硬编码到应用程序的编程语言中。如果数据库发生变化,应用程序就必须变化。但是关系型数据库是独立于应用程序的。更改数据库设计,而不影响应用程序成为可能,关系模型用组成相关数据的表的行和列这种结构,来替换父子框架。

4:对象模型:在关系模型和对象模型之间存在一种阻抗不匹配的关系。在对象模型中,我们将整个物体(包括其特征、操作)整体放到数据库。

1.3关系型数据库的基本概念

*关系模型的理论是1970年由IBM的codd博士提出的。关系模型把世界看作是由实体和联系组成的。所谓实体就是指在现实世界中客观存在并可相互区别的事物。实体可能是有形的或者无形的、具体的或抽象的、有生命的或无生命的。

*实体所具有的某一特性称为属性。实体可以通过若干属性来描述。

*以关系模型来创建的数据库称为关系型数据库。表是关系型数据库的核心单元,它是存储数据的地方。

*在表的内部,数据被分为行和列。填入表中的每一行,代表一个实体。而行的每一列,代表实体的一个属性

*在关系型数据库的表中,用一个唯一的标识符来标识每一行,这个标识符就是主键

*外键就是用来表达表和表之间的关联关系。

*表之间的关联关系存在三种基本的关系类型:一对一关系、一对多关系、多对多关系

1.4关系型数据库管理系统

RDBMS分为以下两种类型:

1.本地数据库管理系统

本地数据库管理系统又称为桌面型数据库管理系统。在这种模式下,RDBMS与数据库应用程序运行在统一客户端的进程中。

2.数据库服务器管理系统

   数据库运行在客户端,而RDBMS运行在专门的数据库服务器上

1.5结构化查询语言SQL

1.SQL是每个RDBMS都能理解的语言。SQL的优点在于,不管我们创建前台客户端用的是ASP.NET、Java、VisualBasic、C#,还是别的语言,SQL是所有这些前台关系型数据库通讯的语言。

2.SQL的非过程性质

  传统语言一般被认为是一种过程式语言,即,它们定义如何执行一个应用程序的操作,以及执行的次序。相反,SQL在本质上就是非过程式的,它主要关心的是操作结果,而由宿主语言决定如何操作。当然,这并不意味着SQL不包括过程元素。即使有了这些过程式元素,也没有使SQL变为一个过程式语言。我们必须使用过程式语言与SQL协同工作,来操作存储在RDBMS中的数据。

3.SQL语句

*数据定义语言(DDL):用于创建、修改和删除数据库中的数据结构

创建和删除数据库的createdatabase和drop database

创建、修改、重命名、删除表的createtable、alter table、rename table、drop table

创建和删除索引的create index和drop index

*数据查询语言(DQL):select语句为查询语句

*数据操作语句(DML)

将数据插入到一个表中的insert语句;

更新表中已有数据的update语句;

删除表中数据的delete语句。

*数据控制语句(DCL)

给用户授予访问权限的grant语句;

取消用户访问权限的revoke语句。

 

第二章       管理数据库和表

2.1管理数据库

1.创建和使用数据库:create database 数据库名;

2.连接到数据库:use 数据库名;

3.删除数据库:drop database 数据库名;

2.2数据类型

整数数据类型

类型大小范围(有符号)范围(无符号)用途 
TINYINT 1 字节 (-128,127) (0,255)小整数值 
SMALLINT 2 字节 (-32768,32767) (0,65535)大整数值 
MEDIUMINT 3 字节 (-8388 608,8 388607) (0,16 777215)大整数值 
INT 4 字节 (-2 147 483 648,2 147 483 647)大整数值 
BIGINT 8 字节 (-9233 372 036 854 775 808,9 223372 036 854 775 807) (0,18 446744 073 709 551 615) 极大整数值 

浮点数据类型
FLOAT 4 字节(-3.402 823 466 E+38,1.175494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度浮点数值 
DOUBLE 8 字节(1.797 693 134 862 315 7 E+308,2.225073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4E-308,1.797693 134 862 315 7 E+308) 0,(2.225073 858 507 201 4 E-308,1.797693 134 862 315 7 E+308) 双精度浮点数值 
DECIMAL 对DECIMAL(M,D),m为总数值,d为小树值,m必须大于d

字符串类型

类型 大小  用途 
CHAR 0-255字节定长字符串 
VARCHAR 0-255字节变长字符串 

二进制数据类型
TINYBLOB 0-255字节不超过 255个字符的二进制字符串 
BLOB 0-65 535字节二进制形式的长文本数据 
MEDIUMBLOB 0-16 777 215字节二进制形式的中等长度文本数据 
LOGNGBLOB 0-4 294 967 295字节二进制形式的极大文本数据 

日期和时间类型
类型大小 (字节)范围格式用途 
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值 
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间 
YEAR 1 1901/2155 YYYY 年份值 
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值 
TIMESTAMP 8 1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMSS混合日期和时间值,时间戳

2.3管理表

1.创建表

Create table 表名(

列名1   数据类型  列的约束,

列名2   数据类型  列的约束,

列名3   数据类型  列的约束

);

表名在一个数据库中必须是唯一的,并且符合标识符规则。

2.删除表

Drop  table 表名;

3.复制表

(1)复制表的结构和数据

Create table 表名select*from被复制的表名;

(2)只复制表的结构,不复制数据。只需在where子句后添加一个永远不等于ture的条件即可。

Create table 表名select*from被复制的表名  where1=0;

4.修改表

alter table 已存在表名 add新加的列名数据类型[约束];

alter table 已存在表名 add新加的列名1数据类型[约束],

       add 新加的列名2 数据类型[约束],

add 新加的列名2数据类型[约束];

alter table 表名

Change 旧列名新列名数据类型[约束条件]

Default‘默认值’;

alter table 表名 drop  column想要删除的列名;

2.4管理索引

1.创建索引:create index 索引名  on表名 (列名1),

 索引名  on表名 (列名1);

2.删除索引:alter table 表名 drop index索引名;

 

第三章  保证数据完整性

3.1数据完整性概述

  保证数据完整性的目的是为了防止存储垃圾数据,影响数据库的执行效率。

1.       实体完整性:保证一行数据是有效的,保证每行所代表的实体能够相互区分(通过在表中设置主键约束、唯一约束或标识列属性来实现)

2.       域完整性:保证一列数据是有效的(通过外键约束、检查约束、默认值定义、非空约束实现)

3.       引用完整性:保证引用的编号是有效的

4.       用户自定义完整性:可以通过触发器、存储过程等实现

3.2数据完整性的实现

1.创建非空约束:在定义列时加上一个not null关键字,来定义一个非空约束

For explem:altertable friend add sarly int not null;

2.主键约束:主键是表中的一到多个列,主键列不能为空,也不能重复。一张表中只能有一个主键,但是主键可以有一列或多列组成。

只有一个主键列:

 Create  table friend(

primary key,

  Name varchar(50)

);

主键约束有多列共同组成:

Create  table friend(

Friendid int ,

Name varchar(20),

Age int ,

Primarykey(friendid,age)

);

3.设置唯一约束:唯一约束是指给指定列所有的值必须是唯一的,该列在每一行的值必须唯一,确保输入到指定列的值不重复,但允许为null值。

Create table friend(

Friendid int,

Name varchar(20) unique

);

4.指定默认值:

Createtable friend(

Namevarchar(50) not null,

Phoneonvarchar(20) default‘不知道电话号码’

);

5.外键约束:

Createtable friend(

Friendidint,

Namevarchar(50) not null,

Phoneonvarchar(20)

);

Createtable friend1(

Friendidint,

Namevarchar(50) not null,

Phoneonvarchar(20),

Foreign key (friendid) references friend(friendid)

);

5.       使用自动编号列:这种自动产生值的字段通常与primary key约束一起配合使用.mysql使用auto_increment来实现字段的自增长。

默认情况下,种子值和增量值都是1

Createtabletest(

Friendidintprimary keyauto_increment,

Namevarchar(50) not null,

);

也可以通过下面的代码设置其实序号:

alter table 表名 auto_increment=100;

6.对已存在的表实时数据完整性 

MySQL查看约束,添加约束,删除约束添加列,修改列,删除列

·        添加主键约束:alter table 表名 add constraint主键(形如:PK_表名) primary key表名(主键字段);

·        添加外键约束:alter table 从表 add constraint外键(形如:FK_从表_主表) foreign key从表(外键字段) references主表(主键字段);

·        删除主键约束:alter table 表名 drop primary key;

·        删除外键约束:alter table 表名 drop foreign key外键(区分大小写);

·        删除唯一约束:alter table表名 drop index unique;

·        修改表名:alter table t_book rename to bbb;

·        添加列:alter table 表名 add column列名 varchar(30);

·        删除列:alter table 表名 drop column列名;

·        修改列名MySQL: alter table bbb change nnnnn hh int;

·        修改列名SQLServer:exec sp_rename't_student.name','nn','column';

·        修改列名Oracle:alter table bbb rename column nnnnn to hh int;

·        修改列属性:alter table t_book modify name varchar(22);

 

第四章使用DML语句更改数据

4.1 添加新数据

4.1.1 插入单行数据

Insertinto 表名(列名列表)values (值列表);

into 是insert和目标表之间可以使用的关键字

表名是插入记录的目标表的名称

列名列表是插入记录的目标表的列名,是一个以逗号分隔开的列名列表

4.1.2插入多行记录

方法1:Insert into 表名 values ( ),(  );

方法2:insert into 表名 (列名列表)select select语句;

4.1.3表数据的复制

方法1:insert  into 表名 select*from被复制的表名;

使用方法1的前提条件是,有一张表和被复制表的结构一致

方法2(建表的方式复制):create table 表名 select*from被复制的表名;

4.2更改已有数据

Update 表名 set列名1=新值1,列名2=新值2  where 过滤条件;

4.2.1更新单列数据

Update friend set name=’李四’ where id=1;

4.2.2更新多列数据

Update friend set name=’李四’ , age=18 where id=2;

4.2.3 通过更新删除列中的数据

有时候需要通过数据的更新操作,实现删除某列的目的。通常的做法是把该列的值设置为null。当然这样做的前提是该列允许为null,即没有非空约束。

Update 表名 set列名=null  where过滤条件;

 4.3删除数据

4.3.1使用delete删除

Delete from 表名 where过滤条件;

使用行过滤条件可以从目标中删除一到多行数据。

Delete from student where id=1 orid=3;

删除区间行

Delete from student where id  between 10  and  19;

4.3.2 使用truncate语句

Truncate table 表名;

Truncate table 不能用于有外键约束引用的表,这种情况下,需要使用不带where子句的delete语句。

truncate和delete、drop之间有什么区别

相同点:

1.truncate和不带where子句的delete、以及drop都会删除表内的数据。 

2.drop、truncate都是DDL语句(数据定义语言),执行后会自动提交。

不同点:

1. truncate 和 delete只删除数据不删除表的结构(定义)
drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为invalid状态。

2. delete 语句是数据库操作语言(dml),这个操作会放到 rollback segement中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。
truncate、drop是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment中,不能回滚,操作不触发 trigger。 

4.速度,一般来说: drop> truncate >delete 

5.安全性:小心使用 drop和 truncate,尤其没有备份的时候.否则哭都来不及
使用上,想删除部分数据行用delete,注意带上where子句.回滚段要足够大.
想删除表,当然用drop
想保留表而将所有数据删除,如果和事务无关,用truncate即可。如果和事务有关,或者想触发trigger,还是用delete。
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。

6.delete是DML语句,不会自动提交。drop/truncate都是DDL语句,执行后会自动提交。 

7、TRUNCATE  TABLE  在功能上与不带  WHERE  子句的  DELETE  语句相同:二者均删除表中的全部行。但  TRUNCATE   TABLE  比  DELETE  速度快,且使用的系统和事务日志资源少。DELETE  语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE  TABLE  通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。 

8、truncate   table  删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用  DELETE。如果要删除表定义及其数据,请使用  DROP   TABLE   语句。  
    
9、对于由   FOREIGN  KEY  约束引用的表,不能使用  TRUNCATE   TABLE,而应使用不带  WHERE  子句的  DELETE  语句。由于  TRUNCATE   TABLE  不记录在日志中,所以它不能激活触发器。    

10、TRUNCATE  TABLE  不能用于参与了索引视图的表。  

第五章 简单的数据查询

5.1 查询的基本结构

select  [distinct] {*|column [alias] ,……}

from  table

[where condition]

[order by column];

5.2投影操作

投影操作是指在SQL查询中,使用select 语句,选择对表中的哪些列进行操作

Select  列名列表 from 表名;

列名列表几种书写格式:

如果我们选择某个列中的多个列,那么列名之间用逗号分隔开;

如果是单个列,只需要列出该列的列名即可;

如果选择所有的列,可以简单地用*代替列名列表。

5.2.1  表名前缀(在更复杂的多表情况下)

Select 表名.列名from表名;

5.2.2列别名

使用别名可以在多个表有同样的列名的时候,使用别名更容易区分

Select 列名 as别名,列名 as别名from表 as别名;

5.2.3计算列

Select 列名+50  from表名;

用于拼接不同列的函数:selectconcat(列名1,列名2) from表名;

5.2.4排除重复数据

Select distinct 列名 from表名;

5.2.5返回限定行数的查询

Select 列名1,列名2from表名 limit开始序号,返回的行数;

5.3选择操作

5.3.1单选择操作

Select 列名列表 from表名where条件;

eg:select  name from  student  where id=3;

5.3.2多选择操作

Select 列名列表 from表  where条件1 and/or条件2;

5.3.3执行范围操作

Select 列名列表 from表

Where 列名 between下限 and上限;

5.3.4定义集合关系(在指定的几个值中进行搜索)

Select 列名列表 from表名  where列名 (not)in(值集合);

例如:我们在instant数据库中的studentexam中查询studentid为2、7、和3的信息

Select studentid ,examid, mark  from studentexam where  studentidin(2,7,3);

5.3.5模糊查询

Select 列名列表 from表名  where列名 like模式;

eg: select *from  student where  money  like ‘%0’;