MySQL多表查询

多表查询:(表必须有关联)

先创建两张有关联的表,这里采用 一对一方式连接表,第一张为用户表,第二张为 IDcard表,这里就不写插入数据了
创建用户表:

create table users(
id int primary key auto_increment,
name varchar(20),
age int
);

创建idcard表

create table card(
id int PRIMARY key,
num VARCHAR(20) not null,
address VARCHAR(100) not null,
CONSTRAINT user_card_fk FOREIGN KEY(id) REFERENCES users(id)
)

1、交叉连接:cross join ,笛卡尔积, 注意 结果不正确,
1)隐式:

SELECT * from users , card

结果:
在这里插入图片描述

2)显式:

SELECT * from users CROSS JOIN card

结果:
在这里插入图片描述

2、内连接:是在交叉连接基础上,只列出条件匹配 的 inner join


select * from users  ,card  where users.id = card.id;

结果:
在这里插入图片描述
外链接:
左外连接:left join on
语法: select * from customers c LEFT JOIN orders o ON c.id=o.customer_id;
右外连接: right join on
语法: select * from orders o RIGHT JOIN customers c ON c.id=o.customer_id;

3、子查询:
某些情况下,当进行查询的时候,需要的条件是另外一个select语句的结果,这个时候就会用到子查询,为了给主查询(外部查询) 提供数据而首先执行的查询(内部查询)被叫做子查询; 子查询分为嵌套子查询和相关子查询。

1)嵌套子查询:内部查询的执行独立于外部查询,内部查询仅执行一次,执行完毕后将结果作为外部查询的条件使用(嵌套子查询中的子查询语句可以拿出来单独运行)。

SELECT * from users WHERE id in (SELECT id from card WHERE id=1)

2)相关子查询:
内部查询的执行依赖于外部查询的数据,外部查询每执行一次,内部查询也会执行一次。每一次都是外部查询先执行,取出外部查询表中的一个元组,将当前元组中的数据传递给内部查询,
例如表:

create table teacher(
id int PRIMARY KEY auto_increment,
name VARCHAR(20) NOT null,
sub VARCHAR(20) not null
);

create table student(
id int PRIMARY KEY auto_increment,
name VARCHAR(20) not null,
gender VARCHAR(10) not null
);

create table tea_stu(
id int PRIMARY key auto_increment,
t_id int,
s_id int,
score int,
CONSTRAINT fk_tea FOREIGN KEY (t_id) REFERENCES teacher(id),
CONSTRAINT fk_stu FOREIGN KEY (s_id) REFERENCES student(id)
);

求每一科考试成绩大于平均分的学生的分数。
select * from score as a where a.score>(select avg(b.score) from score as b where a.cou_id=b.cou_id);
(这条语句可以从双重循环的方面去思考)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值