前言
这篇文章旨在给数据库初学者理清一个大致的学习路线并且对数据库初期学习有一个大致的路线。2017年7月份重新温习了以下这部分的知识,特别梳理一下。我在数据库的研究上也只是初步阶段,这些算是同为初学者之间的交流吧,有什么不得体的地方,请指明。
数据库设计
- 需求分析。涵盖内容的大部分角落,明确指出有哪些东西,这些东西有什么属性,并且彼此之间有什么联系。
名字明确。看了数据库里的表和字段能够立刻明白其中含义和作用。
- 由设计师设计出页面,看看页面需要哪些元素。
- 项目经理据此绘制E-R图来确立事情与行为。
- 数据库设计师根据E-R图来进行数据库设计,明确各个表之间的关联。
- 程序员依据数据库编程。
数据类型
整型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1字节 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2字节 | (-32768,32767) | (0,65535) | 大整数值 |
MEDIUMINT | 3字节 | (-8388608,8388607) | (0,16777215) | 大整数值 |
INT/INTEGER | 4字节 | (-2147483648,2147483647) | (0,4294967295) | 大整数值 |
BIGINT | 8字节 | (-9233372036854775808,9233372036854775807) | (0,18446744073709551615) | 极大整数值 |
浮点型
类型 | 大小 | 用途 |
---|---|---|
FLOAT | 4字节 | 单精度浮点数值 |
DOUBLE | 8字节 | 双精度浮点数值 |
DECIMAL | 取决于M与D | 小数值 |
字符型
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-255字节 | 变长字符串 |
BLOB | 0-65535字节 | 二进制形式的长文本数据 |
TEXT | 0-65535字节 | 长文本数据 |
时间型
类型 | 大小 | 用途 |
---|---|---|
DATE | 3字节 | 日期 |
TIME | 3字节 | 时间值或者持续时间 |
YEAR | 1字节 | 年份 |
DATETIME | 8字节 | 双精度浮点数值 |
TIMESTAMP | 8字节 | 存储了1970年开始到现在的毫秒数,时区转换很方便,但是最大只支持到2038年 |
增删改查
大写全是关键字,中文为可替换部分
创建数据库
CREATE DATABASE 数据库名字;
删除数据库
DROP DATABASE 数据库名字;
查看数据库
SHOW DATABASES;
修改数据库名
MySQL5.1中的版本是支持以下代码删除数据库的
RENAME DATABASE 旧数据库名 TO 新数据库名;
可是之后的版本不再支持,用户可以通过新建新的数据库移动表到里面并且删除旧的数据库来操作。当然,也有脚本可以支持。
表
在使用表之前,要选择数据库。
USE 数据库名;
创建表
CREATE TABLE IF NOT EXISTS 表名(列名 数据类型 [约束][,...,列名n 数据类型n 约束n]);
删除表
DROP TABLE 表名;
修改表名
ALTER TABLE 旧表名 RENAME TO 新表名;
查看表
SHOW TABLES;
查看创建表语句
SHOW CREATE TABLE 表名;
复制表结构及数据
CREATE TABLE 新表 AS SELECT * FROM 旧表;
只复制表结构
CREATE TABLE 新表 AS SELECT * FROM 旧表 WHERE 1=2;
只复制表数据
INSERT INTO 新表(列名,...) SELECT 列名,... FROM 旧表;
字段
添加列
ALTER TABLE 表名 ADD 字段 属性;
删除列
ALTER TABLE 表名 DROP 字段;
修改列
ALTER TABLE 表名 CHANGE 旧字段 新字段 新属性;
查询列
SHOW FULL COLUMNS FROM 表名;
数据
增
INSERT INTO 表名(字段) VALUES(值)[,(值2),...,(值n)];
删
DELETE FROM 表名 条件;
改
UPDATE 表名 SET 列=值[,...,列n=值n] FROM 表名 条件;
查
SELECT 字段 FROM 表名 条件;
约束
约束类型
主键约束(PRIMARY KEY)
PRIMARY KEY(字段名)
外键约束(FOREGIN KEY)
外键约束是建立两个表之间的关系,也是关系型数据库的特色\
设置外键的表叫做从/子表,参照的表称之为主/父表\
ON DELETE CASCADE是为了让父表的该数据删除时,子表一道删除
CREATE TABLE ORDERS(
OID INT PRIMARY KEY,
USER_ID INT,
CONSTRAINT 外键名字 FOREIGN KEY(USER_ID) REFERENCES 父表(父表的字段) ON DELETE CASCADE
);
删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
唯一性约束(UNIQUE)
该字段中的表不可以重复
ALTER TABLE 表名 ADD CONSTRAINT 唯一约束名 UNIQUE(字段名);
删除唯一性约束
ALTER TABLE 表名 DROP INDEX 唯一约束名;
默认值约束
创建表时在数据类型后添加
DEFAULT 值
非空约束
NOT NULL
检查约束
不过MySQL不支持检查约束
CHECK(字段取值范围)
进阶
上面的都是些基本语法,不加以修饰,涉及的也仅仅是简单的增删改查
limit
limit 数字m\
只显示m行的数据,默认从第一条开始\
limit 数字m,数字n\
从第m-1行开始(0代表第一行),显示n个数据
ORDER BY
排序\
ORDER BY 字段 DESC|ASC\
默认是ASC,即升序,DESC为降序
通配符
用于代替一段字符\
%代表若干字符\
_代表一个字符
聚合函数
函数名 | 解释 |
---|---|
AVG() | 平均值 |
COUNT() | 总数量 |
MAX() | 最大值 |
MIN() | 最小值 |
SUM() | 总数值 |
GROUP BY
分组排序\
DEMO:查询商品表中各个品牌的商品数量\
SELECT brand,COUNT(*) FROM mall GROUP BY brand;
HAVING
功能与where一样,但是where只能对行进行过滤,having是对分组进行过滤
字符串函数
函数名 | 解释 |
---|---|
CONCAT(str1,str2,…,strn) | 无限连接字符串 |
SUBSTRING(str,M,N) | 将str字符串从第M个字符开始截取n个字符 |
TRIM(str) | 去除空格 |
LEFT(str,x) | 从左边截取str前x个字符 |
RIGHT(str,x) | 从右边截取str后x个字符 |
SPACE(n) | 返回n个空格 |
LENGTH(s) | s的长度 |
UPPER(S) | 全部转换为大写 |
LOWER(S) | 全部转换为小写 |
日期函数
函数名 | 解释 |
---|---|
NOW(n) | 获取当前时间,加上n毫秒 |
CURRENT_DATE()/CURDATE() | 当前日期 |
CURRENT_TIME()/CURTIME() | 当前时间 |
DATE(S) | 将S转换为日期格式 |
YEAR(S) | 取得S中的年份 |
DATEDIFF(time1,time2) | 计算两个事件的差值(天数) |
DAYOFWEEK(S) | 该日为该周的第几天,周日为第一天1 |
ADDDATE() | 增加一个日期 |
数学函数
函数名 | 解释 |
---|---|
ABS() | 绝对值 |
CEIL() | 大于参数的最小整数 |
FLOOR() | 小于参数的最大整数 |
RAND() | 返回0-1的随机数 |
PI() | 圆周率 |
ROUND(X) | 返回离x最近的整数 |
ROUND(X,Y) | 返回x在四舍五入并保存y位小数后的数值 |
SQRT() | 平方根 |
TRUNCATE(X,Y) | 返回x被截断y位小数后的结果 |
MD5() | md5校验和 |
PASSWORD(str) | 加密密码 |
SHA() | 计算参数的安全散列算法 |
控制流函数
1.CASE WHEN [condition] THEN result [ELSE result2] END\
e.g. \
SELECT CASE WHEN 1>0 THEN ‘TRUE’ ELSE ‘FALSE’ END;\
TRUE\
2.IF(expr1,expr2,expr3)\
如果expr1是true,返回expr2,否则返回expr3
Tips
- InnoDB引擎(MySQL支持很多不同的引擎,有些规则不尽相同)下,自增字段AUTO_INCREMENT必须是主键,删除主键约束时候必须去掉自增
- 仅中国地区内使用可考虑GBK编码,但想要国际化,推荐utf8标准
- select查询的本身是结果集,并不是什么数据类型
- select字句语法
SELECT 列名,列名,...
FROM 表名
WHERE 行级过滤
GROUP BY 分组说明
HAVING 组级过滤
ORDER BY 排序标准
LIMIT 限定的行数
- 本周查询
WHERE ABS(DATEDIFF(NOW(),creatime))<=(DAYOFWEEK(NOW()+5))%7
附录
个人历程
还是比较初级的水平,不过日常使用已经不成问题了。一个星期(周末不算)复习了以前的增删改查,理清了其中的逻辑关系(大学学过,但是没好好学,也不知道什么时候update,什么时候alter)。由于这些时间不是100%都在弄数据库,所以数据库入门来说,对于0基础的小白1-3天也是可以做到的。\
1. 第一天我分别在Windows 10、CentOS 7.1(Linux发行版)、macOS High Sierra下对MySQL进行了安装,并且安装了图形界面进行使用测试。其中CentOS 7.1使用的是MariaDB(基本兼容MySQL语法和规则)。图形界面是官网自带的Workbench,但是发现Windows系统下使用Workbentch插入很多数据时候应用会无法正常运行,故而下载安装了SQLyog,导入很快也没有卡死,macOS下则无卡死。我不知道具体怎么样,但个人很推荐苹果上进行开发。
2. 第二天,看到其他人制作的某网站数据库,去理解为什么那么建表。经过指点,知道了建表的流程:设计师设计页面————项目经理绘制E-R图————数据库工程师据此设计数据库。总的来说,你需要把一个物品的属性给剥离出来,各个物品之间有什么联系也要知道。好比老师和学生的关系就是授课。接下来,建立数据库的时候根据E-R图绘制出最基本的数据库,每个表都包含有与其直接相关的成分,再为每个表之间的行为建立表。这样你的数据库基本可以投入使用了。但是,实际生产生活中,一个表不适合拥有太多的属性,因为有些属性并不一定一开始就用得到但又不得不加入表中作为其属性时,可以为他们单独建表。
3. 第三天,分别对数据类型及其使用场合,图形界面的使用进行了了解。这一天到没有什么,但主要要熟悉数据类型的特点,大概熟悉取值范围,掌握他们的使用场景。如MySQL的InnoDB引擎下,推荐使用varchar而不是char。对于时间过于久远的事物来说,尽可能不使用timestamp,因为它在2038年之前就会失效。一定要好好体会。
4. 第四天,重温了MySQL命令行的操作。增删改查这是一切的基础。在这里会遇到一大堆关键字,新学的时候很容易搞混,其实只要理清逻辑关系即可。增删改查是行为,而一个行为必定受到一个人或物来驱动它。那么只需要知道增删改查的对象是谁,数据库?表?字段?数据?约束?按层次进行分析就可以知道。先有数据库才会有表,有标才会有字段,有字段才会有数据库和约束。在脑中要有一个逻辑关系图,学起来会很容易,事半功倍。了解了语法之后要立刻找到例子去练习。
5. 第五天,拓展了limit、group by、order by等查询关键字,还有聚合函数、联合查询。这些经过大量的练习之后,查看了数据库引擎、字符集等常用操作介绍并进行一些练习。
心得
这些都是基础需要不断反复练习了,计算机的世界看懂了没用很多人都可以看得懂。关键是成为熟练使用这些技术工具的人。关于MySQL我还在持续学习之中,五天算慢了,因为还有其他事情耽搁,能整天学习的一整天也可以零基础入门。这里推荐一本书《深入浅出MySQL》,适合小白转型大牛,还在研究之中。切记:勿以善小而不为。