【跃迁之路】【423天】刻意练习系列182—SQL(2018.04.04)

news/2024/7/6 6:34:14

@(跃迁之路)专栏

叨叨两句

  1. 技术的精进不能只是简单的刷题,而应该是不断的“刻意”练习
  2. 该系列改版后正式纳入【跃迁之路】专栏,持续更新

刻意练习——MySQL

2018.04.02

题目描述

DROP TABLE IF EXISTS test1;
CREATE TABLE test1 (
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(20) NOT NULL,
course varchar(20) NOT NULL,
score bigint(20) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

INSERT INTO test1 VALUES ('1', '张三', '数学', '34');
INSERT INTO test1 VALUES ('2', '张三', '语文', '44');
INSERT INTO test1 VALUES ('3', '张三', '英语', '54');
INSERT INTO test1 VALUES ('4', '李四', '数学', '134');
INSERT INTO test1 VALUES ('5', '李四', '语文', '144');
INSERT INTO test1 VALUES ('6', '李四', '英语', '154');
INSERT INTO test1 VALUES ('7', '王五', '数学', '234');
INSERT INTO test1 VALUES ('8', '王五', '语文', '244');
INSERT INTO test1 VALUES ('9', '王五', '英语', '254');

查出以下结果

法1

SELECT
    A.username,A.score as '数学',B.score as '语文',C.score as '英语'
FROM 
(select username,course,score from test1 where course = '数学') A,
(select username,course,score from test1 where course = '语文') B,
(select username,course,score from test1 where course = '英语') C
WHERE
    A.username = B.username
and B.username = C.username

法2【推荐】

select
    username,sum(case course when '数学' then score else 0 end ) as '数学',
sum(case course when '语文' then score else 0 end ) as '语文',
sum(case course when '英语' then score else 0 end ) as '英语'
FROM
    test1
group by username

2018.04.03

题目描述

在audit表上创建外键约束,其emp_no对应employees_test表的主键id。
CREATE TABLE employees_test(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);

CREATE TABLE audit(
EMP_no INT NOT NULL,
create_date datetime NOT NULL
);

DROP TABLE audit;
CREATE TABLE audit(
    EMP_no INT NOT NULL,
    create_date datetime NOT NULL,
    FOREIGN KEY(EMP_no) REFERENCES employees_test(ID)
);

2018.04.04

由于视图 emp_v 的记录是从 employees 中导出的,所以要判断两者中相等的数据,只需要判断emp_no相等即可。
方法一:用 WHERE 选取二者 emp_no 相等的记录

SELECT em.* FROM employees AS em, emp_v AS ev WHERE em.emp_no = ev.emp_no
方法二:用 INTERSECT 关键字求 employees 和 emp_v 的交集
可参考:http://www.sqlite.org/lang_select.html

SELECT * FROM employees INTERSECT SELECT * FROM emp_v
方法三:仔细一想,emp_v的全部记录均由 employees 导出,因此可以投机取巧,直接输出 emp_v 所有记录

SELECT * FROM emp_v
【错误方法:】用以下方法直接输出 *,会得到两张表中符合条件的重复记录,因此不合题意,必须在 * 前加表名作限定

SELECT * FROM employees, emp_v WHERE employees.emp_no = emp_v.emp_no

http://www.niftyadmin.cn/n/2608624.html

相关文章

浏览器工作原理学习(十二)

编译器和解释器 按语言的执行流程,可以把语言划分为编译型语言和解释型语言。编译型语言:在程序执行前,需要经过编译器的编译过程,并且编译之后会直接保留机器能读懂的二进制文件,这样每次运行程序时,都可以…

离线计算成本节省的神兵利器

摘要: 对于创业成长型的企业来说,离线计算已经必不可少了,通过离线计算我们可以生成复杂的业务报表,通过离线计算我们也能精确的算出用户画像。离线计算已经当今的企业中成为了不可或缺的存在。那么使用弹性计算能够对离线计算领域…

浏览器工作原理学习(十三)

消息队列和事件循环系统 消息队列 消息队列是一种数据结构,可以存放要执行的任务。它符合队列先进先出的特点。IO线程中的产生的新任务会添加进消息队列尾部。渲染主线程会循环地从消息队列头部中读取任务,执行任务。由于多个线程操作同一个消息队列&am…

浏览器工作原理学习(十四)

WebAPI:setTimeout 浏览器中的setTimeout 执行一段异步任务,需要先将任务添加到消息队列中。为了保证回调函数能在指定时间内执行,定时任务的回调函数不能直接添加到消息队列。延迟队列:维护消息队列中需要延迟执行的任务列表。如果当前任务…

(牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)

假定一种编码的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a, aa, aaa,aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx,yyyy 其中a的Index为0&…

浏览器工作原理学习(十五)

微任务与宏任务 宏任务 为了协调任务在主线程上执行,页面进程引入消息队列和事件循环机制,渲染进程内部会维护多个消息队列,主线程从这些任务队列中取出任务执行,这写消息队列种的任务称为宏任务。 微任务 第一种:把…

django markdown

1. 编辑器 css 1 <link rel"stylesheet" href"{% static plugin/editor.md/css/editormd.css %}"> div 1 <div id"editormd" class"col-md-10 text-left"> 2 <textarea name&…

浏览器工作原理学习(十六)

请求陷入排队的几种情况 页面中的资源是有优先级的&#xff0c;比如CSS、HTML、JS等哦都是页面中的核心文件&#xff0c;所以优先级最高。而图片、视频、音频这类资源就不是核心资源&#xff0c;优先级就比较低&#xff0c;通常当后者遇到前者时&#xff0c;就需要让路&#x…