MySQL入门(三)
写了两篇《MySQL入门》以后我发现,写书的人还是都挺有本事的,起码人家知道怎么编排自己想讲的知识点,我实在是不知道该先说那里后说哪里,那我就想到什么讲什么吧。
一 写SQL
其实我是不想写有关SQL的部分的,因为这个部分其实很简单,基本上大学只要好好听听数据库概论这门课基本上都能写满足功能的SQL,但是后来想想,SQL其实是人和数据库交互的一种接口,不会SQL确实是不可以的,写的不好感觉不出数据库有多么的强大,甚至有可能会让人产生出数据库慢的坏印象。
MySQL作为most popular的开源数据库,其实在SQL支持这里做的不是那么完美,比如5.6为止还是不支持全外连接(5.7没试过是不是支持)。如果有人说全外连接这东西不支持就不支持了,没什么,但是我想说的是既然RDBMS是基于Codd的理论,那么全外连接作为关系代数的一部分,不实现是有点说不过去的。相反,Berkeley出身的PostgreSQL就做的很好了,毕竟人家是most advanced开源数据库。
闲话少叙。其实平时很多程序员写的最多的SQL是这样子的:
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是很好理解的,甚至接近了自然的语言。
写一个内连接:
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入门(三)的更多相关文章
- MYSQL入门(三)
索引简介 索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构.如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息 ...
- <MySQL>入门三 数据定义语言 DDL
-- DDL 数据定义语言 /* 库和表的管理 一.库的管理:创建.修改.删除 二.表的管理:创建.修改.删除 创建:create 修改:alter 删除:drop */ 1.库的管理 -- 库的管理 ...
- MySQL概述及入门(三)
MySql概述及入门(三) MySQL性能优化 主要优化安全和性能方面 安全方面 : 数据可持续性 性能方面 : 数据的高性能访问 性能优化——慢查询 在MySQL数据库中有一个慢查询日志功能,去获取 ...
- 【数据库】3.0 MySQL入门学习(三)——Windows系统环境下MySQL安装
1.0 我的操作系统是window10 专业版 64位.,不过至少windows7以上系统都是一样的. 关于MySQL如何下载,请参考博文: [数据库]2.0 如何获得MySQL以及MySQL安装 h ...
- Mysql快速入门(三)
MySQL性能优化之查看执行计划explain 介绍: (1).MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发 ...
- 21分钟 MySQL 入门教程(转载!!!)
21分钟 MySQL 入门教程 目录 一.MySQL的相关概念介绍 二.Windows下MySQL的配置 配置步骤 MySQL服务的启动.停止与卸载 三.MySQL脚本的基本组成 四.MySQL中的数 ...
- MYSQL入门全套(第三部)
MYSQL入门全套(第一部) MYSQL入门全套(第二部) 索引简介 索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构.如果想按特定职员的姓来查找 ...
- MySQL入门笔记
MySQL入门笔记 版本选择: 5.x.20 以上版本比较稳定 一.MySQL的三种安装方式: 安装MySQL的方式常见的有三种: · rpm包形式 · 通用二进制 ...
- MySQL入门转载
21分钟 MySQL 入门教程 http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html 目录 一.MySQL的相关概念介绍 二.Wi ...
随机推荐
- Firemonkey 控件设定字型属性及颜色
将控件 StyledSettings 的勾取消(如此才能自定样式及字型,如果勾选则依 Style 而定). 设定 TextSettings 里的 Font 属性. 使用代码寫法: CheckBox1. ...
- 写PHP代码你搞过单元测试吗
其实一开始我内心是想做单元测试(unit testing)的,但时间久了,也就不想了. 要想通过PHP编程成为技术领域的专家,其实功夫在PHP之外.数据库至少得看几本书,xml至少得看一本书,单元测试 ...
- Scalaz(33)- Free :算式-Monadic Programming
在任何模式的编程过程中都无法避免副作用的产生.我们可以用F[A]这种类型模拟FP的运算指令:A是可能产生副作用的运算,F[_]是个代数数据类型ADT(Algebraic Data Type),可以实现 ...
- 十大Intellij IDEA快捷键
转载:http://blog.csdn.net/dc_726/article/details/42784275 Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一 ...
- GJM : 使用浏览器的计算力,对抗密码破解 [转载]
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- C#之第五单元的项目打印购物单
人生的坚持,学习的坚持,尽管遭遇困苦,但是我们却能在一次次的苦难中成长,重新爬起来.这就是奋斗的人生.就是挥洒自己青春,汗水的有意义,有价值的生活.而,我虽然在平凡的人群中不起眼,可是每个人却闪耀着自 ...
- ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint......
今天用Hibernate建立外键的时候发现没有建立 但是创建了这个字段 情景: user表有一字段role,role是role表id字段的外键 原因: user表中已经有记录了,而且有的记录role这 ...
- Exchange 2013 、Lync 2013、SharePoint 2013 三
前两篇介绍的是关于Exchange 与 Lync 之间的配制关系,这一篇介绍关于Lync.Exchange 与 SharePoint 之间建立信任关系. 首先要创建基于SSL的SharePoint A ...
- Quartz.NET开源作业调度框架系列(三):IJobExecutionContext 参数传递
前面写了关于Quartz.NET开源作业调度框架的入门和Cron Trigger , 这次继续这个系列, 这次想讨论一下Quartz.NET中的Job如何通过执行上下文(Execution Conte ...
- Java Swing快速构建窗体应用程序
以前接触java感觉其在桌面开发上,总是不太方便,没有一个好的拖拽界面布局工具,可以快速构建窗体. 最近学习了一下NetBeans IDE 8.1,感觉其窗体设计工具还是很不错的 , 就尝试一下做了一 ...