多表查询 子查询

多表查询

连接查询:也可以叫跨表查询,需要关联多个表进行查询

笛卡尔集:select * from students,score; 会有重复数据
查询表时给表起别名:例子  SELECT * FROM stu st,score sc;
数据不会重复:select * from students st,score sc where st.id = sc.sid; 99写法
主外键保持一直,是如何做到去除笛卡尔集的(原理)

内连接
例子:select * from students st inner join score sc on st.id=sc.sid;
多表联查约束主外键一样,只是写法改变了
ON后面只写主外键
(对于结果)如果还有条件直接在后面写WHERE
多表联查后还有条件就直接写AN

左连接:左边表数据全部查询出来,右边表只查询满足条件的 on后面的就是条件
例子:select * from students left join score on student.id = score.sid;

右连接:右边表数据全部查询出来,左边表只查询满足条件的 on后面的就是条件 on st.id=sc.sid 是去除笛卡尔集的
例子:select * from student st right join score sc on st.id = sc.sid;

非等值连接数据:comment后面可以写注释

99法:select * from emp e,dept d, salgrade s
where
e.deptno = d.deptno
and e.salary >= s.lowsalary #between lowsalary and highsalary
and e.salary <=s.highsalary
内连接:select *
from emp e
join dept d
on e.deptno = d.deptno
join salgrade s
on e.salary between s.lowsalay and s.highsalary;

自然连接:连接查询会产生无用笛卡尔集,我们通常使用主外键关系等式来去除它.而自然连接无需你去给出主外键等式,它会自找到这一等式也就是说不用去写条件
要让主外键的字段名相同才能连接

子查询

一个select语句中包含另外一个完整的select语句
或者说两个以上select,那么就是子查询语句了

子查询出现的位置: where后,把select查询出的结果当做另外一个select的条件值
from后,把查询出的结果当作一个新表

猜你喜欢

转载自blog.csdn.net/weixin_34384557/article/details/87229147