MySQL多表查询

扩展

upsert语法

原始数据

create table stu(id int primary key auto_increment,name varchar(20),    #学生姓名gender varchar(10),  #学生性别age int              #学生姓名
) default charset=utf8;insert into stu values(null,'乔峰', '男' ,28),(null,'虚竹', '男' ,25),(null,'段誉', '男' ,23),(null,'灭绝', '女' ,38);

方式一:replace into table_name value(val1,val2,...);

replace into stu value(1,'萧峰','男',28); #如果id存在则直接修改

replace into stu value(9,'张无忌','男',26)

方式二:on duplicate key update col=val;

insert into stu value(10,'灵鹫宫宫主', '保密' , 30) on duplicate key update name ='小和尚' ,age=31; #id不存在则添加,存在则修改

执行第一次,添加

执行第二次,修改

多表关系

注意:多对多关系中一定有一个中间关系表,记录两张表之间的数据联系

多表约束之外键约束

外键(从键)

概念:假设有两张表A和B,B表的某列的值引用了A表的主键列的值,则B表的这一列称为B表的外键列 (Foreign Key),其中A表称为主表,B表称为从表。

外键约束

外键约束的作用:

保证插入数据的准确性:从表中外键的值在主表主键中必须有对应的值

如果从表插入的外键值,在主表中不存在,就插入失败

保证删除数据的完整性:主表的主键值被从表外键引用之后,主表中对应的记录不能被删除

外键约束的缺点:

过分强调或者说使用主键/外键会平添开发难度

添加外键,也会降低数据增删改的性能

注意:实际开发,很少使用外键约束,而是从代码层面保持表之间的关系!

创建外键约束

写法一:建表的时候直接指定外键约束

语法:[constraint 外键约束名] foreign key (外键列) references 主表名(主键列名)

举例:

示例1:新建分类表category和商品表product
#创建分类表CREATE TABLE categorycid VARCHAR(32) PRIMARY KEY,#分类idcname VARCHAR(1OG)#分类名称DESC category;
#商品表CREATE TABLE products
(pid VARCHAR(32) PRIMARY KEY,pname VARCHAR(40),price 
DOUBLEcategory_id VARCHAR(32),--商品分类id,外键#CONSTRAINT约束#REFERENCES引用CONSTRAINT fk_category_products FOREIGN KEY
(category_id) REFERENCES category(cid)  #添加外键约束,category_id是外键列,cid是主键列-- [constraint 外键约束名] foreign key (外键列) references 主表名(主键列名)
)

写法二:建表后添加外键约束

-- alter table 外表名 add [constraint 外键约束名] foreign key (外键列) references 主表名(主键列名)
alter table 外表名 add constraint fk_category_products foreign key
(category_id) references category(cid)

删除外键约束:

alter table table_name drop foreign key 外键约束名;

多表查询

测试数据

CREATE TABLE products
(id          INT PRIMARY KEY AUTO_INCREMENT, -- 商品IDname        VARCHAR(24)    NOT NULL,        -- 商品名称price       DECIMAL(10, 2) NOT NULL,        -- 商品价格score       DECIMAL(5, 2),                  -- 商品评分,可以为空is_self     VARCHAR(8),                     -- 是否自营category_id INT                             -- 商品类别ID
);
drop table category
CREATE TABLE category
(id   INT PRIMARY KEY AUTO_INCREMENT, -- 商品类别IDname VARCHAR(24) NOT NULL            -- 类别名称
);# 添加测试数据
INSERT INTO category
VALUES (1, '手机'),(2, '电脑'),(3, '美妆'),(4, '家居');INSERT INTO products
VALUES (1, '华为Mate50', 5499.00, 9.70, '自营', 1),(2, '荣耀80', 2399.00, 9.50, '自营', 1),(3, '荣耀80', 2199.00, 9.30, '非自营', 1),(4, '红米note 11', 999.00, 9.00, '非自营', 1),(5, '联想小新14', 4199.00, 9.20, '自营', 2),(6, '惠普战66', 4499.90, 9.30, '自营', 2),(7, '苹果Air13', 6198.00, 9.10, '非自营', 2),(8, '华为MateBook14', 5599.00, 9.30, '非自营', 2),(9, '兰蔻小黑瓶', 1100.00, 9.60, '自营', 3),(10, '雅诗兰黛粉底液', 920.00, 9.40, '自营', 3),(11, '阿玛尼红管405', 350.00, NULL, '非自营', 3),(12, '迪奥996', 330.00, 9.70, '非自营', 3);

交叉查询(笛卡尔积,了解,慎用)

交叉连接关键字: cross join

显式交叉连接格式: select * from 左表 cross join 右表;

隐式交叉连接格式: select * from 左表,右表;

注意: 交叉连接了解即可,因为它本质就是一个错误,又叫笛卡尔积(两个表记录数的乘积)

注意: 左表和右表没有特殊含义,只是在前面是左表,在后面的是右表

SELECT * FROM products, category; -- 左表的没一行都会对应右表的没一行,基本上都是脏数据,总行数是两个表的行数乘积

