MySQL——DQL语言
Posted fujang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL——DQL语言相关的知识,希望对你有一定的参考价值。
mysql学习笔记(2)——DQL语言
一、基础查询:
-
select 查询列表 from 表名;
-
查询列表:表中的字段、常量值、表达式、函数,查询的结果是个虚拟的表格。
-
去重:
select distinct 查询列表 from 表名;
,distinct只能加一个字段名。 -
+只能做运算符,转换失败则值为0,只要其中一方为null,结果则为null。
二、条件查询:
-
where
-
模糊查询:
like / between and / in / is null / is not null
。%
通配符:任意多个字符,包含0个字符。_
通配符:任意单个字符。\_
:代表_
。转义:
where last_name like '_$_%' ESCAPE '$';
。betwee and
的值包含临界值,临界值不能颠倒顺序。in
不支持通配符in ('a','c');
。 -
<>
:不等于<=>
:安全等于,支持null,=
不支持null,需要用is null
。
三、排序查询:
-
select from where order by 排序列表(多个字段、单个字段、表达式、函数、别名) acs / desc 不加则默认升序;
-
一般放在最后面,
limit
除外。 -
by a ASC, b DESC
a升序,若a相同,则b降序。
四、函数查询:
-
select 函数名(实参列表) from 表
-
函数查询分为两类:单行查询与分组查询。
①、单行函数:
字符函数:
-
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语法。
七、子查询/内查询:
-
外部的语句称为外查询/主查询,其他语句内部的语句称为内查询/子查询。 -
子查询可以放在 select
、from
、where/having
、exists
后面。 -
子查询可以根据本身的查询结果生成的虚拟表分为:①标量子查询(一行一列)②列子查询(一列多行)③行子查询(一行多列)④表子查询(多列多行) -
where/having
后面可以放标量子查询(搭配单行操作符:>
、<
等)、列子查询(搭配多行操作符:in
、not in
、any/some
、all
)、行子查询。 -
select
后面可以放标量子查询。 -
from
后面可以放任意类型的子查询,from
后面的表要起别名。 -
exists
(相关子查询)后面可以放任意类型的子查询。exists
后面的东西存在则为1,否则为0。语法:seists(完整的查询语句)
。
八、分页查询:
-
分页查询场景:数据一页显示不全,需要分页提交sql请求。语法: limit offset size
。offset
代表要显示条数的起始索引(索引从0开始),如果需要从0开始则offset
可省略。size
代表要显示的条目个数。
九、联合查询:
-
语句1 union 语句2
-
将多条查询结果合并成一个结果,要求两个语句生成的虚拟表列数必须一致,结果为去重的,如果不想去重,则把 union
换成union all
即可。
以上是关于MySQL——DQL语言的主要内容,如果未能解决你的问题,请参考以下文章