数据库的多表查询

一.多表连接查询

  1.交叉连接:不适用任何匹配条件,生成笛卡儿积

    select * from 表1,表2;

  2.内连接:只连接匹配的行

    select * from 表1,表2 where 表1.字段 = 表2.字段;

    select * from 表1 inner join 表2 on 表1.字段 = 表2.字段;  

  3.左连接:优先显示左表全部记录

    select * from 表1 left join 表2 on 表1.字段 = 表2.字段;

  4.右连接:优先显示右表全部记录

    select * from 表1 right join 表2 on 表1.字段 = 表2.字段;

  5.全外连接:显示两个表全部记录,union all 显示两个表拼接的有重复的,union可以去重.

    select * from 表1 left join 表2 on 表1.字段 = 表2.字段

    union

    select * from 表1 right join 表2 on 表1.字段 = 表2.字段;

二.子查询

  子查询是将一个查询语句嵌套在另一个查询语句中,子查询中的关键字有in,not in , all ,any ,exists,not exists,还有运算符 = ,!= ,< ,>

  1.in关键字子查询 


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

关键字

  2.exists关键字子查询

    exists关键字表示存在,如果exists后面的内层查询存在就查询外层,否则不进行查询.


#department表中存在dept_id=203,Turemysql> 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,Falsemysql> select * from employee -> where exists -> (select id from department where id=204);Empty set (0.00 sec)

exists关键字

  3.比较运算符子查询


#比较运算符:=、!=、>、>=、<、<=、<>#查询大于所有人平均年龄的员工名与年龄mysql> select name,age from emp where age > (select avg(age) from emp);+---------+------+| name | age |+---------+------+| alex | 48 || wupeiqi | 38 |+---------+------+rows in set (0.00 sec)#查询大于部门内平均年龄的员工名、年龄select t1.name,t1.age from emp t1inner join (select dep_id,avg(age) avg_age from emp group by dep_id) t2on t1.dep_id = t2.dep_idwhere t1.age > t2.avg_age;

比较运算符

相关文章