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 | 杨过 | 打豆豆 | 今天 |
- 豆豆一共被打了多少次?
select count(*) as 打豆豆总次数 from test.表名X where 事件名 = '打豆豆'
select sum(case when 事件名 = '打豆豆' then 1 else 0 end) as 打豆豆总次数 from test.表名X
- 各个班分别打了多少次豆豆?
-- 不用 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更方便。