Mysql
4.1 概述
Mysql 是一种关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言:结构化查询语言
(SQL)进行管理。支持实时的增删改查。拥有体积小,速度快,成本低等特点。
Sql 语句不区分大小写
SQL 是一种面向集合的编程语言
4.2 存储引擎
Innodb 支持事务,查询没有 myisam 快
索引:b+树,上层
Myisam 查询快,但不支持事务
4.3 索引
Mysql 目前主要有以下 4 种索引类型
FullText
全文索引,目前只有 myisam 引擎支持,在 char、varchar、text 上可以创建全文索引
Hash
Hash 索引可以一次定位,适合等值和 in 条件下进行查询,对于范围查询、排序效率不高
Btree
Mysql 默认是这种索引类型,它将索引值按一定算法存入二叉树中,每次查询都从入口开始依次遍历
node 获取 leaf。
Rtree
Rtree 在 mysql 中很少使用,仅支持 geometry 类型,相对于 btree,rtreee 的优势在于范围查找。
4.4 对数据库操作
1.使用默认的字符集与校对创建数据库
create database 数据库名;
2. 可以指定数据库字符
create database 数据库名 CHARACTER set gbk
3 查看当前数据库服务器下所有数据库
show databases;
4 查看创建数据库的语句
show create database 数据库名;
5 删除数据库
drop database 数据库名
6.切换数据库
use 数据库名称
7 查看当前所使用的事数据库
select database();
4.5 对表操作
4.5.1 常用数据类型
Int 整型;
double 浮点型;
decimal 浮点型(用于保存准确精度值);
varchar(可变长度字符串);
date 日期类型,格式为 yyyy-MM-dd;
time 时间类型,格式为 hh:mm:ss;
时间戳类型,格式为 yyyy-MM-dd hh:mm:ss。
char 与 varchar 区别:char 是一个定长字符串,指定长度后不会随着内容的不足而改变
varchar 是一个可变长度字符串,它根据信息自动改变长度。(只在字符串长度小于指定长度的情况
下)
4.5.2 约束
1. 主键约束 primary key,primary key(id)
2. 唯一约束 某一列的值不为重复可以使用唯一约束 unique
3. 非空约束 not null
4. 默认值约束 default 值
5. 外键约束
4.5.3 对表
1. 创建表
Create table 表名(
字段 1 数据类型 约束 1 约束 2,
字段 2 约束类型 约束,
…
) character set 字符集(utf8);
2. 查看表
查看表结构:desc 表名;
查看当前数据库下的表:show tables;
查看表的字符编码集(表的创建语句):show create table 表名;
3. 修改表(很少使用)
add 添加列 alter table 表名 add 列名 类型;
modify--修改列的类型 alter table 表名 modify 列名 类型;
drop --删除列 alter table 表名 drop 列名.
change--修改列名称 alter table 表名 change 旧列名 新列名 类型;
4. 删除表
drop table 表名
truncate table 表名
区别:前者有条件,自增主键不初始化
后者不可回退,速度快,相当于新建一个空表
4.5.4 对单表数据
4.5.4.1insert 插入操作
插入所有列值:insert into 表名(列名 1,列名 2,..)values(列值 1,列值 2,..);
表名后括号内是所有字段名称
插入部分列值:insert into 表名(列名 1,列名 2,..)values(列值 1,列值 2,..)
表名后括号内是部分字段名称
不指定列名:insert into 表名 values(列值 1,列值 2,..);
没有给出要插入的列,表示插入所有列
值的个数必须是该表的列的个数
值的顺序必须与创建表时给出的列的顺序相同
4.5.4.1.1注意事项
1. 插入的数据应与字段的数据类型相同
2. 数据的大小应在该列的长度范围内
3. 在 values 中列出的数据位置必须与被加入的排列位置相对应
4. 除了数值类型外,其他字段类型的值必须使用引号引起。
5. 如果要插入空值,可以不写字段,或者插入 null
6. 注意:对于自动增长的列在操作时,直接插入 null 值即可
4.5.4.2Update 更新操作
用于修改表中的数据
Update 表名 set 列名 = 新值,列名 = 新值, .. where 列名 = 某值;
4.5.4.3Delete 删除操作
Delete 用于删除表中的行(数据)
删除某行 Delete from 表名 where 列名 = 值;
删除所有行 delete from table 表名 或 delete * from table 表名;
删除表中数据 truncate table 表名;
4.5.4.4Selete 基本查询
格式:
SELECT(选择)
字段,常量,变量运算,函数
FROM 表(数据)
WHERE 条件[筛选过滤]
查询指定列:select 字段 1,字段 2,.. from 表名;
查询所有列:select * from 表名;
注意:“*”在练习学习过程中可以使用,在实际开发中不常使用
4.5.4.4.1Distinct
去掉重复记录 select distinct 字段 from 表名;
4.5.4.4.2as
使用别名 select 列名 as 别名 from 表名;
或者直接用空格隔开, select 列名 别名 from 表名;
4.5.4.4.3ifnull 函数
在对数值类型的列做运算时,如果运算的列的值为 null 时,运算结果都为 null,为了解决这一问题使用
ifnull 函数
Select 列名,数值列*(数值列+ifnull(数值列,0)) from 表名;
如果函数内数值列为 null,则按 0 计算。
4.5.4.4.4常用运算符
>,>=,<,<=,=,!=,between(在某个范围内),like(搜索某种模式)
Sql 使用单引号来环绕文本值(大部分数据库也支持双引号),如果是数值,就不要使用引号
4.5.4.4.5逻辑运算符
and 与,or 或,between 小值 and 大值,in(数值 1,2,3..)匹配多个值,like 模糊查询 %匹配多个,
_匹配一个。
4.5.4.4.6null 值
is null;判断为空。Is not null;判断不为空。
4.5.4.4.7order by 排序
select 字段 from 表名 where 条件 order by 字段 asc/desc(升序降序),字段 asc/desc;
4.5.4.4.8聚合函数
Count:统计指定列不为 null 的记录行数;
Sum:计算指定列的数值和,如果指定列数据类型不为数值,计算结果返回 0;
Max:计算指定列的最大值,如果指定列是字符串类型,使用字符串排序运算;
Min:计算最小值,字符串同上。
Avg:计算指定列平均值,如果不为数值类型,返回 0;
4.5.4.4.9分组操作
Group by 用于结合聚合函数,根据一个或多个列进行分组。
分组操作中用 having 对分组后的数据进行过滤,作用类似于 where。
Having 和 where 的区别:
Having 是在分组后对数据进行过滤,where 是在分组前对数据进行过滤
Having 后面可以使用分组函数(统计函数),where 后面不可以使用分组函数
4.5.5 对多表数据
4.5.5.1外键约束
表与表之间的关系包括:一对一,一对多,多对多。表与表之间的关系通过外键维护。
将两张表关联在一起。
外键约束特性如下:
外键必须是另一张表或者自身表的主键的值。
外键可以重复
外键可以为空
一张表中可以有多个外键
4.5.5.2多表关联操作
4.5.5.2.1.1 交叉连接
Select * from A,B
Select * from A cross join B;
原理为笛卡尔积
4.5.5.2.1.2内连接
内连接为两张表同时满足一定条件的结果
显式内连接:select * from A inner join B on(连接条件[外键字段名 = 另一个表的主键字段])
隐式内连接:select * from A,B where 条件
4.5.5.2.1.3外连接
分左外连接和右外连接
分别用 left join 和 right join
4.5.5.2.1.4联合查询
Select 字段 from A where 条件
Union
Select 字段 from B where 条件
可以自动消除重复记录
4.5.5.2.1.5子查询
将一次的查询结果作为条件或数据集,外面再包一层查询(父查询)。
Select * from A where
字段 in (
Select 字段 from B where 条件;
);
4.5.5.2.1.6补充函数
Now()函数 :生成当前时间
Year(now())取出年份
Md5()给字段加密
Limit 起始行数或每页显示行数