mysql高级查询

news2024/11/18 18:36:07

score
在这里插入图片描述
student
在这里插入图片描述
courses
在这里插入图片描述

inner join

内连接:查询的结果为两个表匹配到的数据

1.条件:查询学生信息及课程对应的分数
解析:此时信息存储在三张表通过外键标识,可以先将学生和分数表根据条件连接在一起,然后在连接课程

SELECT stu.studentno,sc.score,cs.name  FROM test.students stu inner join test.scores sc on stu.studentNo=sc.studentno inner join test.courses cs on sc.courseNo=cs.courseNo

在这里插入图片描述

2.查询王昭君的成绩,要求显示姓名课程和分数

SELECT stu.name,sc.score,cs.name  FROM test.students stu inner join test.scores sc on stu.studentNo=sc.studentno inner join test.courses cs on sc.courseNo=cs.courseNo
where stu.name='王昭君'

3.查询男生中的最高成绩 要求显示姓名 课程名 成绩

SELECT stu.sex,stu.name,sc.score,cs.name  FROM test.students stu inner join test.scores sc on stu.studentNo=sc.studentno inner join test.courses cs on sc.courseNo=cs.courseNo
where sex='男' order by sc.score desc limit 1

left join

查询的结果为两张表匹配到的数据加左表特有的数据,对于右表中不存在的数据是用Null
1.条件:查询所有学生的成绩,包括没有成绩的学生

select * from test.students stu left join test. scores sc on stu.studentNo=sc.studentNo

在这里插入图片描述

2.查询所有学生的成绩,包括没有成绩的学生,需要显示课程名

select * from test.students stu left join test. scores sc on stu.studentNo=sc.studentNo left join test.courses cs on sc.courseNo=cs.courseNo

在这里插入图片描述

右连接

添加两门课程

insert into courses values 
(0, '语文'),
(0, '数学');

例1:查询所有课程的成绩,包括没有成绩的课程

select
    *
from
    test.scores sc
right join test.courses cs on cs.courseNo = sc.courseNo

在这里插入图片描述
例2:查询所有课程的成绩,包括没有成绩的课程,包含学生信息

先把成绩和课程连接起来,以课程为主,连接起来之后看作一个整体,把这个整体再和学生信息表左连接

select
    *
from
    scores sc
right join courses cs on cs.courseNo = sc.courseNo
left join students stu on stu.studentNo = sc.studentNo

在这里插入图片描述

自关联

create table areas(
aid int primary key,
atitle varchar(20),
pid int
);

insert into areas 
values ('130000', '河北省', NULL),
('130100', '石家庄市', '130000'),
('130400', '邯郸市', '130000'),
('130600', '保定市', '130000'),
('130700', '张家口市', '130000'),
('130800', '承德市', '130000'),
('410000', '河南省', NULL),
('410100', '郑州市', '410000'),
('410300', '洛阳市', '410000'),
('410500', '安阳市', '410000'),
('410700', '新乡市', '410000'),
('410800', '焦作市', '410000');

在这里插入图片描述

例1:查询一共有多少个省
注:统计个数,使用count(*) 尽量不要统计某一列,万一出现null会出错

select count(*) from areas where pid is null;

例1:查询河南省的所有城市

select * from test.areas p,test.areas c where p.aid=c.pid and where p.atitle='河南省'

select * from test.areas as p inner join test.areas as c on c.pid=p.aid where p.atitle='河北省';

例3:查询河南省的所有区县

select * from test.areas as p inner join test.areas as c on c.pid=p.aid inner join test.areas as q on c.aid=q.pid  where p.atitle='河南省';

在这里插入图片描述

子查询

在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句

主查询和子查询的关系

  • 子查询是嵌入到主查询中
  • 子查询是辅助主查询的,要么充当条件,要么充当数据源
  • 子查询是可以独立存在的语句,是一条完整的 select 语句

子查询分类

  • 标量子查询: 子查询返回的结果是一个数据(一行一列)
  • 列子查询: 返回的结果是一列(一列多行)
  • 行子查询: 返回的结果是一行(一行多列)
  • 表级子查询: 返回的结果是多行多列

