_1_ SQL 了解SQL
SQL
Structured Query Language. 简称SQL. 是一种专门用来与数据库沟通的语言.
一些术语
我们一直都在使用数据库, 但对究竟什么是数据库并不十分清楚. 更何况人们可能会使用相同的数据库术语表示不同的事物, 进一步加剧了这种混乱.
因此, 我们首先需要了解一些最重要的数据库术语, 并加以说明:
数据库
从SQL的角度来看, 数据库是一个以某种有组织的方式存储的数据集合.
最简单的办法是将数据库想象为一个文件柜.
**数据库(database)**
保存有组织的数据的容器(通常是一个文件或一组文件).
**注意: 误用导致混淆**
人们通常使用数据库这个术语来代表他们使用的数据库软件, 这是不正确的, 也因此产生了许多混淆.
确切地说, 数据库软件应称为数据库管理系统(DBMS).
数据库是通过 DBMS 创建和操纵的容器, 而具体它究竟是什么, 形式如何, 各种数据库都不一样.
表
你往文件柜里放资料时, 并不是随便将他们扔进某个抽屉就完事了, 而是在文件柜中创建文件, 然后将相关的资料放入特定的文件.
在数据库领域中, 这种文件称为表. 表是一种结构化的文件, 可用来存储某种特定类型的数据. 例如表可以保存客户清单, 产品目录, 或者其他信息清单.
**表(table)**
某个特定类型数据的结构化清单.
这里关键的一点在于, 存储在表中的数据是同一种类型的数据或清单. 绝不应该将顾客与订单存储在同一个表中, 否则以后的检索和访问会很困难. 应该创建两个表, 或更多的表.
数据库中的每个表都有一个名字来标识自己. 这个名字是唯一的, 即一个数据库中没有同名的表.
**说明: 表名**
虽然在相同数据库中表名不能有重复, 但在不同的数据库中完全可以使用相同的表名.
使表名成为唯一的, 实际上是数据库名和表名等的组合.
有的数据库还使用数据库拥有者的名字作为唯一名的一部分.
表具有一些特性, 这些特性定义了数据在表中如何存储, 包含存储什么样的数据, 数据如何分解, 各部分信息如何命名等信息. 描述表的这组信息就是所谓的模式(schema), 模式不仅可以用来描述数据库中特定的表, 也可以用来描述整个数据库(和其中表的关系).
**模式**
关于数据库和表的布局及特性的信息.
列和数据类型
表由列组成. 列存储表中某部分的信息.
**列(column)**
表中的一个字段. 所有表都是由一个或多个列组成的.
理解列最好办法是将表想象为一个Excel表格那样. 每一列存储着某种特定的信息. 例如在顾客表中, 一列存储编号, 另一列存储姓名等
**分解数据**
正确地将数据分解为多个列极为重要. 例如, 城市, 州, 邮政编码应该总是彼此独立的列.
通过分解这些数据, 才有可能利用特定的列对数据进行分类和过滤(如找出特定城市或州的所有顾客).
如果城市和州组合在一个列中, 当按州分类或过滤时就显得很困难.
你可以根据自己的需求, 来决定把数据分解到何种程度. 例如, 一般可以把门牌号和街道名一起存储在地址里. 这没有问题, 除非你哪天想用街道名来排序, 这时, 最好将两者分开.
数据库中每个列都有相应的数据类型. 数据类型(datatype)定义了列可以存储哪些数据类型. 例如, 如果列中存储的是数字, 则相应的数据类型应该为数值类型. 如果存储的是日期, 文本, 注释, 金额等, 则应该为其规定恰当的数据类型.
**数据类型**
所允许的数据的类型. 每列都有相应的数据类型, 它限制(或允许)该列中存储的数据.
数据类型限定了可存储在列中的数据种类. 数据类型还帮助正确地分类数据, 并在优化磁盘使用方面起重要的作用. 因此, 在创建表时一定要特别关注所用的数据类型.
**数据类型兼容**
数据类型及其名称是SQL不兼容的一个主要原因. 虽然大多数基本数据类型得到了一致的支持, 但许多高级的数据类型却没有.
更糟的是, 偶然会有相同的数据类型在不同的DBMS中具有不同的名称. 对此用户毫无办法, 在创建表结构时要记住这些差异.
行
表中的数据是按行存储的, 所保存的每个记录存储在自己的行内. 如果将表想象为Excel, 垂直的列为表列, 那么水平的行即为表行.
例如, 顾客表可以每行存储一个顾客.
**行(row)**
表中的一个记录.
**说明: 是记录还是行?**
你可能听到用户在提到行时称其为数据库记录(record).
这两个术语多半可以交替使用, 但从技术上来说, 行才是正确的术语.
主键
表中每一行都应该有一列(也可是多列)可以唯一标识自己. 如顾客表可以使用顾客编号, 而订单可使用订单ID.
**主键(primary key)**
一列(或一组列), 其值能够唯一标识表中每一行.
唯一标识表中每行的这个列(或这几列)称为主键. 主键用来表示一个特定的行. 没有主键, 更新或删除表中特定行极为困难, 因为你不能保证操作所涉及到的行.
**提示: 应该总是定义主键
虽然并不总是需要主键, 但多数数据库设计者都会保证他们创建的每个表具有一个主键, 以便于以后的数据操作和管理.
表中的任何列都可以作为主键. 只要他满足以下条件:
- 任意行的主键值各不相同
- 每一行都必须具有一个主键值(主键值不允许为NULL)
- 主键不允许修改
- 主键不能重用