0. 软件项目开发流程(软件过程/软件生命周期(3期8阶段)):
软件定义期:
(1)可行性研究阶段:技术,软硬件,人力,时间,资金,法律政策,回报率等各方面是否可行。——《软件可行性研究报告》
(2)需求分析阶段:功能点(主要,次要),非功能性(安精确度,可靠性,可维护性等)需要。——《软件需求规约》
软件开发期:
(3)概要设计阶段:子系统,模块,模块间接口,数据结构,软硬件/网络的选择等。——《概要设计说明书》
(4)详细设计阶段:设计出每个模块中需要的对象,函数,详细的数据处理流程。——《详细设计说明书》
(5)软件开发阶段:UI/UE设计师(设计产品的效果),前端工程师(将设计转换成代码),后台工程师。
(6)软件测试阶段:——《软件测试报告》
软件维护期:
(7)软件的部署(Deploy)阶段:软件的开发环境->生成环境。
(8)软件的维护(保质期)阶段:纠错和改进。(软件工程国际标准文档)各类文档的模板。
1.服务器的分类:
(1)硬件服务器:工作站,大,中,小,超级服务器。
(2)软件服务器:即服务器应用程序,包括DNS服务器(把域名解析为计算机的IP地址),web服务器(提供Web页面服务),数据库服务器(提供数据的永久储存和高效查询),FTP服务器(文件上传和下载服务),SMTP/POP3服务器(邮寄收发服务),SSH服务器(远程登录服务),Samba服务器(文件和打印机共享服务)等。
2.项目中储存数据的方式:
(1)内存:速度快,但容量有限,非永久存储。
(2)自定义结构的文件:使用简单直接,但不便于查大量数据。
(3)Excel/Access等格式化文件:使用广泛,灵活性不足。
(4)专用文件服务器:网络存储/云存储,可靠性高,操作复杂。
(5)数据库服务器:存储效率高,尤其适合海量存储,操作复杂。
3.数据库概述:Data base(数据库);永久储存项目中的海量数据。
4.数据库的发展4个历程:
(1)网状数据库:20世纪60年代初
(2)层次型数据库:20世纪60年代末
(3)关系型数据库(RDBMS):现在主流,20世纪70年代至今
(4)非关系型数库(NoSQL):现在新型未来趋势,21世纪至今,
5.RDBMS系统的组成: 大多采用c/s(客户端服务器)或者b/s(浏览器服务器)形式。
(1)DB服务器端:永久储存/管理数据
(2)DB客户端:向服务器端发起增删改查指令。
常见的RDBMS六种:
(1)SQlite:微型数据库,常用移动设备,几十KB。
(2)MySQL:开源中小学数据库,可用于各种操作系统,最流行的开源RDBMS,也是Web应用方面是最好的RDBMS应用软件之一。
(3)PostgreSQL:开源中小型数据库。
(4)SQL server:Microsoft开发的中型数据库,只用于Windows系统。
(5)Oracle:中大型数据,可用于各种操作系统。
(6)DB2:IBM开发的中大型数据库,常与IBM服务器搭配。
6. mysql服务器的安装:基于XAMPP软件。
步骤:(1)下载XAMPP软件,默认安装在C盘路径。
(2)删除c:/xampp/htdocs目录下所有文件,将data.sql数据库文件放在该目录下。
(3)启动XAMPP的mysql程序,默认是8080端口。
7. SQL语言:结构化查询语言,ANSI/ISO推出的行业标准语言,用于操作关系型数据中的数据,当前主流的数据库都支持该语言。分类SQL-87,SQL-92,SQL-99等几个版本。
7.1 SQL语言的语法:
(1)SQL语句必需以“;”结尾。
(2)SQL不区分字母大小写。
(3)SQL脚本(新建文本文档右键Editplus打开编写)中可以使用单行注释“#---”或者多行注释“/*----*\”。
(4)一条SQL语句科院编写在多行中。
(5)SQL代码可以换行。
7.2 常用SQL语句:
CREATE DATABASE boke(库名) CHARSET=UTF8; 创建一个新的数据。(SQL中符号“-”为减号.)(大写部分必需大写)。
DROP DATABASE IF EXISTS boke(库名); 丢弃指定的数据库(如果存在的话)。
USE boke(库名);进入数据库。
CREATE TABLE b_user(表名) (列名1,列名2,----,列名n);创建一个新的表(含列)
INSERT INTO b_user(表名) VALUES(值1,值2,---,值n); 插入一行数据
SELECT * FROM b_user(表名);查询出表中所有数据行。
DELETE FROM b_user(表名); 删除所有的记录行。
DELETE FROM b_user(表名) WHERE 列名=‘值’; 删除满足条件的记录。
UPDATE b_user(表名) SET 列名=‘值’,列名=‘值’,---,列名=‘值’; 修改所有记录行
UPDATE b_user(表名) SET 列名=‘值’,列名=‘值’,---,列名=‘值’ WHERE 列=‘值’;删除某列满足条件的记录。
ALTER table b_user(表名) modify age(列名) String(类型) not NULL(约束);
8. Mysql中的列类型:SQL标准只定义了少量的几种数据类型,不同数据都进行了扩展,Mysql是最丰富的。
Mysql中的列类型分三组;
1bit
8bit/1byte(翻译:字节)
16bit/2byte
32bit/4byte
(1).数字类型:
tinyint——微整数,占1字节,-128~127
Smallint——小整数,占2字节,-32768~32767
Int——整数,占4字节,-2147483648~2147483647
Bigint——大整数,占8字节
Float——单精度浮点型小数,占4个字节,运算时可能产生精度丢失。
Double——双精度浮点型小数,占8个字节,运算(即把小数点移动并在后面乘以10的几次方,E表示10的次方)时可能产生精度丢失。
Decimal(M,D)——定点小数,不会四舍五入精度丢失。M表示总的有效位数,D表示小数点后面的有效位数。如¥9999.00的价格商品 写成decimal(7,2)。
enum("男","女","保密")——括号内的值,选其一。
(2)日起时间类型:
DATE:日期;如’yyyy-mm-dd’
TIME:时间(时,分,秒);如’hh:mm:ss’
DATETIME:日期时间类型;如’yyyy-mm-dd hh:mm:ss’
(3)字符串类型;
CHAR(M):定长字符串,必需固定长度为M(M为0~255),不够需要空字符‘\0’,多的长度舍去,如一\0\0\0,操作速度快,如手机号,身份证号。
VARCHAR(M):变长字符串,可能更节约空间(M为不超过65535),如简介,地址。如果刚好长度则不用添加‘\0’,如果位数不够需要填‘\0’表示字符串结束,位数太长就删除到刚好的位数长度,不用添加‘\0’,如果一列中数值长度差不多用CHAR(M),如果长度区别很大用VARCHAR(M).
TEXT(M):变长字符串,M不能超过2G,如小说。
9.SQL标准定义了如下的列约束:
(1)主键约束——PRIMARY KEY(翻译:主键)。如eid INT PRIMARY KEY; 。 声明为主键的列不能为出现NULL,也不能重复出现,并且默认会按主键列上的值从小到大排列,一个表最多只能有一个主键列。
小知识:数据库中的NULL
|
(2)唯一约束——UNIQUE(翻译:唯一约束)。 如 #dname VARCHAR(50) UNIQUE; 声明唯一约束列上不能出现重复值,但可以出现多个NULL。
(3)非空约束——NOT NULL。 #dname VARCHAR(20) NOT NULL; 声明为非空的列不能出现NULL,但可以出现重复值。
(4)检查约束——CHECK,检查约束可以限制列上出现的值的范围。# age TINYINT CHECK (age>=18 and age<=60) 注意:当前MySQ不支持检查约束,即能正确识别但是不会读取。
(5)默认值约束——DEFQULT。 #sex CHAR(1) DEFQUIT ‘男’;声明了默认值得列,若没有指定具体的值,就会自动采取默认的值。应用默认值的2种方法:
a.如INSERT INTO emp VALUES(----,DEFQULT,,);
b.如INSERT INTO emp values(10);其他都采用默认值。
(6)外键约束——FOREIGN KEY 。声明为外键盘的列,出现的值必需在另一个表的主键上出现过。编写模式如下;
如deptId TINYINT; #此处数据参考另一个表主键出现的值,并且字符类型必需一致,然后换行写外键约束:FOREIGN KEY (deptId) REFERENCES dept (did);
10.SQL数据库的查询:
10.1简单 查询:
(1)简单查询——查询特定的列 : SELECT * FROM 表名 WHERE 列=值;
示例:查询出员工的姓名,工资,生日 :SELECT ename,salary,birthday FROM emp;
(2)简单查询——查询所有列 :SELECT * FROM 表名;
示例:查询员工的所有列 :SELECT * FROM emp;
(3)简单查询——为列取别名:SELECT 列名 AS 别名 FROM 表名;
示例:查询员工的编号,姓名,查询结果中列名用中文显示:
SELECT eid AS 编号,ename AS '姓 名' FROM emp;
(4)简单查询——执行列上的算术运算 :SELECT 列名[+-*/]12 FROM emp;
示例:查询所有员工姓名,月薪,年薪: SELECT salary*12 FROM emp;
(5)简单查询——仅显示不同的值,重复值仅显示一次:
示例:查询出部门有员工,仅显示部门的编号即可。
SELECT DISTINCT deptId FROM emp;
(6)简单查询——查询结果集的排序:
示例:查询出所有员工的姓名和工资,并按工资从小到大排序。
SELECT ename,salary FROM emp ORDER BY salary ASC; # ORDER BY salary;安装工资排序默认从小到大。ORDER BY 列名1,列名2-----可以接多个序列。DESC降序,ASC升序。
(7)简单查询——查询结果集的筛选(过滤):
示例:查询出编号为757员工的所有数据
SELECT * FROM emp WHERE eid=757; #SQL中没有==或者===,判断等号用=即可。
(8)简单查询——分页查询——面试题重点:存在很多页数,分页查询所必须的SQL语句没有官方标准,不同数据库实现方式不同。Mysql中分页查询语法;
SELECT-----
FROM---
WHERE-----
ORDER BY---- #SELECT, FROM, WHERE, ORDER BY的先后顺序固定。
LIMIT start,count---- #LIMIT必须在整个SELECT语句的最后面,start表示从哪行开始记录读取,count表示每页的最大行数,且默认从0开始识别每一行。如:LIMIT 0,5 表示从默认的第0行开始,每5行形成一页。#0/1/2/3/4
(9)简单查询——逻辑查询:and,or,not。其中()可以调整优先级。
SELECT * FROM emp WHERE not age>15 and gender="女" or (height<153) ;
(10)简单查询——模糊查询:link,rlink(正则)。
示例:查询姓名中以‘小’开头的。
SELECT * FROM emp WHERE name link "小%"; #“%”替换一个或者多个,“_”替换一个。
示例:查询有2个字。
SELECT * FROM emp WHERE name link "__"; #有几个"_"表示查询有几个字的,"__%"表示查询至少2个字的名。
示例:rlink正则。以周开头。
SELECT * FROM emp WHERE name rlink "^周.*"; #"^周.*"表示以周开头,"^周.*伦$"表示以周开头,以伦结尾。
(11)简单查询——范围查询:not in(不在非连续范围内),in(在非连续范围内),beetween...and...(在连续范围内) ,not beetween...and...(不在连续范围内)。
SELECT * FROM emp WHERE age not in (10,20,30) ; #查询年龄不为20,30,40的结果。
SELECT * FROM emp WHERE not age beetween 18 and 24 ; #查询年龄不为/为18~24之间的结果。
(12)简单查询——空判断:is null, is not null 。
SELECT * FROM emp WHERE age is null;
(13)简单查询——聚合函数:count(某参数总数),max/min(最大最小值),sum(求和),avg(平均数),round(四合五入) 。
SELECT count (*) as 女性人数 FROM emp where gender="女";
SELECT max/min/sum/avg(age) FROM emp ; #avg(age)=sum(age)/count(*);
SELECT round(avg(age),1) FROM emp ; #平均年龄,保留1位,四舍五入。
10.2 复杂 查询:
(1)复杂查询——子查询(Child Query):在一条增删改查语句中,存在另一个子查询语句。
示例:查询出市场部所有员工信息(#表dept和表emp的连接点在于表emp员工的部门编号与表dept中的市场部对应的部门编号相关)。
SELECT * FROM emp WHERE deptId=( SELECT did FROM dept WHERE dname='市场部');
(2)复杂查询——分组查询/聚合查询: GROUP BY,与聚合函数一起使用。
示例:查询所有部门编号以及对应的人数——必需先分局部门编号分组,在每个组内在计数。
SELECT deptId,COUNT(eid) FROM emp GROUP BY deptId; #表示按照deptId分组并搜索分组后每个组deptId中eid的个数。
SELECT gender,COUNT(*) FROM emp where gender="男" GROUP BY gender;
SELECT gender,group_concat(name,age) FROM emp GROUP BY gender;