SQL学习记录

在 DBeaver 连接到 MySQL 时提示错误 Public Key Retrieval is not allowed

在 DBeaver 里右键连接不上的数据库,点“编辑连接”,“主要”->“Sever”->“数据库”。在数据库名字后边加上 ?allowPublicKeyRetrieval=true

使用 Windows 命令行运行 SQL 脚本来创建表

在目录C:\Program Files\MySQL\MySQL Server 8.0\bin下打开CMD。

将写好的sql脚本拷贝到这个目录下。假设这个文件的名字叫xxx.sql

执行命令 mysql -u root -p < xxx.sql,然后输入密码就可以了。

如果不支持中文,就在脚本的顶部加上 set names gbk;,并且将脚本保存成 gbk 编码。

例如:

set names gbk;

CREATE DATABASE IF NOT EXISTS test;

USE test;

DROP TABLE IF EXISTS 表名X;

CREATE TABLE 表名X (
    序号 BIGINT NOT NULL AUTO_INCREMENT,
    班级号 BIGINT NOT NULL,
    学生名字 VARCHAR(100) NOT NULL,
    事件名 VARCHAR(100) NOT NULL,
	日期 VARCHAR(100) NOT NULL,
    PRIMARY KEY (序号)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO 表名X (序号, 班级号, 学生名字, 事件名, 日期) VALUES (1, 1, '杨过', '打豆豆', '昨天');
INSERT INTO 表名X (序号, 班级号, 学生名字, 事件名, 日期) VALUES (2, 2, '郭靖', '吃饭', '昨天');
INSERT INTO 表名X (序号, 班级号, 学生名字, 事件名, 日期) VALUES (3, 2, '郭靖', '睡觉', '昨天');
INSERT INTO 表名X (序号, 班级号, 学生名字, 事件名, 日期) VALUES (4, 1, '小龙女', '睡觉', '今天');
INSERT INTO 表名X (序号, 班级号, 学生名字, 事件名, 日期) VALUES (5, 2, '黄蓉', '吃饭', '今天');
INSERT INTO 表名X (序号, 班级号, 学生名字, 事件名, 日期) VALUES (6, 2, '黄蓉', '打豆豆', '今天');
INSERT INTO 表名X (序号, 班级号, 学生名字, 事件名, 日期) VALUES (7, 1, '杨过', '打豆豆', '今天');

SELECT 'ok' as 'result:';

group by 的用法

假设有两个班,1班里的同学是杨过和小龙女,2班里的同学是郭靖和黄蓉。他们做的事分别吃饭、睡觉、打豆豆。他们每次做这些事的时候都会在表格里留下一条记录。

序号 班级号 学生名字 事件名 日期
1 1 杨过 打豆豆 昨天
2 2 郭靖 吃饭 昨天
3 2 郭靖 睡觉 昨天
4 1 小龙女 睡觉 今天
5 2 黄蓉 吃饭 今天
6 2 黄蓉 打豆豆 今天
7 1 杨过 打豆豆 今天
  1. 豆豆一共被打了多少次?
select count(*) as 打豆豆总次数 from test.表名X where 事件名 = '打豆豆'
select sum(case when 事件名 = '打豆豆' then 1 else 0 end) as 打豆豆总次数 from test.表名X
  1. 各个班分别打了多少次豆豆?
    -- 不用 group by 的写法
    select count(*) as 各个班级的打豆豆次数 from test.表名X where 班级号 = 1 and 事件名 = '打豆豆'
    select count(*) as 各个班级的打豆豆次数 from test.表名X where 班级号 = 2 and 事件名 = '打豆豆'
    -- 用 group by 的写法
    select sum(case when 事件名 = '打豆豆' then 1 else 0 end) as 各个班级的打豆豆次数 from test.表名X group by 班级号

从上面的例子可以看出,如果想要统计1班和2班分别一共打了多少次豆豆,如果用group by更方便。