超详细的mysql多表操作教程

news2024/12/23 14:11:41

目录

外键约束

概念

特点

操作

多表联合查询

概念

操作

多表操作总结


外键约束

概念

特点

定义一个外键时,需要遵守下列规则:

主表必须已经存在于数据库中,或者是当前正在创建的表。

必须为主表定义主键。

主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这 个外键的内容就是正确的。

在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。

外键中列的数目必须和主表的主键中列的数目相同。

外键中列的数据类型必须和主表主键中对应列的数据类型相同。

操作

  • 建立外键约束
create database  mydb3;
use mydb3;
create table if not exists dep
(
pid int primary key,
name varchar(20)
);
create table if not exists per
(
id int primary key,
name varchar(20),
age int,
depid int,
constraint fok foreign key(depid) references dep(pid)
);



create table if not exists dep3
(
pid int primary key,
name varchar(20)
);
create table if not exists per3
(
id int primary key,
name varchar(20),
age int,
depid int
);
alter table per3 add constraint fok3 foreign key(depid) references dep3(pid);

  •  数据插入

必须先给主表添加数据,且从表外键列的值必须依赖于主表的主键列

insert into dep3 values('1001','研发部');
insert into dep3 values('1002','销售部');
insert into dep3 values('1003','财务部');
insert into dep3 values('1004','人事部');

-- 给per3表添加数据
insert into per3 values('1','乔峰',20, '1001');
insert into per3 values('2','段誉',21, '1001');
insert into per3 values('3','虚竹',23, '1001');
insert into per3 values('4','阿紫',18, '1001');
insert into per3 values('5','扫地僧',85, '1002');
insert into per3 values('6','李秋水',33, '1002');
insert into per3 values('7','鸠摩智',50, '1002'); 
insert into per3 values('8','天山童姥',60, '1003');
insert into per3 values('9','慕容博',58, '1003');
  • 数据删除

主表数据被从表依赖时不能删除,否则可以删除;从表的数据可以随便删除。

如下,第一句和第二句执行成功,第三句执行失败

delete from per3 where depid=1003;
delete from dep3 where pid=1004;
delete from dep3 where pid=1002;
  • 删除外键约束

语法:alter table 从表 drop foreign key 关键词名;

alter table per3 drop foreign key fok3;

多表联合查询

概念

操作

  • 交叉连接查询

select * from dept,emp;
  • 内连接查询

注释;上面是隐式内连接,下面是显式内连接 

select * from dept,emp where dept.deptno=emp.dept_id;
select * from dept join emp on dept.deptno=emp.dept_id;

select * from dept join emp on dept.deptno=emp.dept_id and name='研发部';
select * from dept join emp on dept.deptno=emp.dept_id and name='研发部';

select * from dept join emp on dept.deptno=emp.dept_id and (name='研发部' or name='销售部');
select * from dept join emp on dept.deptno=emp.dept_id and (name='研发部' or name ='销售部');
select * from dept join emp on dept.deptno=emp.dept_id and name in ('研发部','销售部');

select a.name,a.deptno,count(*) from dept a join emp on a.deptno=emp.dept_id group by dept_id;
select a.name,a.deptno,count(*) total from dept a join emp on a.deptno=emp.dept_id group by dept_id having total >=3 order by total desc;
  • 外连接查询

若是对应的外表没有数据就补NULL

select * from dept a left join emp b on a.deptno=b.dept_id;
select * from dept a right join emp b on a.deptno=b.dept_id;
-- select * from dept a full join emp b on a.deptno=b.dept_id; --不能执行
-- 用下面的方法代替上面的full join 
select * from dept a left join emp b on a.deptno=b.dept_id union select * from dept a right join emp b on a.deptno=b.dept_id;
-- 对比union all,发现union all没有去重过滤
select * from dept a left join emp b on a.deptno=b.dept_id union all select * from dept a right join emp b on a.deptno=b.dept_id;
  • 子查询

select * from emp where age<(select avg(age) from emp);
select * from emp a where a.dept_id in (select deptno from dept where name in ('研发部','销售部'));
-- 对比关联查询和子查询如下
select * from emp a join dept b on a.dept_id=b.deptno and (b.name='研发部' and age<30);
select * from (select * from dept where name='研发部') a join (select * from emp where age<30) b on b.dept_id=a.deptno;
  • 子查询关键字

all关键字的用法