标量子查询
例1:查询班级学生的平均年龄

查询班级学生平均年龄
select avg(age) from students

查询大于平均年龄的学生
select * from students where age > 21.4167

select * from students where age > (select avg(age) from students);

例2:查询王昭君的成绩,要求显示成绩

学生表中查询王昭君的学号
select studentNo from students where name = '王昭君'

成绩表中根据学号查询成绩
select * from scores where studentNo = '001'

select * from scores where studentNo = (select studentNo from students where name = '王昭君')

列级子查询v
返回一列多行
例3:查询18岁的学生的成绩,要求显示成绩

学生表中查询18岁的学生的学号
select studentNo from students where age=18

成绩表中根据学号查询成绩
select * from scores where studentNo in ('002','006')

select * from scores where studentNo in (select studentNo from students where age=18)

子查询中特定关键字使用

in 范围

  • 格式: 主查询 where 条件 in (列子查询)
select * from students where age in (select age from students where age between 18 and 20)

any | some 任意一个

和in查询类似 等于范围内的任意一个

select * from test.students where age =any (select age from test.students where age between 18 and 20)
any等于some
select * from test.students where age =some (select age from test.students where age between 18 and 20)


# 大于其中的最小值  也就是大于18
select * from test.students where age >any (select age from test.students where age between 18 and 20)

在这里插入图片描述

# 小于范围内的最大值
select * from test.students where age <any (select age from test.students where age between 18 and 20)

在这里插入图片描述

# 小于里面的所有值  也就是小于最小值
select * from test.students where age <all (select age from test.students where age between 18 and 20)

在这里插入图片描述

# 大于其中所有值   也就是大于最大值
select * from test.students where age >all (select age from test.students where age between 18 and 20)

在这里插入图片描述

# 不等于范围所有值
select * from test.students where age !=all (select age from test.students where age between 18 and 20)

在这里插入图片描述

SQL演练

create table test.goods(
    id int unsigned primary key auto_increment,
    name varchar(150),
    cate varchar(40),
    brand_name varchar(40),
    price decimal(10,3) default 0,
    is_show bit default 1,
    is_saleoff bit default 0
);
insert into test.goods values(0,'r510vc 15.6英寸笔记本','笔记本','华硕','3399',default,default); 
insert into test.goods values(0,'y400n 14.0英寸笔记本电脑','笔记本','联想','4999',default,default);
insert into test.goods values(0,'g150th 15.6英寸游戏本','游戏本','雷神','8499',default,default); 
insert into test.goods values(0,'x550cc 15.6英寸笔记本','笔记本','华硕','2799',default,default); 
insert into test.goods values(0,'x240 超极本','超级本','联想','4999',default,default); 
insert into test.goods values(0,'u330p 13.3英寸超极本','超级本','联想','4299',default,default); 
insert into test.goods values(0,'svp13226scb 触控超极本','超级本','索尼','7999',default,default); 
insert into test.goods values(0,'ipad mini 7.9英寸平板电脑','平板电脑','苹果','1998',default,default);
insert into test.goods values(0,'ipad air 9.7英寸平板电脑','平板电脑','苹果','3388',default,default); 
insert into test.goods values(0,'ipad mini 配备 retina 显示屏','平板电脑','苹果','2788',default,default); 
insert into test.goods values(0,'ideacentre c340 20英寸一体电脑 ','台式机','联想','3499',default,default); 
insert into test.goods values(0,'vostro 3800-r1206 台式电脑','台式机','戴尔','2899',default,default); 
insert into test.goods values(0,'imac me086ch/a 21.5英寸一体电脑','台式机','苹果','9188',default,default); 
insert into test.goods values(0,'at7-7414lp 台式电脑 linux )','台式机','宏碁','3699',default,default); 
insert into test.goods values(0,'z220sff f4f06pa工作站','服务器/工作站','惠普','4288',default,default); 
insert into test.goods values(0,'poweredge ii服务器','服务器/工作站','戴尔','5388',default,default); 
insert into test.goods values(0,'mac pro专业级台式电脑','服务器/工作站','苹果','28888',default,default); 
insert into test.goods values(0,'hmz-t3w 头戴显示设备','笔记本配件','索尼','6999',default,default); 
insert into test.goods values(0,'商务双肩背包','笔记本配件','索尼','99',default,default); 
insert into test.goods values(0,'x3250 m4机架式服务器','服务器/工作站','ibm','6888',default,default); 
insert into test.goods values(0,'hmz-t3w 头戴显示设备','笔记本配件','索尼','6999',default,default); 
insert into test.goods values(0,'商务双肩背包','笔记本配件','索尼','99',default,default);

