MySQL多表查询
一、多表查询 当前的应用系统在存储数据的时候为了方便对数据进行管理,都不会将所有的数据存放在一个数据库表中 比如:员工的个人资料和部门信息是分开存放在不同的表中的,但是员工个人信息中会标记出其所在的部门此时在进行员工信息查询时,会涉及到多个表
连接查询:同时涉及多个表的查询 连接条件或连接谓词:用来连接两个表的条件 一般格式:
[表名1.] [表名2.]
[表名1.] BETWEEN [表名2.] AND [表名2.]
连接条件中的各连接字段类型必须是可比的,但名字不必相同
二、常见连接查询:内连接、外连接、复合条件连接
内连接——等值连接 例如:查询每个员工所在的部门 第1种:使用连接符: =
select * from emp,dept where Dept_id=dept.id;
第2种:使用:join … on…
select * from emp join dept on Dept_id=dept.id;
第3种:使用:inner join … on…
select * from emp inner join dept on Dept_id=dept.id;
非等值连接查询 员工信息表enginfo 工资等级表salgrade
查询语句:
select e.ename as '姓名',s.id as '等级' from enginfo e,salgrade s where e.sal BETWEEN s.local and s.maxline;
自身连接 自身连接:一个表与其自己进行连接 需要给表起别名以示区别 由于所有属性名都是同名属性,因此必须使用别名前缀
例如:查询每门课程的先修课名称
SELECT Qir.cno,Qir.cname,Qir.cpno,sec.cname
FROM course Qir,course sec
WHERE Qir.cpno=sec.cno;
外连接
外联接可以是左向外联接、右向外联接在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:
LEFT JOIN 或 LEFT OUTER JOIN
RIGHT JOIN 或 RIGHT OUTER JOIN
左连接 左向外联接的结果集包括:LEFT OUTER,子句中指定的左表的所有行,而不仅仅是联接列所匹配的行 如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值
例如:
SELECT s.sno,sname,sex,age,dept,cno,grade FROM student s LEFT OUT JOIN sc ON s.sno=sc.sno;
右连接 右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值