当前位置:文档之家› SQL数据库基础知识集合

SQL数据库基础知识集合

1、数据库简介:数据库是专门开发数据管理的软件,或者说专门管理数据的软件就是数据库。

数据库存在的意义就是:减轻开发人员的负担。

数据库是一个综合的软件,那么我们不需要队要进行2进制保存数据进行处理了,但是却是要与数据库产生交互,那么命令式SQL,有技巧的,数据库就是万物皆关系(面向对象,万物皆是对象)有所区别。

2、数据库的发展:一开始的是层次化的数据与网状数据库,后来也发现使用确实很麻烦。

于是到了1970年EF.Cold博士(IBM公司的研究员)开创了关系性的数据库的先驱,发表了关系性数据库的论文,但是由于当时电脑硬件的局限性,大家觉得跑如此大的程序不值得。

后来,Oracle(甲骨文)公司的创始人,拉里带领Oracle投入到关系型数据库的研发,并且得到了一个大客户—美国国防部。

随即开始世界刮起了关系数据库的旋风,随后各个公司都纷纷推出自己的数据库系统。

比如:IBM的DB2 ,还有风靡一时的DBS3。

但是随即出现不兼容的问题,由于最早的时候都没有进行没规范。

所以到最后各个数据库巨头统一了操纵数据库的SQL(结构化Struct数据查询语言)变成了标准语言,而关系型数据库也俨然变成大家的宠儿,Oracle也从一个小公司,变成现在的数据库巨头,而我们的微软也推出了SQLServer。

当然还有PHPer的最爱mySQL。

但是mySQL被SUN,SUN 被Oracle收购,现在有免费版与收费专业版了。

所以我们学习SQL语言的时候,先学共同点,再学特异性。

各种数据库软件在使用上有一点区别。

3、数据库系统详解:为适应数据处理的需要而发展起来的一种较为理想的数据处理的核心机构。

计算机的高速处理能力和大容量存储器提供了实现数据管理自动化的条件。

数据库系统一般由4个部分组成:数据库,即存储在磁带、磁盘、光盘或其他外存介质上、按一定结构组织在一起的相关数据的集合。

(个体)数据库管理系统(DBMS)。

一组能完成描述、管理、维护子数据库的程序系统。

它按照一种公用的和可控制的方法完成插入新数据、修改和检索原有数据的操作。

数据库管理员(DBA)。

用户和应用程序。

(微软的称作SSMS)4、数据库系统的基本要求是:1、能够保证数据的独立性。

数据和程序相互独立有利于加快软件开发速度,节省开发费用。

2、冗余数据少,数据共享程度高。

3、系统的用户接口简单,用户容易掌握,使用方便。

4、能够确保系统运行可靠,出现故障时能迅速排除,能够保护数据不受非受权者访问或破坏,能够防止错误数据的产生,一旦产生也能及时发现。

5、有重新组织数据的能力,能改变数据的存储结构或数据存储位置,以适应用户操作特性的变化,改善由于频繁插入、删除操作造成的数据组织零乱和时空性能变坏的状况。

6、具有可修改性和可扩充性、可维护性。

7、能够充分描述数据间的内在联系。

5、数据库(Database):由众多的数据、数据表、约束、存储过程、函数、视图、索引构成的一个数据存储与交互单元,是按照数据结构来组织、存储和管理数据的仓库。

6、数据表(table):数据表,实际上是一个二维表。

一般是围绕一个事务、动作记录,或者是一个信息主题作为一个数据表。

数据表由行与列构成。

7、列(column、field):列,其实就是字段。

也是决定了信息的基本单元。

列,包含有数据类型的设定。

8、行(row、record):行,实际上就是一条基本信息。

一行包含了多列数据的存储的信息。

所以一行也有一条记录之称。

9、行业(trade)一个行业一种需求,没一个需求每一种数据库的设计模式与思想。

每个行业的数据设计的重点都是不同的。

侧重查询(要求低范式)还是操作(要求搞范式)就是自己选择的问题了。

10、索引(index)索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

索引其实就是一个B+树,但是这个索引是N^n层数次方的。

目的就是在数据库中划分出一定的区域优化查询。

可以提升大量数据的查询速度。

索引一般可以分为:基于字段优化查询速度的普通索引、唯一性索引、主键索引、全文索引、单列与多列索引。

现在由于数据库系统的不断升级,我们只要设定索引就可以了,不需要特殊的维护。

而且数据在查询的时候也会根据查询适当地选择是利用索引查询,还是仅仅是表查询。

由于数据库系统的发展,系统内部已经自动帮我们完成对索引的维护。

但是在设计的时候要考虑到索引的损耗问题。

数据库DB就像是一个字典,索引就是根据指定字段制成的快速指向。

由于只是指向数据对象标识,真正的数据是存储在DB中,所以查询速度极快。

但是额外的内存与硬盘花销也是一个需要考虑的问题。

比如:增加、删除、修改时数据库都要对索引进行维护,但是这样也是为了最后查询的效率的提升,特别适合W行级别的数据查询。

而索引可以分为:隐式索引(针对单个字段)、唯一索引(唯一约束)、函数索引(函数(字段))、聚簇索引(主键)、组合索引(最多16个field)与全文索引(text)。