在这里插入图片描述

求所有电脑产品的平均价格,并且保留两位小数

select round(avg(price),2) as avg_price from goods;

在这里插入图片描述

查询所有价格大于平均价格的商品,并且按价格降序排序

select id,name,price from goods 
where price > (select round(avg(price),2) as avg_price from goods) 
order by price desc;

在这里插入图片描述
查询类型为’超极本’的商品价格

select price from goods where cate = '超级本';

查询价格大于或等于"超级本"价格的商品,并且按价格降序排列

select id,name,price from test.goods 
where price >= any(select price from test.goods where cate = '超级本')
order by price desc;


在这里插入图片描述

数据分表

该表设计的不合理
例如:分类和商品名称很多重复的,可以把这两个字段拿出来单独存放
在这里插入图片描述

比如我现在想把联想改成thinkpad 那就需要去原表把所有的联想都改了,但是单独拿出来保存其主见只需要改一个就行
在这里插入图片描述

创建“商品分类”表

create table if not exists goods_cates(
    cate_id int unsigned primary key auto_increment,
    cate_name varchar(40)
);

查询goods表的所有记录,并且按"类别"分组

select cate from goods group by cate;

查询goods表的所有记录,并且按"类别"分组

select cate from goods group by cate;

select distinct from goods ;

在这里插入图片描述

将分组结果写入到goods_cates数据表

insert into goods_cates (cate_name) select cate from goods group by cate;

在这里插入图片描述

通过create…select来创建数据表并且同时写入记录,一步到位
字段名称要对应

create table goods_brands (
    brand_id int unsigned primary key auto_increment,
    brand_name varchar(40)) select brand_name from goods group by brand_name;

在这里插入图片描述
注:也可以用该命令对表进行被封

create table goods_back select * from goods

此时需要将Goods表的商品名称改成id
通过goods_brands数据表来更新goods数据表

update goods as g inner join goods_brands as b on g.brand_name = b.brand_name
set g.brand_name = b.brand_id;


update test.goods  g inner join test.goods_cates c on g.cate = c.cate_name set g.cate = c.cate_id;

在这里插入图片描述

查看 goods 的数据表结构,会发现 cate 和 brand_name对应的类型为 varchar 但是存储的都是字符串

修改数据表结构,把cate字段改为cate_id且类型为int unsigned,把brand_name字段改为brand_id且类型为int unsigned

查询所有商品的详细信息 (通过内连接)

通过两张表的品牌ID进行内连接后生成一张表
在这里插入图片描述

通过新生成的1表和2表关联生产3表 这样就可以查询到完整的商品表了
在这里插入图片描述

查询所有商品的详细信息 (通过内连接)

select id,name,cate_name,brand_name,price from goods as g
inner join goods_cates as c on g.cate_id = c.cate_id
inner join goods_brands as b on g.brand_id = b.brand_id;

在 goods 数据表中写入任意记录

insert into goods (name,cate_id,brand_id,price)
values('LaserJet Pro P1606dn 黑白激光打印机','12','4','1849');

查询所有商品的详细信息 (通过左连接)

select id,name,cate_name,brand_name,price from goods as g
left join goods_cates as c on g.cate_id = c.cate_id
left join goods_brands as b on g.brand_id = b.brand_id;

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

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

