数据准备
create table student
(
sno varchar(10) primary key,
sname varchar(20),
sex varchar(10),
sage smallint,
sdept varchar(20)
);
insert into student values('2018001001','令狐冲','male',18,'cs');
insert into student values('2018001002','任盈盈','female',19,'MA');
insert into student values('2018001003','岳不群','male',20,'CS');
create table course
(
cno varchar(4) primary key,
cname varchar(40) not null,
cpno varchar(4),
credit smallint
);
insert into course values('c001','C语言程序设计',' ',4);
insert into course values('c002','计算机应用基础','c002',2);
create table sc
(
sno varchar(10),
cno varchar(4),
grade smallint,
primary key(sno,cno),
foreign key(sno) references student(sno),
foreign key(cno) references course(cno)
);
insert into sc values('2018001001','c001',88);
insert into sc values('2018001001','c002',78);
insert into sc values('2018001002','c001',88);
insert into sc values('2018001002','c002',78);
OK准备好数据,查看一下,共三张表。
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| course |
| sc |
| student |
+----------------+
3 rows in set (0.00 sec)
交叉连接
交叉连接 不适用任何匹配条件,生成笛卡尔积
mysql> SELECT * FROM student,course,sc;
+------------+--------+--------+------+-------+------+----------------+------+--------+------------+------+-------+
| sno | sname | sex | sage | sdept | cno | cname | cpno | credit | sno | cno | grade |
+------------+--------+--------+------+-------+------+----------------+------+--------+------------+------+-------+
| 2018001001 | 令狐冲 | male | 18 | cs | c001 | C语言程序设计 | | 4 | 2018001001 | c001 | 88 |
| 2018001001 | 令狐冲 | male | 18 | cs | c002 | 计算机应用基础 | c002 | 2 | 2018001001 | c001 | 88 |
| 2018001002 | 任盈盈 | female | 19 | MA | c001 | C语言程序设计 | | 4 | 2018001001 | c001 | 88 |
| 2018001002 | 任盈盈 | female | 19 | MA | c002 | 计算机应用基础 | c002 | 2 | 2018001001 | c001 | 88 |
| 2018001003 | 岳不群 | male | 20 | CS | c001 | C语言程序设计 | | 4 | 2018001001 | c001 | 88 |
| 2018001003 | 岳不群 | male | 20 | CS | c002 | 计算机应用基础 | c002 | 2 | 2018001001 | c001 | 88 |
| 2018001001 | 令狐冲 | male | 18 | cs | c001 | C语言程序设计 | | 4 | 2018001001 | c002 | 78 |
| 2018001001 | 令狐冲 | male | 18 | cs | c002 | 计算机应用基础 | c002 | 2 | 2018001001 | c002 | 78 |
| 2018001002 | 任盈盈 | female | 19 | MA | c001 | C语言程序设计 | | 4 | 2018001001 | c002 | 78 |
| 2018001002 | 任盈盈 | female | 19 | MA | c002 | 计算机应用基础 | c002 | 2 | 2018001001 | c002 | 78 |
| 2018001003 | 岳不群 | male | 20 | CS | c001 | C语言程序设计 | | 4 | 2018001001 | c002 | 78 |
| 2018001003 | 岳不群 | male | 20 | CS | c002 | 计算机应用基础 | c002 | 2 | 2018001001 | c002 | 78 |
| 2018001001 | 令狐冲 | male | 18 | cs | c001 | C语言程序设计 | | 4 | 2018001002 | c001 | 88 |
| 2018001001 | 令狐冲 | male | 18 | cs | c002 | 计算机应用基础 | c002 | 2 | 2018001002 | c001 | 88 |
| 2018001002 | 任盈盈 | female | 19 | MA | c001 | C语言程序设计 | | 4 | 2018001002 | c001 | 88 |
| 2018001002 | 任盈盈 | female | 19 | MA | c002 | 计算机应用基础 | c002 | 2 | 2018001002 | c001 | 88 |
| 2018001003 | 岳不群 | male | 20 | CS | c001 | C语言程序设计 | | 4 | 2018001002 | c001 | 88 |
| 2018001003 | 岳不群 | male | 20 | CS | c002 | 计算机应用基础 | c002 | 2 | 2018001002 | c001 | 88 |
| 2018001001 | 令狐冲 | male | 18 | cs | c001 | C语言程序设计 | | 4 | 2018001002 | c002 | 78 |
| 2018001001 | 令狐冲 | male | 18 | cs | c002 | 计算机应用基础 | c002 | 2 | 2018001002 | c002 | 78 |
| 2018001002 | 任盈盈 | female | 19 | MA | c001 | C语言程序设计 | | 4 | 2018001002 | c002 | 78 |
| 2018001002 | 任盈盈 | female | 19 | MA | c002 | 计算机应用基础 | c002 | 2 | 2018001002 | c002 | 78 |
| 2018001003 | 岳不群 | male | 20 | CS | c001 | C语言程序设计 | | 4 | 2018001002 | c002 | 78 |
| 2018001003 | 岳不群 | male | 20 | CS | c002 | 计算机应用基础 | c002 | 2 | 2018001002 | c002 | 78 |
+------------+--------+--------+------+-------+------+----------------+------+--------+------------+------+-------+
24 rows in set (0.00 sec)
mysql> select count(*) from student cross join sc cross join course;
+----------+
| count(*) |
+----------+
| 24 |
+----------+
1 row in set (2.10 sec)
CROSS JOIN实际上是笛卡尔积
A表有M行,N列
B表有M1行,N1列
则A表与B表的笛卡尔积有M*M1行,N+N1列。
θ连接
θ符号有多种>,>=,<,<=,=,<>,!=
mysql> SELECT *
-> FROM STUDENT,SC
-> WHERE STUDENT.SNO>SC.SNO;
+------------+--------+--------+------+-------+------------+------+-------+
| sno | sname | sex | sage | sdept | sno | cno | grade |
+------------+--------+--------+------+-------+------------+------+-------+
| 2018001002 | 任盈盈 | female | 19 | MA | 2018001001 | c001 | 88 |
| 2018001003 | 岳不群 | male | 20 | CS | 2018001001 | c001 | 88 |
| 2018001002 | 任盈盈 | female | 19 | MA | 2018001001 | c002 | 78 |
| 2018001003 | 岳不群 | male | 20 | CS | 2018001001 | c002 | 78 |
| 2018001003 | 岳不群 | male | 20 | CS | 2018001002 | c001 | 88 |
| 2018001003 | 岳不群 | male | 20 | CS | 2018001002 | c002 | 78 |
+------------+--------+--------+------+-------+------------+------+-------+
6 rows in set (2.06 sec)
mysql> SELECT *
-> FROM STUDENT,SC
-> WHERE STUDENT.SNO<SC.SNO;
+------------+--------+------+------+-------+------------+------+-------+
| sno | sname | sex | sage | sdept | sno | cno | grade |
+------------+--------+------+------+-------+------------+------+-------+
| 2018001001 | 令狐冲 | male | 18 | cs | 2018001002 | c001 | 88 |
| 2018001001 | 令狐冲 | male | 18 | cs | 2018001002 | c002 | 78 |
+------------+--------+------+------+-------+------------+------+-------+
2 rows in set (0.00 sec)
等值连接
mysql> SELECT *
-> FROM STUDENT,SC
-> WHERE STUDENT.SNO=SC.SNO;
+------------+--------+--------+------+-------+------------+------+-------+
| sno | sname | sex | sage | sdept | sno | cno | grade |
+------------+--------+--------+------+-------+------------+------+-------+
| 2018001001 | 令狐冲 | male | 18 | cs | 2018001001 | c001 | 88 |
| 2018001001 | 令狐冲 | male | 18 | cs | 2018001001 | c002 | 78 |
| 2018001002 | 任盈盈 | female | 19 | MA | 2018001002 | c001 | 88 |
| 2018001002 | 任盈盈 | female | 19 | MA | 2018001002 | c002 | 78 |
+------------+--------+--------+------+-------+------------+------+-------+
4 rows in set (0.00 sec)
等值连接的结果去掉重复的列====自然连接
mysql> SELECT STUDENT.*,CNO,GRADE
-> FROM STUDENT,SC
-> WHERE STUDENT.SNO=SC.SNO;
+------------+--------+--------+------+-------+------+-------+
| sno | sname | sex | sage | sdept | CNO | GRADE |
+------------+--------+--------+------+-------+------+-------+
| 2018001001 | 令狐冲 | male | 18 | cs | c001 | 88 |
| 2018001001 | 令狐冲 | male | 18 | cs | c002 | 78 |
| 2018001002 | 任盈盈 | female | 19 | MA | c001 | 88 |
| 2018001002 | 任盈盈 | female | 19 | MA | c002 | 78 |
+------------+--------+--------+------+-------+------+-------+
4 rows in set (0.00 sec)
外连接
mysql> SELECT *
-> FROM student right join sc
-> on student.sno=sc.sno;
+------------+--------+--------+------+-------+------------+------+-------+
| sno | sname | sex | sage | sdept | sno | cno | grade |
+------------+--------+--------+------+-------+------------+------+-------+
| 2018001001 | 令狐冲 | male | 18 | cs | 2018001001 | c001 | 88 |
| 2018001001 | 令狐冲 | male | 18 | cs | 2018001001 | c002 | 78 |
| 2018001002 | 任盈盈 | female | 19 | MA | 2018001002 | c001 | 88 |
| 2018001002 | 任盈盈 | female | 19 | MA | 2018001002 | c002 | 78 |
+------------+--------+--------+------+-------+------------+------+-------+
4 rows in set (0.00 sec)
mysql> SELECT *
-> FROM student left join sc
-> on student.sno=sc.sno;
+------------+--------+--------+------+-------+------------+------+-------+
| sno | sname | sex | sage | sdept | sno | cno | grade |
+------------+--------+--------+------+-------+------------+------+-------+
| 2018001001 | 令狐冲 | male | 18 | cs | 2018001001 | c001 | 88 |
| 2018001001 | 令狐冲 | male | 18 | cs | 2018001001 | c002 | 78 |
| 2018001002 | 任盈盈 | female | 19 | MA | 2018001002 | c001 | 88 |
| 2018001002 | 任盈盈 | female | 19 | MA | 2018001002 | c002 | 78 |
| 2018001003 | 岳不群 | male | 20 | CS | NULL | NULL | NULL |
+------------+--------+--------+------+-------+------------+------+-------+
5 rows in set (0.00 sec)
mysql> SELECT *
-> FROM student left outer join sc
-> on student.sno=sc.sno;
+------------+--------+--------+------+-------+------------+------+-------+
| sno | sname | sex | sage | sdept | sno | cno | grade |
+------------+--------+--------+------+-------+------------+------+-------+
| 2018001001 | 令狐冲 | male | 18 | cs | 2018001001 | c001 | 88 |
| 2018001001 | 令狐冲 | male | 18 | cs | 2018001001 | c002 | 78 |
| 2018001002 | 任盈盈 | female | 19 | MA | 2018001002 | c001 | 88 |
| 2018001002 | 任盈盈 | female | 19 | MA | 2018001002 | c002 | 78 |
| 2018001003 | 岳不群 | male | 20 | CS | NULL | NULL | NULL |
+------------+--------+--------+------+-------+------------+------+-------+
5 rows in set (0.00 sec)
mysql> SELECT *
-> FROM student right outer join sc
-> on student.sno=sc.sno;
+------------+--------+--------+------+-------+------------+------+-------+
| sno | sname | sex | sage | sdept | sno | cno | grade |
+------------+--------+--------+------+-------+------------+------+-------+
| 2018001001 | 令狐冲 | male | 18 | cs | 2018001001 | c001 | 88 |
| 2018001001 | 令狐冲 | male | 18 | cs | 2018001001 | c002 | 78 |
| 2018001002 | 任盈盈 | female | 19 | MA | 2018001002 | c001 | 88 |
| 2018001002 | 任盈盈 | female | 19 | MA | 2018001002 | c002 | 78 |
+------------+--------+--------+------+-------+------------+------+-------+
4 rows in set (0.00 sec)
复合条件连接查询
mysql> SELECT STUDENT.*,SC.CNO,GRADE,course.*
-> FROM STUDENT,SC,course
-> WHERE STUDENT.SNO=SC.SNO AND
-> COURSE.CNO=SC.CNO AND
-> SC.CNO='c002';
+------------+--------+--------+------+-------+------+-------+------+----------------+------+--------+
| sno | sname | sex | sage | sdept | CNO | GRADE | cno | cname | cpno | credit |
+------------+--------+--------+------+-------+------+-------+------+----------------+------+--------+
| 2018001001 | 令狐冲 | male | 18 | cs | c002 | 78 | c002 | 计算机应用基础 | c002 | 2 |
| 2018001002 | 任盈盈 | female | 19 | MA | c002 | 78 | c002 | 计算机应用基础 | c002 | 2 |
+------------+--------+--------+------+-------+------+-------+------+----------------+------+--------+
2 rows in set (0.00 sec)