连接查询:
将多张表连到一起进行查询(会导致记录数行和字段数列发生改变)
交叉连接 cross join
(笛卡尔积)
特点:
1、 从第一张表依次取出每一条记录
2、 取出每一条记录之后,与另外一张表的全部记录挨个匹配
3、 没有任何匹配条件,所有的结果都会进行保留
4、 记录数 = 第一张表记录数 * 第二张表记录数;字段数 = 第一张表字段数 + 第二张表字段数(笛卡尔积)
内连接
内连接:inner join,
特点
1、 从第一张表中取出一条记录,然后去另外一张表中进行匹配
2、 利用匹配条件进行匹配,无论是否匹配都向下执行
语法
基本语法:表1 [inner] join 表2 on 匹配条件;
外连接
外链接:outer join
外连接分为两种:左外连接(left join),右外连接(right join)
左连接:左表是主表
右连接:右表是主表
原理
1、 确定连接主表:左连接就是left join左边的表为主表;right join就是右边为主表
2、 拿主表的每一条记录,去匹配另外一张表(从表)的每一条记录
3、 如果满足匹配条件:保留;不满足即不保留
4、 如果主表记录在从表中一条都没有匹配成功,那么也要保留该记录:从表对应的字段值都未NULL
5、外连接中主表数据记录一定会保存:连接之后不会出现记录数少于主表(内连接可能)
USING
可以指定用某个或某几个相同名字和数据类型的列作为连接条件。
-- 自然连接 是对两个表之间相同名字和数据类型的所有列进行的等值连接;
select * from emp natural join dept; -- emp.dept_No = dept.dept_No
-- using关键字 可以指定用某个或某几个相同名字和数据类型的列作为连接条件。
select * from emp [inner]join dept using(dept_No) where dept_No = 20; -- 注意:using是替换on的
-- natural和using 互相排斥 不可以同时使
-- 内连接 inner join on 利用匹配条件进行匹配,成功了则保留,失败了放弃。
select * from emp join dept on dept.dept_No=20 and dept.dept_No=emp.dept_No;
-- 建议是,在两个表中,有同名字段时,使用using;而在通用条件时,使用on。在数据过滤时(不是指的连接过滤),使用where。
-- 外连接 outer join 按照某一张表作为主表(表中所有记录在最后都会保留),根据条件去连接另外一张表,从而得到目标数据。
-- 左外 查询所有雇员姓名,部门编号,部门名称,包括没有部门的员工也要显示出来
select ename,dept.dept_No,dept_name from emp left [outer] join dept on emp.dept_No=dept.dept_No;
-- 右外连接 查询所有雇员姓名,部门编号,部门名称,包括没有员工的部门也要显示出来
select ename,emp.dept_No,dept_name from emp right outer join dept on emp.dept_No=dept.dept_No;
子查询:
指在一条select语句中,嵌入了另外一条select语句,那么被嵌入的select语句称之为子查询语句。
主查询
主要的查询对象,第一条select语句,确定的用户所有获取的数据目标(数据源),以及要具体得到的字段信息。
子查询和主查询的关系
1、 子查询是嵌入到主查询中的;
2、 子查询的辅助主查询的:要么作为条件,要么作为数据源
3、 子查询其实可以独立存在:是一条完整的select语句
按功能分
标量子查询:子查询返回的结果是一个数据(一行一列)
列子查询:返回的结果是一列(一列多行)
行子查询:返回的结果是一行(一行多列)
表子查询:返回的结果是多行多列(多行多列)
Exists子查询:返回的结果1或者0(类似布尔操作)