mysql 多表连接查询

select 字段列表 from 表1 inner | left |right join 表2
on 条件
View Code

一、多表连接查询

  按照如下命令创建department,employee两个表格:

#创建表
create table department(
id int,
name varchar(20) 
);

create table employee(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);

#插入数据
insert into department values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营');

insert into employee(name,sex,age,dep_id) values
('egon','male',18,200),
('alex','female',48,201),
('wupeiqi','male',38,201),
('yuanhao','female',28,202),
('liwenzhou','male',18,200),
('jingliyang','female',18,204)
;
View Code
#重点:外链接语法

SELECT 字段列表
    FROM 表1 INNER|LEFT|RIGHT JOIN 表2
    ON 表1.字段 = 表2.字段;
重点

1、交叉连接:不使用任何匹配条件,生成笛卡尔积

  通过命令select * from employee,department;可以得到的结果如下,结果成为笛卡尔的积。

2、内连接:使用匹配条件,显示匹配的数据行

  实际上笛卡尔的积是没有意义的,先生成笛卡尔积,然后按照约束条件进行筛选才是我们需要的:

 

 上述这种利用筛选条件,从笛卡尔的积中选出两表共有的部分,也可以通过如下方式进行实现,称为内连接。(有专门干连接的活)

3、左连接:在内连接的基础上增加左边表有右边没有的内容(优先显示左表全部内容记录)

  结果如下所示,即使department表没有204这个部门,左表的204部门的员工信息也会显示:

4、右连接:在内连接的基础上增加右边表有左边没有的内容(优先显示右表全部内容记录)

  结果如下所示,即使employee表没有员工属于203部门,右表的203部门的信息也会显示:

5、全连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果

  在mysql中实际是不支持full join全连接的,但是可以通过union将左、右连接进行连接后去重得到结果,如下:

二、符合条件的连接查询

 1、找出年龄大于25岁的员工以及员工所在的部门

#示例2:以内连接的方式查询employee和department表,并且以age字段的升序方式显示
select emp1.id,emp1.name,emp1.age,dep1.name from emp1,dep1
    where emp1.dep_id = dep1t.id
    and age > 25
    order by age asc;

三、子查询

#1:子查询是将一个查询语句嵌套在另一个查询语句中。
#2:内层查询语句的查询结果,可以为外层查询语句提供查询条件。
#3:子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
#4:还可以包含比较运算符:= 、 !=、> 、<等

1、带关键字in的查询

#查询emp1表,但dep_id必须在dep1表中出现过
select * from emp1
    where dep_id in
        (select id from dep1);

2、带比较运算符的子运算.

#比较运算符:=、!=、>、>=、<、<=、<>
#查询平均年龄在25岁以上的部门名
select id,name from dep1
    where id in 
        (select dep_id from emp1 group by dep_id having avg(age) > 25);

#查看技术部员工姓名
select name from emp1
    where dep_id in 
        (select id from dep1 where name='技术');

#查看不足1人的部门名
select name from dep1 where id not in 
  (select dep_id from emp1 group by dep_id having count(id) >= 1);

3 带EXISTS关键字的子查询

EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录。
而是返回一个真假值。True或False
当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询

#department表中存在dept_id=203,Ture
mysql> select * from employee
    ->     where exists
    ->         (select id from department where id=200);
+----+------------+--------+------+--------+
| id | name       | sex    | age  | dep_id |
+----+------------+--------+------+--------+
|  1 | egon       | male   |   18 |    200 |
|  2 | alex       | female |   48 |    201 |
|  3 | wupeiqi    | male   |   38 |    201 |
|  4 | yuanhao    | female |   28 |    202 |
|  5 | liwenzhou  | male   |   18 |    200 |
|  6 | jingliyang | female |   18 |    204 |
+----+------------+--------+------+--------+

#department表中存在dept_id=205,False
mysql> select * from employee
    ->     where exists
    ->         (select id from department where id=204);
Empty set (0.00 sec)
View Code
原文地址:https://www.cnblogs.com/jassin-du/p/8044732.html