select 字段列表 from 表1 inner | left |right join 表2 on 条件
一、多表连接查询
按照如下命令创建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) ;
#重点:外链接语法 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)