相关子查询
子查询是最典型的多表查询,子查询必须依赖于主查询 ,子查询单独运行会报错,依赖于主查询的结果select嵌套 只能返回单行单列
每次主查询 执行一次,子查询也会执行一次,最终执行N+1次,效率低下,如果主查询没有提供数据,子查询无法执行
语法:select 列名1,列名2,(select 列名 from 表名 where 条件) from 表名
例:SELECT FIRST_NAME,(SELECT LAST_NAME FROM employees WHERE EMPLOYEE_ID =DEPARTMENT_ID ) FROM employees
非相关子查询
from 嵌套 必须要给嵌套的子查询表起别名,可返回多行多列数据,子查询对主查询没有依赖 子查询只会执行一次,只会在from的时候才执行,性能较高,能独立运行,只是给主查询提供条件值
语法:select 列名1 ,列名2,… from (select 列名 from 表名 [where 条件] ) [where 条件]
例:查询电话号码是’13549961578’ 并且姓名为张三的
SELECT * FROM (SELECT * FROM employees WHERE DEPARTMENT_ID=‘13549961578’) AS t1(取列名)
WHERE t1.FIRST_NAME=‘张三’;
where 嵌套 执行2次,子查询可以单独运行,不依赖主查询,只是给主查询提供条件值
语法:select 列名1,列名2, … from 表名 where 列名 关系运算符 (select 列明 from 表名 where 条件)
例:查询管理部的人数有哪些
SELECT * FROM employees WHERE DEPARTMENT_ID =(SELECT DEPARTMENT_ID FROM employees WHERE DEPARTMENT_NAME =‘管理部’)
in 多条值
例:查询管理部门的人有哪些
语法:select 列名1,列名2,… from 表名 where 列名 in (select 列明 from 表名 where 条件)
SELECT * FROM employees WHERE EMPLOYEE_ID in (SELECT DEPARTMENT_ID FROM departments WHERE DEPARTMENT_NAME=‘管理部’)
多表查询如果操作不当会出现严重的笛卡尔集。
等值连接:自己和自己相连接,有时候有一些表里面有我们自己需要的东西那就不需要再麻烦去别的表里面连接查询了。
非等值连接:就是去连接另一个表,分为主表于负表在主表里面找不到的数据值就去连接一个负表以这种的方式去达到自己需要查询数据的目的。
外连接与内连接-(左内连接多表和查询)
- 外连接:不仅将两个表中满足条件的数据查询出来,也将不满足条件的数据查询出来
左外连接:不仅将两个表中满足条件的数据查询出来,也将不满足条件的左表中的数据查询出来
右外连接:不仅将两个表中满足条件的数据查询出来,也将不满足条件的右表中的数据查询出来
满外连接:(oracle中支持)
将左右表中不满足条件的数据同时查询吃来
– 内连接:只是将满足条件的数据查询出来,称为内连接
oracle中支持满外连接:
将左右表中的数据同时查询出来
多表查询并不难,首先需要屡清楚表与表之间的结构关系
先说一下多表之间的关系:
开始提交查询代码:
具体代码:
– 账户 - 账户角色 - 角色 - 角色权限 - 权限