mysql的多表查询

对于mysql在生活中的应用,使用的最多的就是查,你的每次浏览都可能是对mysql数据的一次查询,

因此mysql数据查询的方式非常多样化,尤其是对于多表联合查询。

现在给出三张表,后面的操作都是在这三张表上进行的。

表一:学生信息表(student_info)

mysql> select * from student_info;
+----+-----------+------+
| id | name      | sex  |
+----+-----------+------+
|  1 | 科比      | 男   |
|  2 | 毛线      | 女   |
|  3 | 黄鱼      | 男   |
|  4 | 子栋      | 男   |
|  5 | 子豪      | 女   |
|  6 | 小鸟      | 男   |
|  7 | 星爷      | 男   |
|  8 | 戴鹏      | 男   |
|  9 | 秦子琪    | 女   |
+----+-----------+------+
9 rows in set (0.00 sec)

student_info

表二:学生地址表(student_addr)

mysql> select * from  student_addr;
+--------+--------------+
| name   | addr         |
+--------+--------------+
| 科比   | 湖北罗田     |
| 小鸟   | 湖北襄阳     |
| 子豪   | 江苏扬州     |
| 毛线   | 湖北孝感     |
| 子栋   | 湖北洪湖     |
| 黄鱼   | 湖北罗田     |
+--------+--------------+
6 rows in set (0.00 sec)

student_addr

表二:学生成绩表(student_score)

mysql> select * from student_score;
+--------+-------+-------+--------+
| name   | MYSQL | LIUNX | python |
+--------+-------+-------+--------+
| 科比   |    56 |    87 |     74 |
| 毛线   |    87 |    95 |     78 |
| 小鸟   |    60 |    78 |     87 |
| 子豪   |    54 |    67 |     57 |
| 子栋   |    90 |    95 |     94 |
| 黄鱼   |    78 |    69 |     90 |
| 星爷   |    24 |    45 |     42 |
+--------+-------+-------+--------+
7 rows in set (0.00 sec)

student_score

1.使用select语句直接多表查询(取交集)

语法:SELECT 字段名 FROM 表1,表2......WHERE 表1.字段 = 表2.字段 AND 其它条件

两张表查询:

mysql> select student_info.id,student_info.name,student_info.sex,student_addr.addr
    -> from student_info,student_addr
    -> where student_info.name = student_addr.name;

mysql> select student_info.id,student_info.name,student_info.sex,student_addr.addr
    -> from student_info,student_addr
    -> where student_info.name = student_addr.name;
+----+--------+------+--------------+
| id | name   | sex  | addr         |
+----+--------+------+--------------+
|  1 | 科比   | 男   | 湖北罗田     |
|  2 | 毛线   | 女   | 湖北孝感     |
|  3 | 黄鱼   | 男   | 湖北罗田     |
|  4 | 子栋   | 男   | 湖北洪湖     |
|  5 | 子豪   | 女   | 江苏扬州     |
|  6 | 小鸟   | 男   | 湖北襄阳     |
+----+--------+------+--------------+
6 rows in set (0.00 sec)
#结果取交集

双表查询结果

三表查询:

mysql> select student_info.id,student_info.name,student_addr.addr,student_score.python
    -> from student_info,student_addr,student_score
    -> where student_info.name = student_addr.name and  student_addr.name = student_score.name;

mysql> select student_info.id,student_info.name,student_addr.addr,student_score.python
    -> from student_info,student_addr,student_score
    -> where student_info.name = student_addr.name and  student_addr.name = student_score.name;
+----+--------+--------------+--------+
| id | name   | addr         | python |
+----+--------+--------------+--------+
|  1 | 科比   | 湖北罗田     |     74 |
|  2 | 毛线   | 湖北孝感     |     78 |
|  3 | 黄鱼   | 湖北罗田     |     90 |
|  4 | 子栋   | 湖北洪湖     |     94 |
|  5 | 子豪   | 江苏扬州     |     57 |
|  6 | 小鸟   | 湖北襄阳     |     87 |
+----+--------+--------------+--------+
6 rows in set (0.00 sec)

三表查询结果

