MySQL--DQL语言

DQL语言

基础查询

1. 语法

select 查询列表

from 表名;

2. 特点

① 查询列表可以是字段、常量、表达式、函数,也可以是多个的组合

② 查询结果是一个虚拟的表

3. 示例

  1. 查询单个字段

    select 字段名 from 表名;

  2. 查询多个字段

    select 字段名,字段名 from 表名;

  3. 查询所有字段

    select * from 表名;

  4. 查询常量

    select 常量值;

    注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要

  5. 查询函数

    select 函数名(参数列表);

  6. 查询表达式

    select 100/10;

  7. 别名

    ① as

    ②空格

  8. 去重

    select distinct 字段名 from 表名;

    select distinct 字段名,字段名 from 表名;(两个字段都重复才能去重)

  9. 符号+

    作用:加法运算

    select 数值+数值;--直接运算

    select 字符+数值;--将字符转换为数值进行计算,若转换不成功则将字符转换为0

    select null+值;--结果都为null

  10. concat函数

    功能:拼接字符

    select concat(字符1,字符2,字符3...);

  11. ifnull函数

    功能:判断某字段或表达式是否为null,如果为null,返回指定的值,否则返回原本的值

    select ifnull(commission_pct,0) from employees;

  12. isnull函数

    功能:判断某字段或表达式是否为null,如果为null返回1,反之返回0

条件查询

1. 语法

select 查询列表

from 表名

where 筛选条件;

2. 分类

  1. 简单条件运算符

    < > = != or <> <= >=

  2. 逻辑运算符

    && || !
    and or not

  3. 模糊查询

    like关键字,一般和通配符搭配使用

    通配符:
    %:任意多个字符,包含0个字符
    _:任意单个字符

    between and关键字

    in关键字

    is null关键字

    安全等于 <=>

排序查询

1. 语法

select 查询列表

from 表名

where 筛选条件

order by 排序列表【asc|desc】

2. 特点

  1. asc:升序,默认为升序

    desc:降序

  2. 排序列表支持单个字段、多个字段、函数、表达式、别名

  3. order by的位置一般放在查询语句的最后(除limit语句之外)

常见函数

1. 概述

功能:类似于Java中的方法

优点:提高重用性、隐藏实现细节

调用:select 函数名(参数列表)

2. 单行函数

  1. 字符函数

    concat:连接字符串

    length:获取字符串的长度

    substr:截取字符串

    instr:获取子串第一次出现的索引

    upper:转换为大写

    lower:转换为小写

    replace:替换

    trim:去除前后空格

    lpad:左填充

    rpad:右填充

  2. 数学函数

    ceil:向上取整

    floor:向下取整

    round:四舍五入

    mod:取模

    truncate:截断

    rand:获取0-1区间(左闭右开)的随机数

  3. 日期函数

    now:返回当前日期+时间

    curdate:返回当前日期

    curtime:返回当前时间

    year:返回年

    month:返回月

    monthname:以英文姓氏返回月

    day:返回日

    hour:返回小时

    minute:返回分钟

    second:返回秒

    str_to_date:将字符转换为日期

    date_format:将日期转换为字符

    datediff:返回两个日期之间相差的天数

  4. 其他函数

    version:当前数据库服务器的版本

    datebase:当前打开的数据库

    user:当前用户

    password('字符串'):返回该字符的加密结果

    md5('字符串'):返回该字符以md5形式加密的结果

  5. 流程控制函数

    1. if(条件表达式,表达式1,表达式2):如果条件表达式成立,返回表达式1,否则返回表达式2

    2. case情况一:

      case 要判断的字段或表达式
      when 常量1 then 要显示的值1或 语句1;
      when 常量2 then 要显示的值2或 语句2;
      ...
      else 要显示的值n或 语句n;
      end

      情况二:

      case
      when 条件1 then 要显示的值1或 语句1;
      when 条件2 then 要显示的值2或 语句2;
      ...
      else 要显示的值n或 语句n;
      end

3. 分组函数

  1. 分类

    max:最大值

    min:最小值

    sum:和

    avg:平均值

    count:计算个数

  2. 特点

    语法:

    ​ select max(字段) from 表名;

    支持的类型:

    ​ sum和avg一般处理数值型

    ​ max、min、count可以处理任意类型

    以上分组函数均忽略null,均可搭配distinct使用,实现去重的统计

分组查询

1. 语法

select 分组函数,分组后的字段

from 表

【where 筛选条件】

group by 分组的字段

【having 分组后的筛选】

【order by 排序列表】

2. 特点

​ 使用关键字 筛选的表 位置

分组前筛选 where 原始表 group by的前面

分组后筛选 having 分组后的结果 group by的后面

连接查询

1. 含义

当查询中涉及到了多个表的字段,需使用多表连接

select 字段1,字段2

from 表1,表2

笛卡尔乘积现象:当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接

解决:添加有效的连接条件

2. 分类

按年代分类:

​ SQL92:

​ 等值

​ 非等值

​ 自连接

​ 支持一部分外连接(用于oracle、sqlserver,mysql不支持)

