写了两篇《MySQL入门》以后我发现,写书的人还是都挺有本事的,起码人家知道怎么编排自己想讲的知识点,我实在是不知道该先说那里后说哪里,那我就想到什么讲什么吧。

一 写SQL

其实我是不想写有关SQL的部分的,因为这个部分其实很简单,基本上大学只要好好听听数据库概论这门课基本上都能写满足功能的SQL,但是后来想想,SQL其实是人和数据库交互的一种接口,不会SQL确实是不可以的,写的不好感觉不出数据库有多么的强大,甚至有可能会让人产生出数据库慢的坏印象。

MySQL作为most popular的开源数据库,其实在SQL支持这里做的不是那么完美,比如5.6为止还是不支持全外连接(5.7没试过是不是支持)。如果有人说全外连接这东西不支持就不支持了,没什么,但是我想说的是既然RDBMS是基于Codd的理论,那么全外连接作为关系代数的一部分,不实现是有点说不过去的。相反,Berkeley出身的PostgreSQL就做的很好了,毕竟人家是most advanced开源数据库。

闲话少叙。其实平时很多程序员写的最多的SQL是这样子的:

  1. select t1.a, t1.b, t2.c, t2.d from table1 t1, table2 t2 where t1.m = t2.m and t1.k = ?;

这个写法一点问题都没有,特别的自然,翻译成汉语是这样的:

我需要从table1和table2中取一些数据出来,这两张表通过m列关联起来取交集,其中table1要卡k条件。

这个SQL按下不表,继续说些技术性的东西。

基础语法的东西就不说了,说一下连接。使用频率最高的就是内连接和外连接两种了。连接在我看来就是一种集合运算,比如内连接就是很自然的取交集运算,以两张表的内连接说,就是A和B两个集合做了A∩B运算。

内连接,翻译成英文就是inner join;外连接,翻译成英文就是outer join。所以说SQL是很好理解的,甚至接近了自然的语言。

写一个内连接:

  1. select t1.a, t1.b, t2.c, t2.d from table1 t1 inner join table2 t2 on t1.m = t2.m where t1.k = ?;

这个SQL就是上面那个SQL的等价形式,只不过这是ANSI SQL92写法,上面那种是ANSI SQL89写法,SQL是一种语言,更是一种标准,新的标准更好理解,显然的让我们知道了这个SQL采用了内连接的形式。

至于连接具体怎么写,我很早以前写了一篇笔记:《Oracle的连接》。我就不重复发明轮子了,虽然当时采用的是Oracle,但是我说过了,SQL是一种标准,因此放到任何一个RDBMS里,这些都是通用的。

我本来就没有打算把这个写成什么正式的东西,我没有写书的梦想,所以基本上都是扯淡,扯淡的中途讲点知识。

二 数据类型

SQL也是一种编程语言!SQL也是一种编程语言!SQL也是一种编程语言!

我要把这个强调三遍,因为很多很多,多入牛毛的同行都会觉得写SQL是个很简单的事情,SQL就是增删改查数据,学一个小时就会的东西,是个很low的东西。我见过的很多人都问我SQL到底有什么写的,不就些破命令么?我真的不知道怎么回答他们。

SQL真的可以做很多事情,而写好SQL并不太容易,当然,更不难。

MySQL支持的数据类型大致分为:数字类型,时间日期类型,字符型。

以前玩儿Oracle的时候,数字类型通通是number型,好用到没朋友。但是MySQL不是这样搞的,MySQL的数字类型分为tinyint, smallint, mediumint, int, bigint。每种类型都会有“有符号”和“无符号”的属性,他们的范围如下表:

类型 占用空间(字节) 最小值 最大值
tinyint 1 -128 127
tinyint(unsigned) 1 0 255
smallint 2 -32768 32767
smallint(unsigned) 2 0 65535
mediumint 3 -8388608 8388607
mediumint(unsigned) 3 0 16777215
int 4 -2147483648 2147483647
int(unsigned) 4 0 4294967295
bigint 8 -9223372036854775808 9223372036854775807
bigint(unsigned) 8 0 18446744073709551615

很难记,但是其实不是很难,占用空间这里呢,我们都知道1Byte等于8bit,那么tinyint的取值范围就应该是[-2^(8-1), 2^(8-1)-1]。如果是无符号类型的取值范围就能推导出来了,有基本数学知识都能理解。

我第一次玩儿MySQL的时候,发现列类型经常是int(4)这样的,这个4是什么呢?从上面的表中明显可以看出数字型占用的空间总是一定的,那这里的4就不是char(4)里面那种意思了,这其实是填充格式用的,要和ZEROFILL属性一起用的,这样就能让字段被填充满,不过不影响取值,感觉像是语法糖之类的东西。

后来我觉得MySQL的varchar型有意思,有意思就在于varchar括号内的长度不是字节数,而是字符数,与汉字英文无关,就是字符数,这个感觉又是一个语法糖之类的东西,我在设计表的时候就不需要考虑什么字符集了,直接告诉程序员我给你了一个列,这个列最多存100个字符,你们自己控制。

但是这里还是有个陷阱。很多书上和网上的资料都会说,InnoDB表的所有varchar字段长度的总和不得超过65535,就说到了这里就不说了。实际上不能忽略一个前提,就是字符集应该选择latin1,而且绝对不是65535,是65532,还有些别的开销。如果换成UTF8字符集呢?这个理论总和限制就会变成21845,这个数字其实就是65535/3,实际上的限制是21844。所以我说这个是个语法糖,其实还是字符集相关的,只是不再让上层的程序员去考虑了,而是由DB自己保证。

