赞
踩
多表查询:当查询结果来自多张数据表的时,就需要用到连接查询。
多表连接查询:会出现笛卡尔积的现象:a表有m行,b表有n行,查询结果=m*n行,消除笛卡尔积现象就必须加上关联条件,关联条件的个数=n个表-1。
等值连接:表之间连接条件用 = 连接
非等值连接:表之间连接条件用非等号
自连接:相当于等值连接,只不过是自己连接自己,不像等值连接是两个不同的表
语法格式:
- select
- 查询列表
- from
- 表1 别名1,
- 表2 别名2,
- ......
- where
- 关联条件 and
- 筛选条件(针对表的所有记录)
- group by
- 分组字段列表
- having(只能配合group by使用)
- 与分组有关的筛选条件(针对分组后的每组内记录)
- order by
- 排序
后面的关键字查询条件可根据需求进行选择,
自连接 eg:
- select
- e.name,m.salary
- from
- employees e, employees m #把同一张表当成两张不同表
- where
- e.manager_id = m.employee_id
- order 不要
- m.salary DESC;
左外连接:查询结果以左表为主表查询所有记录,从表无记录数据时为 null
右外连接:查询结果以右表为主表查询所有记录,从表无记录数据时为 null
全外连接:Mysql不支持
交叉连接:就两个记录做笛卡尔积,不加关联条件
语法格式:
- select
- 查询列表
- from
- 表1 别名1
- 【链接类型】 join 表2 别名2
- on 关联条件
- 【链接类型】 join 表3 别名3
- on 关联条件
- where
- 筛选条件(针对表的所有记录)
- group by
- 分组字段列表
- having(只能配合group by使用)
- 与分组有关的筛选条件(针对分组后的每组内记录)
- order by
- 排序

内连接:inner (还可以省略)
外连接:
左外连接 left 【outer】 (outer可以省略)
右外连接 right 【outer】
全外连接 full 【outer】(Mysql不支持)
交叉连接 cross 【outer】(不常用)
1、外连接的查询结果为主表中有的所有记录
外表有对应数据,结果记录上显示对应数据
外表中没有对应的数据,结果记录上填充null
2、外链接与连接的区别:
内连接:当从表没有记录的时候,主、从表的记录都丢掉!
外连接:当从表没有记录的时候,会保留主表的记录,对应从表null
3、左外连接:left join左边的是主表,
右外连接:right join 右边的是主表
4、左外连接和右外连接上是互通的,掌握一个就好啦!
内连接 eg:
- select
- e.name,j.job_title,d.department_name
- from
- employees e
- inner join departments d
- on e.department_id = d.department_id
- inner join jobs j
- on e.job_id=j.job_id
- where e.salary >5000
- order by d.department_name;
左连接 eg:
- SELECT
- d.department_id,d.department_name,e.employee_id
- FROM
- departments d
- LEFT JOIN employees e
- ON d.department_id = e.department_id
- WHERE
- e.employee_id IS NULL;
全外连接查询:
FULL OUTER JOIN 中会返回所有右边表中的行和所有左边表的行。
- ## mysql不支持
- SELECT
- d.department_id,d.department_name,e.employee_id
- FROM
- departments d
- FULL OUTER JOIN employees e
- ON d.department_id = e.department_id
- WHERE
- e.employee_id IS NULL;
MYSQL中暂时不支持全外连接,但是可以通过 union+左右连接来完成,感觉不常用
ends ~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。