-
实体完整性
(
行完整性
):
-
域完整性
(
列完整性
):
-
引用完整性
(
关联表完整性
):
主键约束:primary key 数据唯一,且不能为
null
CREATE TABLE student( classid int, stuid int, name varchar(50), primary key(classid,stuid) );
ALTER TABLE student ADD PRIMARY KEY (id);
唯一约束:unique [key] 特点:数据不能重复。
非空约束:
not null
默认约束:
default
自动增长:auto_increment 给主键添加自动增长的数值,列只能是整数类型
外键约束
: foreign key
实体完整性 即表中的一行
(
一条记录
)
代表一个实体(
entity),标识每一行数据不重复。
*主键约束(primary key)*
*
唯一约束(unique)*
*
自动增长列
(auto_increment)*
域完整性 域代表当前单元格, 限制此单元格的数据正确,不对照此列的其它单元格比较
数据类型
非空约束(
not null
)
默认值约束
(default)
check
约束(
mysql
不支持)
check(sex='
男
' or sex='
女
')
引用完整性 关联表完整性
外键约束:
FOREIGN KEY
constraint
自定义外键名称
foreign key(
外键列名
) references
主键表名
(
主键列名
)
ALTER TABLE 表名 ADD CONSTRAINT 自定义外键名 FOREIGN KEY(外键列名) REFERENCES
主键表名(主键列名);
多表关系:
多对一:
需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键
多对多:
需要创建第三张表
,
中间表中至少两个字段,这两个字段分别作为外键指向各自一
方的主键
一对一:
让一对一的双方的主键进行建立关系,主键约束
多表查询:
多表查询有如下几种:
1.
合并结果集
:UNION(去重)
、
UNION ALL(不去重)
SELECT* FROM t1 UNION SELECT * FROM t2
;
2.
连接查询
2.1内连接 [INNER] JOIN ON 满足条件才留下
语法:
select 列名
from
表
1
inner join 表
2 on
表
1.
列名
=
表
2.
列名
inner join 表
3 on
表
1
或表
2.
列名
=
表
3.
列名
where
等价于:
select 列名
from
表
1,
表
2,
表
3
where 表
1.
列名
=
表
2.
列名
and
表
1/
表
2.
列名
=
表
3.
列名
2.2外连接 OUTER JOIN ON //主表都留下,次表满足才留下
-左外连接 LEFT [OUTER] JOIN //主表在左
- 右外连接 RIGHT [OUTER] JOIN //主表在右
- 全外连接(MySQL
不支持)
FULL JOIN
2.3 自然连接 NATURAL JOIN //得到笛卡尔积,去除重复列
3.
子查询
一个
select
语句中包含另一个完整的
select
语句。
子查询就是嵌套查询,即
SELECT
中包含
SELECT
,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。
l
子查询出现的位置:
a. where后,作为条为被查询的一条件的一部分;
b. from后,作表;
l
当子查询出现在
where
后作为条件时,还可以使用如下关键字:
any() 其中任意一个 all() 其中所有的 in()在里面包含 not 取反
l
子查询结果集的形式:
a. 单行单列(用于条件)
b. 单行多列(用于条件)
c. 多行单列(用于条件)
d. 多行多列(用于表)
多行新增:
insert into
表名
(
列名
) values (
列值
),(
列值
),(
列值
)
;
多表更新: 在连接查询基础上更新
(1)update
表
1,
表
2 set
列名
=
列值
where
表
1.
列名
=
表
2.
列名
and
其他限定条件
(2)update
表1 inner join 表
2 on
表
1.
列名
=
表
2.列名 set 列名
=列值 where
限定条件
内连接 全有才能改,左右外联,主表有就可以改
多表删除:在连接查询基础上删除
delete
被删除数据的表
from 删除操作中使用的表 where
限定条件
delete d,e,s from department d,employee e,salary s where d.depid=e.depid and s.empid=e.empid and depname='
人事部
'
内连接 全有才能删,左右外联,主表有就可以删
日期运算函数:
数据库优化
1、避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
2、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫 描
3、应尽量避免在 where 子句中使用 != 或 <> 操作符,否则引擎将放弃使用索引而进行全表扫描。
4、应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致 引擎放弃使用索引而进行全表扫描 (考虑使用union all)
5、in 和 not in 也要慎用,否则会导致全表扫描。(用between 和 exists)