一、连接查询操作:
mysql支持三种类型的连接查询,分别为:内连接、右连接、左连接。
注意:一个数据库中如果有多个表的话,表名是不能省略的。
1、使用内连接查询班级表与学生表(inner join)
on后面跟着连接查询的条件:
select students.name,classes.name from students inner join classes on students.cls_id = classes.id;
使用as 优化一下:
select s.name as 姓名,c.name as 班级 from students as s inner join classes as c on s.cls_id =c.id;
查出两个表相关的所有信息:(简写可省略inner,但一般都加上)
2、左连接:那students是主表,那classes是从表。(left join)
3、右连接:就是以classes为主表,那students就是从表。(right join)
二、自关联查询的基本操作
准备个数据库表province里面含所有的省市的id和pid。
1、查询所有的省和自治区:
原理:所有省/直辖市的pid=0,前面对应的id=对应市的pid号
2、查询河北省有哪些市:(想像成两张表)
select p.name as 省名,s.name as 市名 from province as p inner join province as s on p.id = s.pid where p.name="河北省";
3、查看石家庄市有哪些县或者区:
select p.name as 市名 ,s.name as 区县 from province as p inner join province as s on p.id = s.pid where p.name="石家庄市";
三、(重点)子查询
在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句
(重点)子查询分类(以子查询返回的结果作为外部主查询的条件)
1、标量子查询: 子查询返回的结果是一个数据(一行一列)
例:查询身高最高的学生的名字:
2、列级子查询: 子查询返回的结果是一列(一列多行)
3、行级子查询: 子查询返回的结果是一行(一行多列)
例:查找班级年龄最大,身高最高的学生(必须都同时满足才行,一一对应才行)
4、表级子查询: 返回的结果是多行多列(以inner join子查询出来的结果作为表,且必须都要有别名,使用as)
①查询学生与班级对应的信息:表级子查询
下面的结果必须加别名
② 直接 inner join 连接查询
说明:发现很多表级子查询的语句,都是可以使用连接查询实现的,此时推荐使用连接查询,
因为连接查询的语句更简洁,逻辑更清晰
四、关键字:any/some/all/in
1、=any = some 与in一样
2、all
3、in
4、>any >=any <any <=any