- 内连接
- 外连接
- 左外连接
- 右外连接
- OJ
内连接
实际上我们在表的复合查询部分用的就是内连接,只不过语法不是很规范。
标准语法:
select字段from表1innerjoin表2on连接条件and其他条件;如,显示SMITH的名字和部门名称:
之前的写法:
mysql>selectename,dnamefromemp,deptwhereemp.deptno=dept.deptnoandename='SMITH';+-------+----------+|ename|dname|+-------+----------+|SMITH|RESEARCH|+-------+----------+1rowinset(0.00sec)标准写法:
mysql>selectename,dnamefromempinnerjoindeptonemp.deptno=dept.deptnowhereename='SMITH';+-------+----------+|ename|dname|+-------+----------+|SMITH|RESEARCH|+-------+----------+1rowinset(0.00sec)外连接
外连接又分为左外连接和右外连接。
左外连接
如果联合查询,左侧的表完全显示我们就说是左外连接。
语法:
select字段名from表名1leftjoin表名2on连接条件示例:
我们先创建两个表:
createtablestu(idint,namevarchar(30));-- 学生表insertintostuvalues(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');createtableexam(idint,gradeint);-- 成绩表insertintoexamvalues(1,56),(2,76),(11,8);查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来:
如果使用普通的内连接:
右外连接
如果联合查询,右侧的表完全显示我们就说是右外连接。
语法:
select字段from表名1rightjoin表名2on连接条件;示例:
- 对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来
- 列出部门名称和这些部门的员工信息,同时列出没有员工的部门
OJ
做些简单OJ巩固下:
- 分数排名
SELECTS.score,COUNT(DISTINCTT.score)AS'rank'FROMScores SINNERJOINScores TONS.score<=T.scoreGROUPBYS.id,S.scoreORDERBYS.scoreDESC;- 换座位
SELECTt1.id,t2.studentFROMSeat t1JOINSeat t2ONt1.id-1+2*MOD(t1.id,2)=t2.idOR(t1.id=(SELECTMAX(id)FROMSeat)ANDt2.id=t1.idANDMOD(t1.id,2)=1)ORDERBYt1.id;