MySQL联表查询之连接和子查询

Posted 5ran2yl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL联表查询之连接和子查询相关的知识,希望对你有一定的参考价值。

一.连接

内连接:

内连接一共有两种方式:

隐式内连接:

select  字段名 from  表1,表2  where  条件 .....;

显式内连接:

select  字段名 from  表1 [inner]  join 表2  on  连接条件 ;

 内连接就是查询绿色部分,也就是两张或多张表相同的地方

最多的就是等值连接

外连接:

左外连接:

select 字段列表 from  表1 left join 表2  on 条件 .....;

上图中: A 蓝色区域

右外连接:

select 字段列表 from  表1 right join 表2  on 条件 .....;

上图中: B黄色区域

自连接:

自连接,就如它的名字一样,就是一张表自己连接自己,在自连接中一定要为表名取别名,这样才知道条件中事那个表的字段

select 字段列表  from  表A  as  a  jion  表A   as b   on  条件.....;

联表查询例子:

 

二.联合查询

联合查询指的是使用两个sql 去查询两张表,然后拼接成一次结果集返回

关键字:

union  : 拼接的结果去重

union  all:拼接的结果不去重

select  字段列表  from  表 1 ..... 

union

select  字段列表  from  表 2 ..... 

注意:查询出来的结果集字段属性一定是要一样的,不然是拼接不了的

三.子查询

在sql语句中嵌套 select语句成为子查询

子查询语句可以被嵌套到 delete,update,insert ,select 语句中,不仅仅是只能嵌套到select 语句中

select  字段列表  from  表1 where  colum = (select  colum from  表2)

标量子查询:

子查询返回的值是单个值(数据,字符串,日期),这些最简单的形式

常用的操作符:  =   ,  <> ,  >  ,  >=  , <  ,  <=

列子查询:

子查询返回的值是一列

常用的操作符:

in :在范围内

not  in:不在范围内

any :有一个满足即可

some:与any 相同

all:所有返回值必须全部相同

行子查询:

子查询返回值的是一行

常用的操作符:

=  , <>  ,  IN  ,  NOT  IN

表子查询:

子查询返回的结果是多行多列,相当于一个小子表

常用操作符:IN

 

MySQL——联表查询

1.1、JOIN 对比

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

思路:

  1. 分析需求,分析查询的字段来自哪些表,(连接查询)
  2. 确定使用哪种连接查询? 7种
  3. 确定交叉点(这两个表中哪个数据是相同的)
  4. 判断的条件:学生表的中 studentNo = 成绩表 studentNo
操作 描述
Inner join 如果表中至少有一个匹配,就返回行
left join 会从左表中返回所有的值,即使右表中没有匹配
right join 会从右表中返回所有的值,即使左表中没有匹配

1.2.1、Inner Join

SELECT s.studentNO,studentName,SubjectNo,StudentResult
FROM student AS s
INNER JOIN result AS r
ON s.studentNO = r.studentNO

1.2.2、Right Join

SELECT s.studentNO,studentName,SubjectNo,StudentResult
FROM student s
RIGHT JOIN result r
ON s.studentNO = r.studentNO

1.2.3、Left Join

SELECT s.studentNO,studentName,SubjectNo,StudentResult
FROM student s
LEFT JOIN result r
ON s.studentNO = r.studentNO

1.3、查询参加考试的同学(学号,学生姓名,科目名,分数)

如果存在多张表关联查询思路:

  1. 我要查询哪些数据 select ...
  2. 从那几个表中查 FROM 表 XXX Join 连接的表 on 交叉条件
  3. 假设存在一种多张表查询,慢慢来,先查询两张表然后再慢慢增加
SELECT s.studentNo,studentName,SubjectName,`StudentResult`
FROM student s
RIGHT JOIN result r
ON r.studentNo = s.studentNo
INNER JOIN `subject` sub
ON r.SubjectNo = sub.SubjectNo

效果:

1.4、自连接

自己的表和自己的表连接

核心:一张表拆为两张一样的表即可,设计出Demo

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 AUTO_INCREMENT=9 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\',\'办公信息\');

效果:

分析:

父类

categoryid categoryName
2 信息技术
3 软件开发
5 美术设计

子类

pid categoryid categoryName
3 4 数据库
2 8 办公信息
3 6 web开发
5 7 ps技术

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

父类 子类
信息技术 办公信息
软件开发 数据库
软件开发 web开发
美术设计 ps技术

查询父子信息: 把一张表看为两个一模一样的表:

SELECT a.`categoryName` AS \'父栏目\',b.`categoryName` AS \'子栏目\'
FROM `category` AS a,`category` AS b
WHERE a.`categoryid` = b.`pid`

效果:

1.5、联表查询的练习

1、查询学生所属的年级

SELECT studentNo,studentName,`GradeName`
FROM student s
INNER JOIN `grade` g
ON s.`GradeID` = g.`GradeID`

效果:

2、查询科目所属的年级 (科目名称,年级名称)

SELECT `SubjectName`,`GradeName`
FROM `subject` sub
INNER JOIN `grade` g
ON sub.`GradeID` = g.`GradeID`

效果:

3、查询了参加 数据库结构-1 考试的同学信息

-- 查询了参加 数据库结构-1 考试的同学信息: 学号,学生姓名,科目名,分数
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\'

效果:

以上是关于MySQL联表查询之连接和子查询的主要内容,如果未能解决你的问题,请参考以下文章

mysql_联表查询和自查询

MySQL——联表查询

mysql联表查询

oracle之连接查询和子查询

java学习笔记之mysql3

mysql中,如何向测试人员介绍连接查询和子查询的优劣势?