MySQL数据库(九)连接查询(SQL99标准)

SQL99标准支持所有内连接(等值连接,非等值连接,自连接)以及外连接中的左外连接和右外连接以及交叉连接。

/*
语法:
    select 查询列表
    from 表1 别名 【连接类型:inner、left outer、right outer、full、cross】
    join 表2 别名
    on 连接条件
    【where 筛选条件】
    【group by】
    【having 】
    【order by】
分类:
内连接:inner
外连接:
左外:left 【outer】
右外:right 【outer】
全外:full 【outer】
交叉连接:cross
*/

#一、内连接

/*语法:
select 查询列表
from 表1 别名
inner join 表2 别名
on 连接条件

分类:等值,非等值,自连接
*/

#1.等值连接
/*
特点:
inner可以省略
筛选条件可以放在where后面,连接条件放在on后面,提高了分离性,便于阅读
99与92的功能一样,可读性提高了
*/
#案例1:查询员工名,部门名
#92语法
SELECT last_name,department_name FROM employees e,departments d
WHERE e.`department_id` = d.`department_id`;
#99语法
SELECT last_name,department_name FROM employees e INNER JOIN 
departments d ON e.`department_id` = d.`department_id`;

#查询部门个数大于3的城市名和部门个数(添加分组和筛选)
#①查询每个城市的部门个数
#②在1的结果基础上筛选满足条件的
SELECT city,COUNT(*) 部门个数
FROM departments d
INNER JOIN locations l
ON d.`location_id` = l.`location_id`
GROUP BY city
HAVING COUNT(*)>3;

SELECT department_name,COUNT(*) 个数 FROM 
departments d INNER JOIN employees e
ON d.`department_id` = e.`department_id`
GROUP BY department_name
HAVING COUNT(*)>3
ORDER BY COUNT(*) DESC;

#查询员工名、部门名、工种名并按照部门名排序
#有连接条件就可以连接
SELECT last_name,department_name,job_title
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`
ORDER BY department_name DESC;

#2.分等值连接
#查询员工工资级别

#3.自连接
#查询员工的名字,上级的名字
SELECT m.last_name,n.`last_name`
FROM employees  m INNER JOIN employees n
ON m.`manager_id` = n.`employee_id`;

SELECT m.last_name,n.`last_name`
FROM employees  m INNER JOIN employees n
ON m.`manager_id` = n.`employee_id`
WHERE m.`last_name` LIKE '%k%';

#二、外连接


引入:查询没有男朋友的女神名
/*应用场景:用于查询一个表中有,另一个表中没有的记录
特点:
1.外连接的查询结果为主表中的所有记录
2.外连接的查询结果 = 内连接结果 + 主表中有而从表中没有的结果,显示为null
3.左外连接,left outer join左边的是主表;右外连接,right outer join右边的是主表
4.左外就是左边是主表,向从表进行映射,对应不上的用null填充,右外就是右边是主表
5.全外就是两表互相映射,对应不上的全部填充null

*/

SELECT * FROM beauty;
SELECT * FROM boys;

SELECT b.name,bo.*
FROM beauty b LEFT OUTER JOIN boys bo
ON b.`boyfriend_id` = bo.`id`
WHERE bo.`id` IS NULL;

USE `myemployees`;

#左外
SELECT department_name,employee_id FROM 
departments d LEFT OUTER JOIN employees e
ON d.`department_id` = e.`department_id`
WHERE e.`employee_id` IS NULL;
#右外
SELECT department_name,employee_id FROM 
employees e RIGHT OUTER JOIN departments d
ON d.`department_id` = e.`department_id`
WHERE e.`employee_id` IS NULL;
#全外
USE girls;
SELECT b.* ,bo.*
FROM beauty b FULL OUTER JOIN boys bo
ON b.boyfriend_id = bo.id;

#交叉连接:笛卡尔乘积
USE girls;
SELECT b.*,bo.* 
FROM beauty b CROSS JOIN boys bo;

#SQL92和SQL99

功能:sql99比sql92功能更多,可读性更强

结合图示很好理解:

 

发布了58 篇原创文章 · 获赞 7 · 访问量 3729

猜你喜欢

转载自blog.csdn.net/xy_learning/article/details/103853809
今日推荐