1 数据库的概念
1.1 什么是数据库
数据库就是用来存储和管理数据的仓库!
1.2 数据库的发展历程
MySQL就是关系型数据库!
关系型数据库管理系统称为RDBMS,R指Relation
数据库由一批数据构成的有序集合,这些数据被分门别类地存放在一些结构化的数据表(table)里,而数据表之间又往往存在交叉引用的关系,这种关系使数据库又被称为关系型数据库
RDBMS = 管理员(manager)+仓库(database)
database = N个table
table:
表结构:定义表的列名和列类型!
表记录:一行一行的记录!
1.3 常见的数据库
数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,是用于建立、使用和维护数据库,简称DBMS。
Oracle
SQLServer
DB2
Sybase
MySQL
SQLLite
1.4 理解数据库
数据库和表的关系:
表与实体的关系:
行(记录)对应着某个实体;列(字段)对应着某种属性
表与表之间的关系
普通excel表的存储:
关系型数据库表的存储:
2 mysql数据库
2.1基本概述
SQL: structure query language结构化查询语言,非过程性语言,不区分大小写(关键字大写,自己定义的小写),只认单引号
连接数据库 进入cmd控制台,输入mysql -u用户名 -p密码
mysql结构:
一个数据库管理系统软件可以有多个数据库,一个数据库中可以有多个表,一个表中可以有多条数据记录。
2.2 操作数据库
2.2.1 创建数据库
create database [if not exists] db_name [character set xxx] [collate xxx]
create database mydb1;
create database mydb2 character set utf8;
create database mydb3 character set utf8 collate utf8_bin ;
2.2.2 查看数据库
show databases;
show create database db_name;
2.2.3 修改数据库
alter database db_name [character set xxx] [collate xxxx]
2.2.4 删除数据库
drop database [if exists] db_name;
2.2.5 使用数据库
use db_name;
相当于进入这个数据库,后续的操作都是针对这个数据库
select database();
2.3 操作表
2.3.1 创建表
create table tab_name(
field1 type,
field2 type,
...
fieldn type
)[character set xxx][collate xxx];
2.3.2 数据类型
常用数据类型:
*创建一个员工表employee
create table employee(
id int primary key auto_increment ,
name varchar(20),
gender bit default 1,
birthday date,
entry_date date,
job varchar(20),
salary double,
resume text
);
2.3.3 查看表信息
desc tab_name;
show tables ;
show create table tab_name;
2.3.4 修改表结构
alter table tab_name add [column] 列名 类型;
alter table tab_name modify 列名 类型;
alter table tab_name change [column] 列名 新列名 类型;
alter table tab_name drop [column] 列名;
rename table 表名 to 新表名;
alter table student character set utf8;
2.3.5 删除表
drop table tab_name;
2.4 表记录
2.4.1 增加一条记录 insert
insert into tab_name (field1,filed2,.......) values (value1,value2,.......);
注意:
- 插入的数据应与字段的数据类型相同。
- 数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。
- 在values中列出的数据位置必须与被加入的列的排列位置相对应。
- 字符和日期型数据应包含在单引号中’zhang’ ‘2013-04-20’
- 插入空值:不指定某列的值或insert into table value(null),则该列取空值。
- 如果要插入所有字段可以省写列列表,直接按表中字段顺序写值列表insert into tab_name values(value1,value2,……);
update tab_name set field1=value1,field2=value2,......[where 语句]
- UPDATE语法可以用新值更新原有表行中的各列。
- SET子句指示要修改哪些列和要给予哪些值。
- WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。
update employee set salary = 5000;
update employee set salary = 3000 where name='张飞';
update employee set salary=4000,job='ccc' where name='关羽';
2.4.3 删除表操作 delete
delete from tab_name [where ....]
- 如果不跟where语句则删除整张表中的数据
- delete只能用来删除一行记录,不能值删除一行记录中的某一列值(这是update操作)。
- delete语句只能删除表中的内容,不能删除表本身,想要删除表,用drop
- 同insert和update一样,从一个表中删除记录将引起其它表的参照完整性问题,在修改数据库数据时,头脑中应该始终不要忘记这个潜在的问题。
- TRUNCATE TABLE也可以删除表中的所有数据,词语句首先摧毁表,再新建表。此种方式删除的数据不能在事务中恢复。(delete之后编码连续的)truncate直接摧毁表格,再重建表格,效率高于delete,但只能整个表都删除。
2.4.4 查询表记录 select
(1)
select [distinct] *|field1,field2,...... from tab_name
其中from指定从哪张表筛选,*表示查找所有列,也可以指定一个列列表明确指定要查找的列,distinct用来剔除重复行。
(2)select 也可以使用表达式,并且可以使用 as 别名
select name,english+chinese+math as 总成绩 from exam;
(3)使用where子句,进行过滤查询。
select name,math+english+chinese as 总成绩 from exam where math+english+chinese>200 ;
select name ,english from exam where english between 80 and 100;
*逻辑运算符
在多个条件直接可以使用逻辑运算符 and or not
select name from exam where math>70 and chinese >80;
(4)Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的别名。
Asc 升序、Desc 降序,其中asc为默认值
ORDER BY 子句应位于SELECT语句的结尾。
select name ,(ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0)) 总成绩 from exam order by 总成绩 desc;
(4)聚合函数
count(列名)
统计一个班级共有多少学生?先查出所有的学生,再用count包上–
select count(*) from exam;
统计数学成绩大于70的学生有多少个?–
select count(math) from exam where math>70;
统计总分大于250的人数有多少?–
select count(name) from exam where (ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0))>250;
sum(列名)
统计一个班级数学总成绩?先查出所有的数学成绩,再用sum包上
select sum(math) from exam;
统计一个班级语文、英语、数学各科的总成绩–
select sum(math),sum(english),sum(chinese) from exam;
统计一个班级语文成绩平均分?–
select sum(chinese)/count(*) from exam ;
AVG(列名)
求一个班级数学平均分?先查出所有的数学分,然后用avg包上。–
select avg(ifnull(math,0)) from exam;
求一个班级总分平均分–
select avg((ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0))) from exam ;
求班级最高分和最低分(数值范围在统计中特别有用)–
select Max((ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0))) from exam;
select Min((ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0))) from exam;
(5)group by字句,其后可以接多个列名,也可以跟having子句对group by 的结果进行筛选。
对订单表中商品归类后,显示每一类商品的总价–
select product,sum(price) from orders group by product;
购买了几类商品,并且每类总价大于100的商品–
select product,sum(price) from orders group by product having sum(price)>100;
注意:!~
having 和 where 的差别: where语句用在分组之前的筛选,having用在分组之后的筛选,having中可以用合计函数,where中就不行。使用where的地方可以用having替代。
2.4.5 备份恢复数据库
备份: 在cmd窗口下
mysqldump -u root -p dbName>c:/1.sql
恢复:
方式1:在cmd窗口下
mysql -u root -p dbName<c:/1.sql
方式2:在mysql命令下
source c:/1.sql
要注意恢复数据只能恢复数据本身,数据库没法恢复,需要先自己创建出数据后才能进行恢复.
2.4.6 重点
Mysql在执行sql语句时的执行顺序:
from where select group by having order by
*分析:
select math+english+chinese as 总成绩 from exam where 总成绩 >250; ---- 不成功
select math+english+chinese as 总成绩 from exam having 总成绩 >250; --- 成功
select math+english+chinese as 总成绩 from exam group by 总成绩 having 总成绩 >250; ----成功
select math+english+chinese as 总成绩 from exam order by 总成绩;----成功
select * from exam as 成绩 where 成绩.math>85; ---- 成功
2.5 约束
2.5.1 创建表时指定约束
create table tb(
id int primary key auto_increment,
name varchar(20) unique not null,
ref_id int,
foreign key(ref_id) references tb2(id)
);
create table tb2(
id int primary key auto_increment
);
2.5.2 外键约束
(1)增加外键:
可以明确指定外键的名称,如果不指定外键的名称,mysql会自动为你创建一个外键名称。
RESTRICT : 只要本表格里面有指向主表的数据, 在主表里面就无法删除相关记录。
CASCADE : 如果在foreign key 所指向的那个表里面删除一条记录,那么在此表里面的跟那个key一样的所有记录都会一同删掉。
alter table book add [constraint FK_BOOK] foreign key(pubid) references pub_com(id) [on delete restrict] [on update restrict];
(2)删除外键
alter table 表名 drop foreign key 外键(区分大小写,外键名可以desc 表名查看);
2.5.3 主键约束
(1)增加主键(自动增长,只有主键可以自动增长)
Alter table tb add primary key(id) [auto_increment];
(2)删除主键
alter table 表名 drop primary key
(3)增加自动增长
Alter table employee modify id int auto_increment;
(4)删除自动增长
Alter table tb modify id int;
2.5.4 唯一约束
创建表的时候
create table 表名(
列名数据类型 unique,
列名数据类型,
列名 ......
)
2.5.5 非空约束
创建表的时候
create table 表名(
列名数据类型 not null,
列名数据类型,
列名 ......
)
2.5.6 设置默认值
创建表的时候
create table 表名(
列名数据类型 default 值,
列名数据类型,
列名 ......
)
2.5.7 提取查询结果
select * from 表名 limit 提取条数
select * from 表名 limit 起点之后 , 提取条数
语文成绩的前三名,limit表示提取几条
select * from student order by chineseScore desc limit 3;
语文成绩的第二名到第四名 limit 1,3 1表示从第一条之后开始提取
select * from student order by chineseScore desc limit 1,3;
2.6 多表设计
多表设计中三种实体关系:
多表设计实例:
CREATE TABLE teacher (
id int(11) NOT NULL primary key auto_increment,
name varchar(20) not null unique
);
CREATE TABLE student (
id int(11) NOT NULL primary key auto_increment,
name varchar(20) NOT NULL unique,
score double default '0',
teacher_id int(11) NOT NULL,
FOREIGN KEY (teacher_id) REFERENCES teacher (id)
) ;
一对一(311教室和20130405班级,两方都是一):在任意一方保存另一方的主键
1:1的联系不必引入关系表
一对多、多对一(班级和学生,其中班级为1,学生为多):在多的一方保存一的一方的主键
多对多(教师和学生,两方都是多):使用中间表,保存对应关系
2.6.1 笛卡尔积
两张表中一条一条对应的记录,m条记录和n条记录查询,最后得到m*n条记录,其中很多错误数据,所以笛卡尔积查询,没有实际意义
a表中的每一条记录,都和b表中的每一条进行匹配连接。
所得到的最终结果是,a表中的条目数乘以b表中的数据的条目数。
select * from a,b
select * from student,class;
2.6.2 内连接
查询两张表中都有的关联数据,相当于利用条件从笛卡尔积结果中筛选出了正确的结果。
隐式内连接查询:
select * from a,b where a.a_id = b.a_id;
显式内连接查询:
注意:内连接查询只会查询到两表中都一定有关联的数据。
select * from a inner join b on a.a_id = b.a_id
2.6.3 外连接
左外连接:
当两个表连接的时候,如果左侧表有数据,右测的表没有对应的数据。会把左侧的表中的数据显示出来。
select * from a left join b on a.a_id = b.b_id
右外连接:
如果右侧有数据,左侧没匹配到,把右侧的数据显示出来。
select * from a right join b on a.a_id = b.b_id
2.6.4 子查询
将一个查询作为另一个查询的条件
select * from student where 条件表达式(另一条查询语句)
子查询,语文成绩最差的学生的信息
select * from student where chineseScore = (select min(chineseScore) from student);
子查询,语文成绩高于平均分学生的信息
select * from student where chineseScore > (select avg(chineseScore) from student);
in 表示:一个内容,是不是在自查的结果中。
exists表示:表示子查询是否有内容。如果有内容,认为是true。如果没有内容,认为是false。
any 表示任何一个 a > any(1,2,3,4) 相当于 a>1 or a>2 or a>3 or a>4
all 表示所有。 a > all(1,2,3,4) 相当于 a>1 and a>2 and a>3 and a>4
2.6.5 联合查询
union 对两个结果集进行并集操作,重复数据只显示一次(去重复)
union all,对两个结果集进行并集操作,重复数据全部显示(不去重复)
select * from student where classId = 1
union
select * from student where stuSex = 'm';
select * from student where classId = 1
union all
select * from student where stuSex = 'm';
2.7 视图
视图是基于 SQL 语句的结果集的可视化的表。
视图可以大大化解查询的文字复杂度。
2.7.1创建视图
视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
2.7.2 查询视图
视图的使用在查询时和表完全一样。视图不允许增、删、改操作。
2.8 用户管理
2.8.1 创建用户
create user 用户名@ip地址 identified by 密码
create user maoyun@192.168.0.102 identified by '123456';
2.8.2 删除用户
drop user maoyun@192.168.0.102;
2.8.3 修改用户的密码
#进入mysql核心数据库中
use mysql;
#查询所有mysql账户
select * from user;
#修改密码
update user set password = password('654321') where user = 'maoyun';
#刷新权限
flush privileges;
2.8.4 用户授权
grant权限1,权限2,….. on 数据库名.表名 to 用户名@ip地址
给某用户授权mao数据库下所有表的查询权限
grant select on mao.* to maoyun@192.168.0.102;
2.8.5 撤销用户的权限
revoke 权限1,权限2,….. on 数据库名.表名 from 用户名@ip地址
revoke select on mao.* from maoyun@192.168.0.102;
3 数据库高级性能术语介绍
当数据访问量极大了以后……:
负载均衡:众多个相同数据的数据库(数据库复制多个相同副本)分别分摊一定数量的用户访问。将用户的访问分流了。
读写分离:有的副本只执行读操作,有的副本只执行写操作,随后进行同步。因为对一个普通网站来说,查询是远大于更新操作的。
当存储数据量极大了以后……:
分片技术:将一个数据库分成多个数据库,将一个表中的数据,分割成N张表,放入位于不同机器的数据库中。
当数据访问量和存储数据量极大极大、海量海量了以后……:
NoSql系列数据库介绍
NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
NoSql基本上都是基于分布式文件系统的,也就是说可以将数据存放与多台不同的机器上,从而无限扩展,而且并发,更新查询速度都超快。
MongoDB、HBase(Hadoop Database)、Redis(内存存储)、sequoiadb(巨衫数据库)… 等。
NoSql数据库是大数据技术的基础。