数据库的联表查询

多表查询和子查询

多表查询和子查询是解决复杂查询问题的两种常用方法。

【1】子查询

  • 就相当于是我们在一步步解决问题

  • 将一条SQL语句的查询结果+括号当做另一条SQL语句的查询条件

-- 子查询
select * form * where *;select * from * where (select * from * where *;);

【2】多查询

  • 先将多张表拼接到一起 形成一张大表 然后基于单表查询回去数据

# eg:以昨天的员工表和部门表为例 查询dream所在的部门名称# 连表操作# 先将员工表和部门表按照某个字段拼接到一起# 基于单表查

【3】数据准备

我先删除表

-- 显示本数据库中的所有表show tables;-- 删除表drop table b1;drop table b2;drop table b3;drop table b4;drop table b5;drop table b6;

image-20240126170347210

image-20240126170422129

drop table course;drop table course_student;drop table employee;drop table employees;drop table salary;drop table department;drop table student1;

( 1 ) 创建表

create table dep(id int primary key auto_increment,name varchar(20)
);create table emp (id int primary key auto_increment,name varchar(20),sex enum("male","female") not null default "male",age int,dep_id int
);# 创建外键的方式有两种
# 一种是物理外键
# 一种是逻辑外键

( 2 )插入数据

insert into dep values
("300","王者荣耀模块"),
("301","和平精英模块"),
("302","cf模块"),
("303","QQ飞车模块"),
("304","LOL模块");​
insert into emp(name,sex,age,dep_id) values
("xiao","male",26,300),
("mao","female",18,301),
("jing","male",38,302),
("bai","male",18,303),
("zhi","male",28,304),
("yi","male",18,305);

image-20240126172601626

image-20240126172616537

【4】子查询案例

  • 获取员工mao所在的部门ID

    # 先查 mao 所在的部门ID
    select dep_id from emp where name = 'mao';​
    # 根据部门ID查询到部门名称
    select name from dep where id=301;​
    # 合为一体
    select name from dep where id = (select dep_id from emp where name = 'mao');

    image-20240126172825716

image-20240126172847800

image-20240126173042497

【5】多表查询

( 1 ) 拼表的四种情况

  • inner join:内连接

    • 只拼接两张表中共有的数据部分

  • left join:左连接

    • 左表所有的数据都展示出来,没有对应的项就用null表示

  • right join:右连接

    • 右表所有的数据都展示出来,没有对应的项就用null表示

  • union:全连接

    • 左右两表的数据都展示出来

( 2 )拼表查询

select * from dep,emp;
# # 左边所有的部门名称都有四份
​
# 优化
select * from dep,emp where
dep.id = emp.dep_id;

image-20240126190302047

【6】四种连接方式

【1】内连接

  • 只拼接两张表中共有的数据部分

语法:

select *(列名/列表)
from 表1
inner join 表2 on 表1.列名 = 表2.列名;
-- 内链接 一定要在 on 后面加条件进行筛选select  * from scoresinner join school on scores.student_id = school.id;create view scores_school as
select *
from scores,school
;

image-20240128222447305

image-20240128222503393

【2】左连接

  • 左表所有的数据都展示出来,没有对应的项就用null表示

语法:

select *
from 表1
left join 表2
on 表1.列 = 表2.列;select * 
from school
left join scores on school.id=scores.student_id ;  

image-20240128222903648

【3】右连接

  • 右表所有的数据都展示出来,没有对应的项就用null表示

语法:

select *
from 表1
right join 表2
on 表1.列 = 表2.列;select  * from scoresright join school on scores.student_id = school.id;

image-20240128222959514

【4】全连接

  • 全连接返回左表和右表中的所有行,如果没有匹配的行,则对应的列值为NULL。

语法:

select *
from 表1
left join 表2
on 表1.列 = 表2.列unionselect *
from 表1
right join 表2
on 表1.列 = 表2.列;select * from school left join scores on school.id  = scores.student_idunionselect * from school right join scores on school.id  = scores.student_id;

