#进阶6: 连接查询 (多表连接) : 等值连接/非等值连接 /左右全连接/内连接 /* 含义: 当查询的字段来自于多个表时, 就会用到连接查询 一: sql 92标准 :等值连接 ,(#内连接) 1.可以为表区别名,区分多个重名的字段 2.为表使用别名后,只能使用别名去"select"! 二:非等值连接 1.where 列名 BETWEEN ... AND ... 三:自连接 :自己连接自己 四:左 / 右 外连接 1.应用场景: 用于查询一个表有内容,另一个表没有内容 如果从表中有和它匹配的,则显示匹配的值 如果从表中没有和它匹配的,则显示null 2.左外连接, left OUTER join (左边的是主表) on 连接关系 where 筛选条件 3.右外连接,right OUTER join (右边的是主表) on 连接关系 where 筛选条件 五:#全外连接 = 内连接的结果 + 表1中有但表2中没有的 + 表2中有的但表1中没有的 #MYSQL不支持!! Oracle数据库 六:#交叉连接 实现笛卡尔成绩,实现两个表的任意两项进行连接! 七:sql 92 和 sql 99 */ #查询对偶姓名匹配 SELECT beauty.`name`,boys.`boyName` FROM beauty,boys WHERE beauty.`boyfriend_id`=boys.`id`; #案例2: 查询员工名和对应的部门名 SELECT last_name,department_name FROM employees,departments WHERE employees.`department_id`=departments.department_id; #3.查询员工名/工种号/工种名 #使用别名 SELECT e.`last_name` ,e.`job_id`,j.`job_title` FROM employees e,jobs j WHERE e.`job_id`=j.`job_id`; #4.查询有奖金的员工名和部门名 SELECT e.`last_name`,e.`department_id` FROM employees e,departments d WHERE e.`department_id`=d.`department_id`; #5.查询每个工种的工种名和员工的个数, 并且按员工个数排序 SELECT j.`job_title`,COUNT(*) FROM jobs j,employees e WHERE j.`job_id`=e.`job_id` GROUP BY j.`job_title` ORDER BY COUNT(*) DESC; #2 / 非等值连接 #案例1:查询员工的工资和工资级别 SELECT salary,grade_level FROM employees e,job_grades g WHERE e.salary BETWEEN g.`lowest_sal` AND g.`highest_sal`; #3 / 左 . 右 外连接 #案例1:查询女生的男朋友不在boys 表中的 女生 -- [左外连接] SELECT b.name,bo.* FROM beauty b LEFT OUTER JOIN boys bo ON b.`boyfriend_id`=bo.`id` WHERE bo.`id` IS NULL ; #案例2: 查询哪个部门没有员工 SELECT d.*,e.employee_id FROM departments d LEFT OUTER JOIN employees e ON d.`department_id`=e.`department_id` WHERE e.employee_id IS NULL; #全外连接 = 内连接的结果 + 表1中有但表2中没有的 + 表2中有的但表1中没有的 #MYSQL不支持!! #交叉连接 SELECT b.*,bo.* FROM beauty b CROSS JOIN boys bo; #内连接 SELECT * FROM beauty b INNER JOIN boys ON b.`boyfriend_id`=boys.`id`;