Mysql基础:联表查询(joinON),表的自连接查询,分页和排序

Mysql基础:联表查询(joinON),表的自连接查询,分页和排序

多表查询本质(图解)

展开(图解)

联表查询,7种join对比:

1.1 inner/right/left join对比

-- 联表查询

-- join 对比

-- 表中数据不够了加了一些

insert into `result`(`studentno`,`subjectno`,`examdate`,`studentresult`)

values

(1001,1,'2013-11-11 16:00:00',85),

(1001,2,'2013-11-12 16:00:00',70),

(1001,3,'2013-11-11 09:00:00',68),

(1001,4,'2013-11-13 16:00:00',98),

(1001,5,'2013-11-14 16:00:00',58),

(1002,1,'2013-11-11 16:00:00',85),

(1002,2,'2013-11-12 16:00:00',70),

(1002,3,'2013-11-11 09:00:00',68),

(1002,4,'2013-11-13 16:00:00',98),

(1002,5,'2013-11-14 16:00:00',58),

(1003,1,'2013-11-11 16:00:00',85),

(1003,2,'2013-11-12 16:00:00',70),

(1003,3,'2013-11-11 09:00:00',68),

(1003,4,'2013-11-13 16:00:00',98),

(1003,5,'2013-11-14 16:00:00',58);

-- 查询参加了考试的同学(学号,姓名,科目编号,分数)

SELECT * FROM result

SELECT * FROM student

-- 分析

-- 1.分析查询字段来自那些表(连接查询)

-- 确定使用哪种连接查询? 7种

-- 确定交叉,学生表studentno=成绩表studentno

-- inner join

SELECT s.studentno,studentname,subjectno,studentresult

FROM student AS s

INNER JOIN result AS r

WHERE s.studentno=r.studentno

-- right join

SELECT s.studentno,studentname,subjectno,studentresult

FROM student AS s

RIGHT JOIN result r -- AS可写可不写

ON s.studentno=r.studentno

-- left join

SELECT s.studentno,studentname,subjectno,studentresult

FROM student AS s

LEFT JOIN result r -- AS可写可不写

ON s.studentno=r.studentno

操作

描述

inner join

如果表中至少有一个匹配,就会返回值,当两张表有同样的列时,需在语句种确定,返回那张表的值

right join

会从左表中返回所有的值,即使右表中没有匹配

left join

会从右表中返回所有的值,即使左表中没有匹配

1.2多表查询练习

-- 查询缺考的同学

-- UPDATE result SET studentresult=NULL

-- WHERE studentno=1003 and subjectno=5

SELECT s.studentno,studentname,subjectno,studentresult

FROM student AS s

LEFT JOIN result r -- AS可写可不写

ON s.studentno=r.studentno

WHERE studentresult is NOT NULL

-- 注意

-- join(连接的表) on (判断条件)连接查询

-- where 等值查询

-- 思考题(查询参加考试的同学信息:学号,学生姓名,科目名,分数),三表查询

SELECT s.studentno,studentname,subjectname,studentresult

FROM student AS s

RIGHT JOIN result r -- AS可写可不写

ON s.studentno=r.studentno

-- where studentresult is not NULL

INNER JOIN `subject` sub

ON r.subjectno=sub.subjectno

-- 总结,当有多张表查询是,应先查询两张表然后再慢慢增加

1.3自连接

本质:自己的表和自己的表连接,核心:一张表拆成两张一样的表即可

eg:

父类

categoryid

categoryname

2

信息技术

3

软件开发

5

美术设计

子类

pid

categoryid

categoryname

3

4

数据库

2

8

办公信息

3

6

web开发

5

7

美术设计

操作:查询父类对应子类的关系

父类

子类

信息技术

办公信息

软件开发

数据库

软件开发

web开发

美术设计

ps

-- ================自连接================

-- 创建新表,插入数据

