一、笛卡尔集的错误及解决、等值连接与非等值连接:
1、笛卡尔集的情况与解决:
select employees.employee_id,employees.department_id,departments.department_name
from employees,departments
- - - 结果会有2000多条记录。出错。
- - - 笛卡尔集的错误情况:左表中的一行,与右表中的每一行都对应一下;原因是:未加过滤条件。
- - - 解决笛卡尔集错误的方案:使用内连接。
select employees.employee_id,employees.department_id,departments.department_name
from employees,departments
where employees.department_id = departments.department_id //添加条件
2、笛卡尔集的等值连接(两个表的连接):
(1)、等值连接时,如果表名太长,可以为表名起个别名(方便)。
select e.employee_id,e.department_id,d.department_name
from employees e,departments d
where e.department_id = d.department_id
(2)、等值连接时,如果某个列名仅存在于一个特定表中,那么操作它的时候可以不必加表名点。(出现少一个人的问题)
select employee_id,e.department_id,department_name
from employees e,departments d
where e.department_id = d.department_id
3、三个表的连接查询:
(1)、Employees表、Departments表、Locations表:
select employee_id,e.department_id,department_name,city
from employees e,departments d,locations l
where e.department_id = d.department_id and d.location_id = l.location_id
连接n个表至少需要n-1个条件。
可以给SQL语句中select后的列名起别名,也可以给SQL语句中from后的表名起别名。
4、非等值连接:
select employee_id,last_name,salary,grade_level
from employees e,job_grades j
where e.salary between j.lowest_sal and j.highest_sal
等值连接与非等值连接只是where条件不同。
二、外连接:
select employee_id,e.department_id,department_name
from employees e,departments d
where e.department_id = d.department_id
结果有106个人;少了一个人(此人没有部门ID,不能满足where后的条件,所以不显示)。