不管是几张表都可以用这种方式来进行查询,查询的结果取交集。

小技巧:表名太多太长,可以使用别名查询;

#使用别名
mysql> select a.id,a.name,a.sex,b.addr  from student_info a,student_addr b
    ->  where a.name = b.name;

mysql> select a.id,a.name,a.sex,b.addr  from student_info a,student_addr b
    ->  where a.name = b.name;
+----+--------+------+--------------+
| id | name   | sex  | addr         |
+----+--------+------+--------------+
|  1 | 科比   | 男   | 湖北罗田     |
|  2 | 毛线   | 女   | 湖北孝感     |
|  3 | 黄鱼   | 男   | 湖北罗田     |
|  4 | 子栋   | 男   | 湖北洪湖     |
|  5 | 子豪   | 女   | 江苏扬州     |
|  6 | 小鸟   | 男   | 湖北襄阳     |
+----+--------+------+--------------+
6 rows in set (0.12 sec)

别名查询

2.合并多个结果集(union和union all)

在SQL语句中,可以通过union或union all将多个select语句的查询结果合并起来,二者的功能有类似之处,但是也有不同的地方。

在使用union或union all关键字将表合并输出地时候,查询结果必须具有相同的结构并且数据类型必须兼容,另外使用union或union all时两张表的字段数量也必须相同,否则会报错。

需要合并的表:

mysql> select * from student_addr;
+--------+--------------+
| name   | addr         |
+--------+--------------+
| 科比   | 湖北罗田     |
| 小鸟   | 湖北襄阳     |
| 子豪   | 江苏扬州     |
| 毛线   | 湖北孝感     |
| 子栋   | 湖北洪湖     |
| 黄鱼   | 湖北罗田     |
+--------+--------------+
6 rows in set (0.00 sec)

student_addr

mysql> select * from new_student_addr;
+-----------+--------------+
| name      | addr         |
+-----------+--------------+
| 小鸟      | 湖北襄阳     |
| 子豪      | 江苏扬州     |
| 毛线      | 湖北孝感     |
| 子栋      | 湖北洪湖     |
| 周杰      | 湖南常德     |
| 魏武      | 河北保定     |
| 王晨      | 山西晋城     |
| 欧飞龙    | 浙江茂名     |
+-----------+--------------+
8 rows in set (0.00 sec)

new_student_addr

union:利用该关键字可以将多个SELECT语句的查询结果合并输出,并删除重复行。

mysql> select * from student_addr union select * from new_student_addr;
+-----------+--------------+
| name      | addr         |
+-----------+--------------+
| 科比      | 湖北罗田     |
| 小鸟      | 湖北襄阳     |
| 子豪      | 江苏扬州     |
| 毛线      | 湖北孝感     |
| 子栋      | 湖北洪湖     |
| 黄鱼      | 湖北罗田     |    #没有完全重复的两条记录
| 周杰      | 湖南常德     |
| 魏武      | 河北保定     |
| 王晨      | 山西晋城     |
| 欧飞龙    | 浙江茂名     |
+-----------+--------------+
10 rows in set (0.07 sec)

使用union合并

union all:利用该关键字可以将多个SELECCT语句的查询结果合并输出,但不会删除重复的行。

mysql> select * from student_addr union all select * from new_student_addr;
+-----------+--------------+
| name      | addr         |
+-----------+--------------+
| 科比      | 湖北罗田     |
| 小鸟      | 湖北襄阳     |
| 子豪      | 江苏扬州     |
| 毛线      | 湖北孝感     |
| 子栋      | 湖北洪湖     |
| 黄鱼      | 湖北罗田     |
| 小鸟      | 湖北襄阳     |
| 子豪      | 江苏扬州     |
| 毛线      | 湖北孝感     |
| 子栋      | 湖北洪湖     |
| 周杰      | 湖南常德     |
| 魏武      | 河北保定     |
| 王晨      | 山西晋城     |
| 欧飞龙    | 浙江茂名     |
+-----------+--------------+
14 rows in set (0.00 sec)

使用union all合并

3.左连接和右连接

左连接:以join左边的表为主

