多表查询
连接查询:也可以叫跨表查询,需要关联多个表进行查询
笛卡尔集: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后,把查询出的结果当作一个新表