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) | 替换字符串 |