MySQL - 数据查询_联合查询_内连接查询(函数查询、多表连接查询和子查询)

联合查询

1. 内连接查询

在实际开发中,我们会联合多个表来实现查询,比如把班级表和学生表联合起来就同时可以看到班级、老师和学员的信息,一个班级表
MySQL - 数据查询_联合查询_内连接查询(函数查询、多表连接查询和子查询)_第1张图片
一个班级对应着多个学生,以下是与之对应的学生表”:
MySQL - 数据查询_联合查询_内连接查询(函数查询、多表连接查询和子查询)_第2张图片
将两个表中ID 相同的记录关联起来组成一个新的“列表”,这就是联合查询:
在这里插入图片描述
这种只有2张表匹配的行才能显示的连接方式在Mysql 中称之为内连接: INNER JOIN

在MySQL中内连接数据查询通过“INNER JOIN…ON”语句来实现,语法形式如下所示。

SELECT field1,field2,…,fieldn FROM tablename1
INNER JOIN tablename2 [INNER JOIN tablenamen] ON CONDITION

其中,参数fieldn表示要查询的字段名,来源于所连接的表tablename1和tablename2,关键字INNER JOIN表示表进行内连接,参数CONDITION表示进行匹配的条件。

mysql>  create database school;   #创建数据库school                                
mysql>  use school;   #选择数据库school                                           
mysql>  CREATE TABLE class (                                                        
  `id` int NOT NULL AUTO_INCREMENT,                                              
  `name` varchar(128) DEFAULT NULL,                                               
  `teacher` varchar(64) DEFAULT NULL,                                               
  UNIQUE KEY `id` (`id`)                                                              
);  #创建班级表 class                                                                 
mysql> insert into class values(101, '萌新一班', 'Martin'),(102, '萌新二班', 'Rock'),(103, '萌新三班', 'Janny');  #创建成绩表 grade                                                 
mysql>  CREATE TABLE `student` (                                                  
  `id` int NOT NULL AUTO_INCREMENT UNIQUE,                                                            
  `name` varchar(64) DEFAULT NULL,                                                
  `class_id` int DEFAULT NULL,                                                      
  `sex` enum('F','M') DEFAULT NULL                                                  
);                                                                                   
mysql> insert into student values(1,'小花',101,'M'),(2,'小红',102, 'F'),(3,'小军',102,'F'),(4,'小白',101,'F');  #插入多条记录   
mysql> select * from class  inner join student  on class.id = student.class_id;  #查询class 表和student 表中班级字段相同的记录并进行内连接  
mysql> select * from class as a inner join student as b where a.id = b.class_id; #同上,使用别名查询

当表名特别长时,直接使用表名很不方便,或者在实现自连接操作时,直接使用表名无法区别表。为了解决这一类问题,MySQL提供了一种机制来为表取别名,具体语法如下:

SELECT field1, field2, ...,fieldn [AS] otherfieldn 
FROM tablename1 [AS] othertablename1, ...,
Tablenamen [AS] othertablenamen ... where othertablename1.fieldx = 
othertablenamen.fieldx ... ;

其中,参数tablename为表原来的名字,参数othertablename为新表名,之所以要为表设置新的名字,是为了让SQL语句代码更加直观、更加人性化和实现更加复杂的功能。

自连接

内连接查询中存在一种特殊的等值连接——自连接。所谓自连接,就是指表与其自身进行连接。
如:查询学生 ”小红 ”所在班级的其他学生,SQL语句如下:

mysql>  use school; #选择数据库school
mysql>  select t1.id, t1.name, t1.class_id from student t1 inner join student t2 on t1.class_id = t2.class_id and t2.name= '小红';  #查询学生 ”小红 ”所在班级的其他学生

MySQL - 数据查询_联合查询_内连接查询(函数查询、多表连接查询和子查询)_第3张图片

等值连接

内连接查询中的等值连接就是在关键字ON后的匹配条件中通过等于关系运算符(=)来实现等值条件。

mysql> select * from class as a inner join student as b where a.id = b.class_id; 

MySQL - 数据查询_联合查询_内连接查询(函数查询、多表连接查询和子查询)_第4张图片

不等值连接

内连接查询中的不等连接就是在关键字ON后的匹配条件中通过除了等于关系运算符来实现不等条件外,还可以使用关系运算符,包含“>”“>=”“<”“<=”和“!=”等运算符号。

mysql> select * from class as a inner join student as b where a.id != b.class_id;

MySQL - 数据查询_联合查询_内连接查询(函数查询、多表连接查询和子查询)_第5张图片

具体操作

MySQL - 数据查询_联合查询_内连接查询(函数查询、多表连接查询和子查询)_第6张图片
MySQL - 数据查询_联合查询_内连接查询(函数查询、多表连接查询和子查询)_第7张图片
MySQL - 数据查询_联合查询_内连接查询(函数查询、多表连接查询和子查询)_第8张图片
MySQL - 数据查询_联合查询_内连接查询(函数查询、多表连接查询和子查询)_第9张图片
别名
MySQL - 数据查询_联合查询_内连接查询(函数查询、多表连接查询和子查询)_第10张图片
MySQL - 数据查询_联合查询_内连接查询(函数查询、多表连接查询和子查询)_第11张图片
MySQL - 数据查询_联合查询_内连接查询(函数查询、多表连接查询和子查询)_第12张图片
MySQL - 数据查询_联合查询_内连接查询(函数查询、多表连接查询和子查询)_第13张图片
MySQL - 数据查询_联合查询_内连接查询(函数查询、多表连接查询和子查询)_第14张图片
MySQL - 数据查询_联合查询_内连接查询(函数查询、多表连接查询和子查询)_第15张图片

结语:

时间: 2020-07-12

你可能感兴趣的:(MySQL)