MySQL多表查询(*)
Posted Firm陈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL多表查询(*)相关的知识,希望对你有一定的参考价值。
如果我们要查询的数据分布在不同的表中,那么需要连接多张表进行多表查询。
–而这些表当中,必须存在主外键关系(直接关联)
–如果不存在直接关系,则必定存在间接关系,否则业务上是没有意义的
A表的字段和B表的字段肯定得有关联
1、等值查询
select 字段集合 from 表1,表2,...,表n
where 条件 (连接条件,一般使用主外键)
注意
条件一般是主键和外键的关联(可能包含筛选数据的条件)
一般给个表取别名,提高阅读性、性能以及解决字段冲突
多(3个或以上)表关联查询时,关联条件用AND连接
create table 教师表
(
编号 int auto_increment primary key not null,
姓名 char(30) ,
性别 char(2) check(性别='男' or 性别='女') default '男',
专业 char(30)
)
create table 学生表
(
学号 int auto_increment primary key not null,
姓名 char(30) ,
性别 char(2) check(性别='男' or 性别='女') default '男',
身高 float ,
学分 float ,
教师编号 int foreign key references 教师表(编号)
)
insert into 教师表 values ('张三','男','计算机')
insert into 教师表 values ('李四','男','日语')
insert into 教师表 values ('王五','女','英语')
insert into 学生表 values ('学生一','男',1.5,50,1)
insert into 学生表 values ('学生二','女',2.5,60,1)
insert into 学生表 values ('学生三','男',3.5,70,2)
insert into 学生表 values ('学生四','女',4.5,80,2)
select * from 教师表
select * from 学生表
2、内连接
-- 功能同等值连接
-- 好处:连接条件与筛选条件分离,简洁明了
select 字段集合 from 表1 [inner] join 表2 [inner join 表3]
on 条件(主外键|相同数据类型)
where 条件
3、外连接
3.1、左外连接
以第一张表为基础向第二张表匹配,匹配成功则正常显示,匹配不成功,则第二张表以NULL值显示
select 字段集合 from 表1 left [outer] join 表2 on 条件
3.2、右外连接
以第二张表为基础向第一张表匹配,匹配成功则正常显示,匹配不成功,则第一张表以NULL值显示
select 字段集合 from 表1 right [outer] join 表2 on 条件
3.3、完全外连接
左、右的数据都要显示,如果能连接,则正常显示;如果不能连接,则以null值显示
# select 字段集合 from 表1 full [outer] join 表2 on 条件
# mysql不支持,可以使用UNION实现
联合查询:实现完全外连接
SELECT * from 表1 LEFT JOIN 表2 on 条件
UNION
SELECT * from 表1 RIGHT JOIN 表2 on 条件;
注意:一般表与表之间使用主外键关联数据,确保数据的一致性
4、交叉连接
-- 语法一
select 字段集合 from 表1 [inner] join 表2 # sql server 使用关键字 cross
-- 语法二
select 字段集合 from 表1,表2
5、自连接
-- 语法一
select * from 表1 as 别名 join 表1 as 别名 on 条件
-- 语法二
select * from 表1 as 别名, 表1 as 别名 where 条件
6、联合查询
把多个查询的结果合并在一起
SELECT f1,f2 FROM T_1
UNION [ALL]
SELECT f1,f2 FROM T_2
7.子查询(三种方式)
顾名思义就是嵌套查询,查询中套查询
子查询分为三种情况:
1.单行单列 也就是结果是一个的 例如 1
2.多行单列 也就是结果是一组的 例如(1,2,3)
3.多行多列 也就是结果是一张表的此不举例
表结构如下:
员工表emp
部门表dept
情况1:单行单列
查询薪资大于猪八戒的员工
思考思路 1查出猪八戒的薪资 2查询薪资大于结果1的
select salary from emp where name='猪八戒'
select * from emp where salary > ( select salary from emp where name='猪八戒')
结果如下:
情况2: 多行单列
查询财务部和市场部所有员工的信息
思路 1查出财务部和市场部的dep_id 结果集是一组
2查出dep_id在结果集1中的员工信息
select did from dept where dname='财务部' or dname='市场部'
select * from emp where dep_id in(select did from dept where dname='财务部' or dname='市场部')
结果如下:
情况3:多行多列
查询日期是’2011-11-11’之后的员工信息和部门信息
思路 1查询日期在’2011-11-11’之后的员工信息
2 内连接查询出对应员工的部门信息
select * from emp where join_date>'2011-11-11'
select * from (select * from emp where join_date>'2011-11-11') a,dept where a.dep_id =dept.did
以上是关于MySQL多表查询(*)的主要内容,如果未能解决你的问题,请参考以下文章