数据库--索引,约束与表连接

索引用来提高数据的检索速度,而约束则用来保证数据的完整性。

建表:

CREATE TABLE T_Person (FNumber VARCHAR(20),FName VARCHAR(20),FAge INT)

T_Person为记录人员信息的数据表,其中字段FNumber 为人员的编号,FName 为人员姓名,FAge为人员年龄。

创建索引的SQL 语句是CREATE INDEX

其语法如下:CREATE INDEX 索引名ON 表名(字段1, 字段2,……字段n)

其中【索引名】为被创建的索引的名称,这个名称必须是唯一的;【表名】为要创建索引的表;【字段1, 字段2,……字段n】为组成这个索引的字段列表,允许一到多个。

例:CREATE INDEX idx_person_name ON T_Person(FName)

       CREATE INDEX idx_person_nameage ON T_Person(FName,FAge)

删除索引DROP INDEX 表名.索引名
例:删除刚才我们创建了两个索引:
       DROP INDEX T_Person.idx_person_name;
       DROP INDEX T_Person.idx_person_nameage;

数据库系统中主要提供了如下几种约束

非空约束;唯一约束; CHECK 约束;主键约束;外键约束。

非空约束:指定一个字段为空的方式就是在字段定义后增加NOT NULL

非空约束不仅对通过INSERT 语句插入的数据起作用,而且对于使用UPDATE 语句进行更新时也起作用。

唯一约束又称为UNIQUE 约束,它用于防止一个特定的列中两个记录具有一致的值

束分为单字段唯一约束与复合唯一约束两种类型

唯一约束设置到这个字段上,设置方式就是在字段定义后增加UNIQUE

例:CREATE TABLE T_Person (FNumber VARCHAR(20) UNIQUE,FName VARCHAR(20),FAge INT)

定义复合唯一约束需要定义在所有字段列表之后,语法如下:
CONSTRAINT 约束名UNIQUE(字段1,字段2……字段n)

所有约束的字段不能同时重复,但可以单个重复。

可以在一个表中添加多个复合唯一约束,只要为它们指定不同的名称即可。

例:

CREATE TABLE T_Person (FNumber VARCHAR(20),
FDepartmentNumber VARCHAR(20),
FName VARCHAR(20),FAge INT,
CONSTRAINT unic_dep_num UNIQUE(FNumber,FDepartmentNumber))

使用ALTER TABLE 语句,可以为一张已经存在的数据表添加新的约束,语法如下:
ALTER TABLE 表名ADD CONSTRAINT 唯一约束名UNIQUE(字段1,字段2……字段n)

删除已经创建好的复合唯一约束,语法如下:

ALTER TABLE 表名DROP CONSTRAINT 唯一约束名

CHECK 约束会检查输入到记录中的值是否满足一个条件,如果不满足这个条件则对数据库做的修改不会成功。

在字段定义后添加CHECK 表达式就可以为这个字段添加CHECK约束,几乎所有字段中都可以添加CHECK约束,也就是一张表中可以存在多个CHECK 约束。

CREATE TABLE T_Person

(FNumber VARCHAR(20),

FName VARCHAR(20),

FAge INT CHECK(FAge >0),

FWorkYear INT CHECK(FWorkYear>0))

除了可以在CHECK 约束中使用常量表达式之外,还可以在CHECK 约束中使用函数

例:CHECK (LEN(FNumber)>12)

直接在列定义中通过CHECK子句添加CHECK约束的方式的缺点是约束条件不能引用其他列。

如果希望CHECK子句中的条件语句中使用其他列,则必须在CREATE TABLe 语句的末尾使用CONSTRAINT 关键字定义它。

语法为:
CONSTRAINT 约束名 CHECK(约束条件)

例:

CREATE TABLE T_Person (
FNumber VARCHAR(20),
FName VARCHAR(20),

FAge INT,
FWorkYear INT ,
CONSTRAINT ck_1 CHECK(FWorkYear< FAge))

添加新的约束:
ALTER TABLE T_Person ADD CONSTRAINT ck_2 CHECK(FAge>14)

删除约束:

ALTER TABLE T_Person DROP CONSTRAINT ck_2;

主键约束

主键必须能够唯一标识一条记录,也就是主键字段中的值必须是唯一的,而且不能包含NULL 值。主键约束是UNIQUE 约束和非空约束的组合,在表中主键是唯一的。

在 CREATE TABLE 语句中定义主键约束非常简单,只要在字段定义后添加PRIMARY KEY 关键字即可。

例:CREATE TABLE T_Person (FNumber VARCHAR(20) PRIMARY KEY,
FName VARCHAR(20),FAge INT)

