DQL:数据查询语言(多表)
2018-09-29 本文已影响7人
别动我名字呀
一、合并结果集
合并结果集就是把两个select语句的查询结果合并到一起,注意被合并的两个表:列、列类型必须相同
合并结果集的两种方式:
- union(合并时去除重复记录)
select * from A
union
select * from B
- union all(合并时不去除重复记录)
select * from A
union all
select * from B
二、连接查询(也叫跨表查询,需要关联多个表查询)
同时查询两张表,出现的就是笛卡尔集结果。隐士的去笛卡尔集就是在查询时保持主键和外键的一致,主表当中的数据参照子表当中的数据
1.多表连查:起别名
select * from stu st , score sc;
- 99连接查询(隐士连接): 两者满足相同条件的数据,不相等的不要
select * from
stu st, score sc
where
st.id=sc.id;
- 内连接
1. inner join 等值连接:
查询两者满足相同条件的数据,与99连接查询主外键是一样的,
只是换了一种写法。on 后面只写主外键
SELECT * FROM stu st , score WHERE st.id =sc.sid
SELECT * FROM stu st INNER JOIN score sc ON st.id=sc.sid
以上两种结果一致,INNER可以省略
2.多表连接
select * from stu st
join score sc on st.id = sc.sid
join course c on sc.cid=c.cid;
3.非等值连接(后面不一定是等于,可能是 < 或者 >)
select * from
emp e, dept d, salgrade g
where e.deptno = d.deptno
and e.salary >= g.lowSalary and e.salary<=g.highSalary;
select * from emp e
JOIN dept d ON e.deptno = d.deptno
JOIN salgrade g ON e.salary >= g.lowSalary and e.salary<=g.highSalary;
4.外连接
1. LEFT JOIN (左连接)
查询两表满足相同条件的数据,如果左边表中有不相同的数据,也把左边表中的数据查出来
左边表中的数据全部查出来,右边表中指查满足条件的内容
SELECT * FRM stu st LEFT JOIN score ON st.id = sc.sid
2.RIGHT JOIN (右连接)
右边表中的数据全部查出来,左边表中指查满足条件的内容
SELECT * FRM stu st RIGHT JOIN score ON st.id = sc.sid
5.自然连接(两张连接的表中列名和类型完全一致的列作为条件,会去除相同的列)
select * from stu NATIRAL JOIN score;
三、子查询
一个select语句中包含另一个完整的select语句,或者两个select语句;就是子查询
where后面:把select查询的结果当成另一个select的条件值
from后面:把查询结果当作一张新表
1.查询跟张三同一个部门的员工
select * from emp dep=(select dep from where ename='张三')
2.查询30号部门薪资大于两千的员工
select ename,salary from
(select ename,salary from emp dep=30) s
where s.salary>2000;
3.查询工资与名字都与李四相同的员工
select * from emp e ,(select name,salary from emp where name='李四') r
where e.name= r.name AND e.salary= r.salary;
四、自连接
自己连接自己 ;起别名
求员工编号为732的姓名、经理编号、经理姓名
select e1.empN,e.name, e2.mgr,e2.name from emp e1, emp e2
where e1.empNo=e2.mgr
ADN e1.empNo=732;