相关文章

升级你的照片编辑体验:Nik Collection by DxO,让你的照片更出色

如果你是一个摄影爱好者或者专业摄影师&#xff0c;你一定需要一款功能强大、易于使用的照片编辑插件套件来提升你的作品质量。今天&#xff0c;我们要向大家介绍一款备受赞誉的产品——Nik Collection by DxO。 Nik Collection by DxO是一款集合了多种照片编辑功能的插件套件…

Leetcode刷题笔记--Hot71--80

1--会议室II&#xff08;253&#xff09; 2--完全平方数&#xff08;279&#xff09; 主要思路&#xff1a; 完全背包问题&#xff0c;每一个平方数可以选取多次。 本题的物品组合与顺序无关&#xff0c;对应于组合问题&#xff0c;因此先遍历物品&#xff0c;再遍历背包。 定…

51单片机中断操作详解(03)

eg1&#xff1a;数码管如何显示出字符 51单片机40个引脚的功能需要记住** RXD&#xff1a;表示的是串行输入口INT0&#xff1a;外部中断0INT1&#xff1a;外部中断1TO : 外部中断0T1 &#xff1a;外部中断1WR: 外部输入存储器写RD: 外部输出存储器读XTK2/XTL1 单片机晶振的输…

分享5个解决msvcp140.dll丢失的方法,全面解析msvcp140.dll丢失的原因

一、MSVCP140.dll是什么&#xff1f; 首先&#xff0c;我们需要了解什么是MSVCP140.dll。MSVCP140.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2015 Redistributable的一部分。这个文件包含了运行使用C编写的应用程序所需的一些函数和类。因此&#xff0c;当…

从零开始,学好 Python 从大一新生自我介绍开始

从零开始&#xff0c;学好 Python 从大一新生自我介绍开始 大家好&#xff0c;我叫xxx,今年18岁&#xff0c;刚刚入学不久。我决定从零开始系统学习Python编程语言。 Python是一种解释型、交互式和脚本编程语言。它由荷兰人Guido van Rossum在1991年左右创立&#xff0c;语法简…

深入理解 C++ 右值引用和移动语义:全面解析

C11引入了右值引用&#xff0c;它也是C11最重要的新特性之一。原因在于它解决了C的一大历史遗留问题&#xff0c;即消除了很多场景下的不必要的额外开销。即使你的代码中并不直接使用右值引用&#xff0c;也可以通过标准库&#xff0c;间接地从这一特性中收益。为了更好地理解该…

023-第三代软件开发-自定义Button

第三代软件开发-自定义Button 文章目录 第三代软件开发-自定义Button项目介绍自定义Button第一类型-加声音第二类型-加样式 第三类型-减声音总结一下存在一点小问题 关键字&#xff1a; Qt、 Qml、 Button、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&…

无需公网IP,如何远程访问内网SVN服务?

小王以往为客户服务器做维护时&#xff0c;需要先在本地服务器上调试后再copy到客户服务器上进行发布。现在在本地搭建SVN服务器并通过花生壳发布SVN到外网&#xff0c;在客户服务器现场时也能load公司内网服务器的SVN代码。无需再次copy又发布&#xff0c;省时省力。下面来看详…

【JavaWeb】后端(MySQL+Mybatis)

目录 一、MySQL1.什么是数据库?2.MySQL安装3.MySQL连接 二、DDL1.DDL&#xff08;数据库操作)2.MySQL客户端工具3.表操作4.数据类型5.表操作 三、DML1.INSERT2.UODATE3.DELETE 四、DQL1.基本查询2.条件查询&#xff08;where&#xff09;3.分组查询&#xff08;group by&#…

Python---练习:while循环嵌套(用两次while三步走--里外各一次)

1、循环嵌套的引入 案例&#xff1a; 有天女朋友又生气了&#xff0c;惩罚&#xff1a;说3遍“老婆大人&#xff0c; 我错了”&#xff0c;这个程序是不是循环即可&#xff1f;但如果女朋友说&#xff1a;还要刷今天晚饭的碗&#xff0c;这个程序怎么书写&#xff1f; 思考&…