mysql> select student_info.id, student_info.name, student_info.sex, student_addr.addr
    -> from student_info left join student_addr on student_info.name = student_addr.name;
+----+-----------+------+--------------+
| id | name      | sex  | addr         |
+----+-----------+------+--------------+
|  1 | 科比      | 男   | 湖北罗田     |
|  2 | 毛线      | 女   | 湖北孝感     |
|  3 | 黄鱼      | 男   | 湖北罗田     |
|  4 | 子栋      | 男   | 湖北洪湖     |
|  5 | 子豪      | 女   | 江苏扬州     |
|  6 | 小鸟      | 男   | 湖北襄阳     |
|  7 | 星爷      | 男   | NULL         |
|  8 | 戴鹏      | 男   | NULL         |
|  9 | 秦子琪    | 女   | NULL         |
+----+-----------+------+--------------+
9 rows in set (0.00 sec)

使用左连接做查询

右连接:以join右边的表为主

mysql> select student_info.id, student_info.name, student_info.sex, student_addr.addr
    -> from student_info right join student_addr on student_info.name = student_addr.name;
+------+--------+------+--------------+
| id   | name   | sex  | addr         |
+------+--------+------+--------------+
|    1 | 科比   | 男   | 湖北罗田     |
|    6 | 小鸟   | 男   | 湖北襄阳     |
|    5 | 子豪   | 女   | 江苏扬州     |
|    2 | 毛线   | 女   | 湖北孝感     |
|    4 | 子栋   | 男   | 湖北洪湖     |
|    3 | 黄鱼   | 男   | 湖北罗田     |
+------+--------+------+--------------+
6 rows in set (0.00 sec)
#以join右边的表为主

使用右连接做查询

使用左右连接做三表查询

mysql> select * from (select new.id,new.name,new.sex,new.addr,student_score.MYSQL,student_score.LIUNX,student_score.python
from student_score right join (select student_info.id, student_info.name, student_info.sex, student_addr.addr
from student_info right join student_addr
on student_info.name = student_addr.name) new
on student_score.name = new.name) two order by two.id;
+------+--------+------+--------------+-------+-------+--------+
| id   | name   | sex  | addr         | MYSQL | LIUNX | python |
+------+--------+------+--------------+-------+-------+--------+
|    1 | 科比   | 男   | 湖北罗田     |    56 |    87 |     74 |
|    2 | 毛线   | 女   | 湖北孝感     |    87 |    95 |     78 |
|    3 | 黄鱼   | 男   | 湖北罗田     |    78 |    69 |     90 |
|    4 | 子栋   | 男   | 湖北洪湖     |    90 |    95 |     94 |
|    5 | 子豪   | 女   | 江苏扬州     |    54 |    67 |     57 |
|    6 | 小鸟   | 男   | 湖北襄阳     |    60 |    78 |     87 |
+------+--------+------+--------------+-------+-------+--------+
6 rows in set (0.04 sec)

三表查询

4.嵌套查询

首先阐述两个名词:

内连接:把查询结果作为where子句的查询条件即为内连接;

子查询:子查询是一个select查询,返回的单个值嵌套在其他查询语句之中,任何可以使用表达式的地方都可以使用子查询。

嵌套查询:在一个查询语句中嵌套有另一个完整的查询语句,就称为嵌套查询,嵌套可以是多层。

mysql> select * from student_addr where name in (select name from student_score where python >= 90);
+--------+--------------+
| name   | addr         |
+--------+--------------+
| 子栋   | 湖北洪湖     |
| 黄鱼   | 湖北罗田     |
+--------+--------------+
2 rows in set (0.01 sec)

嵌套查询

时间: 2024-10-09 23:42:00

mysql的多表查询的相关文章

day15(mysql 的多表查询,事务)