除了这种由单一字段组成的主键之外,还可以由多个字段来组成主键,这样的主键被称为复合主键或者联合主键。

复合主键的定义和复合唯一约束的定义类似。

例:

CREATE TABLE T_Person (FNumber VARCHAR(20),
FName VARCHAR(20),FAge INT,
CONSTRAINT pk_1 PRIMARY KEY(FNumber,FName))

在表格创建以后再进行主键添加使用ALTERTABLe 语句。

不过通过这种方式添加主键的时候有一个附加条件,那就是组成主键的字段必须包含NOT NULL约束。

CREATE TABLE T_Person (FNumber VARCHAR(20) NOT NULL,FName VARCHAR(20) NOT NULL,FAge INT)

ALTER TABLE T_Person ADD CONSTRAINT pk_1 PRIMARY KEY(FNumber,FName)

删除主键:

ALTER TABLE T_Person DROP CONSTRAINT pk_1;

外键约束
当一些信息在表中重复出现的时候,我们就要考虑要将它们提取到另外一张表中了,然后在源表中引用新创建的中的数据。

允许指定一个表中的一个列的值是另外一个表的外间,即一个表中的一个列是引用另外一个表中的记录。

语法如下:

FOREIGN KEY 外键字段REFERENCES 外键表名(外键表的主键字段)

在删除一个表中的数据的时候,如果有其他的表中存在指向这些数据的外键关系,那么这个删除操作会是失败的,除非将所有的相关的数据。

添加外键约束:
ALTER TABLE T_Book
ADD CONSTRAINT fk_book_author FOREIGN KEY (FAuthorId) REFERENCES T_AUTHOR(FId)

表连接

在实现业务功能的时候也经常需要从多个表中进行数据的检索,而进行多表检索最常用的技术就是表连接

CREATE TABLE T_Customer (FId INT NOT NULL ,FName VARCHAR(20) NOT NULL ,FAge INT,PRIMARY KEY (FId))

CREATE TABLE T_OrderType (FId INT NOT NULL ,FName VARCHAR(20) NOT NULL,PRIMARY KEY (FId))

CREATE TABLE T_Order (FId INT NOT NULL ,FNumber VARCHAR(20) NOT NULL ,FPrice NUMERIC(10,2),FCustomerId INT, FTypeId INT,PRIMARY KEY (FId))

其中表T_Customer保存的是客户信息,FId 为主键、FName 为客户姓名、FAge 为客户年龄;

表T_OrderType 保存的是订单类型,FId为主键、FName为类型名;

表T_Order 为保存的是订单信息,FId为主键、FNumber 为订单号、FPrice为价格、FCustomerId为客户的主键。

表连接使用JOIN关键字将一个或者多个表按照彼此间的关系连接为一个结果集。

使用SQL 中的表连接则可以简化开发,并且由于数据库系统会对表连接进行查询优化,所以使用表连接进行数据的检索也会非常快速。

SQL中使用JOIN 关键字来使用表连接。表连接有多种不同的类型,有交叉连接(CROSS JOIN)、内连接(INNER JOIN)、外连接(OUTTER JOIN),另
外在有的数据库系统中还支持联合连接(UNION JOIN)。

内连接(INNER JOIN)
内连接组合两张表,并且基于两张表中的关联关系来连接它们。使用内连接需要指定表中哪些字段组成关联关系,并且需要指定基于什么条件进行连接。内连接的语法如下:
INNER JOIN table_name ON condition
其中table_name 为被关联的表名,condition则为进行连接时的条件。

INNER JOIN中的INNER是可选的,INNER JOIN 是默认的连接方式,亦可直接写成join

例:SELECT FNumber,FPrice FROM T_Order INNER JOIN T_Customer
ON FCustomerId= T_Customer.FId
WHERE T_Customer.FName='TOM'

在这个SQL 语句中,首先列出了组成结果集所需要的列名,而后则是在FROM 关键字后指定需要的表,在INNER JOIN 关键字后指明要被连接的表,而在ON 关键字后则指定了进行连接时所使用的条件。由于T_Customer 和T_Order 表中都有名称为FId 的列,所以在ON 关键字后的条件中使用FId字段的时候必须显示的指明这里使用FId字段属于哪个表。同样在SELECT语句后的字段列表中也不能存在有歧义的字段。

为了避免列名歧义并且提高可读性,这里建议使用表连接的时候要显式列所属的表,如下:
SELECT T_Order.FId,T_Order.FNumber,T_Order.FPrice
FROM T_Order INNER JOIN T_Customer
ON T_Order.FCustomerId= T_Customer.FId
WHERE T_Customer.FName='TOM'

例:

