美文网首页
多表连接查询

多表连接查询

作者: 肥四_F4 | 来源:发表于2020-07-02 23:34 被阅读0次

多表连接查询

-- 1. 预备工作

CREATE DATABASE school CHARSET utf8;
USE school
CREATE TABLE student(
sno INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
sname VARCHAR(20) NOT NULL COMMENT '姓名',
sage TINYINT UNSIGNED  NOT NULL COMMENT '年龄',
ssex  ENUM('f','m') NOT NULL DEFAULT 'm' COMMENT '性别'
)ENGINE=INNODB CHARSET=utf8;

CREATE TABLE course(
cno INT NOT NULL PRIMARY KEY COMMENT '课程编号',
cname VARCHAR(20) NOT NULL COMMENT '课程名字',
tno INT NOT NULL  COMMENT '教师编号'
)ENGINE=INNODB CHARSET utf8;

CREATE TABLE sc (
sno INT NOT NULL COMMENT '学号',
cno INT NOT NULL COMMENT '课程编号',
score INT  NOT NULL DEFAULT 0 COMMENT '成绩'
)ENGINE=INNODB CHARSET=utf8;

CREATE TABLE teacher(
tno INT NOT NULL PRIMARY KEY COMMENT '教师编号',
tname VARCHAR(20) NOT NULL COMMENT '教师名字'
)ENGINE=INNODB CHARSET utf8;

INSERT INTO student(sno,sname,sage,ssex)
VALUES 
(1,'zhang3',18,'m'),
(2,'zhang4',18,'m'),
(3,'li4',18,'m'),
(4,'wang5',19,'f'),
(5,'zh4',18,'m'),
(6,'zhao4',18,'m'),
(7,'ma6',19,'f'),
(8,'oldboy',20,'m'),
(9,'oldgirl',20,'f'),
(10,'oldp',25,'m');

INSERT INTO teacher(tno,tname) VALUES
(101,'oldboy'),
(102,'hesw'),
(103,'oldguo')
(104,'alex');

INSERT INTO course(cno,cname,tno)
VALUES
(1001,'linux',101),
(1002,'python',102),
(1003,'mysql',103)
(1004,'go',105);

INSERT INTO sc(sno,cno,score)
VALUES
(1,1001,80),
(1,1002,59),
(2,1002,90),
(2,1003,100),
(3,1001,99),
(3,1003,40),
(4,1001,79),
(4,1002,61),
(4,1003,99),
(5,1003,40),
(6,1001,89),
(6,1003,77),
(7,1001,67),
(7,1003,82),
(8,1001,70),
(9,1003,80),
(10,1003,96);

-- 2. 多表连接的类型

-- 笛卡尔乘积

mysql> select * from teacher , course;

+-----+--------+------+--------+-----+
| tno | tname  | cno  | cname  | tno |
+-----+--------+------+--------+-----+
| 101 | oldboy | 1001 | linux  | 101 |
| 102 | hesw   | 1001 | linux  | 101 |
| 103 | oldguo | 1001 | linux  | 101 |
| 104 | alex   | 1001 | linux  | 101 |
| 101 | oldboy | 1002 | python | 102 |
| 102 | hesw   | 1002 | python | 102 |
| 103 | oldguo | 1002 | python | 102 |
| 104 | alex   | 1002 | python | 102 |
| 101 | oldboy | 1003 | mysql  | 103 |
| 102 | hesw   | 1003 | mysql  | 103 |
| 103 | oldguo | 1003 | mysql  | 103 |
| 104 | alex   | 1003 | mysql  | 103 |
| 101 | oldboy | 1004 | go     | 105 |
| 102 | hesw   | 1004 | go     | 105 |
| 103 | oldguo | 1004 | go     | 105 |
| 104 | alex   | 1004 | go     | 105 |
+-----+--------+------+--------+-----+

-- 内连接 (取交集)

SQL92: 
mysql> select *from teacher , course where teacher.tno=course.tno;
SQL99: 
mysql> select *from teacher  join course on teacher.tno=course.tno;
+-----+--------+------+--------+-----+
| tno | tname  | cno  | cname  | tno |
+-----+--------+------+--------+-----+
| 101 | oldboy | 1001 | linux  | 101 |
| 102 | hesw   | 1002 | python | 102 |
| 103 | oldguo | 1003 | mysql  | 103 |
+-----+--------+------+--------+-----+

-- 外连接 (左、右)

mysql> 
mysql> select * from teacher left join course on teacher.tno = course.tno;
+-----+--------+------+--------+------+
| tno | tname  | cno  | cname  | tno  |
+-----+--------+------+--------+------+
| 101 | oldboy | 1001 | linux  |  101 |
| 102 | hesw   | 1002 | python |  102 |
| 103 | oldguo | 1003 | mysql  |  103 |
| 104 | alex   | NULL | NULL   | NULL |
+-----+--------+------+--------+------+
4 rows in set (0.00 sec)

mysql> select * from teacher right  join course on teacher.tno = course.tno;
+------+--------+------+--------+-----+
| tno  | tname  | cno  | cname  | tno |
+------+--------+------+--------+-----+
|  101 | oldboy | 1001 | linux  | 101 |
|  102 | hesw   | 1002 | python | 102 |
|  103 | oldguo | 1003 | mysql  | 103 |
| NULL | NULL   | 1004 | go     | 105 |
+------+--------+------+--------+-----+

