一、内连接【inner join】

  1. 语法一:select 列名 from 表1 inner join 表2 on 表1.公共字段=表2.公共字段

  2. 语法二:select 列名 from 表1,表2 where 表1.公共字段=表2.公共字段

  3. 注意:显示公共字段需要指定表名,否则会报错

    select stuinfo.stuno,stuname from stuinfo inner join stumarks on stuinfo.stuno=stumarks.stuno;

  4. 三表查询

    select * from 表1 inner join 表2 on 表1.公共字段=表2.公共字段 inner join 表3 on 表2.公共字段=表3.公共字段

二、外连接

  1. 左外连接(left join)

    a. 以左边的表为标准,如果右边的表没有对应的记录,用null填充

    b. 语法:select 列名 from 表1 left join 表2 on 表1.公共字段=表2.公共字段

  2. 右外连接(right join)

    a. 以右边的表为标准,如果左边的表没有对应的记录,用null填充

    b. 语法:select 列名 from 表1 right join 表2 on 表1.公共字段=表2.公共字段    

  3. 交叉连接(cross join)

    a. 如果没有连接表达式返回的事笛卡尔积

      select * from t1 cross join t2;

    b. 如果有连接表达式等价于内连接

      select * from t1 cross join t2 where t1.id=t2.id;

  4. 自然连接(natural join)

    a. 自动地判断连接条件,它是通过同名字段来判断的

    b. 自然连接分为:

      1) 自然内连接:natural join

      2) 自然左外连接 natural left join

      3) 自然右外连接 natural right join

  5. 指定连接字段:using()

    a. using也会对连接字段进行整理,整理方式和自然连接是一致的。

三、子查询

  1. 语法:select 语句 where 条件 (select ... from 表)

  2. 外面的查询称为父查询,括号中的查询称为子查询

  3. 子查询为父查询提供条件

    a. 找出笔试80分的学生

      select * from stuinfo where stuno=(select stuno from stumaks where writtenexam=80);

    b. 找出笔试最高分的一个学生

      select * from stuinfo where stuno=(select stuno from stumaks order by writtenexam desc limit 1);

      select * from stuinfo where stuno=(select stuno from stumarks where writtenexam=(select max(writtenexam) from stumarks));

  4. in | not in 子查询

    a. 用于子查询的返回结果多个值。

    b. 查找笔试成绩及格的同学

      select * from stuinfo where stuno in (select stuno from stumarks where writtenexam >= 60);

    c. 查找不及格的同学

      select * from stuinfo where stuno in (select stuno from stumarks where writtenexam < 60);

    c. 查找没有通过的同学

      select * from stuinfo where stuno not in (select stuno from stumarks where writtenexam >= 60);

  5. exists 和 not exists

    a. 如果有人超过80分就显示所有的学生

      select * from stuinfo where exists (select * from stumarks where writtenexam >= 80);

    b.  如果没有人超过80分就显示所有学生

      select * from stuinfo where not exists (select * from stumarks where writtenexam >= 80);

  6. 子查询分类

    a. 标量子查询:子查询返回的结果只有一个

    b. 列子查询:子查询返回的结果是一个列表

    c. 行列子查询:子查询返回的结果是一行

      ex1:查询成绩最高的男生和女生

        select stuname,stusex,ch from stu where (stusex,ch) in (select stusex,max(ch) from stu group by stusex)

    d. 表子查询:子查询返回的结果当成一个表

      ex1:

        select stuname,stusex,ch from (select * from stu order by ch desc) as t group by stusex;

      注意:from 后面是一个表,如通子查询的结果当成表来看,必须将子查询的结果取别名。

四、union 联合

  1. 作用将多个select语句结果集纵向联合起来

  2. 语法:select 语句 union [选项] select 语句 union [选项] select 语句

    a. select stuno,stuname from stu union select id,name from Go1;

  3. 注意:

    a. union两端的select语句的字段个数必须一致

    b. union两端的select语句字段名可以不一致,最终按第一个select语句的字段名

    c. union两端的select语句中的数据类型可以不一致。

  4. 例题:

    a. 查找上海的男生和北京的女生

      select stuname,stuaddr,stusex from stu where (stuaddr='上海' and stusex='男') or (stuaddr='北京' and stusex='女');

      select stuname,stuaddr,stusex from stu where stuaddr='上海' and stusex='男' union select stuname,stuaddr,stusex from stu where stuaddr='北京' and stusex='女'

  5. union选项

    a. all:显示所有数据

    b. distinct:去除重复数据【默认】

      select name from go1 union all select name from stu;