SELECT T_Order.FId,T_Order.FNumber,T_Order.FPrice,T_Customer.FId,T_Customer.FName,T_Customer.FAge
FROM T_Order INNER JOIN T_Customer
ON T_Order.FCustomerId= T_Customer.FId

当表明重复多次出现时,可以使用表别名来简化SQL语句的编写,如下:

SELECT o.FId,o.FNumber,o.FPrice,c.FId,c.FName,c .FAge
FROM T_Order o JOIN T_Customer c
ON o.FCustomerId= c.FId

不等值连接

等值连接是最常用的连接,因为它指定的连接条件是一个表中的一个字段必须等于另一个表中的一个字段。

不等值连接,也就是在连接的条件中可以使用小于(<)、大于(>)、不等于(<>)等运算符,而且还可以使用LIKE、BETWEEN AND等运算符,甚至还可以使用函数。

SELECT T_Order.FNumber,T_Order.FPrice,T_Customer.FName,T_Customer.FAge FROM T_Order
INNER JOIN T_Customer ON T_Order.FPrice< T_Customer.FAge*5

交叉连接
交叉连接不存在ON子句。交叉连接会将涉及到的所有表中的所有记录都包含在结果集中。

可以采用两种方式,分别是隐式的和显式的。

隐式的连接只要在SELECT语句的FROM语句后将要进行交叉连接的表名列出即可-------优先选择

例:SELECT T_Customer.FId, T_Customer.FName, T_Customer.FAge,T_Order.FId, T_Order.FNumber, T_Order.FPrice
FROM T_Customer, T_Order

SELECT c.FId, c.FName, c.FAge,o.FId, o.FNumber, o.FPrice
FROM T_Customer c, T_Order o

显式定义方式为使用CROSS JOIN关键字

SELECT T_Customer.FId, T_Customer.FName, T_Customer.FAge,T_Order.FId, T_Order.FNumber, T_Order.FPrice
FROM T_Customer CROSS JOIN T_Order

自连接

交叉连接、内连接、外连接等连接方式中只要参与连接的表是同一张表,那么它们就可以被称为自连接。其主要用途就是检索一张表内部的匹配情况。

例:

SELECT o1.FNumber,o1.FPrice,o1.FTypeId,o2.FNumber,o2.FPrice,o2.FTypeId
FROM T_Order o1 INNER JOIN T_Order o2
ON o1.FTypeId=o2.FTypeId and o1.FId<o2.FId

o1表的一个记录行仅仅在它的FId字段值小于o2表的一个记录行仅仅在它的FId字段值的时候,才出现在结果集中。这确保了一行数据仅出现在结果集中一次。

外部连接

内部连接要求组成连接的两个表必须具有匹配的记录

比如“查询每张订单的订单号、价格、对应的客户姓名以及客户年龄,如果没有对应的客户,则在客户信息处显示空格”

使用内部连接是很难达到这种效果的,可以使用外部连接来实现。外部连接主要就是用来解决这种空值匹配问题的。

外部连接不需要两个表具有匹配记录,这样可以指定某个表中的记录总是放到结果集中。

根据哪个表中的记录总是放到结果集中,外部连接分为三种类型:

右外部连接(RIGHT OUTER JOIN)、左外部连接(LEFT OUTER JOIN)和全外部连接(FULLOUTER JOIN)。

左外部连接还返回左表中不符合连接条件的数据;
右外部连接还返回右表中不符合连接条件的数据;
全外部连接还返回左表中不符合连接条件的数据以及右表中不符合连接条件的数据,是左外部连接和左外部连接的合集。

位于JOIN关键字左侧的表即被称为左表,而位于JOIN关键字右侧的表即被称为右表。比如:
SELECT o.FNumber,o.FPrice,o.FCustomerId,c.FName,c.FAge
FROM T_Order o INNER JOIN T_Customer c
ON o.FCustomerId=c.FId
这里的T_Order就是左表,而T_Customer则是右表。

左外部连接

SELECT o.FNumber,o.FPrice,o.FCustomerId,c.FName,c.FAge
FROM T_Order o LEFT OUTER JOIN T_Customer c
ON o.FCustomerId=c.FId

右外部连接

SELECT o.FNumber,o.FPrice,o.FCustomerId,c.FName,c.FAge
FROM T_Order o RIGHT OUTER JOIN T_Customer c
ON o.FCustomerId=c.FId

全外部连接

SELECT o.FNumber,o.FPrice,o.FCustomerId,c.FName,c.FAge
FROM T_Order o FULL OUTER JOIN T_Customer c
ON o.FCustomerId=c.FId

原文地址:https://www.cnblogs.com/HuXiaoxia/p/3471217.html