-- 3. 多表连接语法格式

select xxx 
from a join b 
on a.x=b.y 
where 
group by 
having 
order by  
limit

select xxx 
from a join b 
on a.x=b.y 
join c 
on b.z=c.zz

核心思路: 
    1.找到所有相关表 
    2.找到所有表之间的关联关系
    3.罗列其他的查询条件

--3. 多表连接例子:

---  统计学员zhang3,学习了几门课
SELECT student.sname,COUNT(*) 
FROM student  JOIN sc 
ON student.sno =sc.sno
WHERE student.sname='zhang3';

--- 所有学员学习的课程门数
SELECT student.sname,COUNT(*) 
FROM student  JOIN sc 
ON student.sno =sc.sno
GROUP BY student.sname;

--- 查询zhang3,学习的课程名称有哪些?
SELECT student.sname,GROUP_CONCAT(course.cname)
FROM student
JOIN sc
ON student.sno=sc.sno 
JOIN course
ON sc.cno=course.cno
WHERE student.sname = 'zhang3'
GROUP BY student.sname;

--- 查询oldguo所教课程的平均分数

SELECT teacher.tname ,AVG(sc.score) FROM 
teacher  
JOIN course 
ON teacher.tno=course.tno
JOIN sc 
ON course.cno=sc.cno
WHERE teacher.tname='oldguo'
GROUP BY teacher.tname;

--- 每位老师所教课程的平均分,并按平均分排序

SELECT teacher.tname ,AVG(sc.score) FROM 
teacher  
JOIN course 
ON teacher.tno=course.tno
JOIN sc 
ON course.cno=sc.cno
GROUP BY teacher.tname
ORDER BY AVG(sc.score);

--- 查询oldguo所教的不及格的学生姓名

SELECT teacher.tname,GROUP_CONCAT(student.sname) FROM 
teacher 
JOIN course 
ON teacher.tno=course.tno 
JOIN sc 
ON course.cno=sc.cno 
JOIN student 
ON sc.sno=student.sno 
WHERE teacher.tname='oldguo'  AND sc.score<60
GROUP BY teacher.tname ;

--- 查询所有老师所教学生不及格的信息

SELECT teacher.tname,GROUP_CONCAT(student.sname) FROM 
teacher 
JOIN course 
ON teacher.tno=course.tno 
JOIN sc 
ON course.cno=sc.cno 
JOIN student 
ON sc.sno=student.sno 
WHERE  sc.score<60
GROUP BY teacher.tname ;

别名的使用

-- 表别名

SELECT a.tname,GROUP_CONCAT(d.sname) FROM 
teacher AS a 
JOIN course AS  b 
ON a.tno=b.tno 
JOIN sc AS c 
ON b.cno=c.cno 
JOIN student  AS d 
ON c.sno=d.sno 
WHERE  c.score<60
GROUP BY a.tname ;

-- 列别名

SELECT a.tname AS aa  ,GROUP_CONCAT(d.sname) AS bb FROM 
teacher AS a 
JOIN course AS  b 
ON a.tno=b.tno 
JOIN sc AS c 
ON b.cno=c.cno 
JOIN student  AS d 
ON c.sno=d.sno 
WHERE  c.score<60
GROUP BY a.tname ;

SELECT teacher.tname AS '老师名' ,AVG(sc.score) AS '平均分' FROM 
teacher  
JOIN course 
ON teacher.tno=course.tno
JOIN sc 
ON course.cno=sc.cno
GROUP BY teacher.tname
ORDER BY 平均分;

相关文章

  • SQL语句常用命令整理---多表查询

    多表查詢之关连查询 多表数据连接查询,简称连接查询。本篇我们来一同学习多表连接查询的相关用法,主要內容有: 内连接...

  • MySQL 基础 6 多表查询

    1.1 多表查询的概述 1.1.1 多表查询的分类 1.1.1.1连接查询 交叉连接:cross join交叉连接...

  • 003 多表查询, 事务和DCL.

    多表查询 多表查询: 笛卡尔积.内连接查询隐式内连接 : 使用where.eg: select * from ...

  • Fourth Day

    /-----------------------------------多表连接查询---------------...

  • Oracle详解(Ⅱ):世界上目前已知最好的关系型数据库

    多表查询 多表连接基本查询 使用一张以上的表做查询就是多表查询 这样会出现的结果就是:笛卡儿积连接查询的时候一般在...

  • Oracle连接_子查询

    多表查询:多张表关联在一起进行查询,在多表查询中会频繁的使用表的别名。连接:内连接(等值连接):select 列名...

  • 2018-08-30

    今天学习了Oracle的多表连接,组函数,分组查询,子查询,常用函数。 多表连接有三种类型:内连接,外连接,自连接...

  • SQL-连接查询

    连接查询 又叫:多表查询、多表连接含义:当查询的子都啊来自多个表时,就会用到连接查询 笛卡尔乘积现象:表1有m行,...

  • python面试题01

    1、什么是多表关联查询,有几种多表关联的查询方式,分别是什么? 多表关联查询概念: 多表关联查询分类:1.1内连接...

  • MySQL元数据获取基础笔记day05

    多表连接查询 1、作用 业务需要的数据来自多张表时 2、多表连接查询基本语法 ??内连接? 外链接全链...

网友评论

      本文标题:多表连接查询

      本文链接:https://www.haomeiwen.com/subject/lfllqktx.html