sql入门-多表查询

案例涉及表

 ----------------------------------建表语句之前翻看之前博客文章

 

 

多表查询

-- 学生表
create table studen (
    id int primary key auto_increment comment 'id',
    name varchar(50) comment '姓名',
    no varchar(10) comment '学号'
) comment '学生表';

insert into studen values (null , '黛绮丽','2000100101'),(null , '谢逊','2000100102'),(null , '殷天正','2000100103'),(null , '韦一笑','2000100184');

drop table studen;

use itheima;

-- 课程表
create table course(
    id int auto_increment primary key comment 'id',
    name varchar(10) comment '课程名称'
)comment '课程名称';

insert into course values (null,'java'),(null,'php'),(null,'mysql'),(null,'hadoop');

-- 中间表(连接两种表上的关系)
create table studen_course(
    id int primary key auto_increment comment 'id',
    studen_id int not null comment '学生id',
    course_id int not null comment '课程id',
    constraint wj_studen foreign key(studen_id) references studen(id),
     constraint wj_course foreign key(course_id) references course(id)
) comment '学生课程中间表';

insert into studen_course values(null,1,1),(null,1,2),(null,1,3),(null,1,4);

-- 多表查询需要消除笛卡尔积

-- 内连接    **--两张表交集部分
-- -- 隐式内连接  select 字段列表 表1,表2 where 条件


-- -- 显示内连接  select 字段列表 from 表1 [inner]join 被连接的表 on 连接条件
-- inner

-- 外连接  **-- 左外 相当于查询所有左表数据  并包含表1和表2 交集部分数据     右外同理
-- -- 左外连接  select 字段 from 表1 left[outer] join 表2 no 条件 ...
# 1.查询emp所有数据,和对应部门信息
select e.*,d.name from emp e left join dept d on e.det_id = d.id;

-- -- 右外连接  select 字段 from 表1 right[outer]join 表2 on 条件...
-- outer可以省略


-- 自连接查询  select 字段 from 表a 别名a join 表a 别名b on 条件...
# **-- 自连接查询,可以是内连接查询,也可以是外连接查询
#1. 查询员工并获取 及其领导的名字
select * from emp;

select e1.name 员工姓名 ,e1.age 年龄 , e2.name 领导名称  from emp e1 join emp e2 on e1.mangerid = e2.id;

#2. 查询员工并获取 及其领导的名字(没有领导也要显示出来) -- 使用左侧连接即可
select e1.name 员工姓名 ,e1.age 年龄 , e2.name 领导名称  from emp e1 left join emp e2 on e1.mangerid = e2.id;


-- 联合查询  select 字段 from 表a  unino[all] select 字段 from 表b ....
-- union 合并查询结果
-- union all 合并结果,并去重
# 1.薪资小于 5000 和 年龄大于50

-- union 会去重 猪八戒只出现一次
select * from emp where salary < 5000
union
select * from emp where age > 50;