内连接

内连接: 两个表的交集

内连接关键字: [inner] join ... on显式内连接格式: select * from 左表 [inner] join 右表 on 关联条件;隐式内连接格式:  select * from 左表 , 右表 where 关联条件;注意: 左表和右表没有特殊含义,只是在前面是左表,在后面的是右表
# 显式内连接格式: select 字段名 from 左表 inner join右表 on 关联条件;
SELECTc.id   cid,c.name cname,p.id   pid,p.name pname
FROMproducts pINNER JOIN category c ON p.category_id = c.id;
# 隐式内连接格式: select 字段名 from 左表,右表 where 条件;
SELECTc.id   cid,c.name cname,p.id   pid,p.name pname
FROMproducts p,category c
WHEREp.category_id = c.id;

左外连接、右外连接

左外连接 内连接关键字: left [outer] join ... on

左外连接格式: select * from 左表 left [outer] join 右表 on 关联条件;

右外连接 内连接关键字: right [outer] join ... on

左外连接格式: select * from 左表 right outer join 右表 on 关联条件;

SELECT * FROM category c left JOIN products p ON p.category_id = c.id;

#这里有个注意的地方,左表是类别,只要右表跟左表有对应就全部对应,所以下面美妆等类别会出现多个对应的行,如果右边没有跟左表对应的,则会用null填充

SELECT * FROM products p left JOIN category c ON p.category_id = c.id;

全连接

两个表合上下(垂直)合并成一个表,如下图

union : 默认去重

union all: 不去重

注意:两个表的列要一一致,否则没发合并

(SELECT category_id,name FROM products LIMIT 0,1)

UNION

(SELECT category_id,name FROM products LIMIT 0,1);

(SELECT category_id,name FROM products LIMIT 0,1)

UNION ALL

(SELECT category_id,name FROM products LIMIT 0,1);

扩展:自关联(自连接查询)

解释: 两个表进行关联时,如果左表和右边是同一张表,这就是自关联。

注意: 自连接必须起别名!

-- 查询'江苏省'下所有城市
SELECTshi.id,shi.title,sheng.id,sheng.title
FROMareas shengJOIN areas shi ON shi.pid = sheng.id
WHEREsheng.title = '江苏省';-- 求每个月和上月的差额
SELECTc.month,c.revenue,c.revenue-u.revenue as diff
FROMsales cJOIN sales u ON c.month = u.month + 1;

注意:该语句涉及到多表关联,如果数据量大的话会特别耗时,在实际使用中无法应用

子查询

子查询:在一个 SELECT 语句中,嵌入了另外一个 SELECT 语句,那么被嵌入的 SELECT 语句称之为子查询语句,外部那个SELECT 语句则称为主查询。

作用: 子查询是辅助主查询的。

子查询的结果充当主查询的条件

子查询的结果充当主查询的数据源(临时表)

子查询的结果充当主查询的查询字段

-- 需求: 求商品价格大于平均价的商品信息
SELECT * FROM  products WHERE price > (SELECT AVG(price) FROM products);
--  查询'河北省'下所有城市
select * from areas where pid = (select id from areas where title = '河北省');

注意:子查询作为表使用必须加括号,同时起别名!!!

-- 需求: 查询'电脑'分类中商品的平均价格,要求结果中包含分类名称
思路1: 先合并商品表和分类表,再分组聚合
select c.name,avg(p.price) from products p JOIN category c ON c.id = p.category_id group by c.name having c.name = '电脑';思路2: 子查询作为表使用,调优角度: join之前能提前过滤就提前过滤
select c.name,avg(p.price) from products p JOIN (select * from category where name = '电脑') c ON c.id = p.category_id group by c.name ;

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

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

相关文章

让智能体—“正念365”陪你一起“养心”

佛学的“八正道”中,笔者个人观点,“正念”是最适合当代人低门槛练习的一个,因为不需要阅读大量的知识来理解概念,只需要保持对当下的觉察,发现分心了,就不带评价的把注意力拉回到当前的事情上就好。就是佛…

uni-app小程序开发(1)

下载软件就不多赘述了。 直接上代码,写过wep端的vue看这个小程序就简单很多,不需要搞那么多麻烦事情,直接编译器就创建好了基础模版。 1、项目结构 暂时知道这么多,后续再补充 2、页面创建、导航栏设置、基础属性设置 在pages中…

Mac上无法访问usr/local的文件

sudo chmod 755 /usr/loca 最后用百度提供的方法解决了

Python Matplotlib 子图绘制

Python 中的子图绘制 在数据可视化中,展示多个图表在同一个画布上是常见的需求,这样可以更直观地比较不同数据集之间的关系。Python 中的 Matplotlib 库为我们提供了强大的功能来实现这一点。在本篇文章中,我们将详细介绍如何使用 Matplotli…

编写一个基于React的聊天室

前言 此前已经编写了一版后端的im,此次就用其作为服务端,可查看参考资料1 代码 使用WebStorm创建React项目 安装依赖包 PS C:\learn-demo\front\chatroom> npm installadded 183 packages, and audited 184 packages in 16s43 packages are looki…