mysql学习笔记--数据库多表查询的更多相关文章

  1. mysql学习笔记--数据库单表查询

    一.查询语句 1.  select [选项] 列名 [from 表名]  [where 条件]  [order by 排序]  [group by 分组]  [having 条件]  [limit 限 ...

  2. MySQL学习笔记8——多表查询

    多表查询 多表查询 *合并结果集 *连接查询 *子查询 合并结果集 *要求被合并的表中,列的类型和列数相同(实际上是查询的结果集列类型和列数相同即可) *UNION,去除重复行 *UNION ALL, ...

  3. MySQL学习笔记-数据库文件

    数据库文件 MySQL主要文件类型有如下几种 参数文件:my.cnf--MySQL实例启动的时候在哪里可以找到数据库文件,并且指定某些初始化参数,这些参数定义了某种内存结构的大小等设置,还介绍了参数类 ...

  4. MySQL学习笔记-数据库内存

    数据库内存 InnoDB存储引擎内存由以下几个部分组成:缓冲池(buffer pool).重做日志缓冲池(redo log buffer)以及额外的内存池(additional memory pool ...

  5. MySQL学习笔记-数据库后台线程

    数据库后台线程 默认情况下讲述的InnoDB存储引擎,以后不再重复声明.后台线程有7个--4个IO thread,1个master thread,1个锁监控线程,1个错误监控线程.IO thread的 ...

  6. Mybatis学习笔记之---多表查询(1)

    Mybatis多表查询(1) (一)举例(用户和账户) 一个用户可以有多个账户 一个账户只能属于一个用户(多个账户也可以属于同一个用户) (二)步骤 1.建立两张表:用户表,账户表,让用户表和账户表之 ...

  7. Mybatis学习笔记之---多表查询(2)

    Mybatis多表查询(2) (一)举例 用户和角色 一个用户可以有多个角色,一个角色可以赋予多个用户 (二)步骤 1.建立两张表:用户表,角色表,让用户表和角色表具有多对多的关系.需要使用中间表,中 ...

  8. Oracle学习笔记_04_多表查询

    一.概念: 1.多表连接有以下几种分法: (1)内连接           vs          外连接 (左.右.满) (2)等值连接        vs         不等值连接 (3)非自连 ...

  9. MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)

    mysql> create table test5( -> id int, ) -> )engine myisam charset utf8; Query OK, rows affe ...

随机推荐

  1. Python 网站后台扫描脚本

    Python  网站后台扫描脚本 #!/usr/bin/python #coding=utf-8 import sys import urllib import time url = "ht ...

  2. docker 搭建 hustoj

    docker 搭建 hustoj hustoj 是个GPL开源的OJ,其提供了docker形式的安装方式. 为执行方便,选择使用aliyun提供的docker镜像来加速安装. 拉取镜像 docker ...

  3. let const区别!

    这次做项目在申明变量的时候用到let const 总结下这两个区别 : 首先 let与const都是只在声明所在的块级作用域内有效. let声明的变量可以改变,值和类型都可以改变,没有限制.const ...

  4. PADS导入DXF板框,不能将开放的2D线转换成闭合的板框错误

    刚开始学会用PADS,学习的时候都是在PADS里手绘一个板框的.然后实际项目中,都是需要导入结构DXF板框文件,第一次导入就发现了问题. 第一次导入DXF后,需要将DXF转换为板框,但提示 “不能将开 ...

  5. intellij idea 相关设置

    IDEA这么高端的工具之前只是断断续续使用了一下,因为项目的开发都是在eclipse上,每次学习IDEA的使用都得上网搜索半天,今天自己整理一下,方便以后查阅. IDEA版本15.0.4 字体 界面字 ...

  6. 用matplotlib.pyplot画简单的折线图,直方图,散点图

    #coding=utf-8 """ 用matplotlib.pyplot画简单的折线图,直方图,散点图 """ import matplot ...

  7. OO第二单元(电梯)单元总结

    OO第一单元(求导)单元总结 这是我们OO课程的第二个单元,这个单元的主要目的是让我们熟悉理解和掌握多线程的思想和方法.这个单元以电梯为主题,从一开始的最简单的单部傻瓜调度(FAFS)电梯到最后的多部 ...

  8. windows快速搭建FTP工具Serv-U FTP Server

    本文介绍一个简单的FTP工具,当然windows系统自带FTP工具,但是配置方法没有第三方工具来的简单可操作性好. 此工具用于搭建FTP环境,对于需要测试FTP上传功能具有极大帮助.例如球机抓拍图片上 ...

  9. python-Djando项目搭建

    1.创建一个项目目录“C:\python项目\project2”. 2.打开CMD 进入该项目目录 cd C:\python项目\project2 3.执行 django-admin startpro ...

  10. 电脑开机出现intel UNDI,PXE-2.1(build 003),是怎么回事?

    restore defaults恢复出厂设置 https://jingyan.baidu.com/article/20b68a88587205796cec6290.html