首页 > 技术文章 > mysql的连接查询

ErNan 2019-08-07 20:10 原文

1、准备工作

1、创建两张实验表

#创建学生表
create table if not exists student(
stu_id int primary key comment'学生编号主键',
stu_name varchar(20)comment'姓名',
stu_age int comment'年龄'
)

#创建课程表
create table if not exists course(
course_id int primary key comment'课程编号主键',
course_name varchar(20)comment'课程名称',
course_stu int comment'上这门课程的学生id'
)

2、向表中插入如下数据

#给学生表添加几条数据
insert into student(stu_id,stu_name,stu_age)values(1,'张三',22);
insert into student(stu_id,stu_name,stu_age)values(2,'李四',12);
insert into student(stu_id,stu_name,stu_age)values(3,'王五',33);
insert into student(stu_id,stu_name,stu_age)values(4,'赵六',23);
#给课程表创建数据
insert into course(course_id,course_name,stu_id)values(1,'英语',1);
insert into course(course_id,course_name,stu_id)values(2,'数学',2);
insert into course(course_id,course_name,stu_id)values(3,'语文',3);
insert into course(course_id,course_name,stu_id)values(4,'物理',2);
insert into course(course_id,course_name,stu_id)values(5,'语文',2);

2、内连接(inner join)

查询两表关联列相等的数据

select * from student s INNER JOIN course c ON s.stu_id=c.course_stu;

如果后边不带ON 后边的条件查询的是笛卡尔积(图没截全)

 

3、外连接

外连接分为左连接和右连接和全外连接。

左连接和右连接具有主表和从表之分,左连接左边的表为主表,右连接右边的表为主表,且主表的记录可以全部查到而从表没有的记录使用null值补全

1、左连接(left join)

#左连接student为主表且主表的据路全部展示从表没有的null值补全
select
* from student s LEFT JOIN course c on s.stu_id=c.course_stu;

2、右连接(right join)

1、为了展示又连接以右表为主表我向course表中添加了一条与student表中的stu_id没有对应的记录

insert into course(course_id,course_name,stu_id)values(6,'政治',5);

2、右连接sql

select * from student s right join course c on s.stu_id=c.course_stu;

3、全外连接

mysql数据库始是没有全外连接查询的可以使用UNION关键字将左连接和右连接结合起来达到全外连接的效果

select * from student s right join course c on s.stu_id=c.course_stu 
UNION 
select * from student s LEFT JOIN course c on s.stu_id=c.course_stu;

4、交叉连接(cross join)

通常不会在实际中运用

交叉连接 cross in,从一张表中循环取出每一条记录都去与另一张表中进行匹配(结果全部保留),连接本身字段就会增加,最终形成笛卡儿积。

#如果交换两张表的前后位置则查询的结果显示也会调换位置
select * from student cross join course;

 5、union和union all

union

union用于合并两个或者多个select语句的结果集,并消去表中任何的重复行。

特别注意:1、union中的里边查询语句中的查找字段个数必须相同

                  2、union中多个查询的字段类型可以不对应(对应的话看起来比较舒服)

     3、union展示字段的列名称为第一个查询语句的字段名称

1、查询字段个数不一样

select * from student UNION select course_id,course_name from course

2、查询字段个数一样类型相匹配

select stu_name,stu_age from student UNION select course_name,course_stu from course

3、查询字段个数一样类型不匹配

select stu_name,stu_age from student UNION select course_stu,course_name from course

union all

union all的用法和union的用法是一样的但它不会去除重复的记录且当可以查询重复记录的时候使用union all比union好省去了去重的操作所以效率高

 

推荐阅读