美文网首页
mysql外键连接+左右外级联+内级联

mysql外键连接+左右外级联+内级联

作者: 黑黑的大猫 | 来源:发表于2018-01-13 17:30 被阅读0次

本期给大家讲解一下mysql的数据约束和标题所说的连接语法规则

-- **********************数据约束**********************

-- 1.1 默认值

create table student(

id int,

name varchar(20),

country varchar(20) default '中国' -- 默认值

);

-- 没有设置默认值的字段,在没有赋值的情况下都是NULL

insert into student(id, name) values(1, "孬蛋");

insert into student(id, name, country) values(2, "金豆", "China");

insert into student(id) values(3);

drop table student;

-- 1.2 非空

create table student(

id int,

name varchar(20),

gender varchar(2) not null -- 非空

);

-- 如果存在非空字段,必须赋值

insert into student(id, name) values(1, "孬蛋");

-- ERROR 1364 (HY000): Field 'gender' doesn't have a default value

-- 必须给非空字段赋值

insert into student(id, name, gender) values(1, "狗蛋", "男");

-- 非空字段用在什么地方?

-- 用户名,密码,邮箱,手机

drop table student;

-- 1.3 唯一

create table student(

id int UNIQUE, -- 唯一

name varchar(20)

);

insert into student(id, name) values(1, "孬蛋");

insert into student(id, name) values(2, "孬蛋");

-- ERROR 1062(23000):Duplicate entry '1' for key 'id'

-- 唯一值不能重复

insert into student(id, name) values(1, "狗剩");

drop table student;

-- 1.4 主键 (非空+唯一)

create table student(

id int primary key,

name varchar(20)

);

insert into student(id, name) values(1, "狗蛋");

insert into student(id, name) values(2, "狗剩");

-- ERROR 1364 (HY000): Field 'id' doesn't have a default value

-- ID值不能为空,必须有数据

insert into student(name) values('辣鸡');

-- ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

-- ID值是唯一索引,不能为空,并且不能重复

insert into student(id, name) values(1, "炸鸡");

drop table student;

-- 1.5 自增长

CREATE TABLE student(

-- 自增长 ZEROFILL 零填充,从0开始

id INT ZEROFILL PRIMARY KEY AUTO_INCREMENT,

name VARCHAR(20)

);

insert into student(name) values("张三");

insert into student(name) values("李四");

insert into student(name) values("王五");

insert into student(name) values("马六");

-- 1.6 外键约束

create table employee(

id int primary key, -- 员工ID

empName varchar(20), -- 员工名

deptName varchar(20) -- 部门名

);

insert into employee values(1, "ll", "JavaEE教学部");

insert into employee values(2, "wd", "JavaEE教学部");

insert into employee values(3, "df", "JavaEE教学部");

insert into employee values(4, "rg", "JavaEE教学部");

insert into employee values(5, "ff", "JavaEE教学部");

-- 每一个人都是JavaEE教学部,这里每一个数据行中,都有JavaEE教学部

-- 导致了数据的冗余

-- 是否可以把部门做成一张表

-- 设计一个独立的部门表

create table dept(

id int primary key,

deptName varchar(20)

);

drop table employee;

-- 设计一个新的员工表,带有部门ID

create table employee(

id int primary key,

empName varchar(20),

deptID int, -- 用部门的ID来表示当前员工的部门是哪一个

-- 建立一个外键约束

CONSTRAINT emp_dept_fk foreign key(deptID) references dept(id) on update cascade on delete cascade -- 级联修改

--        外键名称              外键                连接的参考字段

);

insert into dept(id, deptName) values(1, "JavaEE教学部");

insert into dept(id, deptName) values(2, "PHP教学部");

insert into dept(id, deptName) values(3, "iOS教学部");

insert into employee values(1, "张三", 1);

insert into employee values(2, "李四", 2);

insert into employee values(3, "王五", 3);

insert into employee values(4, "赵六", 1);

-- 下面一条语句存在问题,因为在部门中并没有部门ID为4的部门,这里数据无法添加

-- ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint f

-- ails (`day38`.`employee`, CONSTRAINT `emp_dept_fk` FOREIGN KEY (`deptID`) REFERE

-- NCES `dept` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)

insert into employee values(5, "sf", 4);

解决的办法是: 先添加这下一行语句,在添加上面一条语句;

insert into dept(id, deptName) values(4, "Python教学部");

-- 级联修改 on update cascade on delete cascade

-- 修改部门,这里会随之修改主表里面的数据

update dept set id=4 where id=3;

-- 删除部门表 同时会帮助我们删除员工信息