一般索引会占用原数据库大小的20%。

11、视图(view)固化的子查询,将一个子查询起了一个固化的名字,保存在数据库中,方便以后的使用。

其实调用大量的Join来进行一个查询一般也是用视图。

视图与索引都是为了优化查询的速度与语句。

视图是优化语句,索引是优化单查速度。

一般是DBA来设定数据库的视图,封装内部数据库的数据关系,范式修改数据容易了,视图让我们查询复杂关系的数据变得容易。

12、触发器(trigger)触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由个事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行。

触发器经常用于加强数据的完整性约束和业务规则等。

触发器可以从DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。

13、SQLServer数据类型详解14、命名规范:15null也是一个集合,但是仅仅表示的是一个空集,但是实际上是null=Unknow。

1、数值运算null为null;2、 逻辑判定null 为null ;3、 主外键联接null 为忽略;4、 语句连结null 为or 或真、and 和假。

具体可查三值逻辑的真值表。

5、特殊情况:<1>where null = null ,where column = value :表中column 为NULL 的行永远不会返回,即使value 是NULL ,直接断言; <2>case null when null then XXX :XXX 永远不会执行,即使value 是NULL ,直接断言;<3>unknow 判断,if <unknow> {XXX} else {YYY} end 或case when <Unknown> then XXX else YYY end :这两种情况下,<unknow>,即是null 会执行。

<4>唯一约束(unique index )的字段只允许一个null 的行,再插入或更新该字段为NULL 的行会报字段重复的错误。

<5>group by 时,所有null 被视为一组。

<6>order by 时,所有null 排在一起,但null 排在最前面.(如SQL Server ),或者是最后面(如Oracle ),SQL 标准未规定。

<7>聚集函数(sum/avg/max/min/count )忽略null 的行,即是不返回此行数据,直接断言 <8> declare 时,在未赋值之前为null 。

<9>与NULL 处理相关的运算符和函数:- is null/is not null :用这两个运算符来判断一个值是否为NULL ,而不是=或<>; - is null/ coalesce :取第一个非空值(注意两个函数的数据类型转换规则不同); - nullif(a,b):等价于如果a 等于b 返回null,如果不等于返回b - isnull(a,b):取两者中不为null 的值,都为null 返回null 。

16、Not Null 的建表由于三值关系的存在,很多开发人员在建表的时候,除非是非null 不可,基本都是允许为null 的,其结果往往是一张表除了主键以外所有的字段都可以为Null 。

之所以会有这样的思路,是因为Null 好啊,程序不容易出错啊,你插入记录的时候如果不小心忘输了一个字段,程序依然可以R 运行un ,而不会出现 “XX 字段不能为Null ”的错误消息。

但是,这样做的结果却是很严重的,也会使你的程序变得更加繁琐,你不得不进行一些无谓的空值处理,以避免程序出错。

更糟的是,如果一些重要数据,比如说订单的某一项值为Null 了,那么大家知道,任何值与Null 相操作(比如加减乘除),结果都是Null ,导致的结果就是订单的总金额也为Null 。

你可以运行下面的代码尝试一下:Select Null + 5 As Result但是我们如何解决输入为空的问题呢?我们为什么不使用我们强悍的工具—check 约束与默认值呢?Field Varchar (500) default ‘nothing ’ Not Null Constraint ck_ColumnName Check (Len (ColumnName )>0), [Type] TinyInt Not Null Default 0 Constraint ck_ArticleType Check ([Type] in (0,1,2)),所以,合理的思维方式应该是这样的:默认这个字段是 Not Null 的,然后判断这个字段是不是非Null 不可,如果不是这样,OK ,这个字段是Not Null 的,进行下一个字段。

17、数据库的原子性1、你的表是描述什么事物,明确表的信息对象主体2、你的表是为了适合什么操作语句的设计的,面向操作设计3、列的内容要不要原子性的切块,让查询直逼要害,列的设计的小块的程度要拿捏好4、表必须是二维表,而且要根据不同的需求进行设计,表的设计与列的设计一样都要依赖与操作与需求原子性的存在是为了切分适合的信息块 ,从而达到信息的最大化、最优化的使用,并不是无限切分就好,要看实际的应用。

但是由于原子性数据的表容易设计,而且运行的所需时间较短(查询信息的指向性比较强,同时也便于维护喝更新操作,但是却是在海量数据搜索面前有点乏力),所以对大量的数据处理的时候要加分效果。

1、 同一列中不能存在多个类型相同的值,一列不能多值(除非是) 2、 同一个表中也不能存在有多个存储相同类型数据的列3、 无重复的行,每列只存储一份同类型下的一份数据(列是单值的),无重复列名4、18、结合信息对象与业务设计数据库设计1、数据库的设计师根据信息要素、关系来设计的;2、数据库的信息查找依赖于信息的使用方式的;3、对于可有可无的东西,我们需要花点时间去好好斟酌;4、简短的查询,比囧长的业务查询更加需要思考;5、使用数据的方式将会与我们占用系统内存与硬盘息息相关,影响着服务器的整体表现,所以我们的设计会有所倚重与侧重; 现在基本是双数据库,外层是方便查询,内层是方便修改。

相关主题