image-20240128223333805

【6】查询案例

先将两个表用内连接起来

select * from scores
inner join school
on scores.student_id = school.id;select group_concat(scores.course,':' ,school.course,':',scores.age)
from scores
inner join school
on scores.student_id = school.id
group by school.lecturer
having avg(scores.age) > 30;

image-20240128224039544

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

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

相关文章

20240310-1-Java后端开发知识体系

Java 基础 知识体系 Questions 1. HashMap 1.8与1.7的区别 1.71.8底层结构数组链表数组链表/红黑树插入方式头插法尾插法计算hash值4次位运算5次异或运算1次位运算1次异或运算扩容、插入先扩容再插入先插入再扩容扩容后位置计算重新hash原位置或原位置旧容量 (1) 扩容因子…

qt 格式化打印 日志 QMessagePattern 格式词法语法及设置

一、qt源码格式化日志 关键内部类 QMessagePattern qt为 格式化打印日志 提供了一个简易的 pattern(模式/格式) 词法解析的简易的内部类QMessagePattern,作用是获取和解析自定义的日志格式信息。 该类在qt的专门精心日志操作的源码文件Src\qtbase\src\corelib\global\qloggi…

力扣hot100题解(python版63-68题)

63、搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输…

vue实现购物车功能

实现功能 CSS部分 <style>.tr {display: flex;}.th {margin: 10px;width: 20%;height: 50%;}.td {display: flex;margin: 10px;width: 20%;height: 100px;align-items: center;}.app-container .banner-box {border-radius: 20px;overflow: hidden;margin-bottom: 10px;}…

初识C语言—初识C语言

前言 C语言全面了解&#xff0c;全貌认识 细致的学习&#xff0c;细枝末节 什么是C语言 维基百科 C 语言是一种通用的高级语言&#xff0c;最初是由丹尼斯里奇在贝尔实验室为开发 UNIX 操作系统而设计的。C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现。 在 1978 …

智慧安防视频远程监控平台EasyCVR集成后播放只有一帧画面是什么原因?

智慧安防视频监控平台EasyCVR能在复杂的网络环境中&#xff08;专网、局域网、广域网、VPN、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理&#xff0c;平台可支持的接入协议包括&#xff1a;国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议…

基于springboot+layui仓库管理系统设计和实现

基于 java springbootlayui仓库管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取…

【Attribute】Inspector视图可视不可编辑字段特性

简介 在Unity开发中&#xff0c;有时候我们存在这种需求&#xff0c;需要在Inspector视图中可以查看字段信息但是无法对字段进行赋值&#xff0c;那么我们也可以像Unity内置的[SerializeField]、[Tooltip]等特性那样自定义一个特性&#xff0c;用于满足这个需求。 代码示例(C#…

intel realsense D405 在 ROS2 使用示例

1.点云示例 此示例演示如何启动相机节点并使其使用点云选项发布点云。 ros2 launch realsense2_camera rs_launch.py pointcloud.enable:true 以下示例启动相机并同时打开 RViz GUI 以可视化发布的点云。它执行上面的 2 个示例。 ros2 launch realsense2_camera rs_pointcl…

华为OD机试C卷“跳步-数组”Java解答

描述 示例 算法思路1 不断移动数组将元素删去&#xff08;并未彻底删除&#xff0c;而是将数字元素前移实现“伪删除”&#xff09;这样删除元素的位置就呈现一定规律&#xff0c;详细见下图&#xff08;潦草的画&#xff09; 答案1 import java.util.*;public class Main {…

RabbitMQ - 03 - Work消息模型

目录 部署demo项目 什么是Work消息模型 实现Work消息模型 1.创建队列 2.生产者代码 3.消费者代码 4.配置yml 部署demo项目 通过消息队列demo项目进行练习 相关配置看此贴 http://t.csdnimg.cn/hPk2T 注意 生产者消费者的yml文件也要配置好 什么是Work消息模型 工作…