前言
相信大多数想要从其他职业转为产品经理的小伙伴都想问这样一个问题:产品经理要不要懂开发?作为一个曾经同样有此疑问的转行亲历者,可以负责任的说:要!原因有二:
可以在做需求分析时,从技术的底层逻辑出发,更加全面的考虑业务流程细节;避免仅仅从前端展示页面思考带来的流程漏洞;
在与技术团队召开需求评审会时,可以针对前后端开发人员做不同侧重点儿的介绍和答疑,提高沟通效率;
关于上述问题,我会将实际工作总结为文章,分批发布;尽己所能,为大家提供一定的避坑经验。本文作为技术篇的开篇,为大家带来个人总结的My SQL基础知识。
数据库基础
数据库
数据库(database)是保存数据的仓库,可以方便的把数据放进去,并且把数据根据需要提取出来。
数据库管理系统(database management system,DBMS)是对数据库进行管理(增删改查等)的软件;
常用的DBMS有MySQL、Oracle、DB2、MSSQLServer等;
库、表(Table)、列(column)/字段(Field)
库:有一定关联的数据表集合。例:《学生信息汇总》excel表格文件,可以看做一个库,记录了与学生”相关的数据;
表:格式、属性相同的数据集合。例:《学生信息汇总》excel表格文件中包含的“学生考勤表”、“学生成绩表”等数据表;
列(column):数据表中纵向维度的数据;
主键(primary key)列
主键是数据行的唯一标识;
选用主键的两种策略:
逻辑主键:没有任务业务意义的字段,完全给开发人员看;
业务主键:具有业务意义的字段,便于其他相关部门的同事查看;
业务主键有可能会有变化,一般选择逻辑主键;
外键(foreignKey)--表间关联
当数据表中包含一些可以独立出来描述某个对象集合时,为避免这些数据变动时的更新操作;可以将这些数据重新整合为一个表;通过将新表的主键作为原表的一列,建立指向关系;
原表中,指向外部某个表的数据列称为外键;
MySQL操作
建库
在Navicat(一款数据库管理系统操作软件)的数据库根目录下点击右键,选择“新建数据库“”
为避免出现乱码,字符集选择:UTF-8
建表
在新建库点击右键,选择“新建表”;
设置表的主键,一般都设为Id,字符类型设为“int(整数)”;
设置表的其他列名称和数据类型,设置名字时不要有空格、不要有特殊字符;
表的命名一般使用“T_names”的形式,T代表tables,表明这是一个表;
数据类型
文本
CHAR:最多255个字节的定长字符串,长度必须在创建时制定
VARCHAR:最多255个字节的可变长度字符串,长度必须在创建时制定
TEXT:最大长度为64K字符的变长文本
TINYTEXT:最大长度为255字符的变长文本
MEDIUMTEXT:最大长度为16K字符的变长文本
LONGTEXT:最大长度为4GB字符的变长文本
整数(考虑数据取值后选择尽量小的类型)
tinyint:1字节。有符号值:-128到127,无符号0到255;
smallint:2字节。有符号值:-32768至32767,无符号值:0到65535
mediumint:3字节;
int:4字节;
bigint:9字节;
小数(需要指定长度和小数点,也就是显示宽度和小数位数)
decimal:精确存储的小数,在内部用字符串存储;适合金额等要求精确的类型,别名:NUMERIC
float:4字节,单精度,会近似存储;
double:8字节,双精度,会近似存储;
日期时间:
DATE:4字节,范围:1000-01-01-9999-12-31
TIME:3字节,范围:-838:59:59-838:59:59
DATETIME:8字节,范围1000-01-01 00:00:00-9999-12-31 23:59:59
二进制大数据:
TITYBLOB:最大长度为255字节;
BLOB:最大长度为64KB;
MEDIUMBLOB:最大长度为16MB
LONGBLOB:最大长度为64GB
SQL语句入门
SQL语句:用于与数据库”交流“,操作数据库的语言
SQL语句中的字符串一般用单引号;
SQL语句不区分大小写;
最简单的SQL:查看一个表的全部数据,select * fromTable;
INSERT语句:
Insert intoTable(列1,列2,列3...) values (值1,值2,值3...);语句可以省略后面的列名,但不推荐
若插入的行中有些列的值不确定,不指定即可;
自动递增(auto increment):字段自增可以避免并发等问题,在“设计表”中设置;
UPDATE语句
更新一个列:UPDATETable Set列=value;
更新多个列:UPDATETable Set列1=value1,列2=value2,列3=value3;
对于数值类型的列,也可以表达式更新:如在某个列的数值基础上加1,UPDATETableSET列=列+1;
有条件的UPDATE更新:
更新一部分数据: UPDATETable SET列1=valuewhere 列2='tring';通过where为语句添加条件限制,注意SQL语句中赋值和判断时,都使用单个”=“;
where中还可以使用复杂的逻辑判断,逻辑运算符包括:or/and/not/>/<=/>=/!=等;
DELETE语句
删除表中的全部数据:DELETE FROM Table;
DELETE 也可以使用带where语句来删除一部分数据:DELETE FROMTableWHERESituation;
DELETE只是删除数据,表还在;
删除表要用DROP:DROP TABLETable;
SELECT语句--数据查询
简单的数据检索:SELECT * FROMTable;
只检索需要的列:SELECT 列 1、列2... FROM Table;
给列定义别名:SELECT列1 AS别名1,列2 AS别名2... FROM Table;AS可以省略不写;
计算列:SELECT列1 别名1,列2 别名2...,列2(数字类型的列)+10,1+1,now() FROMTable;
使用WHERE 检索符合条件的数据:SELECT列1FROMTableWHERESituation;
检索不与任何表关联的数据:SELECT 1+1--显示计算结果;SELECT now()--显示当前时间;
数据汇总查询
SQL聚合函数:MAX、MIN、AVG(平均值)、SUM(求和)、COUNT(计数)
一定条件下,某列数的最大值:SELECT MAX(列)FROMTableWHERESituation;
一定条件下的计数:SELECT COUNT(*) FROMTableWHERESituation;
ORDER BY语句--排序
NULL空值处理
数据库中,一个列如果没有指定值,那么值就为null(空值);
null表示不知道该值,而不是该值没有;因此,任何与null相关的逻辑表达式计算结果均为NULL!
因此在查询值为null的数据时,使用is或is not来选择,如:
SELECT * FROMTable WHERE 列 isNULL;
ORDER BY--数据排序
ORDER BY语句位于SELECT语句的末尾,允许制定按照一个列或多个列进行排序,还可以制定排序方式:升序(从小到大,ASC)/降序(从大到小,DESC)
按照某列数据显示排序后的表:SELECT * FROMTableORDER BY列 ASC/DESC;
按照列1数据进行排序,如果列1数据相同则按照例2数据排序:SELECT * FROMTable ORDER BY列1ASC/DESC,列2ASC/DESC;
ORDER BY1句子需要放在WHERE之后:SELECT * FROMTableWHERESituationORDER BY列1 ASC/DESC;
LIKE语句--匹配字符过滤
单字符匹配的统配符为半角下划线"_",用于匹配单个出现的字符,例:查询姓名列中名字以任意字符开头,剩余部分为"erry"的行:SELECT * FROMTableWHERENameLIKE'_erry';
多字符匹配的通配符为半角百分号“%”,用于匹配任意次数(零或多个)出线的任意字符。例:k%匹配以“k"开头,任意长度的字符串。 检索姓名列中包含字母“n”的行:SELECT * FROM Table WHERE Name LIKE '%n%'
like语句性能较差,容易造成全买扫描,谨慎使用;项目中搜索使用全文检索;
LIMIT语句--限制显示搜索结果条目数
LIMIT关键字用于限制返回的结果集,LIMIT放在SELECT 语句的最后位置,语法为“LIMIT 首行行号,要返回的结果集最大数”,例:下面的SQL语句将返回Name不为空、按照工资降序排列的从第二行开始(注意SQL表的行号从0开始计数的)的最多五条记录:SELECT * FROMTableWHEREName is not nullORDER BYSalary DESCLIMIT2,5;
LIMIT一定要放到所有的语句最后
开发网站、开发手机程序分页用的非常多;
GROUP BY语句--分组查询
数据分组用来将数据分为多个逻辑组,从而可以对每个组进行聚合运算。
SQL语句中使用GROUP BY子句进行分组,使用方式为“GROUP BY 分组字段”
分组语句一般和聚合函数一起使用,GROUP BY字符负责将数据分成逻辑组,聚合函数则对每一个分组进行统计计算
例:查看公司员工有哪些年龄段的:SELECTAgeFROMTableGROUP BYAge,上述语句是将Age相同的数据行放到一组,分居后的数据可以看做一个临时的结果集;SELECT Age语句则是取出每组的Age字段的值,就得到了员工的年龄段表;
与聚合函数联合使用,在得到了员工的年龄段之后,就可以通过聚合函数统计每个年龄段的员工他们的工资平均值,最高工资,最低工资以及每个年龄到有多少人了,例:SELECTAge,AVG(Salary),MAX(Salary),MIN(Salary),COUNT(*) FROM Table GROUP BY Age
如果SELECT语句有WHERE条件语句限制,那么GROUP BY子句必须放在WHERE语句之后;
JOIN语句--表间联系
真实的业务中,各个表之间都存在某种联系,很少存在不与其他表存在关联关系的表;而在实现业务功能的时候也经常需要从多个表中进行数据的检索;
SQL中使用JOIN关键字来使用表连接;
表连接类型
交叉连接(CROSS JOIN)
内连接(INNER JOIN)
外链接(OUTTER JOIN)
左连接(LEFT JOIN)
右连接 (RIGHT JOIN)
例:查询每张订单的订单号、价格、对应的客户姓名以及客户年龄,SELECT o.Number,o.Price,c.Name,C.Age FROM T_Orders o LEFT JOIN T_Customers c ON o.CustomerId=c.Id
添加WHERE语句,例:SELECT o.Number,o.Price,c.Name,C.Age FROM T_Orders o LEFT JOIN T_Customers c ON o.CustomerId=c.idWHERE o.Price>=150
JOIN 多张表,列:SELECT o.Number 订单号,o.Price 订单价格,c.Name卖家姓名,c.Age 卖家年龄,t.Name订单类型 FROM T_Orders o LEFT JOIN T_Customers c ON o.CustomerId=c.IdLEFT JOIN T_ordertypes t ON o.TypeId=t.Id
外键约束
如果删除或更新关联表中的一行记录,那么可能会导致本表中关联的列存在非法值的;一般外表中的主键不会更新,因而谈外键约束的时候只谈删除的情况;
外键约束建立在本表的外键字段上;
建立外键约束的方法:新建或者修改表的时候,“外键”--“添加外键”:名:自动命名即可;栏位名:CustomerId;参考表:外部连接表名称;外栏位名:外部连接表的主键;删除时、更新时:(默认设置为CASCADE:删除外表数据时本表的关联行也删除;SET NULL:删除或给信外表时,本表数值设置为NULL;NO ACTION/RESTRICT:拒绝删除)