delete from dept where id=2;

-- 修改员工表信息

update employee set deptID=2 where id=4;

-- 如果没有级联修改,请问如果是好???

-- 1) 当存在外键约束,添加数据的顺序:先添加主表,在添加副表

-- 2) 当存在外键约束,修改数据的顺序:先修改副表,在修改主表

-- 3) 当存在外键约束,删除数据的顺序:先删除副表,在删除主表

-- **************关联查询*****************

-- 严重错误的查询方法

-- 交叉查询 这个结果是有问题的 笛卡尔乘积 存在重复数据,不能使用

select empName,deptName from employee, dept;  

 -- 本来一个人在一个接岗位,但是这样查询就会出

现笛卡尔成绩 1 2 3  对应  4 5 6  就会出现 1和4 ,1和5 ,1和6, 2和4 ,2和5 ,2和6 ,3和4 ,3和5, 3和6 违背查询规则

-- 需求:查询员工及其所在目标,显示员工姓名和部门名称

-- 多表查询

-- 1. 确定查询那些表格 2. 确定要查询的字段 3. 表和表之间的关系

-- 内连接查询。只有满足条件的结果才会展示(使用最多的多表查询)

select empName,deptName  -- 要查询的字段

from employee, dept  -- 要查询的表格

where employee.deptID = dept.id; -- 表和表之间的关系

-- inner join 内连接的另一种语法

select empName, deptName

from employee  -- 主表

inner join dept -- 连接的是哪一张表

on employee.deptID = dept.id; -- 表示条件

-- 使用别名

select e.empName, d.deptName

from employee e

inner join dept d

on e.deptID = d.id;

-- 需求,查看每一个部门的员工

-- 预期结果

-- JavaEE 张三

-- JavaEE 赵六

--  iOS  王五

--  PHP  李四

-- 左[外]连接查询:使用左边表中的数据来匹配右边表的数据,如果符合条件,展示数据

-- 如果没有符合条件的连接数据,显示null

select d.deptName, e.empName

from dept d

left outer join employee e

on d.id = e.deptID;

-- 右[外]连接查询:使用右边表中的数据来匹配左边表的数据,如果符合条件,展示数据

-- 如果没有符合条件的连接数据,显示null

select d.deptName, e.empName

from employee e

right outer join dept d

on d.id = e.deptID;

-- 自连接查询

-- 修改员工表结构,添加上司

alter table employee add bossId int;

update employee set bossId=1 where id=2;

update employee set bossId=2 where id=3;

update employee set bossId=3 where id=4;

-- 预期结果

-- 张三  null

-- 李四  张三

-- 王五  李四

-- 赵六  王五

select e.empName, b.empName

from employee e

left outer join employee b

on e.bossId = b.id;

相关文章

  • mysql外键连接+左右外级联+内级联

    本期给大家讲解一下mysql的数据约束和标题所说的连接语法规则 -- **********************...

  • MySQL实践笔记

    关于外键 子表: 父表: 外键 支持外键只能使用 InnoDB 存储引擎。 级联操作问题 ON UPDATE CA...

  • mysql 级联删除,外键约束

    对表t_user和t_book外键关联。在t_book中设置外键,如图示。其中: RESTRICT:创建约束。删除...

  • MySQL级联操作

    MySQL级联操作 外键约束对子表的含义: 如果在父表中找不到候选键,则不允许在子表上进行insert/updat...

  • 草稿四

    ● 外键的删除操作---on_delete参数指定 <1> models.CASCADE---级联删除外键表的字段...

  • @OneToOne 入门

    几个问题 什么是级联操作? 级联保存操作 当两边只使用@OneToOne会创建表,并且会建外键,保存会报错,说明@...

  • 2019-06-20 MySQL复制高级方案应用实践

    1. MySQL级联复制 1.1 MySQL级联复制介绍 MySQL级联复制的特点是从(slave)服务器本身除了...

  • java基础-day32-数据库3.0

    10.6 外键约束 10.7 级联操作 11. 数据表修改 alter 11.1 添加字段 11.2 修改字段 1...

  • 连接查询

    1.分类 内连接等值非等值自连接 外连接左外右外全外(mysql不支持) 2.语法 1、内连接 语法:select...

  • MySQL约束以及表之间的关系(主键and外键)

    一:约束 分类: 练习 二:为何要分表 三:外键约束 四:级联操作 五:多对多关系的处理

网友评论

      本文标题:mysql外键连接+左右外级联+内级联

      本文链接:https://www.haomeiwen.com/subject/dlncoxtx.html