mysql之多表查询 1.合并结果集 作用:合并结果集就是把两个select语句查询的结果连接到一起! /*创建表t1*/ CREATE TABLE t1( a INT PRIMARY KEY , b VARCHAR(10) ) INSERT INTO t1 VALUES(1,'a'); INSERT INTO t1 VALUES(2,'b'); INSERT INTO t1 VALUES(3,'c'); /*创建t2*/ CREATE TABLE t2( c INT PRIMARY KEY ,

跟王老师学MySQL:单表查询

跟王老师学MySQL:单表查询 主讲教师:王少华   QQ群号:483773664 学习内容 查询所有字段 查询指定字段 查询指定记录 带in关键字的查询 带between and关键字的查询 带like关键字的查询 查询空值 带and的多条件查询 带or的多条件查询 查询不重复记录 对查询结果进行排序 单表查询是指从一张表中查询所需要的数据.查询数据时,可以从一张表中查询数据,也可以从多张表中同时查询数据.两者的查询方式上有一定的区别.因为单表查询只在一张表上进行操作,所以查询比较简单. 一.

mysql语句2-单表查询

mysql 查询以及多表查询 以下所有表格样例都采用下边这个表格 mysql> select * from benet; +------+------+----------+ | id   | name | nianling | +------+------+----------+ |    3 | a    |       16 | |    4 | b    |       17 | |    3 | a    |       16 | |    5 | b    |       15 |

MySQL之单表查询

一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二.关键字的执行顺序 1.找到表:from 2.拿着where指定的约束条件,去文件/表中取出一条条记录 3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组 4.将分组的结果进行having过滤 5.执行select 6.去重 7.将结果按条件排序:order by 8

MySQL之多表查询

阅读目录 一 多表联合查询 二 多表连接查询 三 复杂条件多表查询 四 子语句查询 五 其他方式查询 六 SQL逻辑查询语句执行顺序(重点) 七 外键约束 八 其他约束类型 九 表与表之间的关系 一.多表联合查询 #创建部门 CREATE TABLE IF NOT EXISTS dept ( did int not null auto_increment PRIMARY KEY, dname VARCHAR(50) not null COMMENT '部门名称' )ENGINE=INNODB D

Mysql数据库多表查询

一.介绍 首先说一下,我们写项目一般都会建一个数据库,那数据库里面是不是存了好多张表啊,不可能把所有的数据都放到一张表里面,肯定要分表来存数据,这样节省空间,数据的组织结构更清晰,解耦和程度更高,但是这些表本质上是不是还是一个整体啊,是一个项目所有的数据,那既然分表存了,就要涉及到多个表连接查询了,比如说员工信息一张表,部门信息一张表,那如果我想让你帮我查一下技术部门有哪些员工的姓名,你怎么办,单独找员工表能实现吗,不能,单独找部门表也无法实现,因为部门表里面没有员工的信息,对不对,所以就涉及到

Mysql数据库单表查询

1.单表查询语法 #查询数据的本质:mysql会到你本地的硬盘上找到对应的文件,然后打开文件,按照你的查询条件来找出你需要的数据.下面是完整的一个单表查询的语法 select * from,这个select * 指的是要查询所有字段的数据. SELECT distinct 字段1,字段2... FROM 库名.表名 #from后面是说从库的某个表中去找数据,mysql会去找到这个库对应的文件夹下去找到你表名对应的那个数据文件,找不到就直接报错了,找到了就继续后面的操作 WHERE 条件 #从表中

Mysql的单表查询

MySQL单表查询 汇总 单表查询的语法及关键字执行的优先级 from 1.找到表:from where 2.拿着where指定的约束条件,去文件/表中取出一条条记录 group by 3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组 select 4.执行select(去重) distinct having 5.将分组的结果进行having过滤 order by 6.将结果按条件排序:order by limit 7.限制结果的显示条数 简单查询 创建表

MySQL数据库 多表查询 交叉连接 自然连接 内连接 自连接 外连接 子查询 多表查询练习 单表查询练习 𚳮

原文: http://blog.gqylpy.com/gqy/466 置顶:来自一名75后老程序员的武林秘籍--必读(博主推荐) 来,先呈上武林秘籍链接:http://blog.gqylpy.com/gqy/401/ 你好,我是一名极客!一个 75 后的老工程师! 我将花两分钟,表述清楚我让你读这段文字的目的! 如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍! 没错,我就是这个老者! 干研发 20 多年了!我也年轻过,奋斗过!我