文章目录

  • 重点:SQL执行顺序
  • 0. 分组查询
  • 1. 表连接
  • 1.1. 内连接
  • 1.2. 外连接
  • 1.3 交叉连接 - 其实就是等值连接
  • 2. 子查询
  • 2.1 普通子查询
  • 2.2 分页查询 - limit无论如何都是最后运行
  • 2.3 联合查询


重点:SQL执行顺序

mysql设置采用两种或两种以上组合的鉴别技术对用户进行身份鉴别 mysql两个分组条件_表连接

select 查询列                            ⑤
    from 表名                            ①
    连接类型 join 表  on 连接条件    ②
    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/cross】join 表
    on 连接条件
    where 筛选条件
    group by 列名
    having 分组后筛选的条件
    order by 需要排序的列

1.1. 内连接






内连接

等值连接

非等值连接

自连接

笛卡尔积连接 - 不算内连接


等值连接

SELECT 列名 FROM 表 WHERE 表1.列名 = 表2.名

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

select * 
    from emp1 
    【inner】 join dept1 
    on emp1.deptno = dept1.deptno;



非等值连接

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

mysql设置采用两种或两种以上组合的鉴别技术对用户进行身份鉴别 mysql两个分组条件_子查询_02

1.2. 外连接

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

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





外连接

左外连接

右外连接

全外连接


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

mysql设置采用两种或两种以上组合的鉴别技术对用户进行身份鉴别 mysql两个分组条件_MySQL_03

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

等值连接

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

笛卡儿积连接

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

2. 子查询

2.1 普通子查询

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

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



搭配in、any/some、all



查询

标量子查询:必须保证且明确只有一个数据(一行一列)

列子查询:查询结果只有一列多行数据

行子查询:查询结果为一行多列数据

表子查询:没有限制,即多行多列


mysql设置采用两种或两种以上组合的鉴别技术对用户进行身份鉴别 mysql两个分组条件_分组查询_04

语法

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 查询