数据库
dos命令
查询所有服务sc query
查询指定服务 eg: mysql80sc query mysql80
高级查询(查询更多信息,如:PID)sc queryex mysql80
查询如二进制路径之类的信息sc qc mysql80
查询网络状态netstat -ano
查询当前运行的任务列表tasklist | findstr "mysqld"
查询mysql的网络状态 PID 见sc queryexnetstat -aon | findstr "[PID]"
mysqld 表示数据库服务
MySql
\! [dos命令] 在mysql里面调用系统命令
desc [表名] 查询表格结构
select * from [表名] 查询表信息
更改发送信息的列名
select id as 编号 from employees;
计数
select count(*) from employees;
函数
最大值
select max(列名) from 表名
最小值
select min(列名) from 表名
平均值
select avg(列名) from 表名
保留两位小数
select round(avg(列名),2) from 表名
统计不重复的值
select distinct 列名 from 表名
拼接
concat(salary,'元')
条件
select * from employees where birth_data>'1949-12-31' order by birth_data
show columns from [表名] 和desc [表名] 类似
分组
select gender,count(*) from emps group by gender;
逐级分组
select department,gender,count(*) from emps group by department,gender;
以年份分组
select year(birth_date) as birth_year,count(*) from emps group by birth_year;
以同年代分组(floor()向下取整求年代数,concat()拼接,\转义字符,as birth_year 用 birth_year 当表头)
select concat(floor(year(birth_date)/10)10,'\'s') as birth_year,count() fromm emps group by birth_year
limit分页
跳过第20条拿10条
select * from emps limit 10 offset 20
(简写,参数位置相反)
select * from emps limit 20,10
join使用
交集(可省略inner)
select * from cities inner join guests on cities.id=guests.from_city_id;
交集+左侧剩余数据
select * from cities left outer join guests on cities.id=guests.from_city_id;
交集+右侧剩余数据
select * from cities right outer join guests on cities.id=guests.from_city_id;
并集(mysql没有outer join, 将 left,right join union 即可得并集)
select * from cities left outer join guests on cities.id=guests.from_city_id
union
select * from cities right outer join guests on cities.id=guests.from_city_id;
用truncate 删除表的所有数据
TRUNCATE TABLE
having
筛选总薪资大于500000的分组
select distinct education,sum(salary) from employees group by education having sum(salary)>500000;
serial
bigint unsigned auto_increment
数据库设计模范化
(1)修改异常(Modication)
表一
编号 | 姓名 | 部门 | 部门电话 |
---|---|---|---|
1 | 王娟 | 人事 | 0871-12345677 |
2 | 李强 | 人事 | 0871-12345677 |
2 | 张三 | 公关 | 0871-12345677 |
修改李强的电话信息后
表二
编号 | 姓名 | 部门 | 部门电话 |
---|---|---|---|
1 | 王娟 | 人事 | 0871-12345677 |
2 | 李强 | 人事 | 0871-12345689 |
2 | 张三 | 公关 | 0871-12345677 |
人事部门的数据出现了不一致(Inconsistence),这就是修改异常
(2)删除异常(Deletion)
从表一删除张三
表三
编号 | 姓名 | 部门 | 部门电话 |
---|---|---|---|
1 | 王娟 | 人事 | 0871-12345677 |
2 | 李强 | 人事 | 0871-12345689 |
部门公关信息丢失
(3)插入异常(Insertion)
新员工未定部门,无法插入(假定信息必须完整)
模范化数据库设计
业界标准
第一范式(1NF)
第二范式(2NF)
第三范式(3NF)
BC范式
第四范式(4NF)
第五范式(5NF)
三个基本范式
第一范式(1NF)
1.数据列的数据类型必须一致
2.数据要有原子性(atomic)
指信息不能再细分,是相对的,与业务需求有关,如果业务需求需要将姓氏
和名字
分开处理,则姓名
作为一个数据就不够原子性
修正:将姓名
拆分成姓氏
和名字
3.一个表的单元格不能出现重复数据
编号 | 姓名 | 电话 |
---|---|---|
1 | 王娟 | 0871-12345677,0871-123452312 |
修正:
联系人信息
编号 | 姓名 |
---|---|
1 | 李娜 |
联系电话
联系人编号 | 电话 |
---|---|
1 | 0871-12345677 |
1 | 871-123452312 |
出现了联系人编号
参照编号
的情况
4.不能出现同性质的表格列
编号 | 姓名 | 课程1 | 成绩1 | 课程2 | 成绩2 | 课程3 | 成绩3 |
---|---|---|---|---|---|---|---|
1 | 王娟 | html | 100 | css | 100 | js | 100 |
几个成绩
和几个课程
就是同性质的表格列
修正:
学生信息
编号 | 姓名 |
---|---|
1 | 王娟 |
成绩
学生编号 | 课程 | 成绩 |
---|---|---|
1 | html | 100 |
5.必须有一列或几列数据的组合将表格行区分开
姓名 | 性别 | 电话 |
---|---|---|
李强 | 男 | 18575896321 |
李强 | 男 | 17563548596 |
李强不知道是不是同一个人
修正:
添加一列或多列组合在业务上能够将记录分开的数据
姓名 | 身份证号 | 性别 | 电话 |
---|---|---|---|
李强 | 530111200256879623 | 男 | 18575896321 |
李强 | 530111200506125893 | 男 | 17563548596 |
在业务上能够将每行记录区分开的一列或多列组合被称为(可做主键primary key的)候选键(candiadte key)
候选键:
: 在业务上,他们的数据具有唯一性要求
主键
: 可被其他表参照的候选键
有候选键的情况下,为方便数据处理,我们有时会添加一个具有唯一值的"人工候选键"
第二范式
1.满足第一范式
2.所有候选键列都依赖于全部候选键
员工编号 | 姓名 | 出生日期 | 项目编号 | 项目名称 | 工时 |
---|---|---|---|---|---|
1 | 王娟 | 2002-06-01 | 1 | 产品设计 | 26 |
2 | 李四 | 2002-05-05 | 2 | 产品推广 | 30 |
1 | 王娟 | 2002-06-01 | 2 | 产品推广 | 10 |
姓名
取决于 员工编号
项目名称
取决于 项目编号
候选键应该是员工编号
和项目编号
的组合
除了工时
外,其余列出现了部分依赖
修正
员工信息表
员工编号 | 姓名 | 出生日期 |
---|---|---|
1 | 王娟 | 2002-06-01 |
2 | 李四 | 2002-05-05 |
项目信息
项目编号 | 项目名称 |
---|---|
1 | 产品设计 |
2 | 产品推广 |
工时
员工编号 | 部门编号 | 工时 |
---|---|---|
1 | 1 | 26 |
2 | 2 | 30 |
第三范式
1.满足第二范式
2.所有非候选键列都直接依赖于候选键列
消除传递依赖
员工编号 | 姓名 | 城市 | 省份 | 国家 |
---|---|---|---|---|
1 | 李强 | 昆明 | 云南 | 中国 |
2 | Lina | washionton | D.C | USA |
国家
依赖于省份
省份
依赖于城市
来自城市
依赖于员工编号
因此,所有列都依赖于全部候选键列,但出现了非直接依赖——传递依赖
修正:
员工信息
员工编号 | 姓名 | 来自城市编号 |
---|---|---|
1 | 李强 | 1 |
2 | Lina | 2 |
城市信息
城市编号 | 名称 | 省份 | 国家 |
---|---|---|---|
1 | 昆明 | 云南 | 中国 |
2 | Washionton | D.C | USA |
总结
1.不要在一张表中描述多个事物
2.要有主键
3.数据的原子性由业务决定
4.拆分的多种表具有参照关系
实体(Entity)
实体,是一张表所表述的业务对象
每个实体应该有一个主键(primary key)
如果一个实体需要参照其他实体,则需要有一个外键(Foreign Key),用于参照那个实体的主键。与主键对应的外键,在数据类型上必须严格与主键一致
实体关系
实体间由业务类型决定了他们之间的关系
1.一对一关系
一个实体对应着另一个实体,他们之间有主外键参照。一对一关系通常用于拆分一个实体的多个方面
eg. 一名员工,对应着一个银行账户(用于公司发放工资)。一对一的设计,要求外键具有唯一性
2.一对多关系
有主外键参照关系,
eg. 一名顾客的多个邮寄地址
分两类,一类是紧密的关系(组合,composition),另一类是松散的(聚合,aggregation)
紧密关系:一方被删除,多方无存在意义
松散关系:一方被删除,多方仍存在
3.多对多关系
A 对应多个 B
B 也对应多个 A
无法用主外键建立,但可拆分为两个多对多关系
数据库设计过程
1.实体及其关系的识别
通过描述,找到设计的事物名词,从中找到实体并确立他们之间的关系
2.确定实体的属性
确定原子性的列,列名,数据类型
3.确定数据约束
确定数据约束如唯一性不可空
4.绘制实体关系图(entity-relation,e-r图)
er图能从整体上看到实体间的关系
5.建立数据字典
是建立数据表及例程的依据
举例
例一:
一对多
客户 和 邮递信息
客户属性
编号
: 用于区分客户(候选键列),字符串或整数
姓名
: 姓名,字符串,必填
电话
: 电话,字符串,必填
邮递信息的属性
编号
: 用于区分每个记录,主键。
省
: 字符串,必填
市(县)
: 字符串,必填
详细地址
: 字符串,必填
评论