MySQL——DQL语言

Posted fujang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL——DQL语言相关的知识,希望对你有一定的参考价值。

mysql学习笔记(2)——DQL语言

一、基础查询:

  1. select 查询列表 from 表名;

  2. 查询列表:表中的字段、常量值、表达式、函数,查询的结果是个虚拟的表格。

  3. 去重:select distinct 查询列表 from 表名;,distinct只能加一个字段名。

  4. +只能做运算符,转换失败则值为0,只要其中一方为null,结果则为null。


二、条件查询:

  1. where

  2. 模糊查询:like / between and / in / is null / is not null

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

    _通配符:任意单个字符。

    \_:代表_

    转义:where last_name like '_$_%' ESCAPE '$';

    betwee and的值包含临界值,临界值不能颠倒顺序。

    in 不支持通配符 in ('a','c');

  3. <>:不等于  <=> :安全等于,支持null,=不支持null,需要用is null


三、排序查询:

  1. select from where order by 排序列表(多个字段、单个字段、表达式、函数、别名) acs / desc 不加则默认升序;

  2. 一般放在最后面,limit除外。

  3. by a ASC, b DESC a升序,若a相同,则b降序。


四、函数查询:

  1. select 函数名(实参列表) from 表

  2. 函数查询分为两类:单行查询与分组查询。

①、单行函数:

字符函数:

  • length:汉字为三个字节(utf8),length返回字节个数。
  • upper
  • lower
  • substr/substring(' ', 7):从7开始后的所有字符。 substr/substring(' ', 7, 3):从7开始的后3位字符。
  • instr(' ', ' '):后面的字符串在前面的字符串中第一次出现的索引,如果未出现则为0。
  • trim:去掉前后的空格。 trim('a' from ' '):把前后的a去掉。
  • lpad(' ', 10, '*'):指定长度左填充,如果长度大于10,则右截断。
  • rpad(' ', 10, '*'):指定长度右填充,如果长度大于10,则右截断。
  • replace(' ', 'x', 'y'):所有的x会被替换成y。

数学函数:

  • round:四舍五入。 round(x, y):保留小数点后y位。
  • ceil:向上取整。
  • floor:向下取整。
  • truncate:截断。 truncate(x, y):保留小数点后y位。
  • rand():随机产生0到1之间的小数,不会到1。
  • mod(10, 3):返回10%3.

日期函数:

  • now:日期+时间。
  • curdate:日期。
  • curtime:时间。
  • year(now()):年
  • month
  • monthname:返回月的英文单词。
  • day
  • hour
  • minute
  • second
  • str_to_date('9-13-2010', '%m-%d-%Y'):将字符串转换为日期。
  • date_format(now(), '%y年%m月%d日'):将日期转换为字符串。
符号 代表
%Y 4位年
%y 2位年
%m 01、02月
%c 1、2月
%d 01、02日
%H 24制小时
%h 12制小时
%i 00、01分钟
%s 00、01秒

其他函数:

  • version
  • user
  • database
  • datadiff(' ', ' '):相差多少天。
  • md5:MD5形式加密。
  • password:返回加密形式。

流程控制函数:

  • if(x, y, z):如果x成立,y,否则z。
  • case:两种形式。
case 要判断的字段或者表达式
when 常量 then 值/语句(如果是语句,则加分号)
when 常量 then 值/语句(如果是语句,则加分号)
when 常量 then 值/语句(如果是语句,则加分号)
...
else 值/语句(如果是语句,则加分号)
end
case 
when 条件1 then 值/语句(如果是语句,则加分号)
when 条件2 then 值/语句(如果是语句,则加分号)
when 条件3 then 值/语句(如果是语句,则加分号)
...
else 值/语句(如果是语句,则加分号)
end

②、分组函数(别名:统计函数、聚合函数):

  • sum avg max min count
  • sum、avg:数值、忽略null、``sum(distinct a)```去重。
  • max、min:字符、数值、日期、忽略null。
  • count:非空个数。
  • count * from :统计行数。 count 1 from:统计行数,相当于加了一列1。在 MYISAM存储引擎下, *效率高。在 INNODB存储引擎下,两种方法效率差不多,都比 count 字段高。
  • 使用分组函数一同查询的字段要求是group by后的字段。

五、分组查询:

select 分组函数,列(与group by 后的列相同)
from 
where 分组前的筛选
group by 列
having 分组后的筛选
order by

六、连接查询(多表查询):

  • 按年代分为两种:①sql92:在mysql中仅仅支持内连接。②sql99。
  • 按功能分分类:①内连接:等值连接、非等值连接、自连接。②外连接:左外连接、右外连接、全外连接。③交叉连接
  • sql92仅支持内连接(mysql中): where 连接条件 and 筛选条件,自连接:为表起多个别名来连接。
  • sql99支持外连接与内连接与交叉连接:内连 inner、左外 left (outer)、右外 right (outer)、全外 full (outer)、交叉 cross。如下:
select 表1 别名 连接类型
join 表2 别名
on 连接条件
where
筛选条件
  • 外连接:一般来查询一个表中有,另一个表中没有的数据。查询结果为主表中所有的数据,如果从表中有对应的匹配,则为值;反之则为null。
  • 在左外连接中, left左侧是主表;在右外连接中, right右侧是主表。左外连接和右外连接中可以通过交换语句中表的顺序来转换,达到的效果相同。
  • 筛选另一表中不存在的行时,最好选择筛选从表的主键。
  • 全外连接结果为:主表从表都存在(交集),主表有从表没有则用null填充,主表没有从表有则用null填充。如果想去掉交集,则可以在 where后增加主表或者从表主键为null的条件。
  • sql99中的交叉连接与sql92中的笛卡尔乘积效果等效。
  • 建议使用sql99语法。

七、子查询/内查询:

  • 外部的语句称为外查询/主查询,其他语句内部的语句称为内查询/子查询。
  • 子查询可以放在 selectfromwhere/havingexists后面。
  • 子查询可以根据本身的查询结果生成的虚拟表分为:①标量子查询(一行一列)②列子查询(一列多行)③行子查询(一行多列)④表子查询(多列多行)
  • where/having后面可以放标量子查询(搭配单行操作符: ><等)、列子查询(搭配多行操作符: innot inany/someall)、行子查询。
  • select后面可以放标量子查询。
  • from后面可以放任意类型的子查询, from后面的表要起别名。
  • exists(相关子查询)后面可以放任意类型的子查询。 exists后面的东西存在则为1,否则为0。语法: seists(完整的查询语句)

八、分页查询:

  • 分页查询场景:数据一页显示不全,需要分页提交sql请求。语法: limit offset sizeoffset代表要显示条数的起始索引(索引从0开始),如果需要从0开始则 offset可省略。 size代表要显示的条目个数。

九、联合查询:

  • 语句1 union 语句2
  • 将多条查询结果合并成一个结果,要求两个语句生成的虚拟表列数必须一致,结果为去重的,如果不想去重,则把 union换成 union all即可。


以上是关于MySQL——DQL语言的主要内容,如果未能解决你的问题,请参考以下文章

MySQL之DQL——查询语言

MySQL2.DQL语言-查询

MySQL——DQL语言

MySQL之数据查询语言(DQL)

Mysql基础3-数据操作语言DML-数据查询语言DQL

MySQL基础-- [DML(数据操纵语言),DQL(数据查询语言)]