-- 猪八戒 会重复出现两次 语法 union all 合并两次查询结果(不去重
select * from emp where salary < 5000  -- 猪八戒符合条件
union all
select * from emp where age > 50;  -- 猪八戒符合条件

-- 子查询  sql嵌套select 语句 称为嵌套查询 又称子查询
-- select * from t1 where column1 = (select column1 from t2)
-- 子查询外部可以是 inster update delete select任何一个

-- --  标量子查询(子查询结果为单个值)
# -- 常用的操作符  =等于  <>不等  >大于  >=大于等于 <小于  <=小于等于
# 查询销售部所有员工
select * from emp where det_id = (select id from dept where name = '销售部');

-- --  列子查询(查询结果为一列)
# -- 常用操作符 in指定范围内 not in指定范围外
# -- any子查询任意一个满足即可 some和any等同  all子查询返回列表所有值必须满足
# 查询比 销售部 所有人工资都高的员工信息
select id from dept where name = '销售部';
select salary from emp where det_id = (select id from dept where name = '销售部');
select * from emp where salary > all (select salary from emp where det_id = (select id from dept where name = '销售部'));

-- --  行子查询(查询结果为一行)
# -- 常用操作符 =  <>  in  not in
# 查询和 杨逍 的 薪资 及 直属领导 相同的员工
select salary , mangerid from emp where name = '杨逍' ;

select * from emp where (salary , mangerid) = (select salary , mangerid from emp where name = '杨逍');


-- -- 表子查询(查询结果为多行多列)
# 常用操作符  in
# 查询 宋远桥  和 鹿杖客 职位相同和薪资相同的员工
select salary , job from emp  where name = '宋远桥' || name = '鹿杖客';

select * from emp where (salary , job) in (select salary , job from emp  where name = '宋远桥' || name = '鹿杖客');

# 查询入职日期 '2006-01-01'之后的员工信息,及其部门信息
select id,det_id from emp where entrydate > '2006-01-01';
select e.* , d.name from emp e ,dept d where (e.id , d.id) in (select id,det_id from emp where entrydate > '2006-01-01');

select * from emp where entrydate > '2006-01-01';
select * from (select * from emp where entrydate > '2006-01-01') e left join emp d on e.det_id = d.id;

# -- -- 根据子查询位置,分为where之后,from之后,select之后


# ========================多表查询案例=======================
create table salgrade (
    grade int ,
    losal int ,
    hisal int
) comment '薪资等级表';

insert into salgrade values (1,0,3000);
insert into salgrade values (2,30001,5000);
insert into salgrade values (3,5001,8000);
insert into salgrade values (4,8001,10000);
insert into salgrade values (5,10001,15000);
insert into salgrade values (6,15001,20000);
insert into salgrade values (7,20001,25000);
insert into salgrade values (8,25001,30000);

# 1. 查询员工的姓名 年龄 职位  部门信息
select name , age , job ,det_id  from emp;
-- 隐式内连接--35ms
select e.name ,e.age ,e.job,d.name from dept d , emp e where e.det_id = d.id;
-- 显示外连接--28ms  外连接  左连接  查询交际部分-且返回左侧表所有
select e.name ,e.age ,e.job,d.name from  emp e left join dept d on d.id = e.det_id;



# 2.查询年龄小于30岁的员工姓名,年龄 职位,部门信息(显示内连接)
select * from emp where age < 30;
-- 隐式内连接
select e.name ,e.age ,e.job,d.name from emp e ,dept d where e.age < 30  and  e.det_id = d.id;
-- 显示内连接  -inner join  on   只查询交际部分
select * from emp e inner join dept d on e.det_id = d.id where e.age < 30;

# 3.查询所有员工的部门id,部门名称
-- distinct 去重
select distinct d.* from dept d , emp e where d.id = e.det_id;

# 4.查询所有年龄大于40岁的员工,及其部门的名称,如果员工没有部门,也需要展示出来
select e.* , d.name from emp e left join dept d on e.det_id = d.id where age > 40;

# 5.查询所有员工的工资的等级
select e.salary ,s.grade from emp e , salgrade s where e.salary between s.losal and s.hisal;

# 6.查询研发部所有员工信息及工资等级
select id from dept where name = '研发部';

select * from emp where det_id = (select id from dept where name = '研发部');
-- 子查询方法完成
select e.*, s.grade
from (select * from emp where det_id = (select id from dept where name = '研发部')) e,
     salgrade s
where e.salary between s.losal and s.hisal;

-- 内连接方法
select *
from emp e,
     dept d,
     salgrade s
where e.det_id = d.id
  and e.salary between s.losal and
    s.hisal
  and d.name = '研发部';

# 7.查询‘研发部员’ 工的 ’平均工资‘   -- 聚合函数 avg  平均值
select avg(e.salary)
from emp e ,dept d where e.det_id = d.id and d.name = '研发部';

# 8.查询工资比 '常遇春' 高的员工信息
select salary from emp where name = '常遇春';

select * from emp e where e.salary > (select salary from emp where name = '常遇春');

# 9.查询比平均工资高的员工信息
select avg(salary) from emp ;

select * from emp e where e.salary > (select avg(salary) from emp) ;

# 10.查询低于本部门平均工资的员工信息
-- a思路 ** 当前指定部门的平均薪资
select avg(salary) from emp where det_id = 1;

-- b  此处考察执行顺序  首先from e1   条件薪资小于  指定部门平均薪资
select e1.* , (select avg(salary) from emp where det_id = e1.det_id) 部门平均薪资
from emp e1
where e1.salary < (select avg(salary) from emp where det_id = e1.det_id);


# 11.查询所有的部门信息,并统计部门的员工人数
-- 获取指定部门统计人数
select count(*)
from emp where det_id = 1;
-- 统计部门人数
select d.name ,d.id ,(select count(*)from emp e where e.det_id = d.id ) 部门人数 from dept d;

# 12.查询所有学生 的选则课情况 展示学生名称 ,学号,课程名称
-- 涉及表 studen course stunden_course

select s.name, s.no, c.name
from studen s,
     studen_course sc,
     course c
where s.id = sc.studen_id
  and c.id = sc.course_id;

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

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

相关文章

卷积神经网络——下篇【深度学习】【PyTorch】【d2l】

文章目录 5、卷积神经网络5.10、⭐批量归一化5.10.1、理论部分5.10.2、代码部分 5.11、⭐残差网络&#xff08;ResNet&#xff09;5.11.1、理论部分5.11.2、代码部分 话题闲谈 5、卷积神经网络 5.10、⭐批量归一化 5.10.1、理论部分 批量归一化可以解决深层网络中梯度消失和…

使用PyMuPDF添加PDF水印

使用Python添加PDF水印的博客文章。 C:\pythoncode\new\pdfwatermark.py 使用Python在PDF中添加水印 在日常工作中&#xff0c;我们经常需要对PDF文件进行处理。其中一项常见的需求是向PDF文件添加水印&#xff0c;以保护文件的版权或标识文件的来源。本文将介绍如何使用Py…

Eureka:集群环境配置

创建三个集群 导包 <!-- 导包--><dependencies><!-- Eureka -server --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId><version>1.…

[Open-source tool] 可搭配PHP和SQL的表單開源工具_Form tools(1):簡介和建置

Form tools是一套可搭配PHP和SQL的表單開源工具&#xff0c;可讓開發者靈活運用&#xff0c;同時其有數個表單模板和應用模組供挑選&#xff0c;方便且彈性。Form tools已開發超過20年&#xff0c;為不同領域的需求者或開發者提供一個自由和開放的平台&#xff0c;使他們可建構…

【C++】—— C++11之可变参数模板

前言&#xff1a; 在C语言中&#xff0c;我们谈论了有关可变参数的相关知识。在C11中引入了一个新特性---即可变参数模板。本期&#xff0c;我们将要介绍的就是有关可变参数模板的相关知识&#xff01;&#xff01;&#xff01; 目录 序言 &#xff08;一&#xff09;可变参…

电子电路学习笔记之SA1117BH-1.2TR——LDO低压差线性稳压器

关于LDO调节器&#xff08;Low Dropout Regulator&#xff09;是一种电压稳压器件&#xff0c;常用于电子设备中&#xff0c;用于将高电压转换为稳定的低电压。它能够在输入电压和输出电压之间产生较小的差异电压&#xff0c;因此被称为"低压差稳压器"。 LDO调节器通…

web基础http与apache

一、http相关概念&#xff1a; http概述&#xff1a; HTTP 是一种用作获取诸如 HTML 文档这类资源的协议。它是 Web 上进行任何数据交换的基础&#xff0c;同时&#xff0c;也是一种客户端—服务器&#xff08;client-server&#xff09;协议 为解决"用什么样的网络协…

Datawhale AI夏令营 - 用户新增预测挑战赛 | 学习笔记

任务1&#xff1a;跑通Baseline # 1. 导入需要用到的相关库 # 导入 pandas 库&#xff0c;用于数据处理和分析 import pandas as pd # 导入 numpy 库&#xff0c;用于科学计算和多维数组操作 import numpy as np # 从 sklearn.tree 模块中导入 DecisionTreeClassifier 类 # De…

【docker】运行registry

registry简介 Docker registry是docker镜像仓库的服务,用于存储和分发docker镜像。 Docker registry主要特点和功能: 存储docker镜像:提供持久化存储docker镜像的功能,存储镜像的各个layer。 分发镜像:拉取和推送镜像的去中心化存储和分发服务。 支持版本管理:给镜像打标签…

【Visual Studio】生成.i文件

环境 VS版本&#xff1a;VS2013 问题 如何生成.i预编译文件&#xff1f; 步骤 1、打开VS项目属性&#xff0c;打开C/C\预处理器页面&#xff0c;【预处理到文件】选择是&#xff0c;开启。 2、生成文件如下。 3、正常编译需要关闭此选项。

vue ui 创建项目没有反应

问题 cmd中输入 vue ui 没有反应 解决办法 vue ui命令需要vue3.0以上的版本才可以 1、查看当前版本 vue --version vue版本在3.0以下是没有ui命令的 2、查看版本所拥有的命令 vue -h 3、卸载之前版本的vue npm uninstall vue-cli -g 卸载完成&#xff0c;检查是否已经…

前端高频面试题 js中堆和栈的区别和浏览器的垃圾回收机制

一、 栈(stack)和 堆(heap) 栈(stack)&#xff1a;是栈内存的简称&#xff0c;栈是自动分配相对固定大小的内存空间&#xff0c;并由系统自动释放&#xff0c;栈数据结构遵循FILO&#xff08;first in last out&#xff09;先进后出的原则&#xff0c;较为经典的就是乒乓球盒结…

使用秘籍|如何实现图数据库 NebulaGraph 的高效建模、快速导入、性能优化

本文整理自 NebulaGraph PD 方扬在「NebulaGraph x KubeBlocks」meetup 上的演讲&#xff0c;主要包括以下内容&#xff1a; NebulaGraph 3.x 发展历程NebulaGraph 最佳实践 建模篇导入篇查询篇 NebulaGraph 3.x 的发展历程 NebulaGraph 自 2019 年 5 月开源发布第一个 alp…

Notion团队协作魔法:如何玩转数字工作空间?

Notion简介 Notion已经成为现代团队协作的首选工具之一。它不仅仅是一个笔记应用&#xff0c;更是一个强大的团队协作平台&#xff0c;能够满足多种工作场景的需求。 Notion的核心功能 Notion提供了丰富的功能&#xff0c;如文档、数据库、看板、日历等&#xff0c;满足团队的…

【日常积累】Linux下ftp服务安装

概述 FTP是一种在互联网中进行文件传输的协议&#xff0c;基于客户端/服务器模式&#xff0c;默认使用20、21号端口&#xff0c;其中端口20用于进行数据传输&#xff0c;端口21用于接受客户端发出的相关FTP命令与参数。FTP服务器普遍部署于内网中&#xff0c;具有容易搭建、方…

MyBatis与Spring整合以及AOP和PageHelper分页插件整合

目录 前言 一、MyBatis与Spring整合的好处以及两者之间的关系 1.好处 2.关系 二、MyBatis和Spring集成 1.导入pom.xml 2.编写配置文件 3.利用mybatis逆向工程生成模型层代码 三、常用注解 四、AOP整合pageHelper分页插件 创建一个切面 测试 前言 MyBatis是一个开源的…

uniapp - 全平台兼容实现上传图片带进度条功能,用户上传图像到服务器时显示上传进度条效果功能(一键复制源码,开箱即用)

效果图 uniapp小程序/h5网页/app实现上传图片并监听上传进度,显示进度条完整功能示例代码 一键复制,改下样式即可。 全部代码 记得改下样式,或直接

计算机安全学习笔记(II):自主访问控制 - DAC

书接上篇博客&#xff0c;自主访问方案是指一个实体可以被授权按其自己的意志使另一个实体能够访问某些资源。DAC的一种通常访问方式是在操作系统或数据库管理系统中运用的访问矩阵(access matrix)。 矩阵中的一维由试图访问资源的被标识的主体组成。这个列表一般由用户或用户…

无涯教程-进程 - 组会话控制

在本章中&#xff0c;我们将熟悉进程组&#xff0c;会话和作业控制。 进程组(Process Groups ) - 进程组是一个或多个进程的集合&#xff0c;一个进程组由一个或多个共享相同进程组标识符(PGID)的进程组成。 会话(Sessions) - 它是各种进程组的集合。…

简述docker映射(Mapping)和挂载(Mounting)

映射的概念&#xff1a; 将容器内的端口映射到主机的端口上&#xff0c;这样就可以通过主机的网络接口与容器内部进行通信。主机上对应端口的请求会被转发到容器内部&#xff0c;从而实现对容器内部程序的通信访问&#xff08;注意&#xff01;这里提到的容器内部的端口并不一定…