select * from emp where age>all(select age from emp where dept_id='1003');
select * from emp a where a.dept_id!=all(select deptno from dept);

any(some)关键字的用法

select * from emp where age>any(select age from emp where dept_id='1003') and dept_id!='1003';

in关键字的用法

select ename,eid from emp where dept_id in (select deptno from dept where name in ('研发部','销售部'));

 exists关键字的用法

select * from emp a where a.age<30;
select * from emp a where exists(select * from emp where a.age<30);

select * from emp a where a.dept_id in (select deptno from dept b);
select * from emp a where exists (select * from dept b where a.dept_id = b.deptno);
  • 自关联查询

 

多表操作总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/22302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

967亿销售额!博世解码智能汽车新蓝图

随着新一轮科技革命和产业变革的深化&#xff0c;在低碳化、电动化和智能化的推动下&#xff0c;处于变革关键时期的新能源汽车产业&#xff0c;正逐步由“政策驱动”转向“市场驱动”&#xff0c;智能化、网联化成为新趋势。 据中国汽车工业协会统计&#xff0c;今年我国新能…

通过 Traefik Hub 暴露家里的网络服务

Traefik Hub 简介 &#x1f4da;️Reference: 你的云原生网络平台 -- 发布和加固你的容器从未如此简单。 Traefik Hub 为您在 Kubernetes 或其他容器平台上运行的服务提供一个网关。 Traefik Hub 定位&#xff1a; 云原生网络平台 它有 2 大核心功能&#xff0c;我这次体验感…

pytorch深度学习实战lesson23

第二十三课 AlexNet AlexNet是在2012年被发表的一个金典之作&#xff0c;并在当年取得了ImageNet最好成绩&#xff0c;也是在那年之后&#xff0c;更多的更深的神经网路被提出&#xff0c;比如优秀的vgg,GoogleLeNet. 其官方提供的数据模型&#xff0c;准确率达到57.1%,top 1-5…

认识计算机中的简单指令集

我们现在有了一个新的寄存器&#xff0c;叫做指令寄存器。它包含一个字节&#xff0c;不同的内容表示控制部分的不同操作模式。也被称为指令代码。指令寄存器是一个字节&#xff0c;因此可能有多达256条不同的指令。所有指令都涉及在总线上移动字节。指令将导致字节进出RAM&…

【JavaEE】PCB和进程调度的基本过程

文章目录什么是进程PCB的组成PID内存指针文件描述符表并行和并发进程调度相关属性进程的状态优先级上下文进程的记账信息什么是进程 进程是正在运行的程序的实例&#xff08;an instance of a computer program that is being executed&#xff09; 进程&#xff08;process&am…

《爱的四十条法则》

《爱的四十条法则》 [土]艾丽芙沙法克 作者用别样的手法间接向我们阐述了爱的四十条法则&#xff0c;每一条都会触及不同阶段的灵魂&#xff0c;我仅将文中感触较深的摘录如下&#xff1a; 1.尽管有人这样说&#xff0c;但是爱绝对不是来的快&#xff0c;去的也快的甜蜜感觉而…

长尾分布系列论文解析(二)Delving into Deep Imbalanced Regression

大纲引言回归问题中的长尾分布LDSFDS实验和结果总结引言 本文是长尾分布系列论文解析的第二篇&#xff0c;前情提要详见长尾分布系列论文解析&#xff08;一&#xff09;Decoupling Representation and Classifier for Long-Tailed Recognition&#xff0c;本篇要介绍的是回归任…

弹性力学之边界条件

作者&#xff1a;张伟伟&#xff0c;来源&#xff1a;力学酒吧 弹性力学基本方程包括平衡方程、几何方程和广义胡克定律&#xff0c;其中平衡方程和几何方程都属于微分方程。我们知道&#xff0c;在求解微分方程时&#xff0c;会出现积分常数&#xff0c;只有确定了积分常数&a…

JS —— js中的节流与防抖

文章目录 前言一、节流 1.什么是节流2.做节流可解决什么问题3.如何做节流二、防抖 1.什么是防抖2.做防抖可解决什么问题3.如何做防抖总结前言 最近有同学问到节流与防抖的相关知识点&#xff0c;于是乎&#xff0c;四处查资料&#xff0c;找一找&#xff0c;看一看&#xff0c…

单元测试:会变化的定义