​ SQL99:(推荐使用)

​ 内连接

​ 等值

​ 非等值

​ 自连接

​ 外连接

​ 左外连接

​ 右外连接

​ 全外连接(mysql不支持)

​ 交叉连接

3. SQL92语法

  1. 等值连接

    语法:

    select 查询列表

    from 表1 别名,表2 别名

    where 表1.key=表2.key

    【and 筛选条件】

    【group by 分组字段】

    【having 分组后的筛选】

    【order by 排序字段】

    特点:

    ① 一般需要为表起别名

    ② 多表的顺序可以调换

    ③ n表连接至少需要n-1个连接条件

    ④ 等值连接的结果是多表的交集部分

  2. 非等值连接

    语法:

    select 查询列表

    from 表1 别名,表2 别名

    where 非等值的连接条件

    【and 筛选条件】

    【group by 分组字段】

    【having 分组后的筛选】

    【order by 排序字段】

  3. 自连接

    语法:

    select 查询列表

    from 表 别名1,表 别名2

    where 等值的连接条件

    【and 筛选条件】

    【group by 分组字段】

    【having 分组后的筛选】

    【order by 排序字段】

4. SQL99语法

  1. 内连接

    语法:

    select 查询列表

    from 表1 别名

    【inner】 join 表2 别名

    on 连接条件

    where 筛选条件

    group by 分组列表

    having 分组后的筛选

    order by 排序列表

    limit 偏移,条目数;

    特点:

    • 表的顺序可以调换
    • 内连接的结果=多表的交集
    • n表的连接至少需要n-1个连接条件

    分类:

    等值连接

    非等值连接

    自连接

  2. 外连接

    语法:

    select 查询列表

    from 表1 别名

    left | right | full【outer】 join 表2 别名

    on 连接条件

    where 筛选条件

    group by 分组列表

    having 分组后的筛选

    order by 排序列表

    limit 偏移,条目数;

    特点:

    • 查询的结果=主表中所有的行,其中从表和主表匹配的将显示匹配行,不匹配则显示为null
    • left join左边为主表,right join右边为主表,full join两边都是主表
    • 一般用于查询除了交集部分的剩余的不匹配行
  3. 交叉连接

    语法:

    select 查询列表

    from 表1 别名

    cross join 表2 别名;

    特点:

    显示结果为两表的笛卡尔乘积

子查询

1. 含义

嵌套在其他语句内部的select语句称为子查询或内查询,外面的语句可以是insert、update、delete、select等,select居多。

外面的语句若为select语句,则此语句称为外查询或主查询

2. 分类

  1. 按出现位置

    select后面

    ​ 仅支持标量子查询

    from后面

    ​ 表子查询

    where或having后面

    ​ 标量子查询

    ​ 列子查询

    ​ 行子查询

    exists后面

    ​ 标量子查询

    ​ 列子查询

    ​ 行子查询

    ​ 表子查询

  2. 按结果集的行列

    标量子查询(单行子查询):结果集为一行一列

    列子查询(多行子查询):结果集为多行一列

    行子查询:结果集为多行多列

    表子查询:结果集为多行多列

3. 示例

where或having后面

  1. 标量子查询

    查询最低工资的员工姓名和工资

    ①查询最低工资

    select min(salary) from employees

    ②查询员工的姓名和工资,要求工资=①

    select last_name,salary

    from employees

    where salary=(

    ​ select min(salary)

    ​ from employees

    );

  2. 列子查询

    查询所有是领导的员工的姓名

    ①查询所有员工的manager_id

    select manager_id

    from employees

    ②查询姓名,employee_id属于①表中的一个

    select last_name

    from employees

    where employee_id in (

    ​ select manager_id

    ​ from employees

    );

分页查询

1. 应用场景

当要查询的条目数太多,一页显示不全

2. 语法

select 查询列表

from 表

limit 【offset,】 size;

注意:

offset代表的是起始的条目索引,默认从0开始;

size代表的是显示的条目数

公式:

假如要显示的页数为page,每一页的条目数为size

select 查询列表

from 表

limit (page-1)*sizesize;

联合查询

1. 含义

union:合并、联合,将多次查询结果合并成一个结果

2. 语法

查询语句1

union 【all】

查询语句2

union 【all】

...

3. 意义

  1. 将一条比较复杂的查询语句拆分成多条语句
  2. 适用于查询多个表的时候,查询的列基本是一致的

4. 特点

  1. 要求多条查询语句的查询列数必须一致
  2. 要求多条查询语句的查询的各列类型、顺序最好一致
  3. union去重,union all 包含重复项

总结

语法: 执行顺序

select 查询列表 ⑦

from 表1 别名 ①

连接类型 join 表2 别名 ②

on 连接条件 ③

where 筛选 ④

group by 分组列表 ⑤

having 筛选 ⑥

order by 排序列表 ⑧

limit 起始条目索引,条目数; ⑨

posted on 2021-03-04 21:02  来点番茄酱  阅读(82)  评论(0)    收藏  举报