多表查询

嵌套查询

users表info表

1.查询张三的详细信息
	先根据名字拿到用户的id
	SELECT  id  FROM users WHERE name=’张三’;
	根据拿到的id去info表查询 u_id=id
	SELECT * FROM info WHERE u_id=id;
	
	SELECT * FROM info WHERE u_id in (SELECT  id  FROM users WHERE name='张三');

2.查询手机号为110 的用户
	根据手机去info表查询u_id
	将查询的 u_id 作为查询用户表的条件
	SELECT * FROM users WHERE id in (SELECT u_id FROM info WHERE phone=’110’);

parent表child表

3.查询老张的所有孩子的信息
	select  *  from child where p_id in (select  id  from parent where name=’老张’ );

4.统计老张有多少孩子
	SELECT count(*) from child WHERE p_id in (SELECT id from parent WHERE name='老张');

where关联查询

格式:select * from 表1,表2 where 关联条件
只能查询两张表一一对应的数据

1.查询所有用户详细信息
	SELECT * FROM users,info WHERE users.id=info.u_id ;

2.查询张三的详细信息
	SELECT * FROM users,info WHERE users.id=info.u_id AND users.name=’张三’;

链接查询

  • 内连接

    只查询两张表有关的数据,结果和where 关联查询一样
    格式: SELECT * FROM 表1 INNER JOIN 表2 ON 关联条件 WHERE 筛选条件

内连接inner join

  • 外连接

    left join:以左表为准,将左表中所有的数据查询出来,去右表中匹配数据。如果右表中没有与之相关联的数据,以null占位
    格式:SELECT * FROM 表1 LEFT JOIN 表2 ON 关联条件 WHERE 条件

left join
right join:以右表为准,将右表中的所有的数据查询出来,去左表中匹配数据,如果没有与之相匹配的对应的数据,以null进行占位
格式:SELECT * FROM 表1 RIGHT JOIN 表2 ON 关联条件 WHERE 条件

练习

练习1

有班级、学生、老师三张表
	班级和学生一对多关系
	老师和学生多对多关系
	class
		id  name
	stu
		id  name  c_id
	tea
		id  name
	stu_tea
		s_id  t_id

1.张老师带过多少学生
	select * from tea t left join stu_tea s_t on t.id=s_t.t_id left join stu s on s_t.s_id=s.id where t.name='张老师';
	
2.统计每个班有多少学生
	select c.name,count(s.id) from class c left join stu s on c.id=s.c_id group by c;
	
3.a被那些老师带过
	select * from stu s left join stu_tea s_t on s_t.s_id=s.id left join tea t on s_t.t_id = t.id where s.name='a';
	
4.b 是哪个班的学生
	select * from stu s left join class c on s.s_id=c.id where s.name='b';

练习2

有表:演员表和电影表
一部电影有多个演员
一个演员可以演多部电影
actors
	id  name
fimls
	id  name
actors_films
	actors_id  films_id

1.查询两张表的所有信息
	select  * from actors a inner join actors_films a_f on a.id=a_f.actors_id inner join films f on a_f.films_id=f.id;
	
2.统计甄子丹演出了多少部电影
	select  count(*) from actors a inner join actors_films a_f on a.id=a_f.actors_id inner join films f on a_f.films_id=f.id where a.name='甄子丹';
	
3.统计每个演员分别演出了多少部电影
	select a.name,count(f.id) from actors a left join actors_films a_f on a.id=a_f.actors_id left join films f on a_f.films_id = f.id group by a.name;
	
4.统计罗小黑战记都有哪些演员
	selelct * from   actors a  right join actors_films a_f on a.id=a_f.actors_id left join films f on a_f.films_id=f.id where f.name='罗小黑战记';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值