《红蓝攻防对抗实战》一. 隧道穿透技术详解

一.隧道穿透技术详解 从技术层面来讲&#xff0c;隧道是一种通过互联网的基础设施在网络之间传递数据的方式&#xff0c;其中包括数据封装、传输和解包在内的全过程,使用隧道传递的数据(或负载)可以使用不同协议的数据帧或包。 假设我们获取到一台内网主机的权限&#xff0c;…

概念解析 | 毫米波雷达与计算机视觉的融合

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:毫米波雷达与计算机视觉的融合。 毫米波雷达与计算机视觉的融合 Sensors | Free Full-Text | MmWave Radar and Vision Fusion for Object Detection in Autonomous Driving: A …

分享一个MSSA插值的GRACE level数据集

1. 背景介绍 我们通常使用的GRACE数据包含球谐数据和mascon数据。而不管是球谐产品还是mascon产品&#xff0c;都存在月份数据的缺失&#xff0c;如下图所示&#xff08;Yi and Sneeuw, 2021&#xff09;。本专栏分享了一个利用多通道奇异谱分析&#xff08;MSSA&#…

一篇前段时间使用评分卡的总结_20231022

有帮助要帮我点赞哦 可以依据现在的流程&#xff0c;结合实际数据情况进行调整。 流程框架&#xff1a; eda查看字段相似性&#xff0c;提炼相似字段初步分箱必要时展开二次分箱&#xff08;或者多轮分箱调优&#xff09;可以进一步查看分箱后字段的相似性(woe值转化之后)查看…

【微信小程序】授权登录流程解析

目录 微信授权登录流程 1. 官方图示流程详解 2. 代码登录流程拆解 2.1 前端代码示例讲解 2.2 后端代码示例讲解 2.3 代码登录流程拆解 &#x1f31f; 3. 表情包存储展示&#xff08;扩展&#xff09; 附议 微信授权登录流程 1. 官方图示流程详解 ① 微信服务器验证&a…

excel单元格各种组合求和

单元格如果连续选择的话使用冒号&#xff0c;不是连续选择使用逗号&#xff1b;sum(A1:A4)表示对A1到A4求和&#xff1b;sum(A1,A4)表示求A1A4的和&#xff1b; 如下图&#xff0c;求斜线上四个单元格的和&#xff0c;结果见下图&#xff1b; 求A列和C列全部单元格的和&#x…

Python 函数:定义、调用、参数、递归和 Lambda 函数详解

函数是一段代码块&#xff0c;只有在调用时才会运行。您可以将数据&#xff08;称为参数&#xff09;传递给函数。 函数可以返回数据作为结果。 创建函数 在Python中&#xff0c;使用def关键字定义函数&#xff1a; 示例 def my_function():print("Hello from a func…

CCC数字钥匙设计【NFC】--NFC卡相关基础知识

CCC3.0的NFC技术中&#xff0c;除车端&#xff0c;手机端需包含NFC功能外&#xff0c;另外一般还会配置一个NFC卡&#xff0c;用于备份使用。本文主要介绍NFC卡相关的基础知识。 1、NFC卡 & 智能卡 NFC卡是一种智能卡&#xff0c;其与信用卡大小相同&#xff0c;可通过嵌入…

删除所有出现次数最少的字符

题意: 假设字符串中出现次数最少的字母是x, 出现次数为y, 删除所有出现次数为y的字符 思路&#xff1a;用unordered_map统计出出现次数最少的x出现的次数y 再遍历字符串&#xff0c;删除所有出现次数为y的字符 代码&#xff1a; #include <iostream> #include <uno…

stm32外部时钟为12MHZ,修改代码适配

代码默认是8MHZ的&#xff0c;修改2个地方&#xff1a; 第一个地方是这个文件的这里&#xff1a; 第二个地方是找到这个函数&#xff1a; 修改第二个地方的这里&#xff1a;