MySQL基础篇
基础概念
为什么要用数据库?
应用程序产生的数据是在内存中,如果程序退出或者断电,数据则会消失,使用数据库是为了永久保存数据
为什么不直接使用普通文件?
把数据写在硬盘文件中,当然可以实现持久化的目标,但是不利于后期的检索和管理
Mysql,Oracle,SqlServer是什么?
都是数据库管理系统,是一种操纵和管理数据库的大型软件
SQL是什么?
SQL是结构化查询语言,专门用来操作/访问数据库的语言
目录介绍
mysql的数据文件位置
/var/lib/mysql/
mysql配置文件
/etc/my.cnf
Mysql数据类型
整形:
一字节整形:tinyint
二字节整形:smallint
三字节整形:mediumint
四字节整形:int
对于整形,Mysql支持类型后加(M),M表示显示宽度。int(M)这个M,只有在字段的属性
中指定了unsigned(无符号)和 zerofill(零填充)才有意义
浮点数:
float
double
M为位数,D表示小数位数
decimal(M,D) 默认decimal(10,0)
浮点类型具有误差,浮点类型推荐使用decimal类型(保存为字符串格式)
字符串类型
char(M) M表示字符个数而不是字节个数,M为0~255
varchar(M) M表示字符个数,总字节数<=65535,需要增加1或2个字节存储数据的字节数
blob 0~65535字节,值所占字节数 +2
text 0~65535字节,值所占字节数 +2
对于myisam存储引擎,推荐使用固定长度的数据列代替可变长度的数据列。使整个表静态化,从而使数据检索更快,用空间换时间
对于innodb存储引擎,推荐使用可变长度的数据列,因为innodb数据表的存储格式不分固定长度和可变长度,使用char不一定比使用varchar好,但varchar是按实际的长度存储的,比较节省空间,所以对磁盘IO和数据存储总量比较好
日期时间类型
year 1字节 YYYY 取值:1901-2155
date 3字节 YYYY-MM-DD 取值:1000-01-01至9999-12-31
time 3字节 HH:MM:SS 取值: -838:59:59至838:59:59
datetime 8字节 YYYY-MM-DD HH:MM:SS 取值: 9999-12-31 23:59:59
timestamp 4字节 YYYY-MM-DD HH:MM:SS 取值: 2038-01-19 03:14:07
timestamp类型的日期时间值存储时会将当前时区的日期时间值转换为标准时间值,检索时再转换回当前时区的日期时间值
datetime只能反映出插入时当地的时区,其他时区的人查看数据必然存在误差
enum类型,只能在指定的枚举列表中取值,而且一次只能取一个。枚举列表最多有65535个成员。enum值在内部用整数表示,每个枚举值都有一个索引值,mysql存储的就是索引编号
值 索引
NULL NULL
'' 0
'fisrt' 1
'second' 2
'third' 3
set类型,可以从定义的值列表中选择1个或多个值的组合。set列最多有64个成员。set值在内部用整数表示,分别是1,2,4,8都是2的n次方值,这些整数值对应的二进制位都是只有1位是1,其余是0
集合成员 二进制值 十进制值
'地铁' 0001 1
'公交' 0010 2
'步行' 0100 4
'出租车' 1000 8
mysql运算符
算术运算符
+:求和,不支持字符串拼接
-:
*:
/: div(只保留整数部分) /:数学中的除
%: mod
mysql 没有 += 运算符
比较运算符
:>
:<
:>=
:<=
:= 不能用于null判断
: != 或 <> 不能用于null 判断
区间或集合范围比较运算符
区间范围:between x and y 或 not between x and y
集合范围:in(x,x,x) not in(x,x,x)
模糊匹配比较运算符
%:代表任意字符
_: 代表一个字符,如果两个下划线代表两个字符
select * from t_employeee where ename like '%冰%'
逻辑运算符
&& 或 and
|| 或 or
! 或 not
关于null值
xx is null
xx is not null
xx <=> null
ifnull(xx,代替值) 当xx是null时,用代替值计算
Mysql系统预定义函数
Mysql数据库管理软件提供好的函数,任何数据库都可以用的公共函数
分组函数(聚合函数):表示会对表中多行记录一起做一个"运算",得到一个结果
求平均值 avg(x),求最大值 max(x),求最小值 min(x) 求总和 sum(x) 求个数 count(x)
单行函数:表示会对表中的每一行记录分别计算,有n行就有n行结果
数学函数,字符串函数,日期时间函数,条件判断函数,窗口函数
关系型数据库范式
应用数据库范式带来的好处:
1)减少数据冗余
2)消除异常
3)让数据组织更协调
第一范式:每一列保持原子性
列都是基本数据项,不能够在进行分割
第二范式:属性完全依赖于主键-主要针对联合主键
只依赖于联合主键的其中一个字段,不符合第二范式
第三范式:属性不依赖于其他非主属性
要求一个数据库表中不包含已在其他表中包含的非主关键字信息
范式越高,表越多,带来的问题
1.查询时,需要连接多个表,增加SQL查询的复杂度
2.查询时,需要连接多个表,降低了数据库查询性能
3.第三范式已经很大程度上的减少了数据冗余,并且基本预防了数据插入异常,更新异常,和删除异常
SQL语句
DDL:数据定义语句,创建,删除,修改
DML:增,删,改,查
DCL:数据控制语句:grant,commit,rollback
SQL语法规范
1)mysql中的sql语法不区分大小写
2)建议不要使用nysql的关键字来做为表名,字段名,数据库名,不小心使用,加' '引起来
标点符号
():在创建表,添加数据,函数使用,子查询,计算表达式,等等会用()表示某个部分是一个整体结构
' ':字符串和日期类型的数据值使用单引号,数值类型的不须要加标点符号
" ":列的别名可以使用双引号,给表取别名不能使用双引号
DDL
与数据库相关
create database 数据库名; //创建
show databases; //查看
//查看详细定义
show create database 数据库名;
show create database 数据库名\\G
//修改数据库编码
alter database 数据库名 character set 字符集名称 collate 字符集校对规则;
alter database LHY character set utf8 collate utf8_general_ci;
修改数据库编码,只会影响之后创建表的默认编码,之前创建的表不受影响
//删除数据库
drop database 数据库名;
//使用数据库
use 数据库名;
与数据表相关
create table 数据表名(字段名 数据类型,字段名 数据类型); //创建
//查看表的定义信息
show create table 表名;
show create table 表名\\G
//查看表结构
desc 表名;
//删除表格,包括表结构和字段
drop table 表名;
//修改表,删除表的字段
alter table 表名 drop 字段名称;
//修改表,增加字段
alter table 表名 add 字段名称 数据类型 约束;//添加到末尾
alter table 表名 add 字段名称 数据类型 约束 first;//添加到开头
alter table 表名 add 字段名称 数据类型 约束 after 字段名;//添加到某个字段后
//修改表,修改字段的数据类型
alter table 表名称 modify 字段名称 新的数据类型 约束;
//修改表,修改字段名称
alter table 表名称 change 旧字段名称 新字段名称 新的数据类型;
//修改表结构,修改字段位置
alter table 表名称 modify 字段名称 数据类型 first;
alter table 表名称 modify 字段名称 数据类型 after 另一个字段;
//修改表名称
rename table 旧表名称 to 新表名称;
DML
//添加
insert into 表名称 values(值列表);//值列表中的值顺序,类型,个数与表结构对应
insert into 表名称 values(值列表),(值列表),(值列表);
insert into 表名称(字段列表) values(值列表),(值列表),(值列表);
//修改
update 表名称 set 字段名 = 值,字段名 = 值; //给所有行修改
update 表名称 set 字段名 = 值 where 条件; //给满足条件的行修改
//删除
delete from 表名称; //删除整张表,但表结构保留
truncate 表名称; //截断表,清空表中数据,只有表结构
二者区别:delete是一条一条删除,支持回滚
truncate是把整张表drop,新建一张,效率高,无法回滚
DQL
select 字段名1 as "别名1",字段2 as "别名" from 表名称 as 别名;
//as可以省略,表的别名不能加双引号
//查询结果去重
select distinct 字段列表 from 表名称 【where 条件】;
//