详解MySQL数据库--多表查询--内连接,外连接,子查询,相关子查询
作者:Mis相遇 发布时间:2024-01-24 05:20:34
多表查询
使用单个select 语句从多个表格中取出相关的查询结果,多表连接通常是建立在有相互关系的父子表上;
1交叉连接
第一个表格的所有行 乘以 第二个表格中的所有行,也就是笛卡尔积
创建一个消费者与顾客的表格:
代码如下:
-- create table customers(
-- id int primary key auto_increment,
-- name VARCHAR(20)not null,
-- address VARCHAR(20)not NULL
-- );
-- CREATE table orders(
-- order_namre VARCHAR(20) primary key,
-- num char(20) not NULL,
-- price int not null,
-- customers_id int,
-- constraint cus_ord_fk FOREIGN key(customers_id) REFERENCES customers(id)
-- )
自己插入数据即可。
语法:
隐式语法(不使用关键字): select * from customers,orders;
运行结果如下:
显式语法(使用关键字):select * from customers c INNER JOIN orders o ON c.id=o.customer_id;
两个运行结果一样,但是笛卡尔积有错误,下面的方法进行修正
2内连接
因为交叉连接获得的结果集是错误的。因此内连接是在交叉连接的基础上
只列出连接表中与连接条件相匹配的数据行,匹配不上的记录不会被列出。
语法:
隐式语法:
select * from customers,orders where customers.id=orders.customers_id;
显式语法:
select * from customers c INNER JOIN orders o ON c.id=o.customer_id;
运行结果如下
我们还可以给程序起别名:
代码如下:
select * from customers as c,orders o where c.id=o.customers_id;
SELECT * from customers as c inner join orders o on c.id=o.customers_id;
3外连接
内连接只列出所有购买过商品的用户的信息,不会列出没有购买商品用户。
而外链接是以一张表为基表,其他表信息进行拼接,如果有就拼接上,如果没有显示null; 外链接分为左外连接和右下连接。
左外连接: 以关键字左边的表格为基表进行拼接
语法:
select * from customers c LEFT JOIN orders o ON c.id=o.customer_id;
右外连接: 以关键字右边的表格为基表
语法:
select * from orders o RIGHT JOIN customers c ON c.id=o.customer_id;
4子查询
某些情况下,当进行查询的时候,需要的条件是另外一个select语句的结果,这个时候就会用到子查询,为了给主查询(外部查询) 提供数据而首先执行的查询(内部查询)被叫做子查询; 子查询分为嵌套子查询和相关子查询。
嵌套子查询:
内部查询的执行独立于外部查询,内部查询仅执行一次,执行完毕后将结果作为外部查询的条件使用(嵌套子查询中的子查询语句可以拿出来单独运行。)
语法及练习: 查询出id为1的老师教过的所有学生。
select * from students where id in(select s_id from teacher_student where t_id=1);
相关子查询:
内部查询的执行依赖于外部查询的数据,外部查询每执行一次,内部查询也会执行一次。每一次都是外部查询先执行,取出外部查询表中的一个元组,将当前元组中的数据传递给内部查询,然后执行内部查询。根据内部查询执行的结果,判断当前元组是否满足外部查询中的where条件,若满足则当前元组是符合要求的记录,否则不符合要求。然后,外部查询继续取出下一个元组数据,执行上述的操作,直到全部元组均被处理完毕。
创建三个表格
练习1. 查询出id为1的老师教过的所有学生。
– 创建老师表
create table teacher1(
id int primary key auto_increment,
name char(20) not NULL,
subject char(20) not null
);
– 创建学生表
create table student1(
id int primary key auto_increment,
name char(20) unique not null,
age int null
);
– 创建第三个表格
create table tea_stu(
id int PRIMARY KEY,
name char(20),
t_id int,
s_id int,
score int not null,
constraint teacher1_id_fk foreign key(t_id) references teacher1(id),
constraint student_id_fk foreign key(s_id) references student1(id)
);
练习1. 查询出id为1的老师教过的所有学生。
做法1 用分开的方法写出来:
select s_id from tea_stu where t_id=1;
select * from student1 where id in(2,3);
做法2:
select * from student1 where id in(select s_id from tea_stu where t_id=1);
相关子查询:
内部查询的执行依赖于外部查询的数据,外部查询每执行一次,内部查询也会执行一次。每一次都是外部查询先执行,取出外部查询表中的一个元组,将当前元组中的数据传递给内部查询,然后执行内部查询。根据内部查询执行的结果,判断当前元组是否满足外部查询中的where条件,若满足则当前元组是符合要求的记录,否则不符合要求。然后,外部查询继续取出下一个元组数据,执行上述的操作,直到全部元组均被处理完毕。
求:每一科考试成绩大于平均分的学生的分数。
select * from tea_stu as a where a.score>(select avg(b.score) from tea_stu as b where a.s_id=b.s_id);
以上所述是小编给大家介绍的MySQL多表查询详解整合网站的支持!
来源:https://blog.csdn.net/python20180218/article/details/89192518


