MySQL查询用法总结

  1. select语句的基本结构
select col1,col2
from tb_name
where col1=''  --where为行级筛选
group by col2  --group by根据某个字段进行分组
having count(col1)>1  --having对分组后的数据进行组级筛选
order by col1 desc    --order by根据某个字段进行排序 asc升序,desc降序
limit 3,5               --limit设置查询行的范围

2. 行级筛选数据–where

# where字句的操作符:
=  等于
<> 不等于
!= 不等于
<  小于
<= 小于等于
>  大于
>= 大于等于
between A and B 指定的两个值之间

where col is null      --查询空值
where col is not null  --查询非空值
where col = ''         --查询空字符串

where (条件1 and 条件2) or (条件3 and 条件4)
--任何时候使用具有and 和 or操作符的where字句时,都应该用圆括号明确的分组操作符,
  不要过分依赖默认计算次序
where col in (a,b)--in/not in操作符与or是相同的功能,但比or检索速度更快
where col in (select ....) --用in包含其他select语句,实现子查询的嵌套

模糊匹配查询:

1.用like操作符+通配符
where col like '%A%' --'%'可以拼配0个或1个以上的字符,但不能匹配null
                       '_'只能匹配一个字符
                       注意不要过度使用通配符,会降低检索性能

2.用正则表达式:
where col REGEXP '.000'          --'.'标识任意匹配1个字符
where col REGEXP '100|200|300'   --'|'表示or
where col REGEXP '[123]ton'      --[]表示另一种形式的or语句,[123]是[1|2|3]的缩写形式
where col REGEXP '[1-9]ton'      --[1-9]表示匹配1-9中任意一个数字
where col REGEXP '\\.'           --\\来匹配特殊字符,也用来引用元字符
                                 \\f(换页),\\n(换行),\\r(回车)
where col REGEXP '\\([0-9]stick?\\)'  --'?'匹配0个或1个字符
                                      '*'--0个或多个匹配,'+'--1个或多个匹配
where col REGEXP ’[[:digit:]]{4}’  --表示连在一起的任意4位数字
                                 {n}--指定数目的匹配  {n,}--不少于指定数目的匹配
                                 {n,m}--指定匹配数目的范围                                   

3. MySQL中的常用函数

distinct() --去重
聚合函数:                    
count()  --计数
sum()    --汇总计算
avg()    --平均值 
max()    --最大值
min()    --最小值
std()    --标准差
abs()    --绝对值
rand()   --随机数
sqrt()   --平方根
round()  --保留几位小数 
数据处理函数:
concat() --拼接两个字段列
trim()/ltrim()/rtrim() --去除两边空格/左边空格/右边空格
upper()/lower() --转换字母大小写
left()/right() --返回左右的字符串
locate()  --返回中间范围的字符串
length()  --返回字符串的长度
substring() --返回字串的字符
日期时间处理函数:
在Mysql中,日期格式必须为'yyyy-mm-dd'
addDate() --增加一个日期
addTime() --增加一个时间
curDate() --返回当前日期
curDate() --返回当前时间
Date() --返回日期部分
Date_format(date,'%Y-%m-%d') --返回一个格式化的日期或时间串
DateDiff()   --计算两个日期之差
Date_Add(date,INTERVAL 2 day/month/year)   --日期运算函数
Year()/Month()/Day()/DayofWeek()/HOur()/Minute()/Second()
Time() --返回时间部分
Now()  --返回当前的日期时间

# 有关聚合函数使用注意:
avg()只能用来确定特定数值列的平均值,并忽略列值为null的行
count(*) 对表中所有行计数,不管是null还是非null,count(col)会忽略null值
min()/max()/sum()都忽略null值,sum()在括号里可以添加合计,例如sum(col1*col2)
函数之间可以嵌套使用,例如count(distinct(col))是计数去重后的结果

4. 分组筛选:

select col1,count(*) as c
from tb_name
group by col1 with rollup --使用with rollup可得到每组的汇总值
having count(*)>1         --having中的条件字段不能使用别名
# 如果在select中使用了表达式,则在group by中要使用相同的表达式,不能使用别名
  如果分组中有null值,则将null值单独分为一组
  group by必须出现where字句之后,order by之前

5. 使用子查询

1.使用子查询进行过滤:
select * from tb_name where col in (1,2,3)
2.作为计算字段的子查询
select a.col1,
       a.col2,
       (select count(*)
        from a
        where a.id = b.id) as count
from a
order by a.col1

3.相关子查询:
delete from tb    --删除表中的重复记录
   where id in(
        select id from(
            select id from tb a
            group by a.id
            having count(id)>1) as b
            )

6. 表联接:

自联接:
select col1,col2
from tb
where col3 = (select col3
              from tb
              where col1 = 'SA')

生成笛卡尔积表-cross join
select a.col1,b.col2
from a
cross join b

内联接--inner join:
select a.col1,b.col2
from a
inner join b
on a.id = b.id

left join/right join(左联接/右联接)
select a.col1,b.col2
from a
left/right join b
on a.id = b.id

外连接--full outer join
select a.col1,b.col2
from a
full outer join b
on a.id = b.id

延伸用法:left join excluding inner join
返回左表有但右表没有关联数据的记录集。
select a.col1,b.col2
from a
left join b
on a.id = b.id
where b.id is null

right join excluding inner join
返回右表有但左表没有关联数据的记录集。
select a.col1,b.col2
from a
right join b
on a.id = b.id
where a.id is null

full outer join excluding inner join
返回左表和右表里没有相互关联的记录集。
select a.col1,b.col2
from a
full outer join b
on a.id = b.id
where a.id is null or b.id is null

7.组合查询:

select * from a
union
select * from b
# union中的每个查询必须包含相同的列,表达式及聚合函数
  union会去除两个查询中的重复值,如果不要去重,用union all
  只能使用一条order by字句,且必须放在最后一个查询后面

8.创建视图:

# 视图是一张虚拟的表,不包含数据,可以简化复杂的sql操作
  视图必须唯一命名,且需要访问权限
  视图可以嵌套,可以和表一起使用,但不能有索引和创建触发器或默认值

create view view_name as
select col1,
       col2,
       col3*col4 as col5
from tb_name

select * from view_name where col1=''

9. 创建存储过程:

# 存储过程可以简化复杂操作,提高检索性能
--创建存储过程
Delimiter $
create procedure ordertotal(
       IN number INT,   --IN将number传入存储过程
       OUT total DECIMIAL(8,2)   --OUT将total返回合计
      )
Begin
     select sum(price*quantity)
     from orderitems
     where order_num = number
     INTO total 
END $

--调用存储过程:
CALL ordertotal(200, @total)
select @total

    原文作者:Summer Memories
    原文地址: https://zhuanlan.zhihu.com/p/35940629
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