笛卡尔积
首先我们有两张表:
emp表:
dept表:
现在我们执行以下语句:
select * from emp , dept; -- 从emp和dept表中查询所有的字段数据
结果:
从上面的结果我们看到有一些无效的数据,如 孙悟空
这个员工属于1号部门,但也同时关联的2、3、4号部门。
这就是笛卡尔积的情况。也就是说它会在两表集合中取出所有可能情况。
所以我们要通过限制员工表中的 dep_id
字段的值和部门表 did
字段的值相等来消除这些无效的数据:
select * from emp , dept where emp.dep_id = dept.did;
上面语句就是连接查询
多表查询种类
内连接查询
内连接相当于查询 A B 交集数据
语法:
-- 隐式内连接
SELECT 字段列表 FROM 表1,表2… WHERE 条件;
-- 显示内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;
隐式内连接
我们前面所得到的这张表就属于隐式内连接。现在我们可以取其中的几列进行搜寻:
SELECT
emp. NAME,
emp.gender,
dept.dname
FROM
emp,
dept
WHERE
emp.dep_id = dept.did;
因为两张表的字段可能会有重合,所以我们在SELECT字段的时候最好是带上字段所属表的前缀。
同时考虑到表的名字可能会很长,这就给我们带来不必要的麻烦。所以我们可以给表起别名。
SELECT
t1. NAME,
t1.gender,
t2.dname
FROM
emp t1,
dept t2
WHERE
t1.dep_id = t2.did;
这段代码与上面的代码是等价的,执行结果如下:
因为是内连接,所以取得是交集,我们可以发现在这张表中,没有小白龙,还有销售部。
显示内连接
同样是上面的结果,如果我们使用显示内连接来写,如下:
select * from emp inner join dept on emp.dep_id = dept.did;
-- 上面语句中的inner可以省略,可以书写为如下语句
select * from emp join dept on emp.dep_id = dept.did;
外连接查询
左外连接和右外连接本质上是可以相互转换的,换个位置就行了
例如还是前文的两张表:
使用左外连接:
select * from emp left join dept on emp.dep_id = dept.did;
结果:
使用右外连接:
select * from emp right join dept on emp.dep_id = dept.did;
子查询
子查询说白了就是嵌套查询。
子查询根据结果不同,作用也不同:
- 单行单列
- 多行单列
- 多行多列
单行单列
例如:查询工资高于猪八戒的员工信息
select * from emp where salary > (select salary from emp where name = '猪八戒');
多行单列
例如:查询 ‘财务部’ 和 ‘市场部’ 所有的员工信息。
那我们的思路是要先查询这两个部门的id号,再根据这个id号去查找具体的员工
select did from dept where dname = '财务部' or dname = '市场部';
select * from emp where dep_id in (select did from dept where dname = '财务部' or dname = '市场部');
多行多列
例如:查询入职日期是 ‘2011-11-11’ 之后的员工信息和部门信息
我们思路是先查询入职日期是 ‘2011-11-11’ 之后的员工信息,然后将结果与dept表进行内连接
-- 查询入职日期是 '2011-11-11' 之后的员工信息
select * from emp where join_date > '2011-11-11' ;
-- 将上面语句的结果作为虚拟表和dept表进行内连接查询
select * from (select * from emp where join_date > '2011-11-11' ) t1, dept where t1.dep_id = dept.did;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/122175.html