1)开发工具,设计阶段,表设计
PowerDesinger 15 UML+表设计
a. 可视化工具,表,表之间关系,字段,字段类型,长度
b. 它可以针对不同的数据库生成不同的SQL语句(建表、建立关系)
SQL标准 92年,但是不同厂家数据库它扩展了SQL92,有自己的语法
c. 消除不同语法支持,消除不同数据库之间大部分差异,方便开发
drop table if exists tb_student;
/*==============================================================*/
/* Table: tb_student */
/*==============================================================*/
create table tb_student
(
id int not null,
name varchar(30),
birthday datetime,
salary decimal(8,2),
primary key (id)
);
drop table TB_STUDENT cascade constraints;
/*==============================================================*/
/* Table: TB_STUDENT */
/*==============================================================*/
create table TB_STUDENT (
ID INT not null,
NAME VARCHAR2(30),
BIRTHDAY TIMESTAMP,
SALARY NUMERIC(8, 2),
constraint PK_TB_STUDENT primary key (ID)
);
a. 表名mysql习惯小写,oracle习惯大写
b. 字段名称mysql小写,oracle习惯大写
c. constraint 约束,主键语法不同
d. 字符串类型mysql叫varchar,oracle叫VARCHAR2
e. 日期类型,mysql叫datatime,oracle叫TIMESTAMP 时间戳
f. 浮点数类型,mysql叫decimal,oracle叫number,NUMERIC
a. 需求调研(* 端茶倒水)
b. 需求评审(专家)
c. 概要设计(系统分析师)
d. 详细设计(系统分析师)
e. 开发编码*
f. 测试 *(自测,单元测试;测试组:集成测试,压力测试)
g. 上线 * 指导客户使用系统
h. 维护期 * 指导客户深层使用系统
i. 项目结束
1)SQL好入门,insert,update,delete,select,精通难,select查询变化万千
a. 多练,对语法才熟练,in,like,join,聚合函数,分组,排序
b. 面试都会有SQL
1)git
2)sql优化,原则、概率(死记原则)
3)程序要访问数据库,jdbc java方式数据库连接api,完成数据库的访问和维护
百度百科:
git是一个分布式版本控制系统
举例:
Windows蓝屏,代码或者文档丢失;
项目中多个人编写一个文件,冲突;
代码写了很久了,想用以前的代码,找不着了,新的版本不太对,想恢复到旧的版本;
版本控制:
1.把你的文件上传到一个公共地方,公共地方存储这些文件(网盘)
2.为每一次用户的提交创建一个新文件,v1.0、v1.1、v1.2
a. CVS 第一代最成熟版本控制产品 2000 (几乎没人使用)
b. SVN 第二代最成熟版本控制产品 2005 (文档word/excel和代码code)
c. GIT 第三代最成熟版本控制产品 2008 (代码code)
SVN管理文档 (有权限,主要管理 文档+代码) 集中式管理(昂贵,没有网络没法干活)
GIT (公有和私有,权限粗,代码) 分布式管理(开源,有本地暂存区,有网络了在提交)
GIT不能完全的替代SVN,但是市场确实越来越少的使用SVN。
git技术(内部实现版本控制体系), 安装git是客户端工具
github git服务端(国外网站 ,全球,开源开发软件源码)
gitee GitHub的一个镜像 (复制品,每10分钟同步一次),软件国产化,名字:码云
1)add 把工作空间的内容形成日志操作,存放到本地索引
2)commit 把具体的变化(新增文件)放到本地仓库(复制)
3)push 把本地仓库内容放到远程仓库 (复制)
1)clone把远程仓库内容直接克隆到工作空间,(隐含把内容也放到本地仓库一份)
第一次使用
2)pull 起到远程仓库和本地工作空间的内容同步,远程和本地数据一致
1)在gitee有账号,就会有自己的私人空间
2)在本地安装Git-2.27.0-64-bit(本地客户端工具)
git bash(这里就可以敲入git命令 add,commit,push)
mkdir j2ee #创建本地仓库目录和远程仓库目录一致
cd j2ee #进入目录
git init #初始化
touch README.md #创建文件
git add README.md #新增文件到git中处理
git commit -m “first commit” #提交,设置说明信息
git remote add origin https://gitee.com/nutony/j2ee.git #远程仓库
1)早上一上班,先把远程内容同步本地(把最新的内容下载到本地)
2)如果代码变化测试本地已经没有问题,提交多次(add,commit,push)
3)在下午下班前,必须在提交新的内容
git add . //.点当前目录下包括子目录下的内容都记录日志
git commit -m “信息随便填写”
git push -u origin master
git开发常用工具,实现代码版本控制,团队开发
实际开发中,团队如何管理共享代码
1)add 把工作空间代码,记录它变化信息(新增,修改,删除)提交索引
2)commit -m “提交备注信息” 提交信息到本地仓库
3)push -u origin master 推送信息到远程仓库,在gitee网站来浏览信息
SQL实现一个业务有多种方式,总有一个方法相对而言最优,体现速度优化,对查询SQL而言
大多是一些实际中摸索出来的经验
SQL编译期(优化器) 我们提交SQL没有直接执行,SQL的优化器先进性优化
量变引起质变
SELECT * FROM student
SELECT id,NAME,sex,birthday,salary,age FROM student
准备测试数据
SQL中库,表括起来的不是单撇,叫刀秋,波浪线按键它下面的“单撇”
` 特殊字符,把特殊名字扩起来,例如:名称中有个空格
‘user name’
name varchar(6),char(6)
name=“tony” varchar 4 只存储真实长度,不大于声明的长度
name=“tony” char 6,如果内容不足,自动用空格补充
理由:
varchar变长字段按数据内容实际长度存储,存储空间小,可以节省存储空间
char按声明大小存储,不足补空格
其次对于查询来说,在一个相对较小的字段内搜索,效率更高
decimal 浮点数 7,2 (3.14)
整数部分是几位? 5,不包括小数点
小数部分是几位? 2
创建表的主键,数据库系统会自动创建主键索引,也是唯一索引 unique
current_timestamp() mysql自定义函数(类似java api)当前时间
字段default默认值:不填null,
tinyint 小整型,类似java,short
(8) SELECT (9) DISTINCT column,… 选择字段、去重
(6) AGG_FUNC(column or expression),… 聚合
(1) FROM [left_table] 选择表
(3)
(2) ON
(4) WHERE
(5) GROUP BY
(7) HAVING
(10) ORDER BY
(11) LIMIT count OFFSET count; 分页
查询id为1或者薪水为3000的用户:
反例:
SELECT * FROM student WHERE id=1 OR salary=30000
正例:
SELECT * FROM student WHERE id=1
UNION ALL
SELECT * FROM student WHERE salary=30000
SELECT * FROM student WHERE id=1
SELECT * FROM student WHERE salary=30000
使用or可能会使索引失效,从而全表扫描
对于or没有索引的salary这种情况,假设它走了id的索引,但是走到salary查询条件时,它还得全表扫描。
也就是说整个过程需要三步:全表扫描+索引扫描+合并。
如果它一开始就走全表扫描,直接一遍扫描就搞定。
虽然mysql是有优化器的,处于效率与成本考虑,遇到or条件,索引还是可能失效的。
主键(id):primary key优先使用数值类型int,tinyint
性别(sex):0-代表女,1-代表男;数据库没有布尔类型,mysql推荐使用tinyint
支付方式(payment):1-现金、2-微信、3-支付宝、4-信用卡、5-银行卡
服务状态(state):1-开启、2-暂停、3-停止
商品状态(state):1-上架、2-下架、3-删除(伪删除)
如果查询返回数据量很大,就会造成查询时间过长,网络传输时间过长。
同时,大量数据返回也可能没有实际意义。
如返回上千条甚至更多,用户也看不过来。
通常采用分页,一页习惯10/20/50/100条。
SQL很灵活,一个需求可以很多实现,那哪个最优呢?
SQL提供了explain关键字,它可以分析你的SQL执行计划,看它是否最佳。
Explain主要看SQL是否使用了索引。
EXPLAIN
SELECT * FROM student WHERE id=1
type:
ALL 全表扫描,没有优化,最慢的方式
index 索引全扫描
range 索引范围扫描,常用语<,<=,>=,between等操作
ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中
eq_ref 类似ref,区别在于使用的是唯一索引,使用主键的关联查询
const/system 单条记录,系统会把匹配行中的其他列作为常数处理,如主键或唯一索引查询
null MySQL不访问任何表或索引,直接返回结果
possible_keys:
显示可能应用在这张表中的索引
key:
真正使用的索引方式
提高查询速度的最简单最佳的方式
#alter语法修改表,add index增加索引
#index_name 索引起个名字(针对哪个字段)
ALTER TABLE student ADD INDEX index_name (NAME)
模糊查询,程序员最喜欢的就是使用like,但是like很可能让你的索引失效
TYPE=ALL/INDEX/RANGE/ref/const
EXPLAIN
SELECT id,NAME FROM student WHERE NAME LIKE ‘%陈’ #index 索引全扫描,陈结尾
EXPLAIN
SELECT id,NAME FROM student WHERE NAME LIKE ‘%陈%’ #index 索引全扫描,包含陈
EXPLAIN
SELECT id,NAME FROM student WHERE NAME LIKE ‘陈%’ #通配符 range 索引范围扫描,陈开头
未使用索引:故意使用sex非索引字段
EXPLAIN
SELECT id,NAME FROM student WHERE NAME=1 OR sex=陈
主键索引生效
EXPLAIN
SELECT id,NAME FROM student WHERE id=陈
索引失效,type=ALL,全表扫描
EXPLAIN
SELECT id,NAME FROM student WHERE id LIKE ‘%陈’
#id varchar, type=ALL 没有使用索引,全表扫描,慢
#id int ,type=const 使用索引,常量,快
反例:
#未使用索引
EXPLAIN
SELECT * FROM student WHERE NAME=123
正例:
#使用索引
EXPLAIN
SELECT * FROM student WHERE NAME=‘123’
理由:
为什么第一条语句未加单引号就不走索引了呢?这是因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,MySQL会做隐式的类型转换,把它们转换为数值类型再做比较
如果当数据新增、修改、删除、索引需要重构
性别:男 、女
状态:1上架、2下架
数据中假定就一个男的记录
反例:
SELECT id,NAME FROM student WHERE sex=‘男’
正例:
SELECT id,NAME FROM student WHERE id=1 AND sex=‘男’
理由:
需要什么数据,就去查什么数据,避免返回不必要的数据,节省开销
业务需求:查询最近七天内新生儿(用学生表替代下)
给birthday字段创建索引:
ALTER TABLE student ADD INDEX idx_birthday (birthday)
当前时间加7天:
SELECT NOW()
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY)
反例:
EXPLAIN
SELECT * FROM student
WHERE DATE_ADD(birthday,INTERVAL 7 DAY) >=NOW();
正例:
EXPLAIN
SELECT * FROM student
WHERE birthday >= DATE_ADD(NOW(),INTERVAL 7 DAY);
反例:
EXPLAIN
SELECT * FROM student WHERE id+1-1=+1 #索引失效
正例:
EXPLAIN
SELECT * FROM student WHERE id=+1-1+1
EXPLAIN
SELECT * FROM student WHERE id=1
应尽量避免在where子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。记住实现业务优先,实在没办法,就只能使用,并不是不能使用。如果不能使用,SQL也就无需支持了。
反例:
EXPLAIN
SELECT * FROM student WHERE salary!=3000
EXPLAIN
SELECT * FROM student WHERE salary<>3000
#索引失效
EXPLAIN
SELECT DISTINCT * FROM student
#索引生效
#使用DISTINCT去重视,字段不能是所有
EXPLAIN
SELECT DISTINCT id,NAME FROM student
EXPLAIN
SELECT DISTINCT NAME FROM student
理由:
带distinct的语句占用cpu时间高于不带distinct的语句。因为当查询很多字段时,如果使用distinct,数据库引擎就会对数据进行比较,过滤掉重复数据,然而这个比较、过滤的过程会占用系统资源,如cpu时间
环境准备:
#修改表,增加age字段,类型int,非空,默认值0
ALTER TABLE student ADD age INT NOT NULL DEFAULT 0;
#修改表,增加age字段的索引,名称为idx_age
ALTER TABLE student ADD INDEX idx_age (age);
反例:
EXPLAIN
SELECT * FROM student WHERE age IS NOT NULL
正例:
EXPLAIN
SELECT * FROM student WHERE age>0
理由:
1.并不是说使用了is null 或者 is not null 就会不走索引了,这个跟mysql版本以及查询成本都有关
2.如果mysql优化器发现,走索引比不走索引成本还要高,就会放弃索引,这些条件 !=,<>,is null,is not null经常被认为让索引失效,其实是因为一般情况下,查询的成本高,优化器自动放弃索引的
3.如果把null值,换成默认值,很多时候让走索引成为可能,同时,表达意思也相对清晰一点
1)git: 版本控制工具,管理我们项目的代码,主流开发工具公司会自己搭建一个Github,你的配置下,从公司库中下载代码
2)git (技术总称,客户端git bash)、GitHub(远程仓库-国外)、gitee(远程仓库-国内,镜像库,10分钟同步一次)
3)概念:
a.工作空间:仓库代码都放在工作空间,开发者可以直接操作
b.本地索引:它就记录对工作空间中改动(新增,修改文件内容,删除文件,包括文件夹)一次改动就是一条记录(相当于执行计划)
c.本地仓库:它存放项目中所有文件,含有其他同事的文件
d.远程仓库:它是我们所有库的一个容器(最全)GitHub、gitee、其他镜像网站
6)SQL执行的顺序:死记
7)SQL的优化