1.数据库:
* 存储数据的仓库。
2.数据库的分类:
* 单机数据库
* 网络数据库
* mysql ,sqlserver , oracle , sybase , db2
3.数据模型:
* 层次模型
* 网状模型
* 关系模型
4.数据库的组成:
* 数据,表,表之间的关系。
* 表结构:
* 行
* 单元(列)
* 数据
5.数据与信息:
6.数据约束:
* 主键约束:记录都有一个主键来唯一标识该记录。
* 记录可以没有主键,但建议设置主键。
* 外键约束:用来关联两个表中记录的字段。
* 物理外键
* 逻辑外键
* 组合键(联合主键):记录由多个字段联合在一起,唯一标识该记录。
* 唯一约束:唯一标识该记录。
7.E-R图:
* 在数据库建模中,经常使用E-R图
* 矩形表示实体
* 椭圆表示属性
* 椭圆+下划线表示主键
* 实体之间的关系:
* 1 :1 一对一关系
* 1 :n 一对多的关系
* n : 1
* n : n 多对多关系
8.范式:
* 数据库设计的规则
* 1FN 在一列中不能出现2个数据。
* 2FN 一条记录中的所有字段要求完全依赖于主键。
1001 ,dmc , 18 , china
1002 , dmc2 , 18 , china
* 将冗余的记录重新形成一张表进行存储,通过外键进行关联。
1 china
2 usa
--------------------------------
1001 ,dmc , 18 , 1
1002 , dmc2 ,18 , 1
* 3FN 一条记录中的所有字段不能存在传递依赖。
1001 , dmc , 18 , china , 亚洲
1002 , dmc2 , 18 , china , 亚洲
* 将传递依赖部分形成一张表进行存储,通过外键进行关联
1 , china , 亚洲
2 , usa,美洲
----------------------------------------
1001 ,dmc , 18 , 1
1002 , dmc2 ,18 , 1
9.安装mysql数据库:
* mysql5.0
* 卸载mysql : 控制面板卸载程序。 删除安装目录。
* 安装mysql:
* 选择编码字符集。
* mysql安装成功后会自动分配一个root用户。只需要为其设置密码。
10.mysql简单命令:
* RDBMS 关系型数据库管理系统
* 在cmd中连接mysql
mysql -uroot -p
* show databases ; 显示所有的数据库
* use database_name ;选择一个数据库
* use mysql ;
* create database databsse_name ;创建一个数据库
* create database dmc ;
* drop database databaes_name ;删除数据库
* drop database dmc ;
11.数据库sql语句之DDL
* sql : 结构查询语句
* DDL : 数据定义语言 定义数据存储结构(数据库,表等。。)
* create
* create table table_name(cname1 type , cname2 type) ;
* create table emp(
eno varchar(32),
ename varchar(32),
sal int,
dept varchar(32)
) ;
* sql中的常用数据类型:
* int 最大长度为11
* varchar 可变字符串 最大长度为2000
* char 不可变字符串 最大长度为2000
* date 表现形式(yyyy-MM-dd)
* desc table_name ;显示表格的结构
* show tables ;显示所有的表格
* 创建表时为字段增加约束。
create table emp(
eno varchar(32) primary key, --设置主键
dept varchar(32) not null, --不能为空
ename varchar(32) unique --唯一
) ;
create table emp(
eno varchar(32) ,
dept varchar(32) ,
ename varchar(32) ,
primary key(eno,ename) -- 设置主键(组合键)
) ;
* drop
* dorp table table_name ; 删除表
* drop table emp ;
* alter
* 修改表的结构
* alter table table_name add cname type ; 添加一个字段。
* alter table emp add birthday date ;
* alter table table_name drop cname ; 删除一个字段。
* alter table emp drop sal ;
* alter table table_name change cname1 cname2 type ;
* alter table emp change dept deptno varchar(32) ;
* alter table table_name modify cname type ;
* alter table emp modify deptno int ;
12.数据库sql语句之DML
* DML 数据操作语言:添加,删除,修改,查询数据。
* insert 添加数据:
* insert into table_name[(c1,c2,...,cn)] values(v1,v2,....,vn) ; -- []表示可有可无
* insert into emp values('1001','dmc',10000,'2016-01-01');
* emp后没有指定具体的表字段,插入时默认所有字段都插入,且插入顺序即为建表时字段顺序。
* 数据库中字符串(varchar|char)只能使用单引号。
* 如果是数字格式,则可以使用单引号包含,也可以不使用单引号包含。如果将内容付给字符类型,则自动转换。
* 日期类型是date。应用时,可以将符合日期格式的字符串赋值给日期字段。
* 使用select * from emp ;查看表中的记录。
* insert into emp(ename , eno) values('dmc','1002') ;
* 没指定的字段,默认值都是null
* 主键,物理外键,not null的字段必须赋值。
* 即使为所有的字段都赋值,也建议指定字段,提高效率。
* update 修改数据:
* update table_name set c1=v1 , c2=v2,...,cn=vn [where ?]
* update emp set sal = 12000 ; 所有记录的sal都改成12000;
* update emp set sal = 12000 where birthday < '2015-01-01' ; 将2015-01-01以前出生的员工,工资改成12000
* update emp set sal = sal + 2000 ; 所有员工工资涨2000 ;
* 修改时,不要(不允许)修改主键。
* delete 删除数据:
* delete from table_name [where = ?] ;
* delete from emp ; 删除表中的所有记录
* 无论删除多少记录,一定是整条删除。不能删除某一个字段的值。
* delete from emp where sal > 10000 ; 删除sal>10000的所有记录。
** truncate emp ; 清空表。
* 从结果来看,与delete from emp ;
* select 查询数据:
* DQL
* select * | c1,c2,...,cn from table_name [where ?] [group by ? [having ?] ] [order by ?] [limit ?]
* select * from emp ;查询所有记录,并显示所有字段。
* select eno,ename from emp ;查询所有记录,并显示eno和ename字段。
* 即使查询显示所有字段,也推荐指定字段,可以提高查询效率。
* 使用as 为字段设置别名。 as可以省略
* select ename as '姓名' from emp ;
* select ename '姓名' from emp ;
* 过滤条件:
* 使用where关键字为sql语句增加过滤条件。
* 比较运算符:
= > < >= <= !=(<>) 注意:= 表示相等比较。
* select * from emp where eno != 1001 ;
* is null 或 is not null 过滤值为null的字段。
* select * from emp sal is null ;
** null和任何值进行比较都不成立。
** null和任何值进行运算值都为null。
* 逻辑运算:and or
* select * from emp where sal > 12000 and birthday > '2016-01-02';
** 当and和or都存在时,优先and比较。
* 范围
* between v1 and v2 ; 在v1和v2之间。 v1=< ? <=v2
* select * from emp where sal between 22000 and 25000 ;
* in 在某一个范围中。
* select * from emp where ename in ('dmc1','dmc2','dmc4','world','china');
* any , all
* 与子查询联用。
* 模糊查询:
* 使用like进行模糊查询。
* 使用_代替过滤值中的一个元素。
* 使用%代替过滤值中的n个元素(n>=0)
* select * from emp where ename like 'dmc_' ;
* select * from emp where ename like '%d%' ;
* order by 排序:
* 将查询结果进行排序。 升序(asc),降序(desc)
* select * from table_name order by c1 asc|desc , c2 asc|desc ... ;
* 按照c1字段进行排序,排序之后如果有记录依然无序按照c2进行排序,一次类推。
* 如果没有指定排序字段或排序最后依然有无序记录,则按照主键排序。
* 排序时,如果不写asc或desc,则默认是升序(asc)
* select * from emp order by sal desc ;
* select * from emp order by sal desc , birthday desc;
* select * from emp where sal > 23000 order by sal desc ;
* group by 分组:
* 分组函数:count , max , min , avg , sum
* select count(*) from emp ; 获取记录数。
* select count(eno) from emp ; 获得eno不为null的记录数。
* select max(sal) from emp ; 获得sal最大的值。
* select min(sal) from emp ;
* select avg(sal) from emp ; 获得sal平均值。
* select sum(sal) from emp ; 获得sal的和。
* select count(sal) , max(sal) , min(sal) , avg(sal) from emp ;
* 分组函数不能与普通字段一同显示。
* select ename , max(sal) from emp ; 错
* 如果分组函数与普通字段一同显示了,那么该字段一定是分组字段。
* select [分组字段] , 分组函数 from table_name group by c1,c2,...,cn
* 按照c1,c2...进行分组。将指定分组字段值相等的记录划分为一组。
* 分组字段是c1,c2...中的全部或部分。
** 如果分组字段不是c1,c2中的一个,mysql不会报错,默认显示该组第一个记录的字段值。其他数据库报错。不建议使用。
* select ename , job , count(*) from emp group by job;
* select job , count(*) , avg(sal) , max(sal) from emp group by job;
* 分组过滤:
* 在group by的后面使用having 进行过滤。
* having过滤时可以使用分组函数。where过滤时不允许使用分组函数。
* where 过滤在having过滤器之前。
* select job , avg(sal) from emp group by job having avg(sal) > 10000 ;
* limit 分页:
* select * from table_name limit startIndex,length ;
* 在所有的查询结果中,从指定索引位置开始,将length个记录显示(返回)
* 记录索引从0开始。
* select * from emp limit 0,2 ; 取出前2条记录
* 查询工资最高的2个人。
* select * from emp order by sal desc limit 0,2 ;
* 查询平均工资最高的2个行业
* select job,avg(sal) from emp group by job order by avg(sal) desc limit 0,2 ;
* 存储数据的仓库。
2.数据库的分类:
* 单机数据库
* 网络数据库
* mysql ,sqlserver , oracle , sybase , db2
3.数据模型:
* 层次模型
* 网状模型
* 关系模型
4.数据库的组成:
* 数据,表,表之间的关系。
* 表结构:
* 行
* 单元(列)
* 数据
5.数据与信息:
6.数据约束:
* 主键约束:记录都有一个主键来唯一标识该记录。
* 记录可以没有主键,但建议设置主键。
* 外键约束:用来关联两个表中记录的字段。
* 物理外键
* 逻辑外键
* 组合键(联合主键):记录由多个字段联合在一起,唯一标识该记录。
* 唯一约束:唯一标识该记录。
7.E-R图:
* 在数据库建模中,经常使用E-R图
* 矩形表示实体
* 椭圆表示属性
* 椭圆+下划线表示主键
* 实体之间的关系:
* 1 :1 一对一关系
* 1 :n 一对多的关系
* n : 1
* n : n 多对多关系
8.范式:
* 数据库设计的规则
* 1FN 在一列中不能出现2个数据。
* 2FN 一条记录中的所有字段要求完全依赖于主键。
1001 ,dmc , 18 , china
1002 , dmc2 , 18 , china
* 将冗余的记录重新形成一张表进行存储,通过外键进行关联。
1 china
2 usa
--------------------------------
1001 ,dmc , 18 , 1
1002 , dmc2 ,18 , 1
* 3FN 一条记录中的所有字段不能存在传递依赖。
1001 , dmc , 18 , china , 亚洲
1002 , dmc2 , 18 , china , 亚洲
* 将传递依赖部分形成一张表进行存储,通过外键进行关联
1 , china , 亚洲
2 , usa,美洲
----------------------------------------
1001 ,dmc , 18 , 1
1002 , dmc2 ,18 , 1
9.安装mysql数据库:
* mysql5.0
* 卸载mysql : 控制面板卸载程序。 删除安装目录。
* 安装mysql:
* 选择编码字符集。
* mysql安装成功后会自动分配一个root用户。只需要为其设置密码。
10.mysql简单命令:
* RDBMS 关系型数据库管理系统
* 在cmd中连接mysql
mysql -uroot -p
* show databases ; 显示所有的数据库
* use database_name ;选择一个数据库
* use mysql ;
* create database databsse_name ;创建一个数据库
* create database dmc ;
* drop database databaes_name ;删除数据库
* drop database dmc ;
11.数据库sql语句之DDL
* sql : 结构查询语句
* DDL : 数据定义语言 定义数据存储结构(数据库,表等。。)
* create
* create table table_name(cname1 type , cname2 type) ;
* create table emp(
eno varchar(32),
ename varchar(32),
sal int,
dept varchar(32)
) ;
* sql中的常用数据类型:
* int 最大长度为11
* varchar 可变字符串 最大长度为2000
* char 不可变字符串 最大长度为2000
* date 表现形式(yyyy-MM-dd)
* desc table_name ;显示表格的结构
* show tables ;显示所有的表格
* 创建表时为字段增加约束。
create table emp(
eno varchar(32) primary key, --设置主键
dept varchar(32) not null, --不能为空
ename varchar(32) unique --唯一
) ;
create table emp(
eno varchar(32) ,
dept varchar(32) ,
ename varchar(32) ,
primary key(eno,ename) -- 设置主键(组合键)
) ;
* drop
* dorp table table_name ; 删除表
* drop table emp ;
* alter
* 修改表的结构
* alter table table_name add cname type ; 添加一个字段。
* alter table emp add birthday date ;
* alter table table_name drop cname ; 删除一个字段。
* alter table emp drop sal ;
* alter table table_name change cname1 cname2 type ;
* alter table emp change dept deptno varchar(32) ;
* alter table table_name modify cname type ;
* alter table emp modify deptno int ;
12.数据库sql语句之DML
* DML 数据操作语言:添加,删除,修改,查询数据。
* insert 添加数据:
* insert into table_name[(c1,c2,...,cn)] values(v1,v2,....,vn) ; -- []表示可有可无
* insert into emp values('1001','dmc',10000,'2016-01-01');
* emp后没有指定具体的表字段,插入时默认所有字段都插入,且插入顺序即为建表时字段顺序。
* 数据库中字符串(varchar|char)只能使用单引号。
* 如果是数字格式,则可以使用单引号包含,也可以不使用单引号包含。如果将内容付给字符类型,则自动转换。
* 日期类型是date。应用时,可以将符合日期格式的字符串赋值给日期字段。
* 使用select * from emp ;查看表中的记录。
* insert into emp(ename , eno) values('dmc','1002') ;
* 没指定的字段,默认值都是null
* 主键,物理外键,not null的字段必须赋值。
* 即使为所有的字段都赋值,也建议指定字段,提高效率。
* update 修改数据:
* update table_name set c1=v1 , c2=v2,...,cn=vn [where ?]
* update emp set sal = 12000 ; 所有记录的sal都改成12000;
* update emp set sal = 12000 where birthday < '2015-01-01' ; 将2015-01-01以前出生的员工,工资改成12000
* update emp set sal = sal + 2000 ; 所有员工工资涨2000 ;
* 修改时,不要(不允许)修改主键。
* delete 删除数据:
* delete from table_name [where = ?] ;
* delete from emp ; 删除表中的所有记录
* 无论删除多少记录,一定是整条删除。不能删除某一个字段的值。
* delete from emp where sal > 10000 ; 删除sal>10000的所有记录。
** truncate emp ; 清空表。
* 从结果来看,与delete from emp ;
* select 查询数据:
* DQL
* select * | c1,c2,...,cn from table_name [where ?] [group by ? [having ?] ] [order by ?] [limit ?]
* select * from emp ;查询所有记录,并显示所有字段。
* select eno,ename from emp ;查询所有记录,并显示eno和ename字段。
* 即使查询显示所有字段,也推荐指定字段,可以提高查询效率。
* 使用as 为字段设置别名。 as可以省略
* select ename as '姓名' from emp ;
* select ename '姓名' from emp ;
* 过滤条件:
* 使用where关键字为sql语句增加过滤条件。
* 比较运算符:
= > < >= <= !=(<>) 注意:= 表示相等比较。
* select * from emp where eno != 1001 ;
* is null 或 is not null 过滤值为null的字段。
* select * from emp sal is null ;
** null和任何值进行比较都不成立。
** null和任何值进行运算值都为null。
* 逻辑运算:and or
* select * from emp where sal > 12000 and birthday > '2016-01-02';
** 当and和or都存在时,优先and比较。
* 范围
* between v1 and v2 ; 在v1和v2之间。 v1=< ? <=v2
* select * from emp where sal between 22000 and 25000 ;
* in 在某一个范围中。
* select * from emp where ename in ('dmc1','dmc2','dmc4','world','china');
* any , all
* 与子查询联用。
* 模糊查询:
* 使用like进行模糊查询。
* 使用_代替过滤值中的一个元素。
* 使用%代替过滤值中的n个元素(n>=0)
* select * from emp where ename like 'dmc_' ;
* select * from emp where ename like '%d%' ;
* order by 排序:
* 将查询结果进行排序。 升序(asc),降序(desc)
* select * from table_name order by c1 asc|desc , c2 asc|desc ... ;
* 按照c1字段进行排序,排序之后如果有记录依然无序按照c2进行排序,一次类推。
* 如果没有指定排序字段或排序最后依然有无序记录,则按照主键排序。
* 排序时,如果不写asc或desc,则默认是升序(asc)
* select * from emp order by sal desc ;
* select * from emp order by sal desc , birthday desc;
* select * from emp where sal > 23000 order by sal desc ;
* group by 分组:
* 分组函数:count , max , min , avg , sum
* select count(*) from emp ; 获取记录数。
* select count(eno) from emp ; 获得eno不为null的记录数。
* select max(sal) from emp ; 获得sal最大的值。
* select min(sal) from emp ;
* select avg(sal) from emp ; 获得sal平均值。
* select sum(sal) from emp ; 获得sal的和。
* select count(sal) , max(sal) , min(sal) , avg(sal) from emp ;
* 分组函数不能与普通字段一同显示。
* select ename , max(sal) from emp ; 错
* 如果分组函数与普通字段一同显示了,那么该字段一定是分组字段。
* select [分组字段] , 分组函数 from table_name group by c1,c2,...,cn
* 按照c1,c2...进行分组。将指定分组字段值相等的记录划分为一组。
* 分组字段是c1,c2...中的全部或部分。
** 如果分组字段不是c1,c2中的一个,mysql不会报错,默认显示该组第一个记录的字段值。其他数据库报错。不建议使用。
* select ename , job , count(*) from emp group by job;
* select job , count(*) , avg(sal) , max(sal) from emp group by job;
* 分组过滤:
* 在group by的后面使用having 进行过滤。
* having过滤时可以使用分组函数。where过滤时不允许使用分组函数。
* where 过滤在having过滤器之前。
* select job , avg(sal) from emp group by job having avg(sal) > 10000 ;
* limit 分页:
* select * from table_name limit startIndex,length ;
* 在所有的查询结果中,从指定索引位置开始,将length个记录显示(返回)
* 记录索引从0开始。
* select * from emp limit 0,2 ; 取出前2条记录
* 查询工资最高的2个人。
* select * from emp order by sal desc limit 0,2 ;
* 查询平均工资最高的2个行业
* select job,avg(sal) from emp group by job order by avg(sal) desc limit 0,2 ;