第四章多表连接和子查询本章要点•多表连接的定义•等值连接•不等值连接•外连接•子查询的语法•子查询的使用从多个表中取得数据EMPLOYEESDEPARTMENTS……使用Oracle的语法连接多个表使用表连接从多个表中查询数据SELECTtable1.column,table2.columnFROMtable1,table2WHEREtable1.column1=table2.column2;•在WHERE子句中写入连接条件•当多个表中有重名列时,必须在列的名字前加上表名作为前缀常见的连接类型:•等值连接•非等值连接•外连接连接的类型什么是等值连接?EMPLOYEESDEPARTMENTSForeignkey外键Primarykey主键……使用AND操作符增加查询条件EMPLOYEESDEPARTMENTS……使用表的别名•使用表的别名简化了查询•提高了查询的性能SELECTe.employee_id,e.last_name,e.department_id,d.department_id,d.location_idFROMemployeese,departmentsdWHEREe.department_id=d.department_id;对多表作等值连接查询EMPLOYEESLOCATIONSDEPARTMENTS•为了连接n个表,至少需要n-1个连接条件。例如,为了连接三个表,至少需要两个连接条件…非等值连接EMPLOYEESJOB_GRADES在EMPLOYEES表中所有薪水位于JOB_GRADES表最低薪水和最高薪水之间雇员的薪水情况.…外连接EMPLOYEESDEPARTMENTS没有雇员属于190部门…外连接使用外连接可以看到不满足连接条件的记录外连接运算符是(+)有左外连接和右外连接SELECTtable.column,table.columnFROMtable1,table2WHEREtable1.column(+)=table2.column;SELECTtable.column,table.columnFROMtable1,table2WHEREtable1.column=table2.column(+);子查询SELECTselect_listFROMtableWHEREexproperator(SELECTselect_listFROMtable);子查询在主查询前执行一次主查询使用子查询的结果使用子查询的注意事项子查询要用括号括起来将子查询放在比较运算符的右边(增强可读性)对单行子查询使用单行运算符对多行子查询使用多行运算符子查询的种类单行子查询主查询子查询返回最多一行记录多行子查询0-多行记录主查询子查询返回单行子查询返回一行记录使用单行记录比较运算符Operator===MeaningEqualtoGreaterthanGreaterthanorequaltoLessthanLessthanorequaltoNotequalto下面的语句错在哪里?SELECTemployeeID,nameFROMEMPLOYEESWHEREsalary=(SELECTsalaryFROMEMPLOYEESwheredepartmentID=1);•对多行子查询使用了单行比较操作符.多行子查询返回多行使用多行比较运算符运算符INANYALL含义等于列表中的任何值将值与子查询返回的任意一个值进行比较比较子查询返回的每一个值在多行子查询中使用ANY运算符ANY指小于最大值ANY大于最小值SELECTemployee_id,last_name,job_id,salaryFROMemployeesWHEREsalaryANY(SELECTsalaryFROMemployeesWHEREjob_id='IT_PROG')ANDjob_id'IT_PROG';在多行子查询中使用ALL运算符ALL指大于最大值ALL指小于最小值SELECTemployee_id,last_name,job_id,salaryFROMemployeesWHEREsalaryALL(SELECTsalaryFROMemployeesWHEREjob_id='IT_PROG')ANDjob_id'IT_PROG';本章小结本章讲述了什么是多表连接,以及多表连接的几种类型,通过例子说明了以前的多表连接语法的连接语法。在本章的最后也讲述了子查询的基本语法和使用,并且重点强调了子查询中容易出的错误。