Python-利用os,tkinter库编写一个伪恶意程序文件(Pro版)

前言:上一期我们简单学习了如何编写一个多次弹窗警告用户的exe伪恶意文件。我们知道了把Python初始文件编译为exe文件后,程序在没有Python环境的情况下也能正常运行。我们上次编写的程序仅仅只是伪造系统正在执行关机命令前的倒计时的假象,实…

低压线路保护器在生产型企业配电系统中的应用

摘要 随着现代电力系统的发展,配电系统的可靠性和安全性要求日益提高。低压线路保护器在其中扮演着关键角色。本文将探讨低压线路保护器的工作原理及其在现代配电系统中的作用,重点介绍ALP系列低压线路保护器的功能与应用。 引言 低压线路保护器用于保…

像狗一样的男人 --- 社保 篇

如果你不想像狗一样的活着,请抛弃幻想,保持学习 一些概念城镇职工社会保险(五险一金)城居保(新农合) 一些概念 社保有两个系统: 城镇职工社会保险 也就是 五险一金。新农合 14年新农合改名叫城…

腾讯云轻量应用服务器最佳实践

引言 轻量应用服务器是新一代开箱即用、面向轻量应用场景的云服务器产品,助力中小企业和开发者便捷高效的使用,相比普通云服务器更加简单易用且更贴近应用,提供极简上云体验。那么如何正确地购买、配置、管理轻量应用服务器,以确…

python练习-袭击敌机

$ python -m pip install --user pygame1、画游戏框 class Settings:def __init__(self):self.screen_width 1200self.screen_height 800self.bg_color (230, 230, 230)import sys import pygame from settings import Settingsclass AlienInvasion:def __init__(self):pyg…

windows server2019下载docker拉取redis等镜像并运行项目

一、基本概念 1、windows server 指由微软公司开发的“Windows”系列中的“服务器”版本。这意味着它是基于Windows操作系统的,但专门设计用于服务器环境,而不是普通的桌面或个人用户使用。主要用途包括服务器功能、用户和资源管理、虚拟化等 2、dock…

软件设计师中级 第9章 数据库技术基础

9.1 基本概念 9.1.1 数据库的三级模式结构 数据库系统有三级模式结构,一个数据库可以由多个外模式,只能有一个内模式。 视图对应外模式、基本表对应模式(概念模式)、存储文件对应内模式。 外模式 也称子模式(Subsch…

1.python介绍、安装

python可以做什么? 1.自动化脚本(运维开发、测试开发等) 2.自动化办公 3.web应用程序 4.基于python完成数据计算(生物、化学、物理) 5.基于python开发AI程序 6.完成大数据开发Spark、Flink 想要与计算机交流&am…

一文学会easyexcel导入数据,多sheet页、字典转换【附带源码】

文章目录 前言一、业务流程二、实现1、引入easyexcel、fastjson、lombok包2、创建Json工具类3、创建自定义字典转换注解4、创建字典转换实现类5、创建数据对象类6、创建多sheet页封装对象7、创建Excel导入工具类8、创建测试类 三、接口测试1、启用项目2、使用数据导出的文件&am…

大模型微调技术 --> IA3

IA3 1.摘要 我们引入了一种名为 ( I A ) 3 (IA)^3 (IA)3 (通过抑制和放大内部激活的注入适配器, Infused Adapter by Inhibiting and Amplifying Inner Activations)的新的PEFT方法,该方法通过学习向量缩放激活,在只引入相对少量的新参数的情况下获得更…

Liunx:进程控制

进程终止 三种场景,进程结束结果正确,进程结束不正确,异常终止。 进程的退出码,也就是return,表征着进程运行结果是否正常,return 返回值被父进程接收。return 0表示进程运行结束并且结果正确。他是给用户的…

C++builder中的人工智能(12):了解ELU(Exponential Linear Unit)——人工神经网络中的激活函数

在这篇文章中,我们将解释什么是指数线性单元(ELU),以及如何利用ELU激活函数。通过学习这些知识,你将能够使用C软件创建C应用程序。 我们需要了解哪些关于激活函数的知识? 激活函数(phi()&#…

从0开始学习机器学习--Day19--学习曲线

一般来说,如果一个算法的表现不理想,那么多半是因为出现了欠拟合或过拟合问题,这种时候我们要做的就是搞清楚出现的是偏差问题还是方差问题,亦或是二者皆有,这有助于我们精准定位问题所在。 之前,我们发现…

豆包大模型团队开源RLHF框架,破解强化学习训练部署难题

1. 引言 1.1 强化学习 强化学习(Reinforcement Learning, RL)是与监督学习和无监督学习并列的一种机器学习方法,其用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题…

练习LabVIEW第四十三题

学习目标: 模拟红绿灯,红灯亮十秒,绿灯亮五秒,交替,并用波形图将波形显示 开始编写: 前面板 两个指示灯,一个红色,一个绿色,一个波形图; 程序框图 创建…