案例表
员工表emp
部门表dept
- 薪水表salgrade
表的笛卡尔积
在mysql中,笛卡尔积是指两个表没有指定任何连接条件的连接结果。两个表的笛卡尔积为这两个表所有行的组合,即每个表中的每一行都会与另一个表的每一行进行组合,产生一个包括两个表所有组合情况的结果集。(可也以不止两个表)
笛卡尔积的大小:例如表A有n行,表B有m行,那表AB的笛卡尔积的结果集为n*m行。
案例:将dept表与emp表进行无条件连接
from后面接需要连接的表,用逗号隔开。
表的内连接
内连接是SQL中常用的连接类型之一,用于将两个表中满足条件的行合并成一个结果集。内连接返回两个表中在连续条件上匹配的行,并且只包含匹配的行。其中如果两个内连的表是同一张表,我们称之为自连接。
语法:
SELECT columns
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;
inner join
表示内连接,inner可省略。on
后面跟匹配条件,表示从两个表的笛卡尔积中进行条件筛选。也可以用where代替。
下面用实际案例来学习内连接:
- 案例:显示名字叫SMITH的员工的部门名称
sql语句:
select ename,dname from dept join emp on dept.deptno=emp.deptno where ename='SMITH';
表的外连接
跟内连接不一样的是,外连接能返回两个表匹配或者不匹配的行。跟详细地,外连接又分为左外连接和右外连接。
左外连接
左外连接返回左表的所有行,包括右表中与左表条件匹配地行。如果左表的某一些行在右表没有与之匹配的行不,则右表的列会显示null。左表表示最靠近from的表。简单来说,左外连接就是以左表为核心,去看右表有没有与之匹配的,没有就显示NULL.
语法:
SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column_name = table2.column_name;
上面语法中,table1表示左表,table2表示右表。
准备表数据:
-- 建两张表
create table stu (id int, name varchar(30)); -- 学生表
insert into stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
create table exam (id int, grade int); -- 成绩表
insert into exam values(1, 56),(2,76),(11, 8);
- 案例:查询所有学生的成绩,如果这个学生没有成绩,也要将这个学生的信息显示出来
因为要有所有学生,考虑以学生表为左表与成绩表进行左外连接。
sql语句:
select * from stu left join exam on stu.id=exam.id;//为了避免歧义,stu.id表示stu表中的id字段
右外连接
含义和左外连接类似,只不过是以右表为主,如果左表没有与之条件匹配的行,合并后该行的左表信息显示NULL。
- 案例:对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来
要显示所有的成绩,以成绩表为主,考虑右外连接
sql语句:
select * from stu right join exam on exam.id=stu.id;