【跃迁之路】【425天】刻意练习系列184—SQL(2018.04.06)

news/2024/6/24 20:47:57

@(跃迁之路)专栏

叨叨两句

  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

SELECTA.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
WHEREA.username = B.username
and B.username = C.username

法2【推荐】

selectusername,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 '英语'
FROMtest1
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.htmlSELECT * 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

2018.04.05

题目描述
将所有获取奖金的员工当前的薪水增加10%。
create table emp_bonus(
emp_no int not null,
recevied datetime not null,
btype smallint not null);
CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL, PRIMARY KEY (emp_no,from_date));

UPDATE salaries SET salary = salary * 1.1 WHERE emp_no IN
(SELECT s.emp_no FROM salaries AS s INNER JOIN emp_bonus AS eb 
ON s.emp_no = eb.emp_no AND s.to_date = '9999-01-01')

2018.04.06

题目描述
针对库中的所有表生成select count(*)对应的SQL语句
CREATE TABLE employees (
emp_no int(11) NOT NULL,
birth_date date NOT NULL,
first_name varchar(14) NOT NULL,
last_name varchar(16) NOT NULL,
gender char(1) NOT NULL,
hire_date date NOT NULL,
PRIMARY KEY (emp_no));
create table emp_bonus(
emp_no int not null,
recevied datetime not null,
btype smallint not null);
CREATE TABLE dept_emp (
emp_no int(11) NOT NULL,
dept_no char(4) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,dept_no));
CREATE TABLE dept_manager (
dept_no char(4) NOT NULL,
emp_no int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,dept_no));
CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,from_date));

输出格式:
cnts
select count(*) from employees;
select count(*) from departments;
select count(*) from dept_emp;
select count(*) from dept_manager;
select count(*) from salaries;
select count(*) from titles;
select count(*) from emp_bonus;

本题主要有以下两个关键点:
1、在 SQLite 系统表 sqlite_master 中可以获得所有表的索引,其中字段 name 是所有表的名字,而且对于自己创建的表而言,字段 type 永远是 'table',详情可参考:
http://blog.csdn.net/xingfeng0501/article/details/78043782、在 SQLite 中用 “||” 符号连接字符串
SELECT "select count(*) from " || name || ";" AS cnts
FROM sqlite_master WHERE type = 'table'3.mysql使用concat进行字符串拼接

http://lihuaxi.xjx100.cn/news/247519.html

相关文章

Java中的简单工厂模式(转)

Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式:女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人。”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面…

rpcgen的简单讲解及例子程序

rpcgen 简介 rpcgen可以自动生成RPC服务器程序的大多数代码,它的输入为一个规格说明文件,它的输出为一个C语言的源程序。规格文件(*.x)包含常量、全局数据类型以及远程过程的声明。Rpcgen产生的代码包含了实现客户机和服务器程序所…

C++左值与右值

1. 左值与右值 左值:可以放到等号左边的东西叫左值。可以取地址并且有名字的东西就是左值。 右值:不可以放到等号左边的东西就叫右值。不能取地址的没有名字的东西就是右值。 举例: int a b c; a是左值,有变量名&#xff0…

torch.stack()用法

torch.stack((tensor1, tensor2,…), dimx, outNone) 作用:于将tensor进行按照指定维度进行堆叠。 一维tensor w torch.arange(4) h torch.tensor([0.6, 0.7, 0.8, 0.2]) torch.stack([-w, -h, w, h], dim0) >>> tensor([[ 0.00, -1.00, -2.00, -3.00]…

所有类是object的子类,但是又可以继承一个其他类解析

所有类的祖宗是object,所有类只能有一个父亲。Java的单继承指的是一个类不能有多个父亲,而C就能有好多父亲。举个例子:如果A 没有继承任何类,那他的类层次关系默认是 A -- Object如果A 继承了类B,那他的类层次关系变为…

Python命令行可视化库

我们通常都是在自己的电脑上跑程序,直接是可以可视化相应的结果。如果是在服务器上的话,使用终端,是不太方便查看结果。本文介绍4个可以在命令行中使用的Python库,分别是 BashplotlibtqdmPrettyTableColorama 1. 使用Bashplotlib…

torch.repeat_interleave()用法

torch.repeat_interleave(input, repeats, dimNone) → Tensor 参数 input:输入的张量(类型为Tensor) repeats(类型:int或torch.Tensor):每个元素的重复次数。repeats参数会被广播来适应输入张…

视频专辑:Photoshop基础视频教程

为什么80%的码农都做不了架构师?>>> 专辑:Photoshop基础视频教程 简介:Photoshop基础视频教程 1 1. 软件界面介绍 [photoshop基础教程] 2013-10-31 11:56 | 播放(6) | 评论(0) | 时长:42:44 2 2. 工行LOGO分析及制作1 [photoshop基础教程…