mysql第七天:多表查询

本文详细介绍了数据库设计中的一对多、多对多关系,以及多表查询的笛卡尔积、内连接、外连接、自连接、联合查询(union,unionall)和子查询(包括标量子查询、列子查询、行子查询和表子查询)的概念和用法。
摘要由CSDN通过智能技术生成

一、多表关系

在一个项目开发中,进行数据库设计时,会根据业务需求和业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种关系,基本上分为三种:

1、一对多(多对一)


2、多对多

create table student(
    id int auto_increment primary key comment '主键id',
    name varchar(10) comment '姓名',
    no varchar(10) comment '学号'
)comment '学生表';
insert into student values (null,'张三','2024001'),(null,'李四','2024002'),(null,'王五','2024003'),(null,'赵六','2024004');

create table course(
    id int auto_increment primary key comment '主键id',
    name varchar(10) comment '课程名称'
)comment '课程表';
insert into course values (null,'java'),(null,'mysql'),(null,'python'),(null,'hadoop');

create table student_course(
    id int auto_increment primary key comment '主键id',
    studentid int not null comment '学生id',
    courseid int not null comment '课程id',
    constraint fk_studentid foreign key (studentid) references student(id),
    constraint fk_courseid foreign key (courseid) references course(id)
)comment '学生课程中间表';
insert into student_course values (null,1,1),(null,1,2),(null,1,3),(null,2,2),(null,2,3),(null,3,4);


3、一对一

 

create table user(
    id int auto_increment primary key comment '主键id',
    name varchar(10) comment '姓名',
    age int comment '年龄',
    gender char(1) comment '1:男  2:女',
    phone char(11) comment '手机号'
)comment '用户基本信息表';
insert into user values (null,'王五',30,'1','12345678910'),
                        (null,'赵六',25,'1','12347678910'),
                        (null,'赵梅',35,'2','12745678910'),
                        (null,'王二',28,'2','12395678910');


create table user_edu(
    id int auto_increment primary key comment '主键id',
    degree varchar(20) comment '学历',
    major varchar(20) comment '专业',
    primaryschool varchar(50) comment '小学',
    middleschool varchar(50) comment '中学',
    university varchar(50) comment '大学',
    userid int unique comment '用户id',
    constraint fk_userid foreign key user_edu(userid) references user(id)
)comment '用户教育信息表';
insert into user_edu values (null,'本科','软件工程','吴安屯小学','延津一中','河科大',1),
                            (null,'硕士','汉语言','北京小学','北京一中','北大',2),
                            (null,'本科','英语','上海小学','上海一中','上大',3),
                            (null,'本科','计算机','广州小学','广州一中','广大',4);

二、多表查询

1、笛卡尔积

概述:只从多张表中查找数据
笛卡尔积:两个集合A和B的所有组合情况(在多表查询中,需要消除无效的笛卡尔积)

2、多表查询---分类

(1)内连接:相当于查询A和B交集部分数据

(2)外连接:
        左外连接:查询左表所有数据,以及两张表交集部分数据
        右外连接:查询右表所有数据,以及两张表交集部分数据

(3)自连接:当前表与自身的连接数据,自连接必须使用表别名

内连接

隐式内连接:

select 字段列表 from 表1,表2 where 条件...;

显式内连接:

select 字段列表 form [inner] join 表2 on 连接条件...;

外连接

左外连接:
select 字段列表 from 表1 left [out] join 表2 on 条件;

右外连接:
select 字段列表 from 表1 right [out] join 表2 on 条件;

自连接

select 字段列表 from 表A 别名A join 表A 别名B on 条件...;

自连接查询,可以是内连接查询,也可以是外连接查询

四、联合查询---union,union all

对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集
select 字段列表 from 表A ...
union [all]
select 字段列表 from 表B...;

对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致
union all 会将全部的数据直接合并在一起,union会对合并之后的数据去重

五、子查询

概念:SQL语句中嵌套select语句,成为嵌套查询,又称为子查询

select * from t1 where column1=(select column1 from t2);

子查询外部的语句可以是insert、update、delete、select的任何一个

根据子查询结果不同,分为:

标量子查询(子查询结果为单个值)

列子查询(子查询结果为一列)

行子查询(子查询结果为一行)

表子查询(子查询结果为多行多列)

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

1、标量子查询(子查询结果为单个值):

常用的操作符:>   <   =   >=  <=   

2、列子查询

子查询返回的结果是一列(可以是多行),这种子查询称为列子查询
常用操作符:in   not in   any   some   all
in:在指定的集合范围之内,多选一
not in:不在指定的集合范围之内
any、some:子查询返回列表中,有任意一个满足即可,有some的地方都可以使用any
all:子查询返回列表的所有值都必须满足


3、行子查询(子查询结果为一行,可以是多列)

常用操作符:=   <>   in   not in 

4、表子查询(子查询结果为多行多列)

常用操作符:in

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值