有一种东西&#xff0c; 如果它太小&#xff0c;需要付出的努力就太大&#xff1b;如果它太大&#xff0c;就很难测试。 没错&#xff01;它是单元。 但是什么才是一个好的单元定义呢?为什么它如此重要? 单元的定义对测试过程有很大的影响&#xff0c;但同时单元的定义也是不…

Transformer总结和梳理

Transformer总结和梳理Positional encodingSelf-attentionMulti--head-attentionAdd&NormAdd操作Norm操作FeedForwardMASKPadding MaskedSelf-Attention Masked首先来看一下Transformer结构的结构&#xff1a;Transformer是由Encoder和Decoder两大部分组成&#xff0c;首先…

mysql安装与配置及四大引擎和数据类型、建表以及约束、增删改查、常用函数、聚合函数以及合并

目录 一.mysql安装与配置 1.mysql简介 2.mysql 安装 安装MySQL&#xff08;8.0的版本&#xff09; 安装MySQL&#xff08;5.7的版本&#xff09; 删除MySQL&#xff08;这是5.5版本的卸载方式&#xff09; 3.命令行登陆及权限修改 一.启动方式 二.停止 三.重启 wind…

LeetCode每日一题——808. 分汤

LeetCode每日一题系列 题目&#xff1a;808. 分汤 难度&#xff1a;普通 文章目录LeetCode每日一题系列题目示例思路题解题目 有 A 和 B 两种类型 的汤。一开始每种类型的汤有 n 毫升。有四种分配操作&#xff1a; 提供 100ml 的 汤A 和 0ml 的 汤B 。 提供 75ml 的 汤A 和…

大衣哥在《火火的情怀》后,和孟文豪张成军推出《新时代的农民》

最近一段时间&#xff0c;因为《火火的情怀》版权问题&#xff0c;农民歌唱家大衣哥&#xff0c;被著名导演兼编剧谷传民起诉。话说大衣哥因为被谷传民起诉&#xff0c;也被推上了舆论的风口浪尖&#xff0c;同时也让《火火的情怀》又一次大火。 在谷传民起诉大衣哥的案件当中&…

注册会计师怎么注册非执业?注会执业与非执业有何区别

注册会计师怎么注册非执业?以下就是关于注册会计师怎么注册非执业等等的介绍&#xff0c;希望对您有所帮助! 一、申请注册为非执业会员 取得注册会计师考试已合格&#xff0c;但尚未在中国境内从事审计业务工作二年以上者&#xff0c;可以自行向取得全科合格证书省级注册会计…

调研主板,树莓派 VS RK3288板子,还是 RK的主板香,但是只支持 anrdoid 7系统,估计也有刷机成 armbian或者

1&#xff0c;目前树莓派好贵啊&#xff01;Pi4bB 2G卖810 现在价格是&#xff1a;800多啊&#xff0c;疯了 哎真叫贵。 但是有个东西叫做 广告机的板子&#xff0c;是批量生产放到商场&#xff0c;地铁播视频的。 再配上一个屏幕&#xff0c;就可以直接播放广告了。 不同的地…

计算机网络4小时速成:传输层,功能,UDP协议,TCP协议,三次握手,传输数据,四次握手,超时重传,流量控制

计算机网络4小时速成&#xff1a;传输层 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c…

【云原生】Kubernetes(k8s)Calico 客户端工具 calicoctl

文章目录一、概述二、calicoctl 安装三、calicoctl 简单使用1&#xff09;认证信息配置2&#xff09;查看 IP 资源池3&#xff09;配置 IP 池4&#xff09;IP 资源池示例演示5&#xff09;固定 IP 示例演示6&#xff09;网络策略&#xff08;NetworkPolicy&#xff09;四、Kube…

盘点MySQL的八大日志,你知道哪些?

前言 日志对于任何系统应用来说都承载着至关重要的作用&#xff0c;借助日志&#xff0c;我们可以发现系统运行错误的原因&#xff0c;从而解决问题。MySQL也不例外&#xff0c;也会记录各种各样的日志信息。那么你知道MySQL都有哪些日志吗&#xff1f;每种日志的作用是干吗吗…

【Ajax】全面详细了解git的基础操作【万字教学+面试常客】

✍️ 作者简介: 前端新手学习中。 &#x1f482; 作者主页: 作者主页查看更多前端教学 &#x1f393; 专栏分享&#xff1a;css重难点教学 Node.js教学 从头开始学习 ajax学习 文章目录学习目标起步——关于版本的控制  文件的版本  版本控制软件  使用版本控制软件的好…