嵌套查询
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’);
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 筛选条件
-
外连接
left join:以左表为准,将左表中所有的数据查询出来,去右表中匹配数据。如果右表中没有与之相关联的数据,以null占位
格式:SELECT * FROM 表1 LEFT JOIN 表2 ON 关联条件 WHERE 条件
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='罗小黑战记';