多表查询:
合并结果集:
合并结果集就是把两个select语句的查询结果合并到一起,被合并的两个结果列数列类型必须相同
合并结果集的两种方式:
union:合并时去除重复记录
union all:合并时不去除重复记录
格式:
select * from 表1 union select * from 表2;
select * from 表1 union all select * from 表2;
创建表:
union:
union all:
连接查询:
连接查询,也可以叫跨表查询,需要关联多个表进行查询
笛卡尔积:假设集合A={a, b}, 集合B={0, 1},则两个集合的笛卡尔积为{a, 0), {a, 1}, {b, 0}, {b, 1},可以扩展到多个集合的情况
同时查询两个表出现的就是笛卡尔积:
多表联查保证数据正确的方法:
在查询时要保持主键和外键一致
主表当中的数据参照子表当中的数据,逐行判断,相等的留下
连接方式的分类:内连接,外连接,自然连接
内连接:等值连接,多表连接,非等值连接,自连接
等值连接:
两个表同时出现的id号(值)才显示
与多表联查约束主外键是一样的,只是写法改变,on后面只写主外键,如果还有条件直接在后面写where
多表联查后面还有条件就写and
多表连接:
建立学生,分数,科目表:
使用99连接法:
使用内联查询:
非等值连接:
查看所有员工姓名,工资:
查询所有员工姓名,工资和部门:
或
查询所有员工的姓名,工资和所在部门及工资等级:
或
外连接:左外连接(左连接),右外连接(右连接)
左连接:
两表满足条件相同的数据,如果左边表中有不相同的数据,也把左边表中的数据查出来,左边表当中的数据全部查出来,右边表当中只查出满足条件的内容
使用内连接时,zq不会查出来,没有成绩,缺考了,把所有考过试的学生分数查出来:
或
使用左连接查询所有学生及学生的考试分数:
左连接会把左表当中的数据全部查出,右表当中查出满足条件的数据,可以省略outer不写,查询时两个表可以不需要建立主外键约束
右连接:
右连接会把右表当中的数据全部查出,左边表只查出满足条件的记录
站在表外的角度看,使用左连接就是把左表的数据全部查出,右边查出满足条件的,右连接反之
自然连接:
连接查询会产生无用笛卡尔积,我们通常使用主外键关系来去除它,而自然连接无需你给出主外键关系,它会自动找到这一等式
要求:两张连接的表中列名称和类型完全一致的列作为条件会去除相同的列
子查询:
一个select语句包含另一个完整的select语句或两个以上的select
子查询出现的位置:
where后,把select查询出来的结果当作另一个select的条件值
from后,把查询出的结果当作一个新表
查询与项羽同一部门的员工:
查询工资高于程咬金的员工:
查询工资高于30号部门所有人的员工信息:
查询工作和工资与妲己完全相同的员工信息:
查询有2个以上直接下属员工的信息:
查询员工编号为7788的员工名称,员工工资部门名称部门地址:
自连接:
查询7369员工编号,姓名,经理编号,经理姓名:
上述方法只能查出一个经理的名称
自连接:自己连接自己,起别名: