mysql学习笔记--数据库多表查询
一、内连接【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学习笔记--数据库多表查询的更多相关文章
- mysql学习笔记--数据库单表查询
一.查询语句 1. select [选项] 列名 [from 表名] [where 条件] [order by 排序] [group by 分组] [having 条件] [limit 限 ...
- MySQL学习笔记8——多表查询
多表查询 多表查询 *合并结果集 *连接查询 *子查询 合并结果集 *要求被合并的表中,列的类型和列数相同(实际上是查询的结果集列类型和列数相同即可) *UNION,去除重复行 *UNION ALL, ...
- MySQL学习笔记-数据库文件
数据库文件 MySQL主要文件类型有如下几种 参数文件:my.cnf--MySQL实例启动的时候在哪里可以找到数据库文件,并且指定某些初始化参数,这些参数定义了某种内存结构的大小等设置,还介绍了参数类 ...
- MySQL学习笔记-数据库内存
数据库内存 InnoDB存储引擎内存由以下几个部分组成:缓冲池(buffer pool).重做日志缓冲池(redo log buffer)以及额外的内存池(additional memory pool ...
- MySQL学习笔记-数据库后台线程
数据库后台线程 默认情况下讲述的InnoDB存储引擎,以后不再重复声明.后台线程有7个--4个IO thread,1个master thread,1个锁监控线程,1个错误监控线程.IO thread的 ...
- Mybatis学习笔记之---多表查询(1)
Mybatis多表查询(1) (一)举例(用户和账户) 一个用户可以有多个账户 一个账户只能属于一个用户(多个账户也可以属于同一个用户) (二)步骤 1.建立两张表:用户表,账户表,让用户表和账户表之 ...
- Mybatis学习笔记之---多表查询(2)
Mybatis多表查询(2) (一)举例 用户和角色 一个用户可以有多个角色,一个角色可以赋予多个用户 (二)步骤 1.建立两张表:用户表,角色表,让用户表和角色表具有多对多的关系.需要使用中间表,中 ...
- Oracle学习笔记_04_多表查询
一.概念: 1.多表连接有以下几种分法: (1)内连接 vs 外连接 (左.右.满) (2)等值连接 vs 不等值连接 (3)非自连 ...
- MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)
mysql> create table test5( -> id int, ) -> )engine myisam charset utf8; Query OK, rows affe ...
随机推荐
- Busybox镜像
使用docker多少还是要知道一些Busybox的知识,下面转载自https://blog.csdn.net/chengqiuming/article/details/79313539 一 简介 Bu ...
- android 使用Canvas画箭头
public class MyCanvas extends View{ private Canvas myCanvas; private Paint myPaint=new Pai ...
- Linux常见企业面试题
1:只查看test.txt (100行)文件中第20行到30行的数据(企业常见面试题) 答: seq (序列) 第一种方法:head -30 test1.txt | tail -11 第二种方法:se ...
- 1、Netty 实战入门详解
一.Netty 简介 Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程 ...
- Go语言 并发编程
Go语言 并发编程 作者:Eric 微信:loveoracle11g 1.创建goroutine // 并行 是两个队列同时使用两台咖啡机 // 并发 是两个队列交替使用一台咖啡机 package m ...
- mybatis缓存的设计
继续用提问的方式来看Mybatis的缓存设计. 1.Mybatis如何开启缓存 Mybatis对查询结果进行缓存,所以缓存的对象为具体的Statement 通过在Statement上是否使用缓存来启用 ...
- Magic xpa 3.x很容易将数据导出到Excel中
Magic xpa 3.x很方便的将表中数据导出到Excel文件中,还可以自动将表中数据生成各种图表. 通过使用自带的打印数据内部事即可实现. 1.首先将打印数据任务属性设置为“是”. 2.可使用主程 ...
- linux/centos elasticsearch 环境搭建 安装 运行 使用
环境搭建也是有些坑的存在,所以整理了一下搭建流程,安全无痛. ElasticSearch是一个开源的分布式搜索引擎,具备高可靠性,支持非常多的企业级搜索用例. 一.java 环境 直接apt安装火箭一 ...
- leetCode66:加一
/** * @param {number[]} digits * @return {number[]} */ var plusOne = function(digits) { if(digits[di ...
- intellij与eclipse默认快捷键对比
最近想用intellij,于是找找快捷键.用惯了eclipse,都不太适应intellij的快捷键.慢慢的就适应了常用的快捷键 Idea 与 Eclipse 快捷键的区别,上为Eclipse的快捷键, ...