5--mysql DQL--连接查询01

笛卡尔乘积现象

表1有m行,表2有n行,结果=m*n行】
发生原因:没有有效的连接条件
如何避免:添加有效的连接条件
在这里插入图片描述

连接查询(又称多表查询)

按年代分类:
①sql 92标准:仅支持内连接
②sql 99标准配【推荐】:支持内连接+外连接(左外+右外)+交叉连接
按功能分类:
①内连接:等值连接,非等值连接,自连接
②外连接:左外连接,右外连接,全外连接
③交叉连接

sql 92 标准

1 等值连接
#查询员工名和对应的部门名
SELECT `last_name`,`department_name` 
FROM employees,departments 
WHERE employees.`department_id`=departments.`department_id`;

为表起别名
①提高语句简洁度 ②区分不同表中的重复字段

#查询员工名,工种号,工种名

#不用别名情况,因job_id  这个字段在员工表和工种表都有,所以在查询的时候要指明从哪张表中查
SELECT `last_name`,employees.`job_id`,`job_title`
FROM employees,jobs
WHERE employees.`job_id`=jobs.`job_id`;

#使用别名
SELECT `last_name`,e.`job_id`,`job_title`
FROM employees e,jobs j
WHERE e.`job_id`=j.`job_id`;

SELECT d.department_name,l.city
FROM departments d,locations l
WHERE d.`location_id`=l.`location_id`
AND d.`department_name` LIKE '_o%';

添加分组,排序

#分组  查询每个城市的部门个数
SELECT COUNT(*),city
FROM departments d,locations l
WHERE d.`location_id`=l.`location_id`
GROUP BY l.`location_id`;

#排序 查询每个工种的公众名和员工的个数,并且按员工个数排序
SELECT j.job_title title,COUNT(*) ecounts
FROM jobs j,employees e
WHERE e.`job_id`=j.`job_id`
GROUP BY j.`job_id`
ORDER BY ecounts DESC;

三表连接

#查询员工名,部门名 和所在的城市
SELECT e.last_name,d.department_name,l.city
FROM employees e,departments d,locations l
WHERE e.`department_id`=d.`department_id` AND d.`location_id`=l.`location_id`;
2 非等值连接
连接条件不是等与某个值,可能是一个范围  between and 或者 不等于 !=(<>)
3 自连接 :同一张表查询多次
#查询 员工和上级的名称
SELECT e.last_name,m.last_name
FROM employees e,employees m
WHERE e.`manager_id`=m.`employee_id`;

猜你喜欢

转载自blog.csdn.net/weixin_40719943/article/details/106679536