Back to VNotes

Database / SQL

MySQL 与 SQL 基础(四)

记录 MySQL 启动方式、SQL 分类、DDL、DML、DQL、DCL 和表结构操作。

分组查询

经常与聚合函数搭配使用

可以有多个分组字段,此时只有所有分组字段都相等的数据才会被分到一组,且只会返回组内第一条数据

语法:

SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段列表 [HAVING 分组后的过滤条件];

WHERE与HAVING的区别:

  • WHERE 分组之前进行过滤,不满足条件的不会参与分组,不能对聚合函数进行判断
  • HAVING分组后对结果进行过滤,可以对聚合函数进行判断

例:

统计每个组别的数据的数量,且过滤出数量大于特定值的组别

SELECT count(*) FROM 表名 GROUP BY 分组字段名 HAVING count(*) > 值;

也可在count(*)前加上分组的字段,这样可以更直观的看到具体每个组别的数量

SELECT 分组字段名, count(*) FROM 表名 GROUP BY 分组字段名 HAVING count(*) > 值;

执行顺序:WHERE > 聚合函数 > HAVING

分组之后,查询的字段一般为聚合函数和分组字段,查询其它字段无任何意义

排序查询

语法:

SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式, 字段2 排序方式;

排序方式:

  • ASC - 升序(不提供排序方式时默认)
  • DESC - 降序

如果时多字段排序,那么会优先按照字段1与字段1的排序方式来排序,只有当字段1相等时才会根据第二个字段进行排序

分页查询

语法:

SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;

索引从0开始,起始索引 = (查询页码 - 1)* 查询记录数

分页查询每个数据库的实现方式不同,MySQL是LIMIT关键字

当LIMIT后面只有一个数字时,则会默认变为 LIMIT 0, 所提供数字 即提供的数字被视作查询记录数,而起始索引默认为0

在最后加上OFFSET关键字可以跳过最开头的n条记录

返回跳过了第一条之后的第一条,即返回第二条记录:

SELECT column FROM table LIMIT 1 OFFSET 1;

执行顺序

执行顺序:

FROM
		表名
WHERE
		条件列表
GROUP BY
		分组字段列表
HAVING
		分组后条件列表
SELECT
		字段列表
ORDER BY
		排序字段列表
LIMIT
		分页参数

在FROM后给表起的别名可以用在SELECT后面的字段名处,如表名.字段名

DCL

管理用户

查询用户

USE mysql;
SELECT * FROM user;

即从库 mysql 中查询表 user 的信息

创建用户

CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

修改用户密码

ALTER USER '用户名'@'主机名' IDENTIFY WITH mysql_native_password BY '新密码';

删除用户

DROP USER '用户名'@'主机名';

注意事项:主机名可以用%通配,代表任意主机

权限控制

常用权限:

权限说明
ALL, ALL PRIVILEGES所有权限
SELECT查询数据
INSERT插入数据
UPDATE修改数据
DELETE删除数据
ALTER修改表
DROP删除数据库/表/视图
CREATE创建数据库/表

查询权限

SHOW GRANTS FOR '用户名'@'主机名';

授予权限

GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';

撤销权限

REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';

注意事项:

  • 授权时,数据库和表名可以用 * 进行通配,代表所有
  • 多个权限用逗号分隔

函数

函数分为:

  • 字符串函数
  • 数值函数
  • 日期函数
  • 流程函数

可以用SELECT对表达式和函数进行计算

SELECT 函数(参数)

字符串函数

常见函数:

函数功能
concat(s1, s2, ..., sn)字符串拼接,将s1, s2, ..., sn拼接成一个字符串
lower(str)将字符串全部转为小写
upper(str)将字符串全部转为大写
lpad(str, n, pad)左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
rpad(str, n, pad)右填充,用字符串pad对str的右边进行填充,达到n个字符串长度
trim(str)去掉字符串头部和尾部的空格
substring(str, start, len)返回从字符串str从start位置起的len个长度的字符串(第一个是1)
replace(column, source, replace)替换字符串