MySQL命令学习2 - 分组查询、表连接、子查询

185 阅读3分钟

文章目录

重点:SQL执行顺序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lIHNj0rQ-1587797240326)(en-resource://database/30928:1)]

select 查询列                            ⑤
    from 表名                            ①
    连接类型 joinon 连接条件    ②
    where 筛选                           ③
    group by  分组列                   ④
    having  分组组内筛选条件         ⑥
    order by 排序列                     ⑦
    limit  起始索引, 记录数             ⑧

0. 分组查询

语法

SELECT 列名
    FROM 表
    【WHERE 筛选条件】
    
    【GROUP BY 分组的字段、列名
        HAVING 分组后的筛选条件
     】    
    ORDER BY 列名

1. 表连接

笛卡儿积:

  1. 含义:表1有2行数据,表2有3行数据,笛卡儿积连接后的新表有 2*3 = 6 行的数据
  2. 发生原因:表之间没有任何连接条件,所以避免产生则使用连接条件
# book,dept之间没有任何连接条件,故产生笛卡尔积连接
select book,dept from book,dept;

表连接语法

select 列名
    from  表
    【连接类型left/right/full/crossjoinon 连接条件
    where 筛选条件
    group by 列名
    having 分组后筛选的条件
    order by 需要排序的列

1.1. 内连接

等值连接


SELECT 列名 FROMWHERE1.列名 =2.// 例子 - 下面两者的等值连接效果是一样的
select * 
    from emp1,dept1 
    where emp1.deptno = dept1.deptno;

select * 
    from emp1 
    【innerjoin dept1 
    on emp1.deptno = dept1.deptno;



非等值连接

# 举例 - 根据工资查询工资登记
select * 
    from emp1 inner 
    join sal_level 
    on emp1.sal between sal_level.lowersal and sal_level.maxsal;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UedGsmVl-1587797240332)(en-resource://database/29360:1)]

1.2. 外连接

外连接结果 = 内连接结果 + 内连接没有的主表结果

左连接的主表在左边;同理右连接的主表的右边

# 查询员工以及员工所属部门 - 没有部门的员工也查询出来
select * 
    from emp1 
    left join  dept1 
    on emp1.deptno = dept1.deptno;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8MDWg709-1587797240337)(en-resource://database/29364:1)]

1.3 交叉连接 - 其实就是等值连接

等值连接


//查询员工信息
select *
	from emp1
	cross join dept1
	on emp1.deptno = dept1.deptno;

笛卡儿积连接

//查询员工信息
select *
	from emp1
	cross join dept1
	

2. 子查询

2.1 普通子查询

主查询、外查询:最外层的select
子查询、内查询:不在最外层的select

子查询放在小括号内,一般放在条件右侧

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gPEpTvis-1587797240345)(en-resource://database/29366:1)]

语法

select 列名、标量子查询
    from 表、标量\列\行子查询
    where 筛选条件、标量\列\行子查询
    group by 列名
    having 分组后筛选条件、标量\列\行子查询
    exists 相关子查询、表子查询


例子

# 列子查询 - 查询在研发部工作的职员
select * from emp1 
    where deptno in ( select deptno 
                                from dept1 
                                where dname like '%研发部%' )


# 标量子查询 - 无论如何肯定是只有一行数据的子查询
select *,( select count(*) 
                from emp1 
                where emp1.deptno = dept1.deptno)
	from dept1;
    
    
# 相关子查询如果有数据行 则返回1 否则返回0
select EXISTS( select * from dept1 ) 

# 相关子查询 - 查询有员工的部门
select * from dept1
	where EXISTS(select * from emp1 where emp1.deptno = dept1.deptno)

2.2 分页查询 - limit无论如何都是最后运行

语法:分页开始索引从0开始

select 查询的列                         ⑦
    from 表                               ①
    【连接类型  join on 连接条件】  ②
    where 筛选条件                     ③
    group by 分组列                    ④
    having 分组后筛选                 ⑤
    order by 排序字段                 ⑥
    limit 开始索引,显示的行数;       ⑧


// 显示前两行的数据
select * 
    from emp1
    limit 0,2;

2.3 联合查询

语法

select 查询
     union
select 查询