CREATE TABLE category(

categoryid INT(10) UNSIGNED not NULL auto_increment COMMENT '主题id',

pid INT(10) NOT NULL COMMENT '父id',

categoryname VARCHAR(50) NOT NULL COMMENT '主题名字',

PRIMARY KEY(categoryid)

)ENGINE=INNODB DEFAULT charset=utf8;

INSERT into category (categoryid,pid,categoryname)

VALUES('2','1','信息技术'),

('3','1','软件开发'),

('4','3','数据库'),

('5','1','美术设计'),

('6','3','web开发'),

('7','5','ps技术'),

('8','2','办公信息');

-- 自己 的表和自己的表连接,核心:一张表拆成两张一样的表即可

-- 查询父子信息

SELECT a.categoryname AS '父栏目',b.categoryname as '子栏目'

from category AS a, category AS b

WHERE a.categoryid=b.pid

SELECT * FROM category

-- 练习:查询学员所属的年纪(学号,学生姓名,年纪名称)

SELECT studentno,studentname,gradename

from student s

INNER JOIN grade g

ON s.gradeid=g.gradeid

-- 练习:查询科目所属的年级(科目名称,年级名称)

SELECT subjectname,gradename

FROM `subject` s

INNER JOIN grade g

ON s.gradeid=g.gradeid

-- 思考题(查询参加数据库结构-1考试的同学信息:学号,学生姓名,科目名,分数),

SELECT s.studentno,studentname,subjectname,studentresult

FROM student s

INNER JOIN result r

ON s.studentno=r.studentno

INNER JOIN `subject` sub

ON sub.subjectno=r.subjectno

WHERE subjectname='高等数学-1'

SELECT * FROM grade

SELECT * FROM `subject`

SELECT * FROM result

SELECT * FROM student

1.4分页(limit)和排序(order by)

-- ===========分页(limit)和排序(order by)========

-- 升序ASC,降序DESC

-- 排序

-- 查询结果根据成绩降序排

SELECT s.studentno,studentname,subjectname,studentresult

FROM student s

INNER JOIN result r

ON s.studentno=r.studentno

INNER JOIN `subject` sub

ON sub.subjectno=r.subjectno

WHERE subjectname='高等数学-1'

ORDER BY studentresult DESC

-- 分页,缓解数据库压力,给人体验更好,瀑布流

-- 分页,每页只显示3条数据

-- 语法:limit 起始值,页面大小

SELECT s.studentno,studentname,subjectname,studentresult

FROM student s

INNER JOIN result r

ON s.studentno=r.studentno

INNER JOIN `subject` sub

ON sub.subjectno=r.subjectno

WHERE subjectname='高等数学-1'

ORDER BY studentresult DESC

LIMIT 3,3

-- 分页总结:【pagesize:页面大小,起始值=(n-1)*pagesize】

-- 【n:当前页】,【页面总数/页面大小=总页数】

总结题

-- 思考题:查询高等数学-1,课程成绩排在前三的学生,并且分数大于80的学生信息(学号,姓名,课程名称,分数)

SELECT s.studentno,studentname,subjectname,studentresult

FROM student s

INNER JOIN result r

ON s.studentno=r.studentno

INNER JOIN `subject` sub

ON r.subjectno=sub.subjectno

WHERE subjectname='高等数学-1' AND studentresult>=80

ORDER BY studentresult DESC

LIMIT 0,3

相关推荐

多久属于库存管理期啊(法律上多久算库存货)
365足球平台入口

多久属于库存管理期啊(法律上多久算库存货)

📅 07-22 👁️ 6971
盐城办理建筑焊工证在哪里(如何在盐城办理建筑焊工证)
音频驱动程序枚举 - Windows drivers
365足球平台入口

音频驱动程序枚举 - Windows drivers

📅 07-07 👁️ 9026
尼日利亚16年首度无缘世界杯决赛,球迷下场群殴球员、暴拆球场…
企业到底需要什么样的芯片设计服务?深挖三大需求
365提现流水不足

企业到底需要什么样的芯片设计服务?深挖三大需求

📅 07-14 👁️ 9106
被 YY语音 黄马 封了 IP和ID 怎么办?  三分钟就可以解决了