1. 定义
1.1 SQL的分类
- DQL
- 数据查询语言(Data Query Language, DQL)负责进行数据查询而不会对数据本身进行修改的语句。
SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。
- 数据查询语言(Data Query Language, DQL)负责进行数据查询而不会对数据本身进行修改的语句。
- DDL
- 数据定义语言 (Data Definition Language, DDL) 负责数据结构定义与数据库对象定义
CREATE、ALTER、DROP
- 数据定义语言 (Data Definition Language, DDL) 负责数据结构定义与数据库对象定义
- DML
- 数据操纵语言(Data Manipulation Language, DML)负责对数据库对象运行数据访问工作
INSERT、UPDATE、DELETE
- 数据操纵语言(Data Manipulation Language, DML)负责对数据库对象运行数据访问工作
- DCL
- 数据控制语言 (Data Control Language) 负责对数据访问权进行控制,它可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权
GRANT、REVOKE 两个指令组成。
- 数据控制语言 (Data Control Language) 负责对数据访问权进行控制,它可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权
- TPL
- 数据事务管理语言(Transaction Processing Language)负责确保被DML语句影响的表的所有行及时得以更新。
BEGIN TRANSACTION、COMMIT、ROLLBACK。
- 数据事务管理语言(Transaction Processing Language)负责确保被DML语句影响的表的所有行及时得以更新。
- CCL
- 指针控制语言(Cursor Control Language),它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。
- DBMS、SQL、DB之间的关系
- DBMS通过执行SQL来操作DB中的数据。
1.2 SQL语句执行顺序
书写顺序:SELECT -> FROM -> JOIN -> ON -> WHERE -> GROUP BY -> HAVING -> UNION -> ORDER BY ->LIMIT
但执行顺序为:
1.FORM:选择from后面跟的表,产生虚拟表1。
2.ON:ON是JOIN的连接条件,符合连接条件的行会被记录在虚拟表2中。
3.JOIN:如果指定了LEFT JOIN,那么保留表中未匹配的行就会作为外部行添加到虚拟表2中,产生虚拟表3。如果有多个JOIN链接,会重复执行步骤1~3,直到处理完所有表。
4.WHERE:对虚拟表3进行WHERE条件过滤,符合条件的记录会被插入到虚拟表4中。
5.GROUP BY:根据GROUP BY子句中的列,对虚拟表2中的记录进行分组操作,产生虚拟表5。
6.HAVING:对虚拟表5进行HAVING过滤,符合条件的记录会被插入到虚拟表6中。
7.SELECT:SELECT到一步才执行,选择指定的列,插入到虚拟表7中。
8.UNION:UNION连接的两个SELECT查询语句,会重复执行步骤1~7,产生两个虚拟表7,UNION会将这些记录合并到虚拟表8中。
9.ORDER BY: 将虚拟表8中的记录进行排序,虚拟表9。
10.LIMIT:取出指定行的记录,返回结果集。
2. 数据库表、字段命名规范
2.1 表命名规范
(1)表名、字段名必须使用小写字母或数字
MySQL在Windows系统中不区分大小写,但在Linux系统中默认区分大小写。
java
正例:aliyun_admin,level_name
反例:AliyunAdmin,levelName
(2)表名不使用复数名词。
powershell
正例:user,employee
反例:users,employees
(3)表的命名最好遵循"业务名称_表的作用"原则
powershell
正例:alipay_task,trade_config
反例:yy_all_live_category、yy_alllive_comment_user。
//说明:去除项目名,统一命名规则,均为"yy_alllive_"开头即可。
(4)明细表的名称为:主表的名称+字符dtl(detail缩写)
例如:采购定单的名称为:po_order,则采购定单的明细表为:po_orderdtl。
(5)临时库/表必须以tmp为前缀并以日期为后缀。
(6)备份库/表必须以bak为前缀并以日期为后缀。
(7)通用表要加前缀"all_",示例:all_user。
(8)表必须填写描述信息(使用SQL语句建表时)
(9)一个项目一个数据库,多个项目慎用同一个数据库。
2.2 字段规范
2.2.1 字段命名规范
(1)字段名中的多个单词使用下划线'_'分隔
采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线''组成,命名简洁明确,多个单词用下划线''分隔。
powershell
正例:user_name"、 user_id、 is_friend、 is_good。
反例:username、userid、isfriend、isgood。
(2)字段名中的所有单词必须小写
powershell
反例:userID、houseID。
(3)字段名中禁止出现表名
例如,在名employe的表中禁止使用名为employee_lastname的字段。
(4)表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint(1表示是,0表示否)。
说明:任何字段如果为非负数,则必须是unsigned。注意:POJO类中的任何布尔类型的变量,都不要加is前缀,需要在中设置从is_xxx到xxx的映射关系。数据库表示是与否的值,使用tinyint类型,坚持is_xxx的命名方式是为了明确其取值含义与取值范围。
正例:表达逻辑删除的字段名is_deleted,1表示删除,0表示未删除。
(5)禁止在命名字段时,包含数据类型。
2.2.2 字段类型规范
(1)如果存储的字符串长度几乎相等,则使用char定长字符串类型。
例如,11位手机号,邮编(postcode)。
这种固定长度的纯数字,也不要用int类型或long类型,因为
(2)仅当数字参与了运算,才用数值型;否则即使是纯数字,也不要使用 int/long 类型
powershell
反例:年龄使用 int 存储
(3)小数使用 decimal 存储,禁止使用float和double类型。
在存储时,float和double类型存在精度损失的问题。
如果存储的数据范围超过decimal的范围,那么建议将数据拆成整数和小数并分开存储。
(4)整型int定义中不添加长度
比如使用INT,而不是INT(4)。
(5)禁止使用varchar类型作为主键。
(6)禁止使用 MySql 中的任何类型保存大文本、文件、图片
一列需要占很大空间的字段,一定要单独拎出来,不要和常用信息放一张表。
举个例子: 文章的信息和文章的内容,这一定要分成两个表。否则会给你的文章性能带来极大的挑战。因为很多情况下,查看文章列表,根本不需要查看到文章的内容。
(7)datetime、smalldatetime类型的字段没有默认值,必须为NULL。
(8)除此之外所有字段在设计时,必须有默认值
字符型的默认值为一个空字符值串'',数值型的默认值为数值0,逻辑型的默认值为数值0。
系统中所有逻辑型中数值0表示为"假",数值1表示为"真",
(9)IP地址使用unsigned int类型,这样比较节约存储空间。
(10)避免使用NULL字段
NULL字段很难查询优化、NULL字段的索引需要额外空间、NULL字段的复合索引无效
(10)不建议使用ENUM类型,使用TINYINT来代替。
1)、假如一个设计不合理的ENUM字段,给程序员带来的就完全是梦魇了,比如一个enum字段的范围是('0','1','2','3','4','5'),而enum的枚举值对应的索引是从1开始的,因此,insert into table (enum)values(1),插入的并不是1,而是0
(2)、另外假如你在设计好enum的枚举字段范围并使用了一段时间后,再到字段范围中加一个枚举值,并且不是加在最后,那么也就相当于把原来的范围都改变了索引值,也就是当你在查询的时候直接查询值(并加上单引号),将不会使用enum自身隐藏的索引值来获取结果了
(3)、如果是纯数值型,还是建议采用tinyint字段吧,毕竟它也只占一个字节,即使出现赃数据,也可以被接受,不象enum,如果纯数字型范围,更改了索引,你就不知道你查询的值是否正确了
(4)、如果字段是字符串,并且长度固定,可以尝试用char,如果是数值型,还是用tinyint吧,比较安全稳定,而且即使迁移,也不会出现太多问题