一、连接查询
基本概念
- 当查询结果来源于多张表时,需要将多张表连成一个大的数据集,在筛选合适的结果
- 连接查询可以通过连接运算符(连接条件)可以实现多个表查询
内连接
- 查询的结果把两张表中相同的地方连接起来
左链接
- 查询结果包括内连接,同时查询左表特有的数据,对于右表中不存在的数据使用null填充
右连接
- 查询结果包括内连接,同时查询右表特有的数据,对于左表中不存在的数据使用null填充
二、连接语法
内连接语法
1.内连接标准语法推荐
主要找2张表中关联(相同)字段
-- 语法一:
select * from 表1 inner join 表2 on 表1.字段=表2.字段
/*根据表中相同字段id来进查找*/
select * from a inner join b on a.id = b.id;
错误示例
强行关联,导致错误
1.2内连接隐式连接
用where连接,但是一般使用第一种方法
select * from 表1,表2 where 表1.字段 = 表2.字段
-- 例子
select * from students , score where students.name = score.name;
1.3内连接查询,显示指定的字段
-- 学生表与分数表内连接,只显示爱好和分数
select score,aihao
from students inner join score
on students.name = score.name;
错误示例:
学生表与分数表内连接,只显示班级、分数、爱好
正确示例
-- 学生表与分数表内连接,只显示爱好和分数
select students.class,score,aihao
from students inner join score
on students.name = score.name;
1.4表的别名在查询中使用
作用:有的表名太长不太好记录,所以用别名来代替
as 可省略不写
/*语法*/
select * from 表名1 别名1 inner join 表名2 别名2
on 别名1.字段名 = 别名2.字段名
例子:
/* 把students 表起名为st score表起名为sc,所以下面关联字段就变为 */
select score,aihao from
students st
inner join score sc
on
st.name = sc.name;
-- 用where语句查询
/*查询学生叫杨洋,同时显示成绩对应的课程*/
select score,coursename cname from score sc
inner join
course co on
sc.courseid = co.courseid
where SC.name = '杨洋';
-- 用where & and语句查询
/*查询许问问,分数大于50的成绩和课程*/
select score,coursename from score sc
inner join course co on
sc.courseid = co.courseid
where SC.name = '许问问' and sc.score > 60;
1.5多表联查
- 查询语句需要多张关联
- 两表中有相同字段,查询中要加上表名称,不加会报错
多表联查
/*内连接多表联查语法*/
select * from 表名1
inner join 表名2 on 表1.字段=表2.字段
inner join 表名3 on 表2.字段 = 表3.字段
where 条件;
-- 例子
-- 查询学生信息、成绩、以及成绩对应的课程表
SELECT * from
students st
inner join score sc on st.name = sc.name
inner join course co on sc.courseid = co.courseid;
-- 多表联查带where条件
-- 查询所有学生数学成绩,只显示姓名、成绩、课程
SELECT st.name,sc.score,co.coursename from
students st
inner join score sc on st.name = sc.name
inner join course co on sc.courseid = co.courseid
where co.coursename = '数学';
-- 多表联查带order by、limit字段
/* 查询女同学的分数*,显示成绩、课程、名字只显示前3行*/
select sc.score,co.courseid,st.name from
students st inner join score sc on st.name = sc.name
inner join course co on sc.courseid = co.courseid
where st.sex = '女' ORDER BY sc.score limit 3;
左连接语法
/*语法*/
select * from 表名1 left join 表名2 on 表名1.字段名1 = 表名2.字段名2
-- 例子
/*用左连接查看表中学生成绩,名字*/
select sc.score,st.name from students st
left join score sc on st.name = sc.name;
显示表中全部名字,没有成绩显示null
右连接语法
/*语法*/
select * from 表名1 right join 表名2 on 表名1.字段名1 = 表名2.字段名2
/*用右连接查询学生为女同学的爱好*/
select sc.like from students st right join score sc on
st.name = sc.name where sex = '女';
order by&limit练习
/*用右连接查询学生为女同学的爱好,成绩从高到低,显示2,6行直接的数据*/
select sc.like,sc.score from students st right join score sc on
st.name = sc.name where sex = '女' order by sc.score desc limit 1,3;
显示表中全部like字段,没有like显示null
总结内连接和左右连接区别:
内连接只显示满足条件
左右连接,只显示满足条件+原来表中的字段