MySQL
数据模型
是数据特征的抽象,是数据库管理的数学形式框架,在数据库系统中用来提供信息表示和操作手段的形式构架。
数据模型三要素:数据结构、数据操作、数据约束
早期流行的数据库模型: 层次式数据库、网络式数据库、关系型数据库
当前互联网常用数据库模型:关系型数据库、非关系型数据库(Not Only SQL)
关系型与非关系型(NoSQL)
MySQL是关系型数据库,是指采用了关系模型来组织数据的数据库。
关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
-
关系型数据库的优点:
- 容易理解:二维表结构是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型来说更容易理解
- 使用方便:通用的SQL语言使得操作关系型数据库非常方便
- 易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率
-
关系型数据库瓶颈
- 高并发读写需求(无法满足高并发的读写需求)
网站的用户并发性非常高,往往达到每秒上万次读写请求,对于传统关系型数据库来说,硬盘I/O是一个很大的瓶颈 - 海量数据的高效率读写(读写性能比较差)
网站每天产生的数据量是巨大的,对于关系型数据库来说,在一张包含海量数据的表中查询,效率是非常低的 - 高扩展性和可用性(灵活度欠缺)
在基于web的结构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移。
- 高并发读写需求(无法满足高并发的读写需求)
非关系型数据库是为了处理海量数据,严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
-
非关系型数据库优点:
- 格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
- 速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
- 高扩展性;
- 成本低:nosql数据库部署简单,基本都是开源软件。
-
非关系型数据库缺陷:
- 不提供sql支持,学习和使用成本较高;
- 无事务处理;
- 数据结构相对复杂,复杂查询方面稍欠。
常用数据库默认端口
关系型 | 默认端口 |
---|---|
Oracle | 1521 |
SQL server | 1433 |
MySQL | 3306 |
PostgreSQL | 5432 |
DB2 | 5000 |
Access : 小型桌面数据库
非关系型 | 默认端口 |
---|---|
Mongo DB | 27017 |
redis | 6379 |
MySQL
- 是现流行的开源、免费的关系型数据库
- 特点
- 免费、开源数据库
- 小巧、功能齐全、使用便捷
- 兼容性好,可以工作在不同的平台上。支持C、C++、Java、Perl、PHP、 Python和TCL API。也适用于中小型甚至大型网站应用
- 使用的核心线程是完全多线程,支持多处理器。
- 有多种列类型:1、2、3、4、和8字节长度自有符号/无符号整数、 FLOAT、DOUBLE、CHAR、VARCHAR、TEXT、BLOB、DATE、TIME、 DATETIME、 TIMESTAMP、YEAR、和ENUM类型。
- 全面支持SQL的GROUP BY和ORDER BY子句,支持聚合函数(COUNT()、 COUNT(DISTINCT)、AVG()、STD()、SUM()、MAX()和MIN())。你可以在 同一查询中混来自不同数据库的表。
- 支持ANSI SQL的LEFT 0UTER JOIN和ODBC。
- 所有列都有缺省值。你可以用INSERT插入一个表列的子集,那些没用明确给定值的列设置为他们的决省值。
结构化查询语句SQL
分类:
名称 | 解释 | 命令 |
---|---|---|
DDL (数据定义语言) Data Definition Language | 定义和管理数据对象, 如数据库,数据表等 | CREATE(创建)、DROP(删除-表-库)、ALTER (修改表、库) |
DML (数据操作语言) Data Manipulation Language | 用于操作数据库对象中所包含的数据 | INSERT(添加)、UPDATE(修改更新)、DELETE(删除) |
DQL (数据查询语言) Data Query Language | 用于查询数据库数据 | SELECT (查询记录) |
DCL (数据控制语言) Data Control Language | 用来管理数据库的语言,包括管理权限及数据更改 | GRANT(授予权限)、revoke(撤销权限)、COMMIT(提交事务)、ROLLBACK (回退事务) |
DDL(数据定义语言) Data Definition Language
create
创建数据库:
create database db_name;
create database db_name default character set utf8; /*设置默认字符集编码*/
create database [if not exists] db_name; /*如果数据库不存在就创建*/
枚举(单选类型): enum('data1','data2',...);
集合(多选类型):set('data1','data2',...);
创建数据表:
create table employee(
id int primary key auto_increment, /*设置主键,并设置自增长*/
name varchar(20) not null, /*设置不为空*/
gender varchar(3),
birthdat date,
job varchar(20),
salary double,
resume text
);
创建视图:
create view 视图名 as +sql语句
创建索引:
create index index_name
on table_name(column_name)
CREATE [UNIQUE|CLUSTERED] INDEX INDEX_NAME ON TABLE_NAME(PROPERTY_NAME)
其中UNIQUE和CLUSTERED为可选项,分别是建立唯一索引和聚簇索引,具体解释为:
- UNIQUE:表示此索引的每一个索引值只对应唯一的数据。
- CLUSTERED:表示要建立的索引时聚簇索引,即索引项的顺序与表中记录的物理顺序一致的索引组织。
创建表字段约束和属性
- 非空约束 not null(字段不允许为空)
- 默认约束 default(设置默认值)
- 唯一约束 unique key(uk)(设置字段的值是唯一的,可为空,但只能有一个空值)
- 主键约束 primary key(pk)(作为表记录的唯一标识)
— 设置自增auto_increment=n,从n开始。
— 设置自增set @@ auto_increment_increment=m,步长为m。 - 外键约束 foreign key(fk)(用于两个表之间建立关系,需要指定引用主表的哪一字段。在数据库的存储引擎中InnoDB支持外键,MyISAM不支持外键。
作为外键的字段要求是主表中的主键(单字段主键))
添加外键约束:
CONSTRAINT FK_外键名 FOREIGN KEY (字表中外键字段) REFERENCES 关联表名 (关联字段)。
drop
删除数据库:
drop database db_name;
drop database if exists db_name; /*数据库不存在也不会报错*/
删除数据表:
drop table tab_name;
删除索引:
drop index index_name;
alter
修改数据库的字符集:
alter database db_name character set utf8;
对表进行操作:
修改数据表的字符集编码:
alter table tab_name default character set utf8;
增加表的字段,添加一列或者多列:
alter table tab_name add (column1 datatype, column2 datatype,...);
修改表的数据类型:
alter table tab_name modify column1 datatype;
给表的列添加注释:
alter table tab_name modify column datatype comment ‘details’ ;
更改列名(字段名):
alter table tab_name change oldcolumn newcolumn datatype;
删除一列:
alter table tab_name drop column;
表重命名:
alter table oldtab_name rename to newtab_name;(1)
rename table oldtab_name to newtab_name; (2)
DML (数据操作语言) Data Manipulation Language
insert
第一种方法:
insert into tab_name(col_name1,col_name2,..,col_namen)
values (data1,data2,…...,datan);
第二种方法:
insert into tab_name values(data1,data2,....);
第三种方法:
指定列插入值:
insert into tab_name(col_name1,col_name2)
values (data1,data2);
一次增加多条:
insert into tab_name(col_name1,col_name2,..,col_namen)
values (data1,data2,..,datan), (data1,data2,..,datan);
update
修改数据:
update table_name
set col_name1=newdata [, col_name2=data2 ...] /*多个数据修改用,隔开*/
where col_name=condition; /*条件*/
delete
删除表数据:
delete from tab_name
where 列=条件;
如果不使用where子句,将删除表中所有数据。
DCL (数据控制语言) Data Control Language
grant
授予权限:
grant 权限列表 on 某库.某个对象 to ‘用户名’@‘允许登录的地址/服务器’ [indentified by ‘密码’];
说明:
1.权限列表就是多个权限的名词,相互之间用逗号隔开。
2.某库.某对象:表示给指定的某个数据库的某个下级单位(表名、视图名、存储过程名,存储函数名)授权;
特殊情况:
.:代表所有数据中的所有下级单位
某库.*:代表指定的该库中的所有下级单位
3.[indentified by ‘密码’]:可省略,表示授权的同时也可修改密码。不省略的时,授权不存在的用户会创建用户并授权。
如:
grant all on mydb.* to 'user1'@'localhost';
MySQL查看用户权限与GRANT用法
查看用户权限
show grants for username
比如:show grants for root@‘localhost’;
revoke
剥夺权限:
revoke 权限列表 on 某库.某个对象 from ‘用户名’@‘允许登录的地址/服务器’;
DQL (数据查询语言) Data Query Language
select
显示当前所使用的数据库:
select database();
显示当前数据库版本:
select version();
显示当前时间:
select now();
查询表所有记录 ( * 匹配所有列(column)):
select * from tab_name;
查询表记录,去除列的重复值:(distinct用于返回唯一不同的值)
select distinct col_name from tab_name;
有条件地从表中选取数据:
select col_name from tab_name where 列 运算符 值;
根据指定的列对结果集进行排序(默认为升序:asc,降序:desc)
select 列名 from 表名 order by 列名 desc/asc;
多列排序:order by 列名称(desc/asc),列名称(desc/asc)
实现某一段的记录查询:(m表示从m+1行开始,n表示多少行)
select * from tab_name limit m,n;
取别名:
select column as 别名 from tab_name;
select column from tab_name as 别名;
根据一个或多个列对结果集进行分组:
select * from tab_name group by column;
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面。
分组筛选:
select …… from <tab_name>
where ……
group by ……
having……
例:
select count(*) as 人数,sgrade as 年级
from students
group by sgrade
having count(*)>15 ;
顺序:where–group by–having
where和having区别:
- having可以和函数一起使用
- where关键字无法与函数一起使用
- where针对表中的列发挥作用,查询数据
- having对查询结果中的列发挥作用,筛选数据
在where子句中:
操作符 | 描述 |
---|---|
= | 等于 |
<> , != | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
between …and… | 在某个范围内 |
not between …and… | 不在某个范围内 |
like | 是否匹配于一个模式 |
in (值表) | 在特定的集合里(枚举) |
not in (值表) | 不在特定的集合里(枚举) |
is null | 为空的 |
is not null | 不为空的 |
and | 多个条件同时成立 |
or | 多个条件任一成立 |
Like语句中,% 代表零个或多个任意字符,_ 代表一个字符
聚合函数:
count(列名)返回某一列,行的总数:
select count(*)/count(列名) from tab_name
[WHERE where_definition]
sum函数返回满足where条件的行的和:
select sum(列名){,sum(列名)…} from tab_name
[WHERE where_definition]
avg函数返回满足where条件的一列的平均值:
select avg(列名){,avg(列名)…} from tab_name
[WHERE where_definition]
max/min函数返回满足where条件的一列的最大/最小值:
select max/min(列名) from tab_name
[WHERE where_definition]
简单子查询
where型子查询
把内层查询结果当作外层查询的比较条件
select 列名 from 表名 where 列 in (select 列名 from 表名);
查询score中选学多门课程的同学中分数为非最高分成绩的记录:
from型子查询
把内层的查询结果供外层再次查询
select 别名.列名 from (select 列名 from 表名 where 列 = 条件 ) as 别名;
多表查询—分类
连接查询
- 同时涉及多个表的查询称为连接查询
- 用来连接两个表的条件称为连接条件
内连接(inner join where)
select * from 表一 as e inner join 表二 as s on e.id=s.emp_id;
select * from 表一 as e ,表二 as s where e.id=s.emp_id;’
外连接(左/右外连接可以互相转换)
- 左外联结 (left join)
select * from 表一 as e left join 表二 as d on e.dept_id=d.dept_id
(左边表格全部显示,右边与左边对齐匹配,如不够,以空显示)表1 为主表
- 右外联结 (right join)
select * from 表一 as e right join 表二 as d on e.dept_id=d.dept_id;
(右边表格全部显示,左边与右边对齐匹配,如不够,以空显示)表2为主表
外连接与普通连接的区别
-
普通连接操作只输出满足连接条件的记录
-
外连接操作以指定表为连接主体,将主体表中不满足连接条件的记录一并输出
并集
-
Union:对两个结果集进行并集操作,不包括重复行(剔除重复),同时进行默认规则的排序;
select * from Table1 union select * from Table2 ;
-
Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
select * from Table1 union all select * from Table2
使用union和union all必须保证各个select 集合的结果有相同个数的列,并且每个列的类型是一样的。但列名则不一定需要相同,会将第一个结果的列名作为结果集的列名。
可以在最后使用一条order by来对整个结果进行排序。
备份、恢复数据库
备份数据:
mysqldump –u 用户名 –p 需要备份数据库名 > 路径/文件名.sql
恢复数据:
Linux目录下:mysql –u 用户名 –p 数据库名 < 路径/文件名.sql
或
登录Mysql:source 路径/下文件名.sql
其他常用命令
查看数据库:
show databases;
显示创建数据库的信息:
show create database db_name;
使用数据库:
use db_name;
显示创建的表的结构:
desc tab_name;
显示数据库中的表:
show tables;
显示创建数据表的信息:
show create table tab_name;
显示表的索引:
show index from tab_name;
显示数据库的所有视图:
show table status where comment = 'view';
查看mysql支持的存储引擎:
show engines\G;