介绍&使用

MySQL是基于客户端—服务器(C/S)的DBMS,因为它开源、高性能、可靠、方便使用,用的人很多

不同环境下安装的方式也不同,我是在docker中,方便省事,安装就不多说了,网上一堆教程

安好之后会自带一个MySQL的命令行客户端,正常是在命令行下输入:

mysql -u 用户 -p -h 主机名 -P端口号

在docker下则需要先进mysql的容器运行bash, 在bash下再输入上面内容

docker exec -t 容器名 bash

看到提示符变成mysql说明登录成功

使用命令行

每条语句后面需要加分号才表示语句结束

一些常用命令:

use 库名;                  # 选择数据库
show databases;           # 显示所有数据库
show tables;              # 显示所有表
show columns from 数据表;  # 显示所有表中字段
describe 数据表;           # 显示所有表中字段 等于上条

操作数据

MySQL的sql语句默认不分大小写,匹配时也是

查数据

语句:select 字段名 from 表名

用*代表选择所有字段, 查的多会浪费性能

一些关键字:

distinct去重,必须放在开头,否则会报错

limit指定记录条数,放在末尾,下标以0开始

在多表操作时需要写完整的字段名:表名.字段名

数据排序

语句order by 字段名 asc/desc

放在where子句后,当多个排序时用,分隔

过滤数据

数据一般在服务器端过滤,虽然在客户端也可以过滤,但是会造成不必要的带宽、性能的浪费

语句where 字段 条件

常见的操作符有:>, <, =, >=, <=, !=, <>, BETWEEN A AND B, AND, OR, IN, NOT操作符优先级:AND的优先级高于OR,括号大于一切

通配符

搜索模式(search pattern):由字面值、通配符或两者组合构成的搜索条件

关键字:like 搜索模式 通配符:%代表任意字符出现的任意次数(但不匹配null), _代表单个字符

通配符不要放在pattern的开始处,那样会变得很慢;而且不要过度使用通配符

正则表达式(re)

关键字:regexp 表达式

regexp后面加binary会进行大小写区分

常见匹配:

  • or匹配:用|隔开, 注意要在[]
  • 集合匹配: 在[]中写要匹配的字符或范围(如[1-9]),若是在集合中以^开头则代表否定

^在不同情况下有不同用途:集合里代表否定,作为定位符代表开始

  • 特殊匹配:有些特殊字符,如\.,这样的需要进行转义,在前面加\\

多数正则表达式用一个反斜杠转义特殊字符,但MySQL要求两个反斜杠 (MySQL自己解释一个,正则表达式库解释另一个)

  • 字符类:常用的集合,如[:alpha:]代表任意字符的字符类
  • 重复元字符: *代表0个或多个,+代表1个或多个,?代表0个或1个,{n}指定数目的匹配,{n,}不少于指定数目的匹配,n, m匹配数目的范围
  • 定位符:^开始, $结束

LIKEREGEXP 的不同:LIKE 匹配整个串,而 REGEXP 匹配子串(利用定位符可以使 REGEXP 的作用与 LIKE 一样)

计算字段

计算字段不存在于数据库中,是在进行查询时创建的(客户端无法从查询到的字段中看出是否是计算字段,只有服务端知道)

拼接Concat()可以使多个列连接起来, 在处理字符串类型时常与去空格的Trim()连用

select后面加入计算字段后要用AS起一个别名(也称导出列)

函数

select后面的字段作为参数,如select sum(price) from pro_bill,函数不像SQL语句,不同数据库间的函数也不同

MySQL中常见的:

  • 字符串:Upper(), Trim(), Soundex()

    SOUNDEX:是一个将任何文本串转换为描述其语音表示的字母数字模式的算法

  • 日期:Now()Date(), Time()等 参数格式:yyyy-mm-dd

    一般用Date()来取得准确日期并进行过滤

  • 数值:Abs(), Rand()

聚集函数

参数为字段名,计算后返回单个的值

常见:平均数AVG(), 计数COUNT():参数为*时返回记录行数,为字段时返回字段值的计数(会忽略null), 最大最小值MAX()、MIN(), 求和SUM()

分组数据

语句group by 字段名 关键字:后面再加with rollup可以得到每个分组及每个分组中的值 需要注意:

  • 在建立分组时,指定的所有列都一起计算(不能从个别的列取回数据)
  • group by 后面列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)
  • 如果在select中使用表达式,则必须在group by后面指定相同的表达式,不能使用别名
  • select语句中的每个列都必须在group by后面给出(除聚集计算语句外)
  • 如果分组列中具有null值,则null将作为一个分组返回,如果列中有多行null值,它们将分为一组
  • 必须出现在 where 子句之后, order by 子句之前。

过滤分组:在分组语句后面加having 条件,用法和where一样

wherehaving区别:where在分组前过滤,having可以在分组后进行过滤

order bygroup by区别

  • order by:输出是排序产生的;任意字段可以使用
  • group by:输出是分组,但输出分组的排序可能不是分组的顺序;只能使用select后面的字段;如果和聚合函数一起使用字段,则必须使用