-- 创建部门  (主表)
create table dept(
id int primary key auto_increment,
name varchar(20)
);
-- 创建员工 (副表)
create table employee(
id int primary key auto_increment,
name varchar(20),
deptId int, -- 级联修改 级联删除
constraint employee_dept_fk foreign key(deptId) references dept(id) on update cascade on delete cascade -- 设置外键
);
insert into dept(name) values('软件开发部'),('软件维护部'),('秘书部');
insert into emplpyee(name, deptId) values('张三', 1),('李四', 2),('王五', 3), ('陈六', 2);

1.交叉连接查询(笛卡尔乘积:出来的结果是两张表的乘积 4*3 = 12)错误的

-- 产生笛卡尔积的原因:没有足够的连接条件
-- 需求:员工及其部门
select employee.name, dept.name from employee, dept;

多表查询的步骤:   
    1)确定查询哪些表
    2)确定查询哪些字段
    3)确定连接条件

语句涉及比较长之后可以分行写,语法遇到分号结束
一般我们可以给表一个别名:这里的as可以省略

-- 2.内连接查询

-- 内连接的效果:只有满足连接条件的数据才会显示出来

select e.name, d.name
from employee as e, dept as d -- 可写为:from employee e, dept d
where e.deptId = d.id;

-- 以上写法等同于:

select e.name, d.name
from employee e
inner join dept d
on e.deptId = d.Id;

-- 3.外连接查询

-- 3.1 左外连接查询

-- 需求:查询部门及其部门的员工(部门全部都要显示)
-- 包括即使员工为null都要显示出来
-- 效果:左表 部门要全部显示出来, 左外连接查询 优先查询左表
-- 右表的数据当满足连接条件的时候就显示满足条件的数据
-- 当不满足条件时,则就显示一个null
-- 预期结果:
-- 软件开发部 张三
-- 软件开发部 王五
-- 软件维护部 李四
-- 软件维护部 陈六
-- 秘书部 null
select d.name, e.name
from dept d
left outer join employee e
on e.deptId = d.id;

-- 3.2 右外连接查询

-- 同上,右表优先显示,和上表效果一样的显示:
select d.name, e.name
from employee e
right outer join dept d
on d.id = e.deptId;

-- 4.自连接查询

-- 现在有一个表如下:
-- id name deptId bossId(上司id也是员工id)
-- 1 张三 4 null
-- 2 李四 5 1
-- 3 王五 4 2
-- 4 陈六 5 3
-- 需求:查询员工姓名及其上司姓名
-- 预期结果:
-- 员工 上司
-- 张三 null
-- 李四 张三
-- 王五 李四
-- 陈六 王五
select e.name, b.name
from employee e
left outer join employee b
on e.bossId = b.id;

join 和 union 的区别:

left join 表示至少2表要有1个匹配字段才能返回数据;

union则不需要有关联字段就可以返回数据;

而且union要求多次查询的结果列数必须一样;

例如:

select a,b
from t1
union
select a,b
from t2

必须要求,t1,t2都是显示两个字段

select查询中的格式:

-- select 字段名,可以为*  可用聚合
-- from 表名 子查询中可跟limit
-- join
-- where 条件限制 子查询中可跟聚合
-- group by 分组语句 having 统计函数的比较语句 可跟聚合
-- order by 排序语句 可跟聚合
-- limit

补充:case when的使用

select wokshop_id as '车间编号',
sum(case when worker_sex='男' then 1 else 0 end) as '男',
sum(case when worker_sex='女' then 1 else 0 end) as '女'
from XXX;
SELECT
case -------------如果
when sex='1' then '男' -------------sex='1',则返回值'男'
when sex='2' then '女' -------------sex='2',则返回值'女'
else 0 -------------其他的返回'其他’
end -------------结束
from sys_user --------整体理解: 在sys_user表中如果sex='1',则返回值'男'如果sex='2',则返回值'女' 否则返回'其他’

