当音乐还是稀缺的时候
上周,磁带的发明者、飞利浦公司的荷兰工程师 Lou Ottens 去世了。
这让我想起了往事。这里的年轻读者,可能从没有听过磁带,但是20多年前,它是我们接触流行音乐的唯一渠道。
那时,电台的音乐频道会播歌,要想反复听,就必须录音,或者购买歌手的专辑。我记得,最早一盒是7元,后来涨到了10元。对于学生是很贵的东西,买一盒要下很久的决心,买来以后会反复听几百遍。
现在完全不一样了,一个新专辑在网上发布,很少有人连着听几百遍吧,不知名歌手的专辑可能根本没人听。因为音乐实在太多了,随便一个流媒体网站,都是上百万的曲库,大家已经不会在一张专辑上花太多的时间了。
音乐家应该会怀念磁带的年代。那时,生活中缺乏音乐,人们才会那么投入地去听,歌手也会投入地创作。那时的歌曲真的会影响人生,甚至影响社会。
美国歌手鲍勃·迪伦因为他的歌词,得到诺贝尔文学奖。一个人要经历多少旅途,才能长大 \ 一只鸽子要飞过多少海洋,才能看到沙滩 \ 一门大炮要发射多少次,才有和平 \ 我的朋友啊,答案就在风中飘荡成了一个时代的标志。要是他生在现在,到处是快餐文化,这种歌即使写出来,也不会 ...
寻找你愿意忍受的痛苦
约翰·乌歇尔(John Urschel)是一个职业橄榄球运动员。
2017 年退役后,他改行研究数学,先在宾夕法尼亚大学拿到数学硕士,现在麻省理工学院攻读数学博士。
约翰·乌歇尔从小就对数学有兴趣,在他还打球的 2015 年,就在学术杂志上发表过论文《用于计算图拉普拉斯算子的 Fiedler 向量的级联多重网格算法》,这种题目一看就属于专业数学家的范畴,说明那时他的数学水平已经不低了。
因此,外界对这件事情的看法就是,他具有数学天才,所以改行去读数学也很正常。
一次采访中,他回应了这种看法。说得真好,推荐给大家。
“在别人眼里,数学对于数学家是很容易的。错了, 那是一场斗争,艰苦而孤独,不确定能得到成果,而且需要很长时间的奋斗。数学家是热爱斗争的人。”
他的意思是,即使他真心热爱数学,依然觉得数学研究非常艰苦。(注意,一个真心热爱的人还说艰苦,如果换成普通人,感受可想而知。)他能够坚持下去,并不是因为他觉得很容易,而是因为他可以忍受这些痛苦。
这段话对我很有启发。大家往往只看到成功时的荣耀,而忽视成功之前那个痛苦的过程。英国著名作家奥威尔就说过: ...
实用sql语句
插入或替换如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就先删除原记录,再插入新记录。此时,可以使用REPLACE语句,这样就不必先查询,再决定是否先删除再插入。
1REPLACE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);
若 id=1 的记录不存在,REPLACE 语句将插入新记录,否则,当前 id=1 的记录将被删除,然后再插入新记录。
插入或更新如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就更新该记录,此时,可以使用INSERT INTO ... ON DUPLICATE KEY UPDATE ...语句:
1INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99) ON DUPLICATE KEY UPDATE ...
连接查询
连接查询连接查询是另一种类型的多表查询。连接查询对多个表进行 JOIN 运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上。例如:
1SELECT s.id, s.name, s.class_id, s.gender, s.score FROM students s;
现在假设我们希望结果集同时包含所在班级的名称,上面的结果集只有 class_id 列,缺少对应班级的 name 列。但是,存放班级名称的 name 列存储在 classes 表中,只有根据 students 表的 class_id,找到 classes 表对应的行,再取出 name 列,就可以获得班级名称。这时,连接查询就派上了用场。我们先使用最常用的一种内连接——INNER JOIN 来实现:
1234SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.scoreFROM students sINNER JOIN classes cON s.class_id = c.id;
INNER JOIN ...
多表查询
多表查询SELECT 查询不但可以从一张表查询数据,还可以从多张表同时查询数据。查询多张表的语法是:**SELECT * FROM <表 1> <表 2>**。例如:
1SELECT * FROM students, classes;
这种一次查询两个表的数据,查询的结果也是一个二维表,它是 students 表和 classes 表的“乘积”,即 students 表的每一行与 classes 表的每一行都两两拼在一起返回。结果集的列数是 students 表和 classes 表的列数之和,行数是 students 表和 classes 表的行数之积。这种多表查询又称笛卡尔查询,使用笛卡尔查询时要非常小心,由于结果集是目标表的行数乘积,对两个各自有 100 行记录的表进行笛卡尔查询将返回 1 万条记录,对两个各自有 1 万行记录的表进行笛卡尔查询将返回 1 亿条记录。
你可能还注意到了,上述查询的结果集有两列 id 和两列 name,两列 id 是因为其中一列是 students 表的 id,而另一列是 classes 表的 id,但是在结果集中,不好区分 ...
查询操作
基本查询要查询数据库表的数据,我们使用如下的 SQL 语句:
1SELECT * FROM <表名>
SELECT 是关键字,表示将要执行一个查询,*表示“所有列”,FROM 表示将要从哪个表查询。
1SELECT 100+200; // 输出: 300
SELECT 可以用作计算,但它并不是 SQL 的强项。但是,不带 FROM 子句的 SELECT 语句有一个有用的用途,就是用来判断当前到数据库的连接是否有效。许多检测工具会执行一条 SELECT 1;来测试数据库连接。
条件查询条件查询的语法就是:
1SELECT * FROM <表名> WHERE <条件表达式>
条件表达式可以用<条件 1> AND <条件 2>表达满足条件 1 并且满足条件 2
第二种条件是<条件 1> OR <条件 2>,,表示满足条件 1 或者满足条件 2
第三种条件是 NOT <条件>,表示“不符合该条件”的记录。
如果不加括号,条件运算按照 NOT、AND、OR 的优先级进行,即 NOT 优先级最高, ...
增删改操作
关系数据库建立在关系模型之上。关系模型的本质就是若干个存储数据的二维表。
表的每一行称为记录(Record),记录一个逻辑上的数据。
表的每一列称为字段(Column)。字段定义了数据类型(整型、浮点型、字符串、日期等),以及是否允许为 NULL。
注意NULL表示字段数据不存在。一个整型字段如果为 NULL 不表示它的值为 0,同样的,一个字符串型字段为 NULL 也不表示它的值为空串’’。
通常情况下,字段应该避免允许为 NULL。不允许为 NULL 可以简化查询条件,加快查询速度,也利于应用程序读取数据后无需判断是否为 NULL。
同一个表的若干记录都有若干相同的字段。
关系数据库的表与表之间需要建立一对一,一对多,多对多的关系。
在关系数据库中,关系是通过主键外键来维护的。
主键对于关系表,有个很重要的约束,就是任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键。
对主键的要求,最关键的一点是:记录一旦插入到表中,主键最好不要再修改,因为主键是用来唯一定位记录的,修改了主键,会造成一系列的影 ...
关系模型
关系数据库建立在关系模型之上。关系模型的本质就是若干个存储数据的二维表。
表的每一行称为记录(Record),记录一个逻辑上的数据。
表的每一列称为字段(Column)。字段定义了数据类型(整型、浮点型、字符串、日期等),以及是否允许为 NULL。
注意NULL表示字段数据不存在。一个整型字段如果为 NULL 不表示它的值为 0,同样的,一个字符串型字段为 NULL 也不表示它的值为空串’’。
通常情况下,字段应该避免允许为 NULL。不允许为 NULL 可以简化查询条件,加快查询速度,也利于应用程序读取数据后无需判断是否为 NULL。
同一个表的若干记录都有若干相同的字段。
关系数据库的表与表之间需要建立一对一,一对多,多对多的关系。
在关系数据库中,关系是通过主键外键来维护的。
主键对于关系表,有个很重要的约束,就是任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键。
对主键的要求,最关键的一点是:记录一旦插入到表中,主键最好不要再修改,因为主键是用来唯一定位记录的,修改了主键,会造成一系列的影 ...
MySql基础知识
安装完 MySQL 后,除了 MySQL Server,即真正的 MySQL 服务器外,还附赠一个 MySQL Client 程序。
MySQL Client 是一个命令行客户端,可以通过 MySQL Client 登录 MySQL,然后,输入 SQL 语句并执行。
打开命令提示符,输入命令mysql -u root -p,提示输入口令。填入 MySQL 的 root 口令,如果正确,就连上了 MySQL Server,同时提示符变为mysql>:
输入exit断开与 MySQL Server 的连接并返回到命令提示符。
数据库在一个运行 MySQL 的服务器上,实际上可以创建多个数据库(Database)。要列出所有数据库,使用命令:SHOW DATABASE;。
创建一个新数据库,使用命令:CREATE DATABASE xxx;。(xxx:要创建的数据库名字)
删除一个数据库:DROP DATABASE test;
注意:删除一个数据库将导致该数据库的所有表全部被删除
对一个数据库进行操作时,要首先将其切换为当前数据库: USE xxx;
表列出当前数据库的所有表,使用 ...
Sql基础知识
数据库出现的原因:因为应用程序需要保存用户的数据,比如 Word 需把用户文档保存起来,以便下次继续编辑或拷贝到另一台电脑。要保存用户的数据,最简单的方法是把用户数据写入文件。例如,要保存一个班级所有学生的信息,可以向文件中写入一个 CSV 文件。但是,随着应用程序的功能越来越复杂,数据量越来越大,对数据的保存和管理会出现下面的问题:
读写文件并解析出数据需要大量重复代码。
从成千上万的数据中快速查询出指定数据需要复杂的逻辑。
如果每个应用程序都各自写自己的读写数据的代码,一方面效率低,容易出错。
每个应用程序访问数据的接口都不相同,数据难以复用。
数据库存储应用数据的好处应用程序不需要自己管理数据,而是通过数据库软件提供的接口来读写数据。同时,应用程序不用关心数据本身如何存储到文件的。
数据模型
层次模型:层次模型就是以“上下级”的层次关系来组织数据的一种方式,层次模型的数据结构看起来就像一颗树
网状模型:网状模型把每个数据节点和其他很多节点都连接起来,它的数据结构看起来就像很多城市之间的路网
关系模型:关系模型把数据看作是一个二维表格,任何数据都可以通过行号+列号来唯一确定,它 ...