MYSQL 笔记3

MySQL注释的三种写法

1.单行注释使用"--"
需要特别注意!这种注释"--"后面要加一个空格!

2.单行注释使用"#"

3.多行注释使用"/**/"

[例]
-- I am a commnet.Attention:Please note the space ahead me!

#I am a commnet.

/*I am a commnet.
I am another commnet.
We are commnents*/

MySQL GROUP BY 语句

语法:
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

[例] 以下数据表记录了一个查询系统的用户登录时长,一条记录代表某用户的一次登录

SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
--  Table structure for `querysys_tbl`
-- ----------------------------
DROP TABLE IF EXISTS `querysys_tbl`;
CREATE TABLE `querysys_tbl` (
  `id` int(11) NOT NULL,
  `userid` char(10) NOT NULL DEFAULT '',
  `logintime` datetime NOT NULL,
  `timespending` tinyint(4) NOT NULL DEFAULT '0' COMMENT '在线时长(单位:分钟)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `querysys_tbl`
-- ----------------------------
BEGIN;
INSERT INTO `employee_tbl` VALUES ('1', '小明', '2019-04-22 15:25:33', '1'), ('2', '小王', '2019-04-20 15:25:47', '3'), ('3', '小丽', '2019-04-19 15:26:02', '2'), ('4', '小王', '2019-04-07 15:26:14', '4'), ('5', '小明', '2019-04-11 15:26:40', '4'), ('6', '小明', '2019-04-04 15:26:54', '2');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

注:例子改编自 菜鸟教程 https://www.runoob.com/mysql/mysql-group-by-statement.html

说明(可跳过,与GROUP BY无关):

1)SET NAMES utf8;用于设置编码,可以在建库时设置,也可以在建表时设置,或只是对部分字段进行设置。
参考:MYSQL: set names utf8是什么意思? https://www.cnblogs.com/yanzi-meng/p/9184139.html

2)在MySQL中删除一张表或一条数据的时候,可能会因为MySQL中设置了foreign key关联,造成无法更新或删除数据。
可以通过设置 SET FOREIGN_KEY_CHECKS=0; 来禁用外键约束
之后再用 SET FOREIGN_KEY_CHECKS=1; 来启动外键约束
命令 SELECT  @@FOREIGN_KEY_CHECKS; 可以查看当前FOREIGN_KEY_CHECKS的值

3)反引号是为了区分 MySQL 关键字与普通字符而引入的符号,一般库名、表名与字段名使用反引号。

4)PRIMARY KEY关键字用于定义列为主键。可以使用多列来定义主键,列间以逗号分隔。
5)ENGINE 设置存储引擎,CHARSET 设置编码。

6)BEGIN 开始一个事务,ROLLBACK 事务回滚,COMMIT 事务确认。详见MYSQL的事务处理。
参考:
BEGIN...COMMIT和SET AUTOCOMMIT   https://ask.csdn.net/questions/260117
数据库sql中commit的重要性   https://blog.csdn.net/leilei7407/article/details/100850395

7)INSERT 插入多条数据
INSERT INTO table_name  (field1, field2,...fieldN)  VALUES  (valueA1,valueA2,...valueAN),(valueB1,valueB2,...valueBN),(valueC1,valueC2,...valueCN)...;

导入成功后,查询数据表如下

mysql> SELECT * FROM querysys_tbl;
+----+--------+---------------------+--------------+
| id | userid | logintime           | timespending |
+----+--------+---------------------+--------------+
|  1 | 小明   | 2019-04-22 15:25:33 |      1       |
|  2 | 小王   | 2019-04-20 15:25:47 |      3       |
|  3 | 小丽   | 2019-04-19 15:26:02 |      2       |
|  4 | 小王   | 2019-04-07 15:26:14 |      4       |
|  5 | 小明   | 2019-04-11 15:26:40 |      4       |
|  6 | 小明   | 2019-04-04 15:26:54 |      2       |
+----+--------+---------------------+--------------+
6 rows in set (0.00 sec)
mysql>

使用 GROUP BY 语句 将数据表按用户名进行分组,并统计每个用户有多少条登录记录:

mysql> SELECT userid, COUNT(*) FROM querysys_tbl GROUP BY name;
+--------+----------+
| userid | COUNT(*) |
+--------+----------+
| 小丽   |        1 |
| 小明   |        3 |
| 小王   |        2 |
+--------+----------+
3 rows in set (0.01 sec)
mysql>

WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
例如我们将以上的数据表按用户名进行分组,再统计每个用户登录的时长:

mysql> SELECT userid, SUM(timespending) as timesp_total FROM  querysys_tbl GROUP BY userid WITH ROLLUP;
+--------+----------------+
| userid   | timesp_total |
+----------+--------------+
| 小丽     |            2 |
| 小明     |            7 |
| 小王     |            7 |
| NULL     |           16 |
+--------+----------------+
4 rows in set (0.00 sec)
mysql>

其中记录 NULL 表示所有用户的在线时长。
可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:select coalesce(a,b,c);
参数说明:如果a!=null,则选择a;如果a==null,则选择b;如果b==null,则选择c;如果都为nul,则返回为null。
具体的查询语句如下:
SELECT coalesce(userid, '总数'), SUM(timespending) as timesp_total FROM  querysys_tbl GROUP BY userid WITH ROLLUP;

HAVING:用于对WHERE和GROUP BY查询出来的分组经行过滤,查出满足条件的分组结果。HAVING 子句可以让我们筛选成组后的各种数据。WHERE 子句在聚合前先筛选记录,而 HAVING子句在聚合后对组记录进行筛选