时间和日期类型MySQL也是很丰富的,而且特别简单,'2015-12-12 12:31:20'这样就可以,Oracle的话还得写个什么函数去把字符串转成date型。当然时间和日期类型也是有空间占用的,很多资料上都会说用TIMESTAMP类型取代DATETIME类型,这样节省空间,确实没有问题,TIMESTAMP占用的空间仅有DATETIME的一半,但是要注意,TIMESTAMP的范围不大,1970年到2038年,节省空间是对的,但是要注意应用场景。

当然还有很讨厌的BLOB和TEXT这样的大数据类型(huge size data type),这可不是现在特别火的big data。这部分数据嘛,我觉得能不用就别用了,他们的存储都是在单独的地方,效率上我个人觉得堪忧。不过还是那句话,设计的时候要注意应用场景,给恰当的数据类型。

今天就扯到这里吧。

MySQL入门(三)的更多相关文章

  1. MYSQL入门(三)

    索引简介 索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构.如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息 ...

  2. <MySQL>入门三 数据定义语言 DDL

    -- DDL 数据定义语言 /* 库和表的管理 一.库的管理:创建.修改.删除 二.表的管理:创建.修改.删除 创建:create 修改:alter 删除:drop */ 1.库的管理 -- 库的管理 ...

  3. MySQL概述及入门(三)

    MySql概述及入门(三) MySQL性能优化 主要优化安全和性能方面 安全方面 : 数据可持续性 性能方面 : 数据的高性能访问 性能优化——慢查询 在MySQL数据库中有一个慢查询日志功能,去获取 ...

  4. 【数据库】3.0 MySQL入门学习(三)——Windows系统环境下MySQL安装

    1.0 我的操作系统是window10 专业版 64位.,不过至少windows7以上系统都是一样的. 关于MySQL如何下载,请参考博文: [数据库]2.0 如何获得MySQL以及MySQL安装 h ...

  5. Mysql快速入门(三)

    MySQL性能优化之查看执行计划explain 介绍: (1).MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发 ...

  6. 21分钟 MySQL 入门教程(转载!!!)

    21分钟 MySQL 入门教程 目录 一.MySQL的相关概念介绍 二.Windows下MySQL的配置 配置步骤 MySQL服务的启动.停止与卸载 三.MySQL脚本的基本组成 四.MySQL中的数 ...

  7. MYSQL入门全套(第三部)

    MYSQL入门全套(第一部) MYSQL入门全套(第二部) 索引简介 索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构.如果想按特定职员的姓来查找 ...

  8. MySQL入门笔记

    MySQL入门笔记 版本选择: 5.x.20 以上版本比较稳定 一.MySQL的三种安装方式: 安装MySQL的方式常见的有三种: ·          rpm包形式 ·          通用二进制 ...

  9. MySQL入门转载

    21分钟 MySQL 入门教程 http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html 目录 一.MySQL的相关概念介绍 二.Wi ...

随机推荐

  1. mysql对表操作的各种语句

    创建表 create table tb_user( id int(类型)primary key(设置为主键) auto_increment (设置id自增长), 每一个字段用逗号隔开, name va ...

  2. 2016 长春东北赛---Coconuts(离散化+DFS)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5925 Problem Description TanBig, a friend of Mr. Frog ...

  3. 泛函编程(5)-数据结构(Functional Data Structures)

    编程即是编制对数据进行运算的过程.特殊的运算必须用特定的数据结构来支持有效运算.如果没有数据结构的支持,我们就只能为每条数据申明一个内存地址了,然后使用这些地址来操作这些数据,也就是我们熟悉的申明变量 ...

  4. 如何解决CRUD操作中与业务无关的字段赋值

    提高效率一直是个永恒的话题,编程中有一项也是可以提到效率的,那就是专注做一件事情,让其它没有强紧密联系的与之分开.这里分享下我们做CRUD时遇到的常见数据处理场景: 数据库表字段全部设计为非空,即使这 ...

  5. 说说IT技术团队招聘那点事

    因为近来由于新项目的需要,各种招聘比较多,几乎每周都要面试几个人,顺便对以前的面试和带开发经验进行简单的总结 1.首先负责招聘的人一定得是自己团队的人,而且在招聘的时候一定要想清楚目标候选人进来的职责 ...

  6. Redis-持久化

    Redis 持久化 Redis 提供了不同持久化范围的选项: RDB 持久化以指定的时间间隔执行数据集的即时点(point-in-time)快照. AOF 持久化在服务端记录每次收到的写操作,在服务器 ...

  7. 用div和css样式控制页面布局

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  8. Wami Map Project – 开源的 OSM API 服务

    Wami 地图项目把 OSM 数据分享给所有的人,很容易使用.他们利用 MongoDB 的潜力进行大数据管理来实现从 OSM 数据来源搜索相关的数据.它们的 API 使人们有可能检索不同格式的 POI ...

  9. go语言编辑器:liteide

    LiteIDE is a simple, open source, cross-platform Go IDE. LiteIDE是一款开源.跨平台的轻量级Go语言集成开发环境(IDE). 项目地址:h ...

  10. JS常用的设计模式

    单例模式 只创建类的唯一一个实例.我们看了好几种可以不通过构造函数和类Java语法达成单例的方法.从另一方面来说,JavaScript中所有的对象都是单例.有时候开发者说的单例是指通过模块化模式创建的 ...