Mysql(三)约束

一、视图

视图是虚拟的数据表,本身不存储数据,而是提供数据的逻辑 展示。

      1、创建视图

create view stu_view as
select s1.id, s1.name, s2.room, s2.stay_time
from student s1, stay s2
where s1.id = s2.id;

创建视图后,就可以像查询数据表一样查询视图。  视图的字段就是我们从数据表中查询而来的字段。

select id from stu_view   desc stu_view
      2、修改视图

alter view stu_view as
select s1.id, s1.name, s2.room, s2.stay_time
from student s1 left outer join stay s2
on s1.id = s2.id;
select * from stu_view

  3、删除视图

drop view stu_view;

4、 在修改视图时,我们可以不使用alter,而是or replace。 在视图不存在时,创建视图,当视图存在时,替换视图。

create or replace view stu_view as
select s1.id, s1.name, s2.room, s2.stay_time
from student s1 left outer join stay s2
on s1.id = s2.id;

5、视图只是一个预存储的查询语句。(as后面的查询语句)  当我们查询视图时,视图的查询语句就会展开。(就是从 视图存储的查询语句(结果集)中查询。

select * from stu_view
select * from (
select s1.id, s1.name, s2.room, s2.stay_time
from student s1 left outer join stay s2
on s1.id = s2.id) x;

  视图的特征:

1 视图作为预存储的查询语句,不能提高性能。
2 视图可以简化我们的输入操作。
3 视图可以提供相同数据表的不同逻辑展示。

二、

视图默认情况下,是以我们查询的字段命名。
#当视图的查询字段出现同名时(命名冲突)时,我们可以:
#1 使用别名 当使用别名时,视图字段会以别名来命名。
#2 自定义视图字段的名称

1、别名

create or replace view stu_view as
select s1.id stu_id, s2.id stay_id, s1.name, s2.room, s2.stay_time
from student s1 left outer join stay s2
on s1.id = s2.id;
desc  stu_view;

 2、自定义视图字段的名称,指定的字段数量与查询的字段数量必须一致。

create or replace view stu_view(field1, field2) as
select s1.id, s2.stay_time
from student s1 left outer join stay s2
on s1.id = s2.id;
desc  stu_view;

三、索引

索引是数据表中一个特殊的对象。

优点:索引可以加快记录的查询速度。

缺点:
#1 索引需要占用额外的硬盘空间。
#2 当数据表中记录发生变动时(增加,修改等),索引需要 进行重新变更(重新维护)。

索引使用的场合:

1 数据量很大(表中的记录多)
2 查询操作多
3 增加,删除等操作少。

1、创建索引

create index stu_index on student(id);

create index 索引名 on 表名(字段1,字段2, ……字段n);     可以指定一列或者多列

2、删除索引

drop index 索引名 on 表名

drop index stu_index on student

索引这就类似于图书的目录一样,如果我们想要查询某些内容, 我们可以从第一页开始,逐页进行查找,但这势必会耗费大 量的查找时间。但是,如果我们通过目录来查询,就可以快 速的定位到相关的页码上。 
 
四、数据库约束

约束
约束,就是一种限制,其可以保证数据的正确性与完整性。
约束可以分为如下几类:
1唯一性约束
2非空约束
3主键约束
4外键约束
5检查约束

约束具有字段级语法与表级语法。

1、唯一性约束

唯一性约束保证约束列(一列或多列)的值不能出现重复。唯一性约束允许加入多个null值。因为MySQL中,null不等于任何值,包括其自身。因此,多个null值,彼此也是不等的。

字段级语法:

如果不存在创建表
create table if not exists t(
	id int primary key,
    age int unique
);

如果表存在,删除。
  drop table if exists t;

 

insert into t(id, age) values (1, 1);
#错误,违法唯一性约束。
#insert into t(id, age) values (2, 1);
insert into t(id, age) values (3, null);
#允许插入多个null值。
insert into t(id, age) values (4, null);
select * from t;

表级语法:

唯一性约束也可以作用于多个字段。当作用于多个字段时, 只要多个字段的值不全相等,则认为是不重复的。

create table t(
	id int primary key,
    age int,
    name varchar(20),
    unique key (age, name)
);

与表级语法unique key (age, name)不同,对于表级语法, age,name只要有一个字段值不同即可,对于字段级语法, age与name两个字段值都不允许重复。

在建表之后增加唯一性约束:

对于建表之后加入的约束,一定要保证当前表中的数据  没有破坏该新增的约束,否则,约束就无法加入成功。

alter table t add unique key(age, name);
alter table t modify age int unique;

删除唯一性约束
alter table t drop index age;

2、非空约束

非空约束表示字段不允许为null值,该约束只有字段级语法,没有表级语法。

create table t(
id int primary key,
age int not null
);

在建表之后指定非空约束

create table t(
    id int primary key,
    age int
);
alter table t modify age int not null;  

删除(取消)非空约束。
alter table t modify age int null;

3、主键约束

主键字段既不能为null,也不能重复。主键约束就是唯一性约束+非空约束。

字段级语法:

create table t (
id int primary key
);

表级语法:

create table t (
	id int,
    name varchar(10),
    primary key(id, name)
    #我们可以给主键命名,但仅仅是语法上支持,功能上不支持。
    #不管我们如何命名,MySQL主键名都是primary。
    #primary key pk(id, name)
);

  当我们使用多个字段充当主键(联合主键),作为主键的多个字段只要不同时相同,就认为是不重复的,但是,每个字段都不允许为null。

建表之后增加主键:

create table t(
id int
);
alter table t add primary key(id);
alter table t modify id int primary key;

删除主键:

alter table t drop primary key;

4、外键约束:

如果B表中B1字段参照A表中的A1字段,则我们称B表为从表,A表为主表。B1字段的值或者为null,或者必须是A1字段中存在的值。A1字段必须是主键约束,或者是唯一性约束。

图书表
create table book(
id int primary key,
name varchar(30),
author varchar(30)
);

借书表
#字段级语法,MySQL仅支持语法,不支持功能。
create table borrow(
id int primary key,
book_id int references book(id),
borrow_person varchar(30)
);

#表级语法,MySQL支持
drop table if exists borrow;
create table borrow(
id int primary key,
book_id int,
borrow_person varchar(30),
foreign key(book_id) references book(id)
#也可以自定义外键的名字。
#constraint fk foreign key(book_id) references book(id)
);

insert into book(id, name, author) values(1, ‘Java‘, ‘abc‘);
insert into book(id, name, author) values(2, ‘C++‘, ‘def‘);
insert into book(id, name, author) values(3, ‘C#‘, ‘张三‘);
insert into book(id, name, author) values(4, ‘Hadoop‘, ‘小李‘);
select * from book;
insert into borrow(id, book_id, borrow_person)
values (1001, 3, ‘学生A‘);
#错误,违反外键约束。
#insert into borrow(id, book_id, borrow_person)
#values (1002, 5, ‘学生B‘);
insert into borrow(id, book_id, borrow_person)
values (1002, null, ‘学生B‘);

update book set id=10 where id=3
delete from book where id=3;

  在建表之后增加外键:

create table borrow(
id int primary key,
book_id int,
borrow_person varchar(30)
);
alter table borrow add foreign key(book_id) references book(id);

指定外键名
alter table borrow add constraint fk   foreign key(book_id) references book(id);
删除外键

alter table borrow drop foreign key fk;

当主表的某条记录被从表所参照时,当主表记录修改或删除时,
从表的表现方式(行为):
1restrict 当主表记录修改或删除时,拒绝执行。
2cascade 当主表记录修改或删除时,从表随之也修改或删除。
3set null 当主表记录修改或删除时,从表记录设置为null值。
4no action 等价于restrict
默认的行为为:restrict

5、检查约束(MySQL仅支持语法,不支持功能)

create table t(
    id int primary key,
    age int,
    check (age > 0)
);
insert into t (id, age) values (1, -2);
select * from t;

  

约束的表级语法与字段级语法。

1 相对于表级语法,字段级语法更简单些。
2 字段级语法只能作用于单个字段,而表级语法可以作用于多个 字段。例如:联合主键。
3 字段级语法不能为约束命名,而表级语法可以为约束命名。

五、union

union 用于合并多个结果集。

要求多个结果集的字段类型与字段数量一致。

union distinct 会去掉结果集中的重复记录。

union all 不会去掉结果集中的重复记录。

默认为union distinct

优先考虑使用union all(性能会好一些)。

select * from student
select * from stay;
select id from student union select id from stay;
select id from student union all select id from stay;

六、子查询

子查询即查询中还有查询(嵌套查询)
根据子查询出现的位置,可以将子查询分为两类:
1 出现在from之后,作为临时的数据表。
2 出现在where(having)之后,作为过滤条件。

子查询需要使用()括起。

子查询根据查询结果记录条数,可以将子查询分为:
1 单行子查询 返回一条记录
2 多行子查询 返回多条(一条)记录。

时间: 2024-10-12 21:07:15

Mysql(三)约束的相关文章

MySQL(三) —— 约束以及修改数据表

约束: 1. 约束保证数据的完整性和一致性: 2. 约束分为表级约束和列级约束: 3. 约束类型包括:NOT NULL, PRIMARY KEY, UNIQUE KEY, DEFAULT, FOREIGN KEY 外键约束 父表和子表必须使用相同的存储引擎,而且禁止使用临时表: 数据库的存储引擎只能为InnoDB: 外键列和参照列必须具有相似的数据类型.其中数字的长度或是否有符号位必须相同:而字符的长度则可以不同: 外键列和参照列必须创建索引.如果外键列不存在索引的话,MySQL将自动创建索引.

mysql 对约束的操作

MySQL中约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息: 约束主要完成对数据的检验,保证数据库数据的完整性:如果有相互依赖数据,保证该数据不被删除. 常用五类约束: not null:非空约束,指定某列不为空 unique: 唯一约束,指定某列和几列组合的数据不能重复 primary key:主键约束,指定某列的数据不能重复.唯一 foreign key:外键,指定该列记录属于主表中的一条记录,参照另一条数据 check:

MySQL之约束注意点

not null约束. not null约束只能在列名后面声明,不能使用constraint语句声明,当然也就没无法声明约束名称了.更改字段为null或者not null只能使用alter table table_name modify col_name (not) null;无法使用constraint语句修改.也就是说not null虽然是约束,但是却和constraint语句扯不上关系.not null约束在information_schema里面的table_constraints表中也

6、MySQL字段约束介绍

6.MySQL字段约束 上一章简要介绍了关于MySQL关于多表查询的相关操作介绍,本章内容将在创建数据表的时候关于定义的相关字段进行约束操作. 一.字段字段修饰符的使用 1.1 null和not null修饰符 null占用空间,此字段不可为空 not unll设置的字段中可以为空,卡插入控制,其插入为空值的时候不占用空间. 例:定义一个表定义字段为null类型和not null进行比较. mysql> create table myziduan(char1 varchar(18) not nu

mysql的约束

MySQL中约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息: 约束主要完成对数据的检验,保证数据库数据的完整性:如果有相互依赖数据,保证该数据不被删除. 常用五类约束: not null:非空约束,指定某列不为空 unique: 唯一约束,指定某列和几列组合的数据不能重复 primary key:主键约束,指定某列的数据不能重复.唯一 foreign key:外键,指定该列记录属于主表中的一条记录,参照另一条数据 check:

mysql三范式

列不可分割 数据惟一性 数据不可冗余(如果一列能被其中一列推导出来,则不可以数据列里添加上去) 有时可反3范式 mysql三范式

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

ALTER TABLE:添加,修改,删除表的列,约束等表的定义. 查看列:desc 表名; 修改表名: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_stude

[转]mysql的约束

转自:http://blog.csdn.net/kqygww/article/details/8882990 MySQL中约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息: 约束主要完成对数据的检验,保证数据库数据的完整性:如果有相互依赖数据,保证该数据不被删除. 常用五类约束:not null:非空约束,指定某列不为空 unique: 唯一约束,指定某列和几列组合的数据不能重复 primary key:主键约束,指定某列的数据

mysql(三) 数据表的基本操作操作

mysql(三) 数据表的基本操作操作 创建表,曾删改查,主键,外键,基本数据类型. 1. 创建表 create table 表名( 列名 类型 是否可以为空, 列名 类型 是否可以为空 )ENGINE=InnoDB DEFAULT CHARSET=utf8 例如: 类型解释: 是否可以为空: 是否可空,null表示空,非字符串 not null - 不可空 null - 可空 默认值设置 默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值 create table t