执行顺序 select –>where –> group by–> having–>order by
参考:mysql having的用法 https://blog.csdn.net/love_xsq/article/details/42417917

MySQL NULL值处理

不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。在 MySQL 中,NULL = NULL 返回false 。
三大运算符
IS NULL: 当列的值是 NULL,此运算符返回 true。
IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
<=>: 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true。

MySQL 正则表达式

传送门-> 菜鸟教程 https://www.runoob.com/mysql/mysql-regexp.html

[例] 

mysql> select * from sysconf where parameter REGEXP '^cpu'; -- cpu开头
+-------------------------+-------+---------+
| parameter               | value | remark  |
+-------------------------+-------+---------+
| cpuUtilCollectInterval  | 60    | seconds |
| cpuUtilThreshold        | 80    | %       |
+-------------------------+-------+---------+
2 rows in set (0.02 sec)

mysql> select * from sysconf where parameter REGEXP 'Interval$'; -- Interval结尾
+-----------------------------+-------+---------+
| parameter                   | value | remark  |
+-----------------------------+-------+---------+
| timeoutCheckInterval        | 90    | second  |
| pollInterval                | 5     | minutes |
| cpuUtilCollectInterval      | 60    | seconds |
| diskUtilCollectInterval     | 5     | minutes |
| memUtilCollectInterval      | 60    | seconds |
+-----------------------------+-------+---------+
5 rows in set (0.00 sec)

mysql> select * from sysconfig where parameter REGEXP 'Collect'; -- 包含Collect
+----------------------------+-------+---------+
| parameter                  | value | remark  |
+----------------------------+-------+---------+
| cpuUtilCollectInterval     | 60    | seconds |
| diskUtilCollectInterval    | 5     | minutes |
| memoryUtilCollectInterval  | 60    | seconds |
+----------------------------+-------+---------+
3 rows in set (0.00 sec)

mysql>
mysql> select * from sysconfig where remark REGEXP 'seconds|minutes';
+-----------------------------+-------+--------------+
| parameter                   | value | remark       |
+-----------------------------+-------+--------------+
| cpuUtilCollectInterval      | 30    | seconds      |
| diskUtilCollectInterval     | 5     | minutes      |
| memUtilCollectInterval      | 30    | seconds      |
+-----------------------------+-------+--------------+
3 rows in set (0.00 sec)

mysql>

MySQL 事务 

传送门-> 菜鸟教程 https://www.runoob.com/mysql/mysql-transaction.html
InnoDB与MyISAM区别 参考:
https://blog.csdn.net/handoking/article/details/90107543
https://blog.csdn.net/qq_35642036/article/details/82820178

B树在存储引擎中的实现方式  https://my.oschina.net/u/3670641/blog/3045464(第6节)
Myisam
非聚簇索引,数据和索引分别存储。
索引文件xx.MYI
数据文件xx.MYD
叶子节点保存的是引用地址而非数据
InnoDB
聚簇索引,数据和索引保存在一起
文件xx.ibd
在叶子节点保存对应的所有数据
以主键索引来组织数据,没有主键的话,会帮我们隐式创建主键索引
辅助索引不存地址,存主键,这样便于维护

引擎 事务 外键 适合场景
InnoDB 支持 支持 增加、修改
MyISAM 不支持 不支持 查询

MySQL ALTER命令

传送门-> 菜鸟教程 https://www.runoob.com/mysql/mysql-alter.html

查看表结构的两条命令

SHOW COLUMNS FROM table_name; 或 
DESC table_name;

MySQL索引

索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大则查询所花费的时间就越多。如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据。
【例】有一张2W条记录的表,记录着2W个人的信息。其中Phone的字段记录每个人的电话号码,现在想要查询出电话号码为xxxx的人的信息。如果没有索引,那么将从表中第一条记录一条条往下遍历,直到找到该条信息为止。如果有索引,那么会将该Phone字段,通过一定的方法进行存储,好让查询该字段上的信息时,能够快速找到对应的数据,而不必在遍历2W条数据了。

索引分单列索引和组合索引:
单列索引,即一个索引只包含单个列
组合索引,即一个索引包含多个列

优点:加快数据的查询速度
缺点:创建索引和维护索引要耗费时间,对表中的数据进行增加、删除、修改时,索引也需要动态的维护
      索引也需要占空间,我们知道数据表中的数据也会有最大上线设置的,如果我们有大量的索引,索引文件可能会比数据文件更快达到上线值
 =>
对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引。
数据量小的表最好不要使用索引,因为查询全部数据花费的时间可能比遍历索引的时间还要短。
在取值少的列上(字段上)不要建立索引,比如"性别"字段上只有男,女两个不同值。在一个字段上不同值较多可以建立索引。

参考:MySQL索引详细介绍  https://www.jianshu.com/p/0d6c828d3c70
命令参考菜鸟教程  https://www.runoob.com/mysql/mysql-index.html

 

获取服务器元数据

SELECT VERSION( ) 服务器版本信息
SELECT DATABASE( ) 当前数据库名 (或者返回空)
SELECT USER( ) 当前用户名
SHOW STATUS 服务器状态
SHOW VARIABLES 服务器配置变量
发布了89 篇原创文章 · 获赞 1 · 访问量 4836

猜你喜欢

转载自blog.csdn.net/wy_hhxx/article/details/103268701