进阶6: 连接查询
USE `myemployees`
/*
含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
笛卡尔乘积现象: 表1 有m行, 表2有n行,结果=m*n行
发生原因:没有有效的连接条件
如何避免:添加有效的连接条件
分类:
按年代分类:
sql92标准:仅仅支持内连接
sql99标准【推荐】:支持内连接+外连接(不支持全外)+交叉
按功能分类:
内连接
等值连接
非等值连接
自连接
外连接
左外连接
右外连接
全外连接
交叉连接
*/
SELECT NAME, `boyName` FROM `boys`,`beauty`
WHERE `beauty`.`boyfriend_id`=`boys`.`id`;
#一、sql92标准
#1.等值连接
/*
特点:
①多表等值连接的结果为多表的交集部分
②n表连接,至少需要n-1个连接条件
③多表的顺序没有要求
④可以搭配前面介绍的所有查询子句,比如:排序分组筛选
*/
#案例1:查询女神名和对应的男神名
SELECT NAME, `boyName`
FROM `boys`,`beauty`
WHERE `beauty`.`boyfriend_id`=`boys`.`id`;
#案例2:查询员工名和对应的部门名
SELECT `last_name`,`department_name`
FROM `employees`,`departments`
WHERE `departments`.`department_id`=`employees`.`department_id`;
#2. 为表起别名
/*
优点:提高语句的简洁度
区分多个重名的字段
注意:如果为表齐了别名,则我们查询的字段就不能使用原来的表名去限定
*/
#查询员工名,工种号,工种名
SELECT `last_name`,e.`job_id`,`job_title`
FROM `employees` AS e,`jobs`
WHERE e.`job_id`=jobs.`job_id`;
#3.两个表的顺序是否可以调换 (是可以的)
#4.可以加筛选?
#案例:有奖金的员工名和部门名
SELECT `last_name`,`department_name`,`commission_pct`
FROM `departments` AS d,`employees` AS e
WHERE d.`department_id`=e.`department_id`
AND e.`commission_pct` IS NOT NULL;
#案例2:查询城市中第二个字符为o的对应的部门名和城市名
SELECT `department_name`,`city`
FROM `departments` AS d, locations AS l