文章目录
C1 背景知识
1.1 数据库简介
数据库指一组相关信息的集合
1.1.1 非关系数据库
非关系数据库包括层次数据库,网状数据库等
层次数据库:
网状数据库:
1.1.2 关系模型
关系模型:使用集合来表示数据,但相关条目之间并不使用指针来作为导航,而是借助冗余数据(外键)来链接不同表中的记录
关于单表的大小:表中数据行的数目通常只是受到物理设备(磁盘空间大小)和可维护性(表中数据规模过大仍能保持易用性)的限制
主键:每张表作为每行唯一标识的信息
外键:即冗余数据,如客户表的客户id在产品表中被再次存储,如果想要查找某个客户购买了哪些产品,使用该客户的id在产品表中比对即可,这个过程也被称为连接,也许多次存储相同的数据是一种浪费的做法,但是某些情况下冗余数据能更清晰的体现关系模型
结果集:未持久化表的另一个名字,一般作为SQL查询的结果
在一列中包含多条信息也是不合理的,如使用address列包含了用户所在的省,市,区这些信息,数据库设计精化过程的主要目标就是保证每条独立的信息只能存在一条地方(外键除外)
1.2 SQL简介
SQL语言与关系模型关系密切,因为SQL查询的结果也可以视为一张表(结果集)
1.2.1 SQL分类
SQL语言可以分为几个独立的模块
SQL方案语句:用于定义存储于数据库中的数据结构
SQL数据语句:用于操作SQL方案语句所定的数据结构
SQL事物语句:用于开始,结束或回滚事物
1.2.2 非过程化的语言SQL
几乎所有的编程语言都是过程化语言,通过代码来完全控制程序的行为,然而SQL语句只定义必要的输入和输出
执行SQL语句的方式交给了数据库引擎的一个组件,优化器,优化器的工作包括查看SQL语句并考虑该表的配置信息以及有无索引等,以确定效率最高的工作路径
C2 创建和使用数据库
2.1 MySQL数据类型
一般来说,所有流行的数据库都可以存储相同的数据类型,如字符串,日期,数字等,但对于一些特殊的数据类型,比如XML文档或大的文本以及二进制文档,各种数据库之间存在着较为明显的差异
2.1.1 字符型数据
字符型数据可使用char和varchar来实现:
char(20) 定长字符串,使用空格向右填充以保证占用申请的字节数
varchar(20) 变长字符串,不需要向右填充,所有字节数可变
char的最大长度为255,varchar最大长度为65535
如需要存储更长的字符串,即存储数据超过了64KB(varchar的最大长度),如电子邮件,XML文档等,需要使用文本类型来存储
2.1.2 数值型数据
数值型数据分为整数类型和浮点类型,可以加上unsigned关键字,以表明这些值都大于0
在选择类型时,只要确保能够容纳预期的最大数字即可,这样可以避免浪费不必要的存储空间
2.1.3 时间数据
使用时间数据的几个建议:
1,用于存储生日之类的列可以使用date类型
2,用于存放订单发货收获时间之类的可以用datetime类型
3,记录用户何时修改表中特定行可以用timestamp类型
2.2 表的创建
对于最后一句constraint意为 约束,上述表建立了主键约束,将该表的person_id当作主键并为主键命名为id
对于性别的处理,这里创建的方式是不对的,性别只有两种选项,可以使用bit的1或0来代替男女,或者使用enum类型
如:sex enum('M', 'F')
,enum字符数据类型可以将检查约束(即M,F)与数据类型定义融合到一起
创建完表后,可以使用describe(desc)命令来检查表的定义:
对于上述表的详情,第4列显示是否作为主键或外键,第5列显示如果在插入数据时忽略了该列,为其提供的默认值,第6列Extra显示该列附加的说明信息
关于NULL:在向表中插入数据时,无法为其中某一列提供具体的值,被用于指明该列值的缺失,可以用于,业务上不可行,不知道该如何赋值,集合为空等场景
2.3 操作和修改表
2.3.1 插入数据
可以使用order by子句为查询结果建立顺序(英文字母顺序)
tips:
1,有些列的值可以为null,虽然为null,但不能不写null,如果表中是7列,插入了6列会导致后面的类型不匹配出错
2,date类型的数据可以直接写字符串进去,只要形如"YYYY-MM-DD",MySQL会帮你将字符串转换为日期类型
2.3.2 更新数据
对于更新后返回的结果:
Rows matched:1,即where子句匹配了表中的1条数据
Changed:1,即表中有1行数据被修改
在单个语句中修改多行数据是可行的,如:
2.3.3 删除数据
同理DELETE也可以删除多行语句,但是省略WHERE会删除表中所有记录