本文共 2370 字,大约阅读时间需要 7 分钟。
在数据库查询中,多表查询是常见的操作之一。当查询涉及多个表时,通常需要使用连接查询来获取数据。以下是关于多表查询的一些关键点和实例。
当两个表之间没有有效的连接条件时,数据库会自动生成笛卡尔乘积 resultset。例如,如果表A有m行记录,表B有n行记录,则笛卡尔乘积会产生m x n行结果。这一点在没有where子句限制的情况下尤为明显。
笛卡尔乘积的产生主要是由于缺少有效的连接条件。数据库无法理解表之间的关联关系,因此会将所有可能的组合都包含在结果中。
为了避免笛卡尔乘积现象,必须在查询中明确指定连接条件。确保每个涉及到的表之间都有明确的关联规则。
等值连接
非等值连接
自连接
左外连接
右外连接
全外连接
###案例1:查询女神名和对应的男神名
SELECT NAME, boyName FROM boys, beautyWHERE beauty.boyfriend_id = boys.id;
###案例2:查询员工名和对应的部门名
SELECT last_name, department_nameFROM employees, departmentsWHERE employees.`department_id` = departments.`department_id`;
###案例3:查询员工名、工种号、工种名
SELECT e.last_name, e.job_id, j.job_titleFROM employees e, jobs jWHERE e.`job_id` = j.`job_id`;
###案例4:查询有奖金的员工名、部门名
SELECT last_name, department_name, commission_pctFROM employees e, departments dWHERE e.`department_id` = d.`department_id`AND e.`commission_pct` IS NOT NULL;
###案例5:查询城市名中第二个字符为'o'的部门名和城市名
SELECT department_name, cityFROM departments d, locations lWHERE d.`location_id` = l.`location_id`AND city LIKE '_o%';
###案例6:查询每个城市的部门个数
SELECT COUNT(*) AS 部门个数, cityFROM departments d, locations lWHERE d.`location_id` = l.`location_id`GROUP BY city;
###案例7:查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资
SELECT department_name, d.`manager_id`, MIN(salary)FROM departments d, employees eWHERE d.`department_id` = e.`department_id`AND commission_pct IS NOT NULLGROUP BY department_name, d.`manager_id`;
###案例8:查询每个工种的工种名和员工个数,并按员工个数降序
SELECT job_title, COUNT(*) AS 员工个数FROM employees e, jobs jWHERE e.`job_id` = j.`job_id`GROUP BY job_titleORDER BY 员工个数 DESC;
###案例9:查询员工名、部门名和所在的城市
SELECT last_name, department_name, cityFROM employees e, departments d, locations lWHERE e.`department_id` = d.`department_id`AND d.`location_id` = l.`location_id`AND city LIKE 's%'ORDER BY department_name DESC;
###案例1:查询员工的工资和工资级别
SELECT salary, grade_levelFROM employees e, job_grades gWHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal`AND g.`grade_level` = 'A';
###案例:查询员工名和上级的名称
SELECT e.employee_id, e.last_name, m.last_nameFROM employees e, employees mWHERE e.`manager_id` = m.`employee_id`;
转载地址:http://rhbfk.baihongyu.com/