猜你喜欢
- 前言接口在面向对象编程中是经常使用的招式,也是体现多态很重要的手段。是的。Golang中也有接口这玩意儿。1.为什么需要接口?多数情况下,数
- 前言大家都知道Web运维总要关注相关域名的实时2xx/s、4xx/s、5xx/s、响应时间、带宽等这些指标,之前的日志是五分钟一分割,简单的
- 在JavaScript中,数组本质上是一种特殊的对象,它的类型值会返回 object。如果我们需要比较两个数组是否相等,不能像比较基本类型(
- 目录一,python介绍二.python的安装程序三、变量python基础部分学习一,python介绍python的创始人为吉多·范罗苏姆(
- 如果你写一个 bug 管理系统,用了这个 PeriodLimit 你就可以限制每个测试人员每天只能给你提一个 bug。工作是不是就轻松很多了
- 关于权限管理的思考最近用laravel设计后台,后台需要有个权限管理。权限管理实质上分为两个部分,首先是认证,然后是权限。认证部分非常好做,
- 将音频文件拷贝到程序所在目录即可。如下所示:#!/usr/bin/env python# encoding: utf-8"&quo
- 给每一个onClick再附加一个事件 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HT
- 使用python进行程序编写时,经常会使用第三方模块包。这种包我们可以通过python setup install 进行安装后,通过impo
- 注:使用的是Python 2.7。一个简单实现class Foo(object): __instance
- 文 | 李晓飞来源:Python 技术「ID: pythonall」最近有了一个新任务,需要将赛事视频,拆分成两分钟以内的小段,用
- 我就废话不多说了,大家还是直接看代码吧!### 以下链接里面的codeimport numpy as npfrom keras.callba
- 新建项目时,选择新建虚拟环境项目打开后,启动终端,却经常发现,并没有开启虚拟环境,导致一些包都被安装到全局环境中。一种解决办法是手动开启虚拟
- 一、基础第三方库使用1.基本使用方法"""例"""from urllib imp
- 养成良好的编码习惯,一个合格的程序员需要掌握一些编写单元测试的能力。单元测试也可以整体上提升我们的代码质量,这里介绍下 VUE 组件的单元测
- python自带了日志模块logging,可以用来记录程序运行过程中的日志信息。同时python还有logbook模块用来取代logging
- 有一些问题可能会遇到同元素多列去重问题,下面介绍一种非常简单效率也很快的做法,用pandas来实现。首先我们看一下数据类型:G1 G2a b
- 1.列表元素删操作的方法列表的删操作指的是在列表中删除已存在的元素,列表中的元素被删除后,后面所有的元素依次往前移动一位,挂在被删除元素的索
- 本文实例为大家分享了php微信公众号获取位置信息的具体代码,供大家参考,具体内容如下<?php/** * wechat php tes
- 1. 介绍灰度切割:增强特定范围的对比度,突出图像 * 定范围的亮度(灰度级分层也叫灰度切割)实现灰度切割的方法有很多种,但基本的方法就两种,