mysql基础操作(四):简单多表查询的更多相关文章

  1. Mysql基础(四):库、表、记录的详细操作、单表查询

    目录 数据库03 /库.表.记录的详细操作.单表查询 1. 库的详细操作 3. 表的详细操作 4. 行(记录)的详细操作 5. 单表查询 数据库03 /库.表.记录的详细操作.单表查询 1. 库的详细 ...

  2. Mysql基础(五):多表查询、pymysql模块

    目录 数据库04 /多表查询.pymysql模块 1. 笛卡尔积 2. 连表查询 3. 子查询 4. pymysql模块 数据库04 /多表查询.pymysql模块 1. 笛卡尔积 将两表所有的数据一 ...

  3. MySQL基础(三)多表查询(各种join连接详解)

    Mysql 多表查询详解 一.前言 二.示例 三.注意事项 一.前言 上篇讲到Mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有哪些 ...

  4. MySQL数据库(四)多表查询

    两张假设有两张表格A和B,把表格当作一个集合,那么表格中的记录就是集合中的一个元素. 两张表格如下: TableA:TableB: 2.1 内连接(只有一种场景) inner join 或者join( ...

  5. MySQL基础(四)(子查询与链接)

    1.子查询简介 其中,所谓的“外层查询”并不是指“查找”,指的是所有SQL语句的统称:结构化查询语言(Structured Query Language),简称SQL. : 2.由比较运算符引发的子查 ...

  6. MYSQL基础操作之单表的增删改查

    一.添加数据. -- 1.创建表,并插入一定的数据. CREATE TABLE STUDENT( ID INT, USERNAME ), SERVLET INT, JSP INT, ADDRESS ) ...

  7. MYSQL 基础操作

    1.MySQL基础操作 一:MySQL基础操作 1:MySQL表复制 复制表结构 + 复制表数据 create table t3 like t1; --创建一个和t1一样的表,用like(表结构也一样 ...

  8. MySQL基础操作&&常用的SQL技巧&&SQL语句优化

    基础操作     一:MySQL基础操作         1:MySQL表复制             复制表结构 + 复制表数据             create table t3 like t ...

  9. MYSQL基础操作

    MYSQL基础操作 [TOC] 1.基本定义 1.1.关系型数据库系统 关系型数据库系统是建立在关系模型上的数据库系统 什么是关系模型呢? 1.数据结构可以规定,同类数据结构一致,就是一个二维的表格 ...

  10. MySQL基础操作(二)

    MySQL基础操作 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用.注意:使用视图时 ...

随机推荐

  1. 【译】.NET 对象分配工具

    随着 Visual Studio 16.10 的发布,性能分析器又有了一个新的分析引擎,.NET 对象分配工具是第一个加入的工具.这为该工具提供了一些新特性,并显著提高了 perf 性能.在你的 C# ...

  2. YsoSerial 工具常用Payload分析之URLDNS

    本文假设你对Java基本数据结构.Java反序列化.高级特性(反射.动态代理)等有一定的了解. 背景 YsoSerial是一款反序列化利用的便捷工具,可以很方便的生成基于多种环境的反序列化EXP.ja ...

  3. java网络编程基础——TCP网络编程一

    基于TCP协议的网络编程 TCP/IP协议是一种可靠的网络协议,它的通信的两端各自建立一个Socket,从而在通信的两端之间形成网络虚拟链路. Java使用Socket对象来代表两端的通信端口,并通过 ...

  4. 八大排序算法~冒泡排序【加变量flag的作用】

    八大算法~冒泡排序[加变量flag的作用] 1,冒泡排序思想:从第一个数开始找,要把大数"排除在外"~为大数找后座.(从小到大排序哈) 外层循环~需要放后的大数个数: 内循环~从第 ...

  5. Kafka之--python-kafka测试kafka集群的生产者与消费者

    前面两篇博客已经完成了Kafka的搭建,今天再来点稍高难度的帖子. 测试一下kafka的消息消费行为.虽然,kafka有测试的shell脚本可以直接测试,但既然我最近在玩python,那还是用pyth ...

  6. P3643 [APIO2016]划艇

    P3643 [APIO2016]划艇 题意 一个合法序列可表示为一个长度为 \(n\) 的序列,其中第 \(i\) 个数可以为 0 或 \([l_i,r_i]\) 中一个整数,且满足所有不为零的数组成 ...

  7. java String转List<Device>集合

    // 从Redis中获得正常设备的数量 String success = redisService.get(RedisKey.CULTIVATION_RECORD_SUCCESS); //建立一个li ...

  8. gos-log高性能大日志检索中台

    gos-log 基于Go语言的轻量级高性能的大日志检索系统 开源地址 gos-log https://gitee.com/dianjiu/gos-log https://github.com/dian ...

  9. Unity3D学习笔记3——Unity Shader的初步使用

    目录 1. 概述 2. 详论 2.1. 创建材质 2.2. 着色器 2.2.1. 名称 2.2.2. 属性 2.2.3. SubShader 2.2.3.1. 标签(Tags) 2.2.3.2. 渲染 ...

  10. sql server 查看数据库配置等信息(字符集,编码格式,版本号...)

    select SERVERPROPERTY(N'edition') as Edition --数据版本,如企业版.开发版等,SERVERPROPERTY(N'collation') as Collat ...