外键
创建外键
create table my_foreign1(
id int primary key auto_increment,
name varchar(20) not null comment “学生姓名”,
c_id int comment “班级id” – 普通字段
– 增加外键
foreign key(c_id ) references my_class(id)
)charset utf8;
创建一个表
create table if not exists my_foreign2(
id int primary key auto_increment,
name varchar(20) not null comment “学生姓名”,
c_id int comment “班级id” – 普通字段
)charset utf8;
增加外键
alter table my_foreign2 add
– 指定外键名
constraint student_class_1
– 指定外键字段
foreign key(c_id)
– 引用父表主键
references my_class(id);
删除外键
alter table my_foreign1 drop foreign key my_foreign1_ibfk_1;
– 插入数据: 外键字段在父表中不存在
insert into my_foreign2 values (null, ‘张总’,4); – 实际没有四班
insert into my_foreign2 values (null, ‘刘德华’,1);
insert into my_foreign2 values (null, ‘晁盖’,2);
insert into my_foreign2 values (null, ‘郭德明’,2);
– 更新父表记录
update my_class set id = 4 where id = 1; – 失败: id = 1 的记录已经被学生引用
update my_class set id = 4 where id = 3; – 可以: 没有引用
– 插入数据
insert into my_foreign1 values(null,’王宝庆’,5);
– 增加外键
alter table my_foreign1 add foreign key c_id references my_class(id);
外键约束
– 创建外键: 指定模式: 删除置空, 更新级联
create table if not exists my_foreign3(
id int primary key auto_increment,
name varchar(20) not null,
c_id int,
– 增加外键
foreign key(c_id)
– 引用表
references my_class(id)
– 指定删除模式
on delete set null
– 指定更新模式
on update cascade
)charset utf8;
– 插入数据
insert into my_foreign3 values(null,’刘备’,1),
(null,’曹操’,1),
(null,’杨阳’,1),
(null,’牛牛’,2),
(null,’周瑜’,2);
– 更新父表主键
update my_class set id = 3 where id = 1;
– 删除父表主键
delete from my_class where id = 2;
联合查询
– 联合查询
select * from my_class
union – 默认去重
select * from my_class;
– 联合查询
select * from my_class
union all – 不去重
select * from my_class;
– 联合查询
select id, c_name,room from my_class
union all – 不去重
select name, number,id from my_student;
– 需求: 那声升序, 女生降序(年龄)
(select * from my_student where sex = ‘男’ order by age asc limit 9999999)
union
(select * from my_student where sex = ‘女’ order by age desc limit 9999999);
子查询:
标量子查询
– 标量子查询
select * from my_student where c_id =
(select id from my_class where c_name = ‘java0001’);
列子查询
select * from my_student where c_id in(select id from my_class);
– any ,some ,all 肯定结果
select * from my_student where c_id =any(select id from my_class);
select * from my_student where c_id =some(select id from my_class);
select * from my_student where c_id =all(select id from my_class);
– any, some, all 否定结果
select * from my_student where c_id !=any(select id from my_class); – 所有结果 (null除外)
select * from my_student where c_id !=some(select id from my_class); – 所有结果 (null除外)
select * from my_student where c_id !=all(select id from my_class); – 2 (null除外)
行子查询
select * from my_student where
– (age,height) 称之为行元素 (构造行元素)
(age,height) = (select max(age),max(height) from my_student);
表子查询
select * from my_student group by c_id order by height desc;
select * from (select * from my_student order by height desc)
as student group by c_id;
exists 子查询:
select * from my_student where
exists(select * from my_class where id = 1);
exists 子查询:
select * from my_student where
exists(select * from my_class where id = 6);
视图
创建视图
– 视图: 单表 + 多表
create view my_v1 as
select * from my_student;
create view my_v2 as
select * from my_class;
– 多表视图
create view my_v3 as
select s.*,c.c_name,c.room from my_student as s
left join my_class c on s.c_id = c.id;
查看视图创建语句
show create view my_v3;
视图使用
– 视图使用
select * from my_v1;
select * from my_v2;
select * from my_v3;
修改视图
– 修改视图
alter view my_v1 as
select id,name,age, sex,height, c_id from my_student;
删除视图
– 删除视图
drop view my_v4;
视图数据操作
视图数据新增.
– 新增数据.(单表视图: 视图不包含所有不允许为空的字段(学号)).
insert into my_v1 values(null,’杨阳’,150,’男’,180,1);
– 插入my_v2 数据.
insert into my_v2 values (null,’java0005’,’D101’);
视图删除数据
– 单表视图删除数据.
delete from my_v2 where id = 5;
多表数据更新数据
– 更新数据
update my_v3 set c_id = 4 where id =6;
– 视图: 年龄age 字段限制更新
create view my_v4 as
select * from my_student where age > 30 with check option;
– 表示视图的数据来源都是大于 30 岁: where age> 30 决定
– with check option: 决定通过视图更新的时候, 不能将已经得到的数据age>30 的改成 小于30 的.
– 将视图可以查到的数据改成 小于 30
update my_v4 set age = 20 where id = 7;
– 可以修改数据(修改之后成为让视图可以查到的数据)让视图可以查到的
– 可以改但是无效果:
update my_v4 set age = 20 where id = 6;
– 获取所有班级中最高的一个学生
create view my_v5 as
select * from my_student order by height desc;
select * from my_v5 group by c_id;
视图算法:
– 指定算法为临时表
create algorithm = temptable view my_v6 as
select * from my_student order by height desc;
select * from my_v6 group by c_id;
数据备份与还原:
数据表备份:
– 创建myisam表
create table if not exists my_myisam(
id int
)charset utf8 engine = myisam;
– 单表数据备份.
select * into outfile ‘C:/SQLbeifen/student.txt’
from my_student;
– 指定备份处理方式
select * into outfile ‘c:/SQLbeifen/student.txt2’
– 字段处理
fields
enclosed by ‘”’ – 数据使用双引号包裹
terminated by ‘|’ – 使用竖线分割字段数据
– 行处理
lines
starting by ‘START:’
from my_student;
还原数据
– 还原数据
load data infile ‘c:/SQLbeifen/student.txt2’
into table my_student
– 字段处理
fields
enclosed by ‘”’ – 数据使用双引号包裹
terminated by ‘|’ – 使用竖线分割字段数据
– 行处理
lines
starting by ‘START:’;
SQL备份 (注意: 在 mysqldump 客户端里是不支持注释的, 语句最后也不加分号).
– 单表备份
mysqldump -uroot -proot mydatabase my_student > c:/SQLbeifen/student.sql
– 整库备份
mysqldump -uroot -proot mydatabase > c:/SQLbeifen/mydatabase.sql
– 还原数据: mysql客户还原
mysql.exe -uroot -proot mydatabase < c:/SQLbeifen/student.sql
– sql指令还原sql备份
source c:/SQLbeifen/student.sql ;