1.软件的生命周期
软件的定义期开发期维护期
软件的定义期
可行性研究阶段/需求分析阶段
软件的开发期
概要设计阶段/详细设计阶段/编码实现阶段/测试阶段
软件维护期
部署阶段/维护阶段
2.服务器(启动访问服务器)
硬件 计算机
软件 提供各种服务(数据库服务、打印机服务、网页(web)服务)
启动服务器
将自己的网页部署到服务器,放到public目录
访问服务器
域名(IP地址) / 端口号 / 协议
http://127.0.0.1:80
http://localhost:80
1.通过局域网访问服务器
查看自己电脑在局域网的IP地址
在cmd下,输入ipconfig命令,查看"以太网适配器 以太网/无线网适配器"下的IPv4地址,就是IP地址。
192.168.0.102
使用该IP地址访问服务器
http://192.168.0.102:80
2.项目中数据的存储方式
内存/特定的文件/第三方云服务/数据库服务器
3.什么是数据库?
数据库是按照特定的形式来组织存储数据,是为了对数据的 操作方便——增删改查
(1)数据库的发展历史
网状数据库 - 层次型数据库 - 关系型数据库 - 非关系数据库(Nosql)
(2)关系型数据库逻辑结构
Server -> Database -> Table -> Row -> Column 服务器 数据库 数据表 行 列
数据库服务器
(3)常见的关系型数据库
SQLServer Oracle MySQL DB2...
4.使用mysql数据库
免费、开源、号称中小型数据、兼容各种操作系统 瑞典MySQLAB -> SUN公司 -> Oracle公司 Martin: mariaDB Oracle: mysql xampp 服务器套装,包含多个服务器端软件(apache,mysql...) www.apachefriends.org/download.ht…
(1)mysql部署结构
服务器端:负责存储/维护数据——银行总行的服务器机房 C:/xampp/mysql/bin/mysqld.exe 启动文件 确保3306端口不被占用 客户端:负责连接服务器,对数据增删改查——ATM机 C:/xampp/mysql/bin/mysql.exe 客户端工具
(2)使用客户端连接服务器端
mysql.exe -h127.0.0.1 -P3306 -uroot -p
-h host 服务器的域名或IP地址,默认不能使用局域网IP
-P port 端口号
-u user 用户名,root是管理员用户
-p password 密码,root的密码默认是空
mysql -uroot 简写形式
命令的结尾不能加分号结束
5.常用的mysql操作命令
quit; 退出服务器的连接
show databases; 显示服务器下所有的数据库
use 数据库名; 进入指定的数据库
show tables; 显示当2前数据库所有的数据表
desc 表名; 描述表中都有哪些列(表头哪些项)
所有的操作命令都统一加英文分号结束。
6.SQL命令 执行方式
结构化查询语言,用来操作关系型数据库;主要是对数据的增删改查。 SQL命令的两种执行方式
(1)交互模式
客户端输入一行,点击回车,服务器端执行一行;适用于临时性的查看数据。
(2)脚本模式
客户端把所有要执行的命令写在一个脚本文件中,一次性的提交给服务器执行,适用于批量的操作数据。 mysql -uroot<C:/xampp/..../01.sql 回车 在连接mysql的同时,提交脚本文件,不能进入mysql操作。
7.SQL语法规范
(1)一条SQL语句可以跨越多行,以英文的分号结尾 (2)假设某一条语句出现错误,则此条语句及后边所有语句不再执行 (3)SQL命令不区分大小写,习惯上关键字大写,非关键字小写 (4)分为单行注释(#...)和多行注释(/.../),注释的内容不会被服务器执行
8.常用的SQL命令 管理命令
(1)丢弃已经存在的数据库
DROP DATABASE IF EXISTS jd;
(2)创建一个新的数据库
CREATE DATABASE jd;
(3)进入创建的数据库
USE jd;
(4)创建保存数据的表
CREATE TABLE student(
id INT,
name VARCHAR(8),
sex VARCHAR(1),
score INT
);
(5)插入数据
INSERT INTO student VALUES('1', 'tom', 'M', '97');
(6)查询数据
SELECT * FROM student;
(7)修改数据
UPDATE user SET phone='19988888888',isOnline='n' WHERE uid='2';
(8)删除数据
DELETE FROM user WHERE uid='3';
关系型数据库
逻辑结构
Server->Database->Table->Row->Column
mysql
部署结构:服务器端mysqld.exe、客户端mysql.exe
使用客户端连接服务器端
mysql.exe -h127.0.0.1 -P3306 -uroot -p
mysql -uroot
管理命令
show databases;
use 数据库名称;
show tables;
desc 表名称;
quit;
常用SQL命令
DROP DATABASE IF EXISTS ...
CREATE DATABASE ...
USE ...
CREATE TABLE...
INSERT INTO ... VALUES();
SELECT * FROM ...
9.计算机存储字符
(1)如何存储英文字符
abc 979899
Latin-1: 总共有256个,兼容ASCII码,同时对欧洲符号进行了编码
(2)如何存储中文字符
GBK: 对两万多汉字进行了编码,兼容GB2312
BIG5: 台湾繁体字编码
Unicode: 对世界上主流国家常用的语言进行了编码,具体存储方案有UTF-8,UTF-16,UTF-32
mysql默认使用Latin-1编码,不兼容中文,所以出现乱码
(3)解决mysql中文乱码
脚本文件另存为的编码为UTF8
客户端连接服务器端的编码为UTF8
服务器端创建数据库使用的编码为UTF8
10.mysql中的列类型
创建表的时候,指定的列可以存储的数据类型 CREATE TABLE t1( nid 列类型 );
(1)数值型——引号可加可不加
TINYINT 微整型,占1个字节,范围-128~127
SMALLINT 小整型,占2个字节,范围-32768~32767
INT 整型,占4个字节,范围 -2147483648~2147483647
BIGINT 大整型,占8个字节,范围很大
FLOAT 单精度浮点型,占4个字节,范围比INT大的多,可能产生计算误差
DOUBLE 双精度浮点型,占8个字节,范围比BIGINT大的多,可能产生计算误差
DECIMAL(M,D) 定点小数,小数点不会变化,几乎不会产生计算误差,M表示总的有效位数,D表示小数点后的有效位数
BOOL 布尔型,只有两个值,分别是TRUE/FALSE,不能加引号;真正存储的时候自动转为TINYINT,TRUE/FALSE自动转为1/0,所以也可以执行存储1/0.
(2)日期时间型——必须加引号
DATE 日期型 '2019-12-25'
TIME 时间型 '15:24:30'
DATETIME 日期时间型 '2019-12-25 15:24:30'
(3)字符串型——必须加引号
VARCHAR(M) 变长字符串,不会产生空间浪费,操作速度相对慢,M最大值是65535
CHAR(M) 定长字符串,可能产生空间浪费,操作速度相对快,M的最大值是255,常用于存储一些固定长度的数据,例如电话号码、身份证号等
TEXT(M) 大型变长字符串,M的最大值是2G
CHAR(5) VARCHAR(5)
a a\0\0\0\0 a\0
ab ab\0\0\0 ab\0
一二三 一二三\0\0 一二三\0
variable character
123456.789*10^-1
12345.6789
1234.56789*10
123.456789*10^2
12.3456789*10^3
1.23456789*10^4
GB - MB - KB - BYTE - BIT (位)
1BYTE=8BIT
CREATE TABLE t1(
id INT,
age TINYINT,
phone CHAR(11),
price DECIMAL(6,2), #9999.99
sex BOOL, # 1-男 0-女
ctime DATETIME,
article VARCHAR(5000)
);
11.mysql中的列约束
mysql可以对要插入的数据进行特定的验证,只要满足条件才允许插入,否则被认为的非法的插入,例如一个人的性别只能是男或女,一个人的工资只能是正数。
(1)主键约束——PRIMARY KEY
声明了主键约束的列上不允许插入重复的值;一个表中只能有一个主键约束,通常添加在编号列上,查询时候会按照编号列从小到大排序,会加快查找速度。
NULL表示空,在插入的时候,无法确定的数据通常用NULL,例如无法确定一个员工的性别,生日,无法确定商品的价格等;
注意:NULL使用的时候不能加引号。
主键列上禁止插入NULL。
(2)非空约束——NOT NULL
声明了非空约束的列上,禁止插入NULL
(3)唯一约束——UNIQUE
声明了唯一约束的列上,禁止插入重复的值,允许插入NULL,甚至是多个NULL 两个NULL比较是不等的,所以允许插入多个。
(4)默认值约束——DEFAULT
可以使用DEFAULT关键字声明默认值,具体有两种方式可以应用默认值
比如:
INSERT INTO laptop_family VALUES(36,'神州',DEFAULT);
INSERT INTO laptop_family(fid,fname) VALUES(37,'惠普');
(5)检查约束——CHECK
检查约束可以对插入的数据进行自定义的验证
CREATE TABLE student(
score TINYINT CHECK(score>=0 AND score<=100)
);
mysql不支持检查约束,会影响数据的插入速度。对服务器造成较大的压力
后期可以使用JS替代此功能。
(6)外键约束——FOREIGN KEY
声明了外键约束的列上,取值必须在另一个表的主键列上出现过,两者的列类型要保持一致;一个表外键列允许使用多次,而且允许使用NULL
FOREIGN KEY(外键列) REFERENCES 另一个表(主键列)
FOREIGN KEY(familyId) REFERENCES laptop_family(fid)
#外键familyId的取值要到另一个表laptop_family的fid中
12.自增列
AUTO_INCREMENT: 自动增长,假如一个列上声明了自增列,则无需手动赋值,只需要赋值为NULL,就会自动获取当前的最大值,然后加1插入。
注意:自增列必须添加在主键列上,自增列允许手动赋值。
13.简单查询
(1)查询特定的列
示例:查询所有员工的编号和姓名
SELECT eid,ename FROM emp;
查询所有员工的姓名,性别,生日
SELECT ename,sex,birthday FROM emp;
(2)查询所有的列
SELECT eid,ename,sex,birthday,salary,deptId FROM emp;
SELECT * FROM emp;
(3)给列起别名
示例:查询所有员工的姓名和性别,使用汉字别名
SELECT ename AS 姓名,sex AS 性别 FROM emp;
:查询所有员工的编号,姓名,工资,使用汉字别名
SELECT eid AS 编号,ename AS 姓名,salary 工资 FROM emp;
:查询所有员工的姓名和生日,使用一个字母别名
SELECT ename a,birthday b FROM emp;
AS关键字可以省略,保留空格即可;
起别名的目的通常是为了简化列名称单词过长
(4)显示不同的记录
示例:查询员工都分布在哪些部门
SELECT DISTINCT deptId FROM emp;
:查询出公司都有哪些姓名的员工
SELECT DISTINCT sex FROM emp;
(5)查询时执行计算
示例:计算2+3-4*5+9*37
SELECT 2+3-4*5+9*37;
:查询出所有员工的姓名及其年薪
SELECT ename,salary*12 FROM emp;
假设每个员工的工资增加700,年终奖为8000,查询所有员工的姓名及其年薪,使用汉字别名
SELECT ename 姓名,(salary+700)*12+8000 年薪 FROM emp;
(6)查询结果集排序
示例:查询所有的部门,结果集按照部门编号升序排列
SELECT * FROM dept ORDER BY did ASC; #ascendant 升序
示例:查询所有的部门,结果集按照部门编号降序排列
SELECT * FROM dept ORDER BY did DESC; #descendant 降序
desc emp; describe描述
: 查询所有的员工,结果集按照工资降序排列
SELECT * FROM emp ORDER BY salary DESC;
查询所有员工,结果集按照年龄从小到大排序
SELECT * FROM emp ORDER BY birthday DESC;
查询所有员工,结果集按照姓名升序排列
SELECT * FROM emp ORDER BY ename;
按照字符串排序,按照Unicode来排列的。
如果排序规则为空,则默认按照升序排列,ASC
查询所有员工,结果集按照工资升序排列,如果工资相同按照年龄从大到小排序
SELECT * FROM emp ORDER BY salary,birthday;
查询所有员工,结果集女员工显示在前,如果性别相同按照姓名升序排序
SELECT * FROM emp ORDER BY sex,ename;
(7)条件查询
示例: 查询出编号为5的员工所有信息
SELECT * FROM emp WHERE eid=5;
练习: 查询出姓名为lucy的编号,姓名,性别,工资
SELECT eid,ename,sex,salary FROM emp WHERE ename='lucy';
练习: 查询出20号部门下的员工有哪些
SELECT * FROM emp WHERE deptId=20;
练习: 查询出所有的女员工有哪些
SELECT * FROM emp WHERE sex=0;
练习: 查询出工资在7000以上的员工有哪些
SELECT * FROM emp WHERE salary>7000;
比较运算符:> < >= <= = !=(不等于)
练习: 查询出不在10号部门下的员工有哪些
SELECT * FROM emp WHERE deptId!=10;
练习: 查询出没有明确部门的员工有哪些
SELECT * FROM emp WHERE deptId IS NULL;
练习: 查询出有明确部门的员工有哪些
SELECT * FROM emp WHERE deptId IS NOT NULL;
练习: 查询出工资在6000以上的男员工有哪些
SELECT * FROM emp WHERE salary>6000 AND sex=1;
练习: 查询出工资在5000~7000之间的员工有哪些
SELECT * FROM emp WHERE salary>=5000 AND salary<=7000;
SELECT * FROM emp WHERE salary BETWEEN 5000 AND 7000;
练习: 查询出1993年出生的员工有哪些
SELECT * FROM emp WHERE birthday>='1993-1-1' AND birthday<='1993-12-31';
SELECT * FROM emp WHERE birthday BETWEEN '1993-1-1' AND '1993-12-31';
练习: 查询出工资在5000以下和7000以上的员工有哪些
SELECT * FROM emp WHERE salary<5000 OR salary>7000;
SELECT * FROM emp WHERE salary NOT BETWEEN 5000 AND 7000;
练习: 查询出20号部门和30号部门的员工有哪些
SELECT * FROM emp WHERE deptId=20 OR deptId=30;
SELECT * FROM emp WHERE deptId IN(20,30);
练习: 查询出不在20号部门和30号部门的员工有哪些
SELECT * FROM emp WHERE deptId NOT IN(20,30);
IS NULL/IS NOT NULL
AND/OR
BETWEEN AND/NOT BETWEEN AND
IN() / NOT IN()
(8)模糊条件查询
示例: 查询出姓名中含有字母e的员工有哪些
SELECT * FROM emp WHERE ename LIKE '%e%';
练习: 查询出姓名中以e结尾的员工有哪些
SELECT * FROM emp WHERE ename LIKE '%e';
练习: 查询出姓名中倒数第2个字符为e的员工有哪些
SELECT * FROM emp WHERE ename LIKE '%e_';
% 匹配任意0个或者多个字符 >=0
_ 匹配任意1个字符 =1
以上两个符号必须结合着LIKE关键字使用
(9)分页查询
查询的结果集有太多的数据,一页显示不完,可以做成分页显示
前提是要有两个已知条件:每页的数据量、当前的页码
每页开始查询的值=(当前的页码-1)*每页的数据量
SELECT * FROM emp LIMIT 每页开始查询的值,每页的数据量;
假设每页显示5条数据
第1页 SELECT * FROM emp LIMIT 0,5;
第2页 SELECT * FROM emp LIMIT 5,5;
第3页 SELECT * FROM emp LIMIT 10,5;
练习: 假设每页显示7条数据,查询前3页每页的数据。
第1页 SELECT * FROM emp LIMIT 0,7;
第2页 SELECT * FROM emp LIMIT 7,7;
第3页 SELECT * FROM emp LIMIT 14,7;
LIMIT后的两个值数据类型必须是数值型。
14.数据库中是如何存储图片
存储的是图片的路径,例如banner1.png
15.复杂查询
(1)聚合查询/分组查询
示例: 查询所有员工的数量
SELECT COUNT(ename) FROM emp;
练习: 通过部门编号查询员工数量
SELECT COUNT(deptId) FROM emp;
练习: 通过员工编号查询员工数量
SELECT COUNT(eid) FROM emp; #推荐
练习:通过*号查询所有女员工的数量
SELECT COUNT(*) FROM emp WHERE sex=0;
聚合函数
函数是一个功能体,需要提供若干个数据,产出结果。——饺子机
COUNT()/SUM()/AVG()/MAX()/MIN()
数量 总和 平均 最大 最小
练习: 查询所有员工的工资总和
SELECT SUM(salary) FROM emp;
练习: 查询出所有男员工的平均工资
SELECT AVG(salary) FROM emp WHERE sex=1;
练习: 查询出工资最高的女员工工资是多少
SELECT MAX(salary) FROM emp WHERE sex=0;
练习: 查询出年龄最大的员工生日是多少
SELECT MIN(birthday) FROM emp;
分组查询:只能查询聚合函数以及分组条件
练习: 查询出男女员工的最高工资,最低工资,平均工资
SELECT MAX(salary),MIN(salary),AVG(salary),sex FROM emp GROUP BY sex;
练习: 查询出各个部门的员工数量和总的工资是多少;
SELECT COUNT(eid),SUM(salary),deptId FROM emp GROUP BY deptId;
练习: 查询出所有员工出生的年份
SELECT YEAR(birthday) FROM emp;
练习: 查询出1991年出生的员工有哪些
SELECT * FROM emp WHERE YEAR(birthday)=1991;
练习: 查询出12月生日的员工有哪些
SELECT * FROM emp WHERE MONTH(birthday)=12;
(2)子查询
示例: 查询研发部的员工有哪些
步骤1:查询出研发部的部门编号——10
SELECT did FROM dept WHERE dname='研发部';
步骤2:查询出10号部门的员工有哪些
SELECT * FROM emp WHERE deptId=10;
综合: SELECT * FROM emp WHERE deptId=(SELECT did FROM dept WHERE dname='研发部');
练习:查询出和tom同一年出生的员工有哪些
步骤1: 查询出tom出生的年份——1990
SELECT YEAR(birthday) FROM emp WHERE ename='tom';
步骤2: 查询出1990年出生的员工有哪些
SELECT * FROM emp WHERE YEAR(birthday)=1990;
综合: SELECT * FROM emp WHERE YEAR(birthday)=(SELECT YEAR(birthday) FROM emp WHERE ename='tom') AND ename!='tom';
练习: 查询出比tom工资高的员工有哪些
SELECT * FROM emp WHERE salary>(SELECT salary FROM emp WHERE ename='tom');
(3)多表查询 内连接 左外连接
右连接 全连接 UNION
示例: 查询所有员工的姓名及其部门名称
SELECT ename,dname FROM emp,dept;
错误:笛卡尔积
如何解决: 在多表查询中添加查询条件!
SELECT ename,dname FROM emp,dept WHERE deptId=did;
以上查询结果中,无法查询到没有部门的员工,无法查询到没有员工的部门
内连接——和之前结果一样
SELECT ename,dname FROM emp INNER JOIN dept ON deptId=did;
左外连接——显示左侧表中所有记录
SELECT ename,dname FROM emp LEFT OUTER JOIN dept ON deptId=did;
右外连接——显示右侧表中所有记录
SELECT ename,dname FROM emp RIGHT OUTER JOIN dept ON deptId=did;
在左外和右外连接中,OUTER关键字可以省略的
全连接——显示左侧和右侧所有记录
FULL JOIN ,mysql不支持
UNION ALL 联合后不合并相同的记录
UNION 联合后合并相同的记录
(SELECT ename,dname FROM emp LEFT OUTER JOIN dept ON deptId=did)
UNION
(SELECT ename,dname FROM emp RIGHT OUTER